0,功能介绍,-h
1,端口扫描
2,获取网站banner
3,传输文本信息
4,传输文件和目录
5,加密传输文件
6,远程克隆硬盘 远程电子取证
7,远程控制(正反向shell)
8,新版nc和ncat简析(调整系统命令的默认值)
netcat简称nc,著有网络安全界的“瑞士军刀”美称,因其体量小(传统版nc安装包才区区23KB),然而功能强大,具有网络测试工作中所包含的多种可组合功能,然而后来的nmap下的ncat继续完善nc的工作,被誉为“21世纪的瑞士军刀”。
nc -h
连接到某处:nc [-options]主机名端口[s] [端口] ...
侦听入站:nc -l -p端口[-options] [主机名] [端口]
选项:
-c shell命令为-e;使用/ bin / sh来执行[危险!!!
-e文件名程序在连接后执行[危险!!]
-b允许广播
-g网关源路由跳跃点,最多8个
-G num源路由指针:4、8、12,...
-h这个杂物
-i秒发送线路,扫描端口的延迟间隔
-k在套接字上设置keepalive选项
-l侦听模式,用于入站连接
-n仅数字的IP地址,无DNS
-o文件流量的十六进制转储
-p端口本地端口号
-r随机化本地和远程端口
-q秒在标准输入法上发生EOF之后退出并延迟了几秒
-s addr本地源地址
-T tos set服务类型
-t回答TELNET协商
-u UDP模式
-v verbose [使用两次会更详细]
-w秒超时,用于连接和最终网络读取
-C发送CRLF作为行尾
-z零I / O模式[用于扫描]
端口号可以是单个的或范围内的:lo-hi(含);
端口名称中的连字符必须以反斜杠转义(例如'ftp \ -data')。
其中常用的参数有 n v z l p q c
nc 用来进行端口扫描的命令是 nc -nvz ip 地址 端口号,z 参数翻译过来就是不进行 i/o,用来扫描。意思就是仅仅是去 ping 去探测目标是否开启指定端口,不进行任何的交互。
测试平台 :KaliLinux 2020.01 Ubuntu 18.04.4
z 参数默认扫描的是 tcp 类型,如果需要扫描 udp,则需要使用一个新参数 u。
我在Ubuntu上开了一个Apache2的网站同时xshell连接,所以在1-100之间就是这两个端口是开放的
网站的banner就是网站开启某对外服务是在该服务的端口上所添加的 “ 欢迎类信息 ” ,之前是通过Telnet进行扫描,后来渐渐被ssh替代了。ssh和nc一样都是使用明文传输,只要数据包被拦截下来就完蛋。所以之后都逐渐被ncat取代,ncat后面会介绍,其是使用加密传输。
命令格式是 nc -nv ip port;根据返回的信息可以判断网站某端口运行服务的欢迎信息
nc可以实现在两台机器之间相互传递信息,首先要其中一台机器开启监听一个端口,另一台机器便可以通过访问这个端口,来实现两台机器间的无缝传输信息:
在两个机器上面同时敲下的字符会同时显示在两端的屏幕上,非常有意思
这种相互传输信息和渗透之间的关系是,电子取证的时候可以用。当机器被攻击后,为了不破坏现场,需要提出大量的信息和文件出来做分析,这时候可以用 nc 的这个机制,例如,需要一个命令的输出信息,首先在一台机器上监听一个端口,随后在被攻击的机器上执行相关的命令,然后以管道给 nc,指定另一台的地址和端口,这样输出结果就会到另一端:
此时,另一端的控制台上就会出现被控制方的ll命令的结果:
我们还可以将控制台上的命令输送至txt文本文件中:
作为文件传输和目录这些功能,其实和文本信息传输类似,只不过是把文本信息换成了文件和目录。首先用一台机器监听一个端口,如果有人连接并传来信息时,则将信息使用 > 重定向到文件。另一台机器连接目标指定端口然后通过 < 输出要传送的文件即可。
其中需要说明一下的是这两个符号 : < >
我们这边可以吧端口参数想象成一个文件传输程序的 “ 接口 ”,吧需要发送的文件指向( < )这个接口,接受到的文件重新命名文件格式和名称地址,从这个接口引出来 ( > )
同理,两端都可以发送和接收,但是nc的传输都是单双工类型的数据交换
要是需要传送目录的话,只需将目录压缩(tar,zip,rar)即可进行传输
加密传输文件需要使用 mcrypt 库,linux 系统默认是没有安装的,需要手动安装:
随后和传输文件类似,只需要在传输文件时使用 mcrypt 加密即可:
先设置监听端服务器:
然后配置发送端服务器:
mcrypt --flush -Fbq -a rijndael-256 -m ecb < 痛仰乐队\ -\ Rosemary.mp3 | nc -nv 192.168.1.137 666
再输入完配置信息以后,会有提示输入密码,需要连续输入两次,发送端的密码输入完成以后,接收端才会出现密码输入框:
命令用到的参数有,--flush 立即冲洗输出,-F 输出数据,-b 不保留算法信息,-q 关闭一些非严重的警告,-d 解密
rijndael-256 代表的是加密方式有256,128,和512三种,分别对应的应该是sh系列hash加密算法(我猜的)
传输过程可能较长,需要耐心等待......
对于远程克隆硬盘,在远程电子取证时可以用,使用方法需要借助 dd 命令,首先通过 nc 监听一个端口,然后通过 dd 指定要克隆的分区,dd 的 of 参数相当于一个复制功能,然后再另一台机器通过 nc 连接此端口,dd 的 if 参数相当于粘贴的命令。格式如下:
nc -lp 6666 | dd of=/dev/sda
dd if=/dev/sda | nc -nv 192.168.228.128 6666 -q 1
他的控制原理很简单,只不过传输的信息是bash信息,windows就是cmd;用法也很简单,只要在末尾加上 -c bash就可以了:
然后神奇的事情就发生了:在控制端下,居然就直接获取了被控制端(首先打开监听端口的那一方)的shell?!
相当于打开端口时候shell的权限
软件都装上了.....
总结:正向 shell 是服务器开启一个端口指定 shell 让别人来连。但出于防火墙原因,一般都连不上。这时需要用反向 shell,让目标服务器指定 shell 后来连接自己。
这里会涉及到一个很典型的服务器端漏洞:反弹shell漏洞,等我什么时候研究清楚了一定会写一个总结博客,把整个实现原理田里去洗的阐述一遍
其中有一些朋友在一开始就会发现,自己的 nc -h 命令为什么和我的不一样??
这是因为,默认情况下,centos和kali默认安装传统版本的nc,然而Ubuntu一直是默认带有新版的nc,其中新版和老版的nc命令也是相差不少,可以安装自己需要的版本:
其中第一个是新版,第二个是老板,再咋UN过完新老两个版本之后,需要去系统的命令配置里面修改一下 “ nc ”这个命令调用的到底是哪个版本的nc:
sudo update-alternatives --config nc
即可选择
nc 也有不足之处,首先就是明文传输,可能会被嗅探。其次对于反向 shell,如果其他人通过网络扫描发现了这个端口,也就意味着任何人都可以去监听这个端口进行连接,缺乏身份验证功能。想使用ncat首先需要安装nmap;
ncat 则弥补了这些缺点,ncat 不是 linux 系统自带的命令,而是 nmap 中的。ncat 中很多参数和 nc 一样,其中可以通过 --alow 参数来指定允许连接的机器,通过 --ssl 进行数据的加密