网络分析工具:NetCat
什么是 NetCat
简单来说,NetCat (nc) 是一个命令行工具,能够让你很方便、很灵活地操纵 传输层协议
(TCP & UDP)
nc 可以在两台设备上面相互交互,即侦听模式
/传输模式
nc 包含以下主要功能:
- Telnet 功能
- 获取 banner 信息
- 传输文本信息
- 传输文件 / 目录
- 加密传输文件,默认不加密
- 远程控制
- 加密所有流量
- 流媒体服务器
- 远程克隆硬盘
使用 NetCat
一般来说,nc 的命令行包括如下几个部分:
|
|
命令选项
本文内容基于 OpenBSD 社区的变种(也叫 OpenBSD netcat,部分命令与原版有差异。 )
下面列举了一些常用选项,更多选项参见 OpenBSD manual page
|
|
主机
这部分可以没有,可以以 IP 地址
形式表示,也可以以 域名
形式表示。
端口
这部分可以没有,可以是单个端口,可以是端口范围。
常用使用场景示例
测试某个远程主机的监听端口是否可达
经常有这种需求,要判断某个主机的监听端口是否能连上。导致监听端口无法连接,通常有两种原因:
- 监听端口没开启
- 监听端口虽然开启,但是被防火墙阻拦了
对第 1 个原因,(如果你能在该主机上运行命令)可以直接用 netstat
这个命令查看监听端口是否开启;但对于第 2 个原因,netstat
就用不上了,这时候就可以用 nc 来帮你搞定。
用如下命令可以测试某个 IP 地址上的某个监听端口是否开启:
|
|
注: 默认情况下 nc 会等待很久,然后才告诉你连接失败。如果你所处的网络环境稳定且高速(比如:局域网内),那么,你可以追加 -w
选项,设置一个比较小的超时值。在下面的例子中,超时值设为 3 秒。
|
|
判断防火墙是否允许 or 禁止某个端口
假设你正在配置防火墙规则,禁止 TCP 的 8080 端口对外监听。那么,你如何验证自己的配置生效?
为了叙述方便,设想如下场景:
有两台主机 ——主机 C
充当客户端,主机 S
充当服务端。
然后要判断主机 S
上的防火墙是否会拦截其它主机对 8080 TCP 端口的连接。
在主机 S
上运行 nc,让它在 8080 端口,命令如下:
|
|
然后在 “主机 C” 上运行 nc,测试 “主机 S” 上的 8080 端口是否可达
注: 在默认情况下,nc 开启 listen 模式充当服务端,在接受第一次客户端连接之后,就会把监听端口关闭。如果你想要让 nc 始终监听模式,使之能重复接受客户端发起的连接,可以追加 -k
选项。
端口扫描
下面这个命令,用来扫描的端口范围从 1 到 1024
|
|
选项 -z
是指开启 zero-I/O 模式
。该模式 nc 只判断某个监听端口是否能连上,连上后不与对端进行数据通讯。
**注:**端口扫描的时候,-v
选项会把成功/失败的结果统统打印出来。通常关注的都是 “扫描成功” 的那些端口。因此,可以用可以配合使用 grep
过滤一下,只打印扫出来的端口
|
|
此外,由于 -v
选项产生的输出位于 stderr
,上述命令中的 2>&1
用来把 stderr
合并到 stdout
。
另: nc 默认超时较大,导致扫描速度较慢。建议根据网络情况合理设置超时值,加快扫描速度。
探测服务器类型和软件版本
如果某个服务器运行了 SSH 服务端,那么用如下命令可以看出:该服务器的操作系统类型,以及 SSH server 的版本。
|
|
端口转发
用 nc 进行端口转发,需要运行两个 nc 进程,一个充当服务端
,另一个是客户端
,然后用管道让把两个进程的标准输入输出``交叉配对
。所谓的交叉配对
就是——每一个 nc 进程的标准输出
都对接到另一个 nc 进程的标准输入
。如此一来,就可以完美地建立双向通讯。
步骤 1:创建命名管道
用下面这个简单的命令创建一个 “命名管道”,其名称叫做 nc_pipe
|
|
步骤 2:同时启动两个 nc
|
|
运行上述命令之后,就可以把本机的 1235 端口重定向到本机的 5678 端口。
传输文件
为了叙述方便,假设你有两台主机 A 与 B,你要把 A 主机上的文件 file1 传输到 B 主机上,保存为 file2
|
|
两者端口号要相同
远程备份整个磁盘
假设你要把 A 主机 /dev/sda
磁盘的原始数据整个复制到 B 主机的 /dev/sdb
磁盘。
|
|
远程控制
将 A 主机的 bash
发给 B 主机
|
|
流媒体服务
|
|
A 让 test.MP4 这个文件成为流
的形式发送到 B,B 用 mplayer 播放,接收多少播放多少,指定缓存 4000bytes。
信息收集
收集目标机上的进程信息
|
|