日常的工作中经常使用Nmap扫描机器,虽然能够记住nmap的各个扫描选项,但从没有研究过各个扫描之间的差异以及nmap在底层的一些实现机制。因此特意研究一下Nmap的官方文档,现对文档学习做一个简单的笔记,一是加深自己的理解,而是方便后期自己的复习。
Nmap扫描的解析过程
Nmap扫描过程可以分为不同的阶段。执行扫描时,nmap完成一个阶段的扫描后才会进入下一个扫描阶段,每个扫描阶段完成不通的功能,根据需求,也可以跳过一些扫描阶段。Nmap的扫描过程大致分为如下几个阶段:
预扫描脚本
当使用nmap进行扫描时,指定了使用脚本的选项,如--script
或-sC
才会进入该阶段。在该阶段中执行的脚本是单个nmap实例执行的脚本,而不是针对每个扫描目标均执行的脚本。-A
选项中包含-sC
选项,即使用了-A
选项会启动脚本扫描。
目标枚举
在该阶段nmap将用户输入的目标解析成IP的形式,然后进行下一步的深度扫描。该步骤不可省略。
主机发现
网络中只有在线的主机才值得深入调查,发现在线主机的过程被称为主机发现或者PING 扫描。Nmap有许多种发现主机的方法,如ARP请求、TCP/ICMP及其它类型数据帧结合起来的扫描。
Nmap在主机发现过程当中并不只采用ARP或ICMP协议,还会对常见的一些端口进行TCP连接。
反向DNS解析
nmap会对输入的IP地址做反向域名解析,解析出绑定该IP的域名,从而协助判断该主机的作用。通过–dns-servers server1,server2…选项指定反向解析IP的DNS服务器。
端口扫描
Nmap实现的主要功能,Nmap主要是利用实现了不通协议的探测帧探测目标主机对应的端口,然后根据端口的响应帧判断端口所处的状态:open,closed,filtered等。
版本检测
如果Nmap检测到某个端口处于开启状态,那么Nmap会继续向该端口发送探测帧,并根据其响应与数据库中6500多个已知服务指纹进行匹配。
系统检测
不同的操作系统实现的网络标准会略有不同。Nmap通过向目标主机发送探测帧,然后与数据库中已知的指纹进行匹配,从而获取目标主机的系统信息。
路由追踪
Nmap还实现一套优化后的路由追踪实现,通过--traceroute
选项开启路由追踪功能。
脚本扫描
除了前面提到的预扫描与后扫描脚本,Nmap的大多数脚本都是在这个阶段运行的。Nmap内置了一个lua语言的脚本引擎及用于收集网络信息的标准库。
输出
根据不通的选项,Nmap支持不同的输出格式。
后扫描脚本
当Nmap扫描完毕并输出结果之后,这个阶段的脚本可以处理扫描的结果形成报告并进行统计。Nmap在该阶段并未有任何提前预置的脚本,因此需要用户自己添加。