关键词
APT34、钓鱼邮件、恶意Excel
最近,FortiGuard的一位样本采集人员发现了一起这样的事件:它始于发给约旦外交官的鱼叉式钓鱼电子邮件,与许多类似的攻击一样,该电子邮件包含恶意附件,但该附件包含的并不是普通的恶意软件,该恶意软件具有与高级持续威胁(APT)相关的功能和技术。根据这次攻击中使用的技术,可以推断这是APT34发起的另一个攻击活动。文章的其余部分将分析与这封电子邮件相关的攻击链以及其与普通恶意软件不同的特征,例如DNS隧道和状态检查编程。
-
受影响的平台:Microsoft Windows
-
受影响的用户:目标Windows用户
-
影响:从受感染的机器上收集敏感信息
-
严重性级别:中
这次鱼叉式网络钓鱼攻击的目标是一名约旦外交官,发件人假装是同一政府机构IT部门的同事。
与其他恶意软件(如Emotet和QBot)通常使用的Excel MacroSheets不同,附件中的Excel文件包含一个恶意VBA(Visual Basic Application)宏。宏的攻击方法大致分为两种,第一种方法比较复杂,通常是恶意宏安装由Cobalt Strike或Metasploit等工具部署的stager实施攻击或者使用living-off-the-land技术来下载和执行第二阶段的二进制文件进而进行攻击。第二种方法则比较简单,宏只是简单地释放并运行恶意二进制文件。在本攻击中,宏使用就是第二种方法,这是本攻击与其他网络钓鱼攻击的相似之处。
图 2:开始时的宏
此宏的独特技术之一是工作表可见性的切换。大多数涉及Excel的攻击不使用隐藏工作表,在使用隐藏工作表的情况下,隐藏表中通常包含恶意代码,在这种攻击中,一旦打开工作簿,两张工作表的可见性就会迅速切换。由于模拟器(例如免费的ViperMonkey)可能不支持所有Excel功能,所以隐藏工作表的一个可能原因是作为一种反仿真技术。
上图中的第16行和第17行被注释掉了,或许这些代码是用于测试,或者是其他诱饵文档所使用的功能,可以看到,其使用了TeamViewer(用于设备维护的远程访问和控制软件)。
细心的读者可能也注意到了上图中的第25行,第25行调用了一个与C2服务器进行通信的函数。
图 3:连接C2服务器
如上图所示,与大多数恶意宏不同,此宏使用WMI(Windows Management Instrumentation)来ping C2服务器,而不是使用PowerShell或CMD等常用的工具。此外,该函数在宏执行期间被多次调用,它的基本功能是作为状态(State)监视器,跟踪攻击期间发生的情况。tMsg变量在攻击的不同阶段会发生变化,从而允许攻击者查看其网络日志以了解宏的状态。rds变量是一个随机的四位数字,在整个宏状态检查的过程中始终使用相同的四位数字。
表 1:宏状态
C2 |
Macro State |
qwzbabz[four-digits].joexpediagroup[.]com |
Macro start |
qwzbbbz[four-digits].joexpediagroup[.]com |
Connected successfully to task scheduler |
qwzbaez[four-digits].joexpediagroup[.]com |
Successfully created malicious PE file |
qwzbbez[four-digits].joexpediagroup[.]com |
Successfully created XML config file |
qwzbcez[four-digits].joexpediagroup[.]com |
Successfully created signed Microsoft PE file |
qwzbdez[four-digits].joexpediagroup[.]com |
Double-check malicious PE file was created |
qwzbeez[four-digits].joexpediagroup[.]com |
Successful manual execution of malicious PE file |
qwzafzz[four-digits].joexpediagroup[.]com |
Begin task scheduler configuration for persistence |
qwzbbfz[four-digits].joexpediagroup[.]com |
Successfully created scheduled task |
-
恶意PE文件为:%LocalAppData%MicrosoftUpdateupdate.exe。
-
配置文件为:%LocalAppData%MicrosoftUpdateupdate.exe.config。
-
签名的PE文件为:%LocalAppData%MicrosoftUpdateMicrosoft.Exchange.WebServices.dll。
图 4:表单标题
图 5:计划任务
除了前面提到的可见性切换技术之外,在这个宏还通过检查鼠标是否存在以逃避自动化分析,如果系统未连接鼠标,则宏不会创建三个文件中的任何一个。在某些情况下,鼠标确实不会连接到计算机上。第一种情况是如果计算机是远程控制的,则不一定需要鼠标,鼠标会安装在控制计算机上。第二种情况是如果分析系统只是处理和模拟Office文件,则不需要鼠标,它可以创建一个脚本来自动执行所有必要的操作。
本攻击中的恶意宏包含了在大多数攻击中不常用的几种技术,这表明恶意软件作者花费了大量的时间和精力来开发这部分攻击代码。在下一节中,我们将分析由该宏创建的文件的详细信息。
第一个良性的签名文件被嵌入到Excel文件中,并释放到以下位置:%LocalAppData%MicrosoftUpdateMicrosoft.Exchange.WebServices.dll。另一个良性的文件被释放到 %LocalAppData%MicrosoftUpdateupdate.exe.config,其内容将用作配置数据,以下是其解码后的内容:
图 6:配置数据
第三个文件是一个.NET二进制恶意软件,它与两个良性文件的存储位置相同,即%LocalAppData%MicrosoftUpdate,文件名为update.exe,包含着主要的有效载荷。
此恶意软件二进制文件和Excel宏都使用了状态的概念以及对执行流程中任何时间点发生的事情的跟踪,因此可以断定此恶意软件二进制文件与Excel宏都是由同一组织开发的。由于.NET是一种比VBA更强大的编程语言,因此恶意软件二进制文件可以使用更简单的方法保持状态更新。
图 7:状态字典
上图显示了恶意软件定义的部分状态字典,根据执行流程和恶意软件所处的状态,恶意软件会引入一些延迟操作。
图 8:延迟时间(以毫秒为单位)
这些延迟通过调用Sleep()函数实现,在.NET中,Sleep()接受以毫秒为单位的值。在某些情况下,恶意软件可以休眠6(DelayMinAlive) 到8(DelayMaxAlive)小时!
此恶意软件在某些状态下休眠,某些状态下与C2服务器通信,与Excel宏一样,它连接看似随机的子域名,实际上,它使用域名生成算法(DGA) 来计算子域名。
图 9:DGA
恶意软件首先通过分配一个随机值给_AgentID来构建DGA,然后将该值作为种子输入到上图红框中的RandomMersenneTwister函数中,然后,它使用haruto字符串以及CharsDomain和CharsCounter变量中的字符串执行进一步的计算。生成子域名字符串后,恶意软件会随机选择三个域名中的一个进行连接(joexpediagroup[.]com、asiaworldremit[.]com 或 uber-asia[.]com)。
生成URL后,恶意软件的下一步是检查C2服务器的DNS数据。
图 10:DNS
图 11:DNS隧道
在上图中的第245行,TaskClass.ListData被设置为从DNS请求中接收到的数据,这表明该恶意软件正在DNS响应中接收任务,显然,该恶意软件使用DNS隧道与其C2服务器进行通信,而APT34历史上也曾使用DNS进行通信。
为此恶意软件定义了几种类型的任务。
图 12:任务类型
该恶意软件能够获取DNS响应并在受感染的机器上创建任意文件,File和CompressedFile是用于创建文件的任务类型,其余任务类型用于向恶意软件发送后门命令,这些后门命令可以通过PowerShell或Windows CMD解释器执行。下表列出了其支持的后门命令:
表 2:后门命令
Command |
Interpreter |
Payload |
1 |
PS |
Get-NetIPAddress -AddressFamily IPv4 | Select-Object IPAddress |
2 |
PS |
Get-NetNeighbor -AddressFamily IPv4 | Select-Object “IPADDress” |
3 |
CMD |
whoami |
4 |
PS |
[System.Environment]::OSVersion.VersionString |
5 |
CMD |
net user |
7 |
PS |
Get-ChildItem -Path “C:Program Files” | Select-Object Name |
8 |
PS |
Get-ChildItem -Path ‘C:Program Files (x86)’ | Select-Object Name |
9 |
PS |
Get-ChildItem -Path ‘C:’ | Select-Object Name |
10 |
CMD |
hostname |
11 |
PS |
Get-NetTCPConnection | Where-Object {$_.State -eq “Established”} | Select-Object “LocalAddress”, “LocalPort”, “RemoteAddress”, “RemotePort” |
12 |
PS |
$(ping -n 1 10.65.4.50 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.4.51 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.65.65 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.53.53 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.21.200 | findstr /i ttl) -eq $null |
13 |
PS |
nslookup ise-posture.mofagov.gover.local | findstr /i Address;nslookup webmail.gov.jo | findstr /i Address |
14 |
PS |
$(ping -n 1 10.10.21.201 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.19.201 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.19.202 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.24.200 | findstr /i ttl) -eq $null |
15 |
PS |
$(ping -n 1 10.10.10.4 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.50.10 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.22.50 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.45.19 | findstr /i ttl) -eq $null |
16 |
PS |
$(ping -n 1 10.65.51.11 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.6.1 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.52.200 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.6.3 | findstr /i ttl) -eq $null |
17 |
PS |
$(ping -n 1 10.65.45.18 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.28.41 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.36.13 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.51.10 | findstr /i ttl) -eq $null |
18 |
PS |
$(ping -n 1 10.10.22.42 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.23.200 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.45.19 | findstr /i ttl) -eq $null;$(ping -n 1 10.10.19.50 | findstr /i ttl) -eq $null |
19 |
PS |
$(ping -n 1 10.65.45.3 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.4.52 | findstr /i ttl) -eq $null;$(ping -n 1 10.65.31.155 | findstr /i ttl) -eq $null;$(ping -n 1 ise-posture.mofagov.gover.local | findstr /i ttl) -eq $null |
20 |
PS |
Get-NetIPConfiguration | Foreach IPv4DefaultGateway | Select-Object NextHop |
21 |
PS |
Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object SERVERAddresses |
22 |
CMD |
systeminfo | findstr /i “Domain” |
该恶意软件实际上缺少命令6,这些命令无论是执行上传文件还是后门命令,都会有某种输出,然后使用.NET的压缩模式对该输出进行格式化和压缩,在结果用base32编码后,这个新结果然后被合并到DGA中。其中Base32也是APT34曾经使用过的编码方案。
图 13:DNS数据泄露
随着此恶意软件的开发工作的增加,它似乎不像其他隐蔽的信息窃取者那样执行一次然后自行删除。也许是为了避免触发任何行为检测,该恶意软件没有增加任何维持持久性的方法,相反,它依靠Excel宏通过计划任务的方式创建持久性。由于Excel是带签名的二进制文件,因此某些行为检测引擎可能会漏报这种维护持久性的方式。然而,使用计划任务作为持久性机制的问题在于,它存在多个自身副本同时运行的风险,为了避免这个问题,恶意软件创建了一个互斥锁,互斥体(互斥对象)是创建的程序对象,因此多个程序线程可以轮流共享同一资源。在最基本的定义中,它只是一种锁机制,如果系统上已经存在一个值为726a06ad-475b-4bc6-8466-f08960595f1e的互斥锁,则意味着受感染的计算机上已经存在该恶意软件的实例,因此,如果计划任务启动了恶意软件的另一个副本,恶意软件会检测到互斥锁,并立即终止。
该恶意软件能够与三个域名进行通信:
-
uber-asia[.]com
-
joexpediagroup[.]com,Excel宏与此域名进行通信
-
asiaworldremit[.]com
(1)Uber-asia[.]com
图 14:Virustotal DNS结果
(2)Joexpediagroup[.]com
该域名注册于2022年1月20日,它可能在模仿约旦的Expedia travel。2022年4月20日之后,该域名也开始解析为127[.]0[.]0[.]1。在此之前,此域名解析为45[.]11[.]19[.]47。此C2服务器还打开了SSH对应的22端口,我们的Fortinet遥测系统检测到有人从约旦连接到该IP地址。
(3)Asiaworldremit[.]com
表 3:假域名
Registered Domain |
Attempting to masquerade as |
astrazeneeca[.]com |
AstraZeneca |
astrazencea[.]com |
AstraZeneca |
hsbcbkcn[.]com |
HSBC Bank China |
valtronics-ae[.]com |
Valtronics AE |
ntu-sg-edu[.]com |
Nanyang Technological University Singapore |
theworldbank[.]uk |
World Bank Group |
coinbasedeutschland[.]com |
Coinbase for Germany |
cisco0[.]com |
Cisco |
开发此攻击所付出的精力远高于普通的网络钓鱼邮件攻击活动,因此我们认为其属于APT攻击的水平。攻击者一开始就冒充有效用户,并保持电子邮件简短而没有任何语法错误。此后,他们继续使用具有高级技术的Excel宏,并使用鼠标检查和工作表可见性切换技术实现反分析功能。
虽然状态编程很少用于恶意软件,但在此攻击中,Excel宏和恶意软件都利用了状态检测编程。确认恶意软件成功运行后,其会休眠6-8小时,一个可能的原因是攻击者希望外交官在早上打开鱼叉式网络钓鱼邮件,然后在其下班后进行攻击操作。
虽然使用DNS隧道进行C2通信并不是什么新技术,但在实践中很少见。攻击者的后门还支持非常多的命令,从表面上看,攻击者做了相关调查,因为从他们的后门命令可以看出他们已经事先了解了目标的内部网络基础设施,这进一步表明攻击者很可能在进行鱼叉式钓鱼尝试之前,已经在其他地方获得了有限的访问权限。
攻击者三分之二的C2服务器似乎受到了严格的控制,他们只是在特定的时间开展攻击活动。第三个C2服务器的域名已经被一些攻击组织使用过,这使得难以将其归因到特定的APT组织,但从收集的证据来看,此次攻击活动是APT34发起的。通过以上的分析证明他们拥有渗透政府网络所需的资源,并且能够使用更先进的技术。
Indicator |
SHA256 |
Confirmation Receive Document.xls |
82A0F2B93C5BCCF3EF920BAE425DD768371248CDA9948D5A8E70F3C34E9F7CCA |
Microsoft.Exchange.WebServices.dll |
7EBBEB2A25DA1B09A98E1A373C78486ED2C5A7F2A16EEC63E576C99EFE0C7A49 |
update.exe.config |
C744DA99FE19917E09CD1ECC48B563F9525DAD3916E1902F61B79BDA35298D87 |
update.exe |
E0872958B8D3824089E5E1CFAB03D9D98D22B9BCB294463818D721380075A52D |
Other
Indicator | Value |
Mutex | 726a06ad-475b-4bc6-8466-f08960595f1e |
C2 domain | joexpediagroup[.]com |
C2 domain | asiaworldremit[.]com |
C2 domain | uber-asia[.]com |
Mitre TTPs
Initial Access | |
T1566.001 | Spearphishing |
Execution | |
T1059.001 |
PowerShell |
T1059.003 | Windows Command Shell |
T1053.005 | Scheduled Task |
T1204.002 | Malicious File |
T1047 | Windows Management Instrumentation |
Persistence | |
T1053.005 |
Scheduled Task |
Defense Evasion |
|
T1480 | Execution Guardrails |
Discovery |
|
T1087.001 |
Local Account |
T1083 |
File and Directory Discovery |
T1049 | System Network Connections Discovery |
Command and Control | |
T1071.004 | DNS |
T1132.002 | Non-Standard Encoding |
T1568.002 | Domain Generation Algorithms |
Exfiltration | |
T1041 | Exfiltration Over C2 Channel |
编辑|韩高奎
审校|何双泽、金矢
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。联系信息进入公众号后点击“关于我们”可见。
原文始发于微信公众号(国家网络威胁情报共享开放平台):疑似APT34的钓鱼邮件攻击