主动扫描与被扫描目标有一个互动的过程,目标是可能知道自己在被扫描的;主动扫描一般都是针对目标发送特制的数据包,然后根据目标主机的反应来获得一些信息,帮助我们过滤无意义的主机,建立目标的网络拓扑,主要功能包括:
1. 目标主机是否在线
2. 目标主机的制定端口是否开放
3. 目标主机的操作系统
4. 目标主机上运行的服务等
kali里最优秀的主动扫描工具一定是nmap,nmap最早开发出来就是用来扫描端口的,后来功能慢慢增加,现在也能够通过调用脚本扫描一些漏洞
如果不加任何参数只打命令nmap的话,可以看到nmap的参数使用说明 。包括几大类:
- 主机发现 HOST DISCOVERY
- 扫描技术(方式)SCAN TECHNIQUES
- 端口规格和扫描顺序 PORT SPECIFICATION AND SCAN ORDER
- 服务/版本检测 SERVICE/VERSION DETECTION
- 脚本扫描 SCRIPT SCAN
- 操作系统检测 OS DETECTION
- TIMING AND PERFORMANCE
- FIREWALL/IDS EVASION AND SPOOFING
- 输出 OUTPUT
- 杂项 MISC
- 示例 EXAMPLES
最简单的命令: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网络中会影响扫描结果。【经抓包试验,-PU不是进行udp扫描,还是进行类似-PS的扫描】
-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种不同的状态:
- open——在该端口有应用程序接收TCP连接或者UDP报文。
- closed——closed并不意味着没有任何反应,状态为closed的端口是可访问的,这种端口可以接收nmap探测报文并做出响应。只是没有应用程序在open上监听。
- filtered——存在目标网络数据包过滤,导致nmap无法确定该端口是否开放。
- unfiltered——表明目标端口是可以访问的,但是nmap却无法判断它到底是open还是closed的。
- open|filtered——无法确定端口是开放的还是被过滤了。
- closed|filtered——无法确定端口是关闭的还是被过滤了。
-sT 执行了完整的三次握手 nmap -sT -p 443 www.baidu.com
-sU 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.最后进行版本识别:发送探针报文,根据得到的返回报文信息分析得出服务版本。
可以使用以下选项打开和控制版本检测:
- -sV——进行版本探测
- --allports——不为版本探测排除任何端口。nmap在进行版本探测时不会对目标的全部端口进行扫描,而是会跳过一些端口,如果确实有必要的话,可以使用这个参数来扫描所有的端口
- --version-intensity [数字]——设置版本扫描强度,数值越高,服务越有可能被正确设别。然而,高强度扫描花更多的时间。强度值必须在0~9之间,默认值为7
- --version-light——打开轻量级模式,相当于--version-intensity 2
- --version-all——尝试每个探测,相当于--version-intensity 9
- --version-trace——跟踪版本扫描活动,打印出关于正在进行的扫描的详细调试信息
- -sR——RPC扫描,判断端口是否为RPC端口,是则可以确定版本号
【输出】: -oX [存放路径和文件名] //将结果输出到指定路径下的XML文件
【脚本功能】 nmap通过NSE脚本,扩展了其漏洞扫描的能力。脚本存放于nmap目录下的scripts目录里。可以到官网下载更新的脚本
- nmap -p 80,443 --script http-methods [目标] #通过使用脚本的名字来调用脚本
- nmap --script safe,discovery [目标] #使用种类的名字来调用一个分类中的全部脚本
- nmap --script /Nmap/scripts/banner.NSE [目标] #使用指定路径的方式来执行NSE脚本
- nmap --script /NSE/user-defined/ [目标] #执行文件夹中的全部脚本
- nmap -sV --script "not exploit" [目标] #使用除了exploit分类意外的所有脚本对目标进行检测
- nmap --script "snmp-*" [目标] #使用所有与SNMP相关的脚本
例子: 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命令。可以使用此选项进行扫描