瑞士军刀NC
nc是网络调试的一款强大的工具,是用于处理TCP或UDP数据的通用实用程序,是黑客界的瑞士军刀
看看的常规用法:
> 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的操作,则是向其他网络端发起网络操作,是一个客户端
两个终端实时通讯
如:
开一个服务端
nc -l 1234 # 打开本地的1234端口,可以通过这个接口接受数据
开一个客户端,向上面这个服务端传数据
nc localhost 1234
然后,你在客户端里面输入的任何内容都会在跑服务端这段print出来。
服务端保存接受到的数据成文件
之前的服务端print的内容是标准输出到终端窗口,我们也可以改一下输出到一个文件
touch log.txt | nc -l 1234 > server.txt # 所有的接受到的数据会保存到server.txt
我们刚才上面是用 nc localhost 1234来向服务端发数据,其实也可以直接用telnet
telnet localhost 1234 # 所有telnet命令下的敲入的数据都会被传到服务器,直到telnet客户端断开连接
传输文件
也可以直接向服务端传输文件
echo 'this is client' > client.txt
nc localhost 1234 < client.txt # client.txt的重定向到nc,然后传给服务端,server.txt的内容就变成client.txt的内容
那么如果要从服务端下载内容怎么做?
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
tar -cvf - . | nc -l 1234 # 压缩当前目录传输出去
nc localhost 1234 > server.tar # 接受到的目录压缩包保存位server.tar
nc localhost 1234 | tar -xvf - # 直接解压压缩到的目录到当前目录
加密传输
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,客户端收到后,同样的解密,两端需要数同样的加密密码
反向代理
上面我们知道,可以通过命令单方面向服务端发起数据,反向代理需要我们服务端自动响应,所以我们借助命令管道来实现
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
dd if=/dev/sda | nc -l 1234 # 已有机器,假设系统装在设备sda上
nc -n {ip from linux device} 1234 | dd of=/dev/sda
远程执行shell(代替ssh)
有时候,我们没有安装ssh的时候,也可以用nc来帮我们对服务器做远程的shell操作,原理也是借助命名管道来实现
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
在客户端输入,就会出现一个可交互的命令终端
nc localhost 1234
$ ls
server.txt
...
扫描端口
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
好了
最后想说,技术无知,人有分别,请大家管好自己的键(欲)盘(望).
扩展阅读:
新手该如何选择云服务器
个人玩家和中小企业云服务器选择对比
发表评论 (审核通过后显示评论):