【天穹】图穷匕见:HTA-ZIP 复合文件攻击
/ / 点击 / 阅读耗时 15 分钟一、概述
在天穹沙箱日常运营分析过程中,监测到扩展名为 .hta 的文件,但其实际文件头却显示为 ZIP 格式,表明这类样本在文件类型上存在刻意伪装。为探究其攻击手法与规避原理,我们对该样本展开了深入分析。
二、样本信息
- 样本名:setupi.hta
- MD5:e5e3578329be22d26443d7f6c6690485
- SHA1:179e19367d82da0458f42ea7647236a3cda3fb71
- 文件类型:HTA
- 文件大小:5.17 MB
- 恶意家族:银狐
- 报告链接:天穹沙箱分析报告
文件扩展名为 .hta,文件头信息实际为 50 4B 03 04,从文件头看属于 ZIP 文件。

但是文件中也包含 HTA 标签 <HTA:APPLICATION 标签。因此该样本的结构分为两部分:前面部分为 ZIP,后面部分为 HTA。

HTA(HTML 应用程序,HTML Application)是一个使用 HTML 和动态 HTML 构建的 Microsoft Windows 应用程序,运行在 Internet Explorer 中,并且支持其他的脚本语言,例如 VBS 和 JavaScript。HTML 用来创建用户界面,脚本语言则用来构建程序主体。HTA 运行时不受浏览器安全模型的限制,实际上,它就像是一个被“完全信任”的应用程序。在 Windows 上,由 mshta.exe 运行 .hta 文件,而 mshta.exe 主要依赖文件扩展名(.hta)来判断文件类型,mshta.exe 在读取 .hta 文件时,会扫描整个文件内容 (从头到尾), 如果在某处发现合法的 HTML 标记 + 脚本 (例如 <HTA:APPLICATION>、<script>、VBScript / JScript 代码等),就会把这些内容作为 HTA 应用来解析执行。
HTA 代码可以拼接到 ZIP 文件后面,还可以拼接到其他的文件 (例如 PDF、图片、BAT 脚本等) 的后面。Windows 的判断方式是基于文件扩展名(.hta),而不是严格依据文件头,一些安全产品 (如邮件网关、反病毒软件等) 更倾向于根据文件内容来判断,它们可能将此类文件当成 ZIP(PDF、图片、BAT 脚本等)处理,从而绕过一些安全产品的文件内容检查,执行隐藏的恶意脚本。
三、样本分析
该样本首先写入了一个名为 cmsadasd.dsadsad 的文件,并创建了大量可执行程序。其中 cmsadasd.dsadsad 文件包含一个合法的签名。

写入大量文件,如 longlq.cl、lua5.1.dll 等等。

复制文件到目录 c:\Users\Public\A4y3zC\、c:\ProgramData\6mjxfjhc\,复制后的文件名和目录名均是随机生成的。

创建了一些进程,如 9wa.exe、W2ey7yY.exe 等。

下载了一个 Chrome 安装程序,下载的目标文件是合法的官方安装程序文件。

运行下载的 Chrome 安装程序,以便静默执行恶意代码。

删除了文件 yyD.zip、9wa.exe、msys-1.0.dll。

域名访问,其中可疑域名为 xiaoshihou[.]name。

四、HTA分析
head 标签中的 JavaScript 脚本会让将浏览器窗口移动到屏幕坐标为 (-3000, -3000) 的位置,窗口被移动到屏幕外,并将窗口的大小缩小到 0x0。其目的是隐藏窗口,即使用户试图恢复该窗口,也无法看到它。
<HTA:APPLICATION> 标签属性如下:
SHOWINTASKBAR=”no”:应用程序不会显示在任务栏上。
WindowState=”hidden”:应用程序窗口启动时是隐藏的。
INNERBORDER=”NO”:没有窗口的内边框。
MAXIMIZEBUTTON=”NO”:没有最大化按钮,用户不能将窗口最大化。
MINIMIZEBUTTON=”NO”:没有最小化按钮,用户不能将窗口最小化。
SCROLL=”NO”:不显示滚动条。
SELECTION=”NO”:禁用文本选择功能,用户无法选中文本。
SINGLEINSTANCE=”YES”:只能运行一个实例,如果尝试运行第二个实例,系统会忽略它。
1 | <html lang="en"> |
第二个 JavaScript 脚本中包含大量混淆。

去混淆后的脚本中开头包含两个全局变量 serialized_obj4 和 serialized_obj3,经 Base64 编码。

以 serialized_obj4 为例,解码后的部分内容如下所示。解码后的内容显示了一个二进制数据的反序列化对象以及与 .NET 相关的一些类的结构,如序列化有关的 .NET 类 System.DelegateSerializationHolder,反射相关的类 System.Reflection.MemberInfoSerializationHolder ,以及一个 PE 文件。

这个 PE 文件实际上是 dll,dll 名称为 CshapeHostingBridageWrapperShowErrorWindow.dll,dll 中包含 SharpZipLib 全套组件,而 SharpZipLib 是一个完整的压缩与解压缩库。

其中的字符串被加密,存储在一个字符串数组中,在需要时调用函数动态解密字符串。字符串解密前,都会对数组中的字符串进行预处理,如移除不可见的 Unicode 字符 [U+202E](右到左覆盖符)、正则表达式 /[MjUZEFmOtuniAhrRQt=]/g 移除 base64 干扰字符、通过 shift / push / pop 操作改变数组元素顺序等。

字符串解密算法为 Base64 + RC4。

分析浏览器的 navigator.userAgent 字符串关键词,实现对用户操作系统的名称和版本的检测。

脚本中的 codeRunner3 函数可以执行多种操作:
- 创建临时目录:在 C:\Users\Public 下创建随机命名的目录结构。
- 文件解压/释放:从内置资源或网络获取加密的恶意文件,解压到临时目录。
- 文件操作:复制、移动和重命名恶意文件,主要针对 .exe、.dll、.bat等可执行文件。
- 创建快捷方式:在启动文件夹创建恶意程序的快捷方式。
- 自启动注册:通过快捷方式实现系统启动时自动运行恶意代码。
- 进程创建:使用 WScript.Shell 的 Run 方法执行目标程序。
- 延迟执行:使用 Sleep 函数延迟执行。

dotnet4 函数会检测系统是否安装了 .NET Framework 4.0 ,base64 解码前面的 serialized_obj4 和 serialized_obj3 的内容,然后将解码的数据注入到内存中执行。

只在特定日期 2025/11/26 20:42:00 前有效,过期后自动停止执行。

函数 downloadFromYouDaoYun 支持从有道云存储服务下载加密的恶意负载。

五、IOC
恶意文件(MD5)
1 | e5e3578329be22d26443d7f6c6690485 |
恶意 IOC
1 | xiaoshihou[.]name |
报告链接
分析报告:天穹沙箱分析报告
六、 技术支持与反馈
星图实验室深耕沙箱分析技术多年,致力于让沙箱更好用、更智能。做地表最强的动态分析沙箱,为每个样本分析人员提供便捷易用的分析工具,始终是我们追求的目标。各位同学在使用过程中有任何问题,欢迎联系我们。