端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。
1 简单回顾
首先简要回顾一下端口扫描的原理以及命令行选项。
1.1 扫描原理
Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port unreachable/ UDP recv_from, IP protocol,SCTPINIT/SCTP COOKIE ECHO等扫描方式。原理是基于网络数据包的特征或者网络编程API来判定端口的状态。例如,以TCP SYN方式(Nmap的默认的TCP扫描方式)为例来简单地回顾端口扫描原理。
TCP SYN探测到端口关闭:
TCP SYN探测到端口开放:
更多扫描原理的细节,请参考电子书:Secrets of NetworkCartography
1.2 端口扫描用法
扫描方式指定选项
端口指定选项详细端口扫描用法介绍
官方手册:http://nmap.org/book/man-port-scanning-techniques.html
2 实现框架
下面我们从端口扫描部分的文件组织、核心类介绍与代码流程框架三个角度来整体把握其要点。
2.1 文件组织
scan_engine.cc/scan_engine.h
Nmap的端口扫描功能主要在scan_engine.h/scan_engine.cc中实现,其中scan_engine.cc为C++文件,共有6000多行代码(目前版本Nmap6.0)。实现端口扫描所需的基础类及调用接口。
nmap-services
端口扫描功能会用到nmap-services数据库文件,此文件描述互联网上常见的注册端口对应的服务名称,以及该端口开放的频率和注释信息。端口开放的频率是Nmap项目组对互联网上大量的计算机进行扫描,统计出的每个端口开放的概率值,所以根据此概率可以很方便指定扫描覆盖的范围。例如,使用--top-ports 3000,可以让Nmap扫描概率排名前3000的端口;使用--port-ratio 0.001,可以让Nmap扫描开放概率在0.001以上的所有端口。
2.2 核心类分析
Nmap端口扫描部分涉及到多个Class,这些类将端口扫描过程中涉及到各种数据及接口有效地管理起来。
2.2.1 UltraScanInfo
UltraScanInfo是统一管理端口扫描过程信息的类。该类的对象主要用在ultra_scan()函数中。下面简要列举UltraScanInfo类中的关键点:
- 执行的扫描类型详细信息(如TCP SYN/UDP/ARP