nc - 网络工具箱中的"瑞士军刀"
nc 是 Linux 下强大的网络命令行工具,主要用于 TCP、UDP、UNIX域套接字 相关的操作
它被设计成可以由其他程序灵活驱动可靠的后台工具,拥有 "瑞士军刀" 的美称,每个系统管理员都应该掌握它
nc -h
nc
命令的帮助手册提供了以下信息:
-
连接到某处:
- 语法:=nc [-options] hostname port[s] [ports] …=
- 说明:用于向指定主机和端口发起连接。
-
监听传入连接:
- 语法:=nc -l -p port [-options] [hostname] [port]=
- 说明:在指定端口上监听传入连接。
-
选项包括:
-c shell commands
:作为-e
使用,用于执行 shell 命令(潜在危险)-e filename
:连接后执行指定程序(潜在危险)-b
:允许广播-g gateway
:指定源站点路由跳数,最多 8 个-G num
:设置源站点路由指针:4、8、12 等-h
:显示帮助信息-i secs
:发送行或扫描端口的延迟间隔-k
:在套接字上设置保持活动选项-l
:监听模式,用于接受传入连接-n
:仅使用数字 IP 地址,不进行 DNS 解析-o file
:以十六进制转储流量-p port
:本地端口号-r
:随机化本地和远程端口-q secs
:在标准输入 EOF 后退出,并延迟指定秒数-s addr
:本地源地址-T tos
:设置服务类型-t
:应答 TELNET 协商-u
:UDP 模式-v
:详细输出(使用两次更详细)-w secs
:连接和最终网络读取的超时时间-C
:将 CRLF 发送为行结束符-z
:零 I/O 模式(用于扫描)
扫描端口
有时需要测试服务器的端口连通性,下面是测试服务器(IP:10.3.3.3 22) 22 端口是否开启的例子
|
|
-z 选项是报告连接状态(只连接不发送数据)
-v 选项是输出命令过程信息,
-w 是设置超时时间,默认是秒,如果要设置毫秒的话,可以在数字后面加上 ms, 比如:-w 3 是3秒超时,-w 300ms 表示超时时间是300毫秒
从上面的结果可以看出,目标服务器上 22 端口是开启的,6000 端口是关闭的
例子中扫描的是 TCP 协议的端口,如果要扫描 UDP 协议的端口,需要加上 -u 选项,如果换成 UDP 端口的话,上面的命令就会变成 nc -uz -v -w 3 segfault.net 22
聊天服务器
机器 A 的终端开启端口侦听,机器 B 连接 A 侦听的端口并向A发送数据。具体过程如下:
- 机器 A 相当于一个简易的命令行聊天服务器,机器 B 相当于客户端的功能,默认使用 TCP 协议连接服务器
- 机器 A 在本地开启一个侦听 8000 端口的服务,机器 B 连接 机器 A 的 8000 端口,连接成功之后可以互相发送数据了
机器 A
|
|
机器 B
|
|
传输文件
机器 A 和机器 B 之间可以通过 nc 命令传输文件,具体步骤如下:
机器 A 作为服务器,侦听 8000 端口并重定向到 out.txt 文件, 机器 B 连接机器 A 成功之后,自动把 input.txt 文件传输到服务器
机器 A
|
|
机器 B
|
|
创建后门
可以在系统中创建后门执行 bash 命令的服务,因为涉及到系统安全性问题,所以生产环境要慎用,不过平时在内网开发环境中用 来测试的话就很方便了,具体的使用步骤如下:
上面的例子中,机器 A 开启端口 8000 的本地服务,服务会使用 /bin/bash 执行收到的命令,机器 B 客户端连上 机器 A 后,输入任意的命令,都相当于在63机器上执行,命令结果返回给64机器
说明:-e 选项默认使用的是 /bin/bash 执行命令, 这里的 -e 也可以换成 -c ,唯一区别是 -c 默认使用的是 /bin/sh 执行命令
机器 A
|
|
机器 B
|
|
远程执行脚本
nc 支持远程执行 shell 脚本和 lua 脚本
shell 脚本
脚本 s.sh 脚本内容如下:
|
|
服务器端
|
|
客户端
|
|
Web服务器
nc 可以当做简易的 web 服务器,现服务器本地有一个 index.html 文件,内容如下
|
|
服务器执行 nc -k -l 192.168.70.63 8080 < index.html 命令监听8080端口
打开浏览器,地址栏输入 192.168.70.63:8080,具体效果如下图:
此时,服务器端的输出如下:
注意:-k 选项是指监听模式接受多个连接,如果没有指定 -k 选项的话,浏览器访问一次,服务器就会退出了
机器 A
|
|
机器 B
|
|
作为浏览器
nc 不仅可以当作web服务器,还可以当作浏览器发送HTTP请求
以百度首页为例, 输入 nc www.baidu.com 80,回车之后,再次输入 GET / HTTP/1.0 再次敲击两次回车,即可获得百度首页的HTML 文档内容,由于百度首页HTML太长,下面的例子只是文档的部分内容
|
|
查找运行在端口上的服务
nc 可以扫描指定IP上指定端口是否开启,那能否查找到指定IP上运行于指定端口上的服务呢? 答案是肯定的,以下的例子是获取指定IP上 22 号端口上运行的服务
|
|
从上面的例子中可以看出,机器(segfault.net)上 22 号端口上运行的是 SSH 服务