任何网络侦察任务的第一步就是将一组IP范围缩减为一组活动的主机,因为最初我们锁定的IP地址范围往往要比实际需要深入扫描的目标数大得多。而且,扫描每一个IP地址的每一个端口这个过程既慢也没必要。至于我们需要关注什么样的主机,这取决于我们的扫描目的。网络管理员可能只对运行某项服务的主机感兴趣,安全审计人员则对每个具有IP地址的设备都感兴趣。管理员可能仅使用ICMP ping就能在自己的内部网络上定位主机,而外部***测试人员可能会使用数十种探针来逃避防火墙的限制。
由于主机发现需求是如此多样,因此Nmap提供了多种用于自定义的技术选项。有时候主机发现也被称作ping扫描,但这远远超出了与无处不在的ping工具关联的简单ICMP回显请求数据包。我们可以使用列表扫描(-sL)或禁用ping(-Pn)来完全跳过ping,也可以通过任意组合多个端口和TCP SYN/ACK,UDP,SCTP INIT和ICMP探针扫描网络。这些探针的目的是探测某个IP地址实际上处于活动状态的响应,也就是某个IP地址正在被主机或网络设备使用。在很多网络中,一段时间内一般只有很少比例的IP地址处于活动状态,尤其是在私有地址空间过大的网络中这种情况更加常见,例如:10.0.0.8/8,这个网络内包括了超过16000000个IP地址,但有的公司在网络内的设备还没超过1000台。主机发现可以在稀疏分配的IP地址中找到这些机器。
如果不设置任何主机发现的选项,Nmap会向端口443发送ICMP回显请求和TCP SYN数据包,向端口80发送TCP ACK数据包以及ICMP时间戳请求(对于IPv6,将忽略ICMP时间戳记请求,因为它不是ICMPv6的一部分)。这些默认的选项相当于-PE -PS433 -PA80 -PP选项。ARP(用于IPv4)和邻居发现(用于IPv6)扫描例外,因为它们会自动扫描本地以太网上的任何目标。对于非特权Unix Shell用户,默认探针是使用connect系统调用到达端口80和443的SYN数据包。如果你只是扫描本地网络,主机发现的默认选项就足够了,但是如果要进行安全审计则建议使用更全面的探针集。
-P*选项可以组合使用。你可以使用不同的TCP端口、标志位和ICMP代码组合的探针来提高穿透防火墙的几率。还要注意,即使你指定其他-P*选项,默认情况下也会针对本地以太网上的目标执行ARP扫描和邻居发现,因为它们一般更加快速有效。
默认情况下,Nmap会进行主机发现,然后对它确定在线的每个主机执行端口扫描。即使指定了非默认主机发现类型,例如:UDP探针(-PU),也是如此。我们使用-sn选项可以仅执行主机发现;使用-Pn选项可以跳过主机发现,直接对所有主机进行端口扫描。我们会在后面的部分详细介绍有关控制选项的内容。