nc是网络调试的一款强大的工具,是用于处理TCP或UDP数据的通用实用程序,是黑客界的瑞士军刀

看看的常规用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
> tldr nc
Netcat is a versatile utility for working with TCP or UDP data.
More information:
https://nmap.org/ncat

- Listen on a specified port and print any data received:
nc -l {{port}}

- Connect to a certain port (you can then write to this port):
nc {{ip_address}} {{port}}

- Set a timeout:
nc -w {{timeout_in_seconds}} {{ipaddress}} {{port}}

- Serve a file:
nc -l {{port}} < {{file}}

- Receive a file:
nc {{ip_address}} {{port}} > {{file}}

- Server stay up after client detach:
nc -k -l {{port}}

- Client stay up after EOF:
nc -q {{timeout}} {{ip_address}}

- Scan the open ports of a specified host:
nc -v -z {{ip_address}} {{port}}

- Act as proxy and forward data from a local TCP port to the given remote host:
nc -l {{local_port}} | nc {{hostname}} {{remote_port}}

nc对于网络的操作可以分为接受发送这两种操作

区别是参数 -l, -l 是监听端口的参数,有这个参数,说明启动的是一个服务端

其他没有-l的操作,则是向其他网络端发起网络操作,是一个客户端

两个终端实时通讯

如:

开一个服务端

1
nc -l 1234 # 打开本地的1234端口,可以通过这个接口接受数据

开一个客户端,向上面这个服务端传数据

1
nc localhost 1234

然后,你在客户端里面输入的任何内容都会在跑服务端这段print出来。

服务端保存接受到的数据成文件

之前的服务端print的内容是标准输出到终端窗口,我们也可以改一下输出到一个文件

1
touch log.txt | nc -l 1234 > server.txt #  所有的接受到的数据会保存到server.txt

我们刚才上面是用 nc localhost 1234来向服务端发数据,其实也可以直接用telnet

1
telnet localhost 1234 # 所有telnet命令下的敲入的数据都会被传到服务器,直到telnet客户端断开连接

传输文件

也可以直接向服务端传输文件

1
2
echo 'this is client' > client.txt
nc localhost 1234 < client.txt # client.txt的重定向到nc,然后传给服务端,server.txt的内容就变成client.txt的内容

那么如果要从服务端下载内容怎么做?

1
2
3
4
echo 'this is server' > server.txt
nc -l 1234 < server.txt # 把server.txt重定向给nc,作为服务内容
nc localhost 1234 # server.txt的内容会在客户端打印出来
nc -n localhost 1234 > client.txt # server的内容会保持到client.txt

如果我们平时想临时搭建一个服务在两台机器间传输文件,用nc是非常方便的,那么这种传输的其他用途,大家可以发挥自己的想象力

传输整个目录

传输目录要借助压缩工具,比如tar,把目录压缩成一个文件然后通过管道流到nc

1
2
3
tar -cvf - . | nc -l 1234 # 压缩当前目录传输出去
nc localhost 1234 > server.tar # 接受到的目录压缩包保存位server.tar
nc localhost 1234 | tar -xvf - # 直接解压压缩到的目录到当前目录

加密传输

1
2
mcrypt –flush –bare -F -q -m ecb < server.txt | nc -l 1234
nc localhost 1234 | mcrypt –flush –bare -F -q -d -m ecb > server.txt

通过mcrypt加密后重定向给nc,客户端收到后,同样的解密,两端需要数同样的加密密码

反向代理

上面我们知道,可以通过命令单方面向服务端发起数据,反向代理需要我们服务端自动响应,所以我们借助命令管道来实现

1
2
3
4
5
6
mkfifo reply # 创建命名管道 replay
# reply重定向给nc server,
# nc server又通过管道把接收到的内容交给另外一个nc客户端
# 然后这个客户端接收到内容重定向给命名管道replay,
# 由于reply已经重定向给server,所以就能接收到client请求的结果
nc -k -l 1234 < reply | nc localhost 8080 > reply

打开浏览器输入http://localhost:1234,就能看到localhost:8080的内容

结束后,记得把执行** rm reply** 把命名管道删除掉

克隆一个linux系统

借助dd来读取磁盘的原始数据重定向给server

1
2
dd if=/dev/sda | nc -l 1234 # 已有机器,假设系统装在设备sda上
nc -n {ip from linux device} 1234 | dd of=/dev/sda

远程执行shell(代替ssh)

有时候,我们没有安装ssh的时候,也可以用nc来帮我们对服务器做远程的shell操作,原理也是借助命名管道来实现

1
2
3
4
5
rm -f /tmp/f; mkfifo /tmp/f # 先删除可能以前遗留的命名管道f(应该起一个独特的名字)
# 把命名管道的内容导入到给shell,
# shell启动交互模式,执行的结果错误也重新通过管道写到标准输出,标准输出又通过管道交给nc
# 然后nc接收到输入命令又重定向给/tmp/f命名管道,形成闭环
cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

在客户端输入,就会出现一个可交互的命令终端

1
2
3
4
nc localhost 1234
$ ls
server.txt
...

扫描端口

1
2
3
4
5
nc -zv localhost 20-80      
nc: connect to localhost port 20 (tcp) failed: Connection refused
nc: connect to localhost port 21 (tcp) failed: Connection refused
Connection to localhost 22 port [tcp/ssh] succeeded!
nc: connect to localhost port 23 (tcp) failed: Connection refused

好了

最后想说,技术无知,人有分别,请大家管好自己的键(欲)盘(望).