主动扫描与被扫描目标有一个互动的过程,目标是可能知道自己在被扫描的;主动扫描一般都是针对目标发送特制的数据包,然后根据目标主机的反应来获得一些信息,帮助我们过滤无意义的主机,建立目标的网络拓扑,主要功能包括:
1. 目标主机是否在线
2. 目标主机的制定端口是否开放
3. 目标主机的操作系统
4. 目标主机上运行的服务等
kali里最优秀的主动扫描工具一定是nmap,nmap最早开发出来就是用来扫描端口的,后来功能慢慢增加,现在也能够通过调用脚本扫描一些漏洞
如果不加任何只打命令nmap的话,可以看到nmap的参数使用说明 。包括几大类:
最简单的命令:nmap [目标IP] :扫描目标IP,返回主机活动状态以及常见的1000个端口状态及对应的默认服务。多个扫描目标时,IP地址可以不连续形如192.168.100.1 192.168.100.2 192.168.100.5,IP之间以空格间隔,也可以是一段形如192.168.100.1-100,还可以使用CIDR形如192.168.100.0/24
-sn ping scan and disable port scan 此参数只执行ping操作,主要用于主机发现
-P及由-P延伸出的其他组合参数主要是用来进行“【主机发现】”。
进行主机发现时,nmap发送信息报,然后根据是否获得被测主机的响应报来识别,那么可以利用arp协议,ICMP协议以及TCP等支持回应的协议来进行探测。
扫描同一网段的时候,默认都是使用ARP扫描(即与参数-PR等同,可以在kali里打开wireshark,然后ping 192.168.100.0/24 -sn 查看具体的数据包情况)
网络层适合用于扫描的主要是ICMP协议,ICMP有查询和查错两种功能,NMAP利用了ICMP协议的查询功能(分为回送请求应答 -PE、时间戳应答 -PP、掩码地址请求应答 -PM)。需要注意的是,NMAP在执行扫描的时候能用arp的就会采用arp,也就是说如果使用nmap -PE命令时,后面的目标应该是不同网段的,这样抓包的时候才能抓到ICMP包。
传输层的TCP/UDP都可以用于扫描。主要是利用SYN包和ACK包,常用参数如下
-PS/PA/PU [portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
从上图可以看出,执行SYN扫描时,扫描主机向被侦测主机发送一个SYN数据包,然后被测主机回一个SYN/ACK包,然后扫描主机不会回ACK包,而是回一个RST包,中断连接
从上图可以看出,执行ACK扫描时,扫描主机向被侦测主机发送一个ACK数据包,被测主机因为没找到对应的SYN包,就会回一个RST包。
UDP扫描是通过发送UDP数据包到目标主机并等待响应,来判断目标端口是否开放。如果目标返回ICMP不可达的错误(类型3,代码3),则说明端口是关闭的;如果得到正确的或适当的响应,则说明端口是开放的。
-PU:扫描只会对目标进行UDP Ping扫描。这种类型的扫描会发送UDP包来获得一个响应。注意:使用UDP Ping扫描方式,在NAT网络中会影响扫描结果。
-sU表示这种扫描技术是用来寻址目标主机打开的UDP端口。它不需要发送任何的SYN包,因为这种技术是针对UDP端口的。UDP扫描发送UDP数据包到目标主机,并等待响应。如果返回ICMP不可达的错误消息,说明端口是关闭的;如果得到正确的或适当的回应,则说明端口是开放的。
【端口扫描】端口扫描的参数是-s以及由-s延伸出的其他组合参数,如-sS -sT -sA -sF -sN -sU等等
-sS是默认参数,即nmap不带任何参数时采用的就是-sS
例如: nmap -sS -p 443 www.baidu.com
-sS(SYN) -sA(ACK) -sF(FIN) 均是发送不完整的握手包
-sS俗称半开扫描。由于三次握手就没有完成,无法建立正常的TCP连接,因此这次扫描不会被记录到系统日志中。SYN扫描是nmap所采用的默认扫描方式,扫描速度极快,可以在一秒钟扫描上千个端口,也不容易被网络中的安全设备发现。
-sF FIN扫描方式是向目标端口发送一个FIN数据包,对于所有关闭的端口,目标系统应该返回RST标志,经常被用来探测防火墙。
-sN NULL扫描方式是向目标端口发送一个不包含任何标志的数据包,对于所有关闭的端口,目标系统应该返回RST标志。
nmap中对于端口给出了6种不同的状态:
-sT 执行了完整的三次握手 nmap -sT -p 443 www.baidu.com
-sU udp端口扫描 ,UDP扫描的速度是相当慢的,也不可靠
其他一些常用的扫描端口的命令:
nmap -F [目标IP] //扫描常见的100个端口
nmap -p [端口号] [目标IP] //指定某一个端口
nmap -p "*" //扫描所有端口
nmap --top-ports [number] [目标] //扫描常用端口
nmap -p U:[UDP ports],T:[TCP ports] [目标] //使用协议指定扫描端口
【操作系统扫描】
-O: Enable OS detection
--osscan-limit: Limit OS detection to promising targets //将操作系统检测限制在有希望的目标上
--osscan-guess: Guess OS more aggressively //更积极地猜测操作系统
后面这两个参数要有效,命令里必须有-O参数
nmap安装目录下有一个nmap-os.db的文件(可用记事本打开),里面存放了已收集到的各种操作系统的指纹。
nmap在执行操作系统扫描时会发送“探针”,然后根据回复的数据包与文件进行比对,从而猜测出目标主机的操作系统。同一个windows操作系统有很多版本,有很多不同的补丁,不同的语言,安装不同的软件,这些都会造成猜测无法很准确
【服务扫描】 -sV
使用nmap [目标IP]、nmap -sV [目标IP] 两种扫描出现的端口对应的服务版本有可能不一样。因为前者使用了nmap-services数据库(在namp安装目录下)中常用的端口-服务,可能并不是正在该端口监听的服务(服务的端口可能被改了);而使用-sV之后,才是真正的对目标服务进行了扫描。服务探针则存放于nmap-probes数据库里(在namp安装目录下)。
进行服务发现的顺序:
1.首先进行端口扫描:默认情况下使用SYN扫描。
2.其次进行服务识别:发送探针报文,根据得到的返回确认值确认服务。
3.最后进行版本识别:发送探针报文,根据得到的返回报文信息分析得出服务版本。
可以使用以下选项打开和控制版本检测:
【输出】: -oX [存放路径和文件名] //将结果输出到指定路径下的XML文件
【脚本功能】 nmap通过NSE脚本,扩展了其漏洞扫描的能力。脚本存放于nmap目录下的scripts目录里。可以到官网下载更新的脚本
例子: nmap --script ftp-vsftpd-backdoor 192.168.107.130
这里显示了该漏洞存在以及对应的CVE编号
脚本扫描常用命令:
nmap --script=auth [目标IP] //弱口令扫描
nmap --script=vuln [目标IP] //扫描常见漏洞
nmap --script=ftp-brute.nse [目标IP] //扫描弱口令账号,但是所用字典很小
nmap -p 80 --script=http-enum.nse ip //扫描WEB敏感目录
其他常用参数:
-T4 //针对TCP端口禁止动态扫描延迟超过10ms
-iL //读取主机列表,例如,“nmap -iL d:\ip.txt”
-A //全面系统检测、启用脚本检测、扫描等
-v // 显示扫描过程,推荐使用
-Pn //有些防火墙禁止ping命令。可以使用此选项进行扫描