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端口,可以通过这个接口接受数据
|
开一个客户端,向上面这个服务端传数据
然后,你在客户端里面输入的任何内容都会在跑服务端这段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
|
好了
最后想说,技术无知,人有分别,请大家管好自己的键(欲)盘(望).