Linux nc 命令用法收集

参数

想要连接到某处:

nc [-options] hostname port[s] [ports] …

绑定端口等待连接:

nc -l port [-options] [hostname] [port]

  • -g:设置路由器跃程通信网关,最多设置8个;
  • -G:设置来源路由指向器,其数值为4的倍数;
  • -i:设置时间间隔,以便传送信息及扫描通信端口;
  • -l:使用监听模式,监控传入的资料;
  • -n:直接使用ip地址,而不通过域名服务器;
  • -o:指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
  • -p:设置本地主机使用的通信端口;
  • -r:指定源端口和目的端口都进行随机的选择;
  • -s:设置本地主机送出数据包的IP地址;
  • -u:使用UDP传输协议;
  • -v:显示指令执行过程;
  • -w:设置等待连线的时间;
  • -z:使用0输入/输出模式,只在扫描通信端口时使用。

基础用法

连接到远程主机

$nc -nvv 192.168.x.x 80

连到 192.168.x.x 的 TCP 80端口.

监听本地主机

$nc -l 80

监听本机的 TCP 80 端口.

超时控制

多数情况我们不希望连接一直保持,那么我们可以使用 -w 参数来指定连接的空闲超时时间,该参数紧接一个秒数,如果连接超过指定时间则连接会被终止。

端口扫描

端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。

$nc -z -v -n 192.168.1.1 21-25
  • 可以运行在 TCP 或者 UDP 模式,默认是 TCP,-u 参数调整为 UDP;
  • -z 参数告诉 netcat 使用 0 IO,连接成功后立即关闭连接,不进行数据交换;
  • -v 参数指详细输出;
  • -n 参数告诉 netcat 不要使用 DNS 反向查询 IP 地址的域名。

以上命令会打印21到25 所有开放的端口。

$nc -v 127.0.0.1 22
localhost [127.0.0.1] 22 (ssh) open
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4

SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.4 为 Banner 信息。

Chat Server

Server

$nc -l 20000

netcat 命令在 20000 端口启动了一个 TCP 服务器,所有的标准输出和输入会输出到该端口。

Client

$nc 192.168.1.1 20000

不管你在机器 B 上键入什么都会出现在机器 A 上。

文件传输

Server

$nc -l 20000 < file.txt

Client

$nc -n 192.168.1.1 20000 > file.txt

目录传输

如果我们想要发送多个文件,或者整个目录,只需要使用压缩工具tar,压缩后发送压缩包。

Server 1

$tar -cvf – dir_name | nc -l 20000

Client 1

$nc -n 192.168.1.1 20000 | tar -xvf -

如果想要节省带宽传输压缩包,我们可以使用 bzip2 或者其他工具压缩。

Server 2

$tar -cvf – dir_name| bzip2 -z | nc -l 20000

Client 2

$nc -n 192.168.1.1 20000 | bzip2 -d |tar -xvf -

加密传输数据

如果你担心你在网络上发送数据的安全,你可以在发送你的数据之前用如 mcrypt 的工具加密。

Server

$nc localhost 20000 | mcrypt –flush –bare -F -q -d -m ecb > file.txt

Client

$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 20000

以上两个命令会提示需要密码,确保两端使用相同的密码;这里我们是使用mcrypt用来加密,使用其它任意加密工具都可以。

流视频

虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用 netcat,我们仍然有希望做成这件事。

Server

$cat video.avi | nc -l 20000

Client

$nc 192.168.1.1 20000 | mplayer -vo x11 -cache 3000 -

这里我们从 socket 中读入数据并重定向到 mplayer。

克隆一个设备

假如你的系统在磁盘 /dev/sda 上。

Server

$dd if=/dev/sda | nc -l 20000

Client

$nc -n 192.168.1.1 20000 | dd of=/dev/sda

打开一个 shell

如果没有安装 telnet 或者 ssh 命令,我们也可以使用 netcat 创建远程 shell(假设你的 netcat 支持 -c -e 参数)。

Server 1

$nc -l 20000 -e /bin/bash -i

Client 1

$nc 192.168.1.1 20000

假如 netcat 不支持 -c 或者 -e 参数(openbsd netcat),我们仍然能够创建远程 shell。

Server 2

$mkfifo /tmp/tmp_fifo
$cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 20000 > /tmp/tmp_fifo

这里我们创建了一个 fifo 文件,然后使用管道命令把这个 fifo 文件内容定向到 shell 2>&1 中用来重定向标准错误输出和标准输出,然后管道到 netcat 运行的端口 20000 上。

Client 2

$nc -n 192.168.1.1 20000

反向 shell

反向 shell 经常被用来绕过防火墙的限制,如阻止入站连接。例如我有一个专用 IP 地址为 192.168.1.1,我使用代理服务器连接到外部网络。如果我想从网络外部访问这台机器的 shell,那么可以使用反向 shell。

Server

$nc -l 20000

Client

$nc 192.168.1.1 20000 -e /bin/bash

指定源端口

假设你的防火墙过滤除 25 端口外其它所有端口,你需要使用 -p 选项指定源端口。

Server

$nc -l 20000

Client

$nc 192.168.1.1 20000 -p 25

使用 1024 以内的端口需要 root 权限;该命令将在客户端开启 25 端口用于通讯,否则将使用随机端口。

指定源地址

假设你的机器有多个地址,希望明确指定使用哪个地址用于外部数据通讯。我们可以在 netcat 中使用 -s 选项指定ip地址。

Server

$nc -u -l 20000 < file.txt

Client

$nc -u 192.168.1.1 20000 -s 172.31.100.5 > file.txt

静态 Web 页面服务器

while true; do
    nc -l 80 -q 1 < somepage.html;
done

模拟 HTTP Headers

$nc www.huanxiangwu.com 80
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser

HTTP/1.1 200 OK
Date: Tue, 16 Dec 2008 07:23:24 GMT
Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8
Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Cache-Control: private, post-check=0, pre-check=0, max-age=0
[......]

在 nc 命令后,输入请求部分的内容,然后按两次回车,即可从对方获得 HTTP Headers 内容。

禁止从标准输入中读取数据

该功能使用 -d 参数:

Server

$ nc -l 2389

Client

$ nc -d localhost 2389
Hi

你输入的 Hi 文本并不会送到服务器端。

强制服务器端保持启动状态

默认连接到服务器的客户端断开连接,那么服务器端也会跟着退出。我们可以通过 -k 参数来控制让服务器不会因为客户端的断开连接而退出。

Server

$ nc -k -l 2389

配置客户端不因为 EOF 退出

客户端可以通过 -q 参数来控制接收到 EOF 后隔多长时间才退出,该参数的单位是秒:

Client

$nc -q 5 localhost 2389

使用 SMTP 发邮件

$nc localhost 25 << EOF
HELO host.example.com
MAIL FROM: 
RCPT TO: 
DATA
Body of email.
.
QUIT
EOF

通过代理服务器连接

如下使用 10.2.3.4:8080 这个代理服务器连接到 host.example.com 的 42 端口。

$nc -x10.2.3.4:8080 -Xconnect host.example.com 42

使用 Unix Domain Socket

$nc -lU /var/tmp/dsocket