常用的 netcat 相关命令整理。
简介
Netcat 用于调试、检查网络的工具包,可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP UDP 套接字。在网络安全领域被称作 “TCP IP 的瑞士军刀” (Swiss-army knife for TCP/IP)。
在 CentOS 中,可以通过如下方式安装。
----- CentOS 6版本安装
# yum install nc
----- CentOS 7版本安装
# yum install nmap-ncat
常用参数简单列举如下。
常用参数:
-k 保持打开,默认只监听一个客户端,如果某一端退出则退出
-l 监听模式,用于接收链接请求,默认客户端退出后服务同时退出
-n 直接使用IP地址,不做DNS解析
-v 用于显示更详细的信息,可以使用多个
-u UDP模式
-w secs 连接超时
-t 使用TELNET协议
-e file 链接后执行的命令
常见示例
在此简单列举下常见的示例。
运行于服务器模式,侦听指定端口
默认使用 ipv4(-4)
,可以显示使用 ipv6(-6)
;默认当客户端退出后,服务端同时也会退出,可以通过 -k
防止服务端退出;通过 -u
指定是 UDP 连接。
$ nc -l 2389 // 创建服务端,监听2389端口
$ nc 127.1 2389 // 使用客户端模式来连接到2389端口
端口扫描
----- 扫描10.1.1.180主机上的80或者1~14000号TCP端口
$ nc -v -z -w2 10.1.1.180 80
(UNKNOWN) [10.1.1.180] 80 (www) open
$ nc -v -z -w2 10.1.1.180 1-14000
----- 扫描10.1.1.180主机上的1~14000号UDP端口
$ nc -u -v -z -w2 10.1.1.180 1-14000
REMOTE主机绑定SHELL
----- 绑定到5354端口
$ nc -l -p 5354 -t -e c:\winnt\system32\cmd.exe
$ nc -l -p 5354 -t -e /bin/bash
----- 链接到服务器,可以执行Bash命令
$ nc 10.1.1.180 5354
传输文件/文件夹
将客户端的 testfile 传输到服务器端的 test,可以是文本文件,也可以是二进制文件。对于目录需要通过 tar 打包,然后再发送。
$ nc -l 2389 > test // 服务器端将文件重定向到test
$ cat testfile | nc 127.1 2389 // 客户端传输文件,或者如下
$ nc 127.1 2389 < testfile
$ tar -cvf -- DIR-NAME | nc -l 1567 // 打包目录
$ nc -n 172.1 1567 | tar -xvf -
$ tar -cvf -- DIR-NAME | bzip2 -z | nc -l 1567 // 同时进行压缩,减小带宽的使用
$ nc -n 172.1 1567 | bzip2 -d |tar -xvf -
加密传输
$ nc 127.1 1567 | mcrypt --flush --bare -F -q -d -m ecb > file.txt // 在此使用mcrypt工具加密数据
$ mcrypt --flush --bare -F -q -m ecb < file.txt | nc -l 1567
以上两个命令会提示需要密码,确保两端使用相同的密码,也可以使用其它任意加密工具。
视频流
虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用 netcat 。
$ cat video.avi | nc -l 1567
$ nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
克隆一个设备
如果已经安装配置一台 Linux 机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。
$ dd if=/dev/sda | nc -l 1567 // 假设系统在磁盘/dev/sda上
$ nc -n 172.1 1567 | dd of=/dev/sda // 复制到其它机器
如果已经做过分区并且只需要克隆 root 分区,可以根据系统 root 分区的位置,更改 sda 为 sda1,sda2 等等。
超时控制
多数情况我们不希望连接一直保持,那么我们可以使用 -w 参数来指定连接的空闲超时时间,该参数紧接一个数值,代表秒数,如果连接超过指定时间则连接会被终止。
$ nc -l 2389
$ nc -w 10 localhost 2389 // 该连接将在 10 秒后中断。
注意: 不要在服务器端同时使用 -w 和 -l 参数,因为 -w 参数将在服务器端无效果。
发送Unix Domain Socket
直接发送数据。
$ echo "show stat" | nc -U /usr/var/your.sock