本文偏技术细节,网络扫描工具中最著名的非Nmap莫属,在作者看来Nmap是个好用并且有学习价值的工具,否则也不会从1997年出现至今经久不衰。作为开源软件,凝结了大量安全研究人员的努力,无论是代码结构上的设计还是细节处每一个建立在对网络协议深刻理解的完备考虑,都有一定程度工程和学习的指导意义。
本系列文章来自作者对Nmap源码改造移植后整理出的学习笔记。Nmap系列分为多个章节,本篇是第1篇总述性文章。后续章节展开几个较有价值的模块。
本文面向对Nmap有高级用法的读者。例如
-
不改变Nmap功能,集成Nmap到自己的工程中,需要简单改造Nmap的输入输出,例如使用管道进行进程间通信。而不是解析Nmap的结果XML文件。
-
不改变Nmap功能,将Nmap编译成lib库,需要修改Nmap源码。
-
抽取部分功能模块,开发自己的网络端口扫描器,需要梳理Nmap的代码模块结构。
-
功能扩展,例如网络空间拓扑结构测绘,改造nse模块作为漏洞扫描模块的基础。
Nmap扫描流程原理图
-
参数初始化。解析命令行参数到全局数据结构·NmapOps·
-
基本库初始化。初始化网络,例如 WinSock 的初始化。
-
延迟参数初始化。对具有前置依赖的参数进行参数校验检查并放入延迟选项结构`delayed_options`中。
-
包含延迟参数。script_timeout,max_rtt_timeout,exclude_file, exclude_spec,raw_scan_opt,iflist,host_timeout
- 参数合并。例如 osscan 和 traceroute 需要 -A(高级扫描)和 --privilege(权限)条件。max-rtt 和hostgroup 等参数需要按照用户单独指定和性能模板(-T)参数共同的结果。osscan 开启后读取 nmap-os-db 文件。
- 冲突参数验证。例如 portlist (-p 指定参数)和 fastscan(-sP ping扫描开启)冲突。noportscan 和 -sT/sU/sS 等端口扫描参数冲突。
- 调试参数 route-dst 验证。
- 端口列表初始化。按协议分别初始化TCP,UDP,STCP 的全局端口列表。同时对常用端口移到列表的前面来加速查询。同时做列表随机化排列(只针对 TCP端口列表)。
- NSE引擎加载& Lua 预扫描。
- 决定当前扫描组大小。将命令行指定的待扫描地址空间划分为若干主机组,组内的机器一般具有同质化属性,例如在相同网段。每次开始主机组扫描时都会根据全局命令行参数和当前已扫描状态,计算一次当前主机组的大小(groupsize),算法如下。
- 如果是 UDP 或 SCTP,则 groupsize = 128
- 如果是 TCP,则取 Max(1024/端口数量, 64)
- 如果端口数量 > 1000,且时间参数要求较快
- 为了能在扫描初期尽快有扫描结果,会对 groupsize 进行减半操作
- 使用指定的 box 操作限制 groupsize
- 获取下一个机器。获取下一个扫描地址的算法如下。
- 若当前批次缓存中还有,则取出
- 若无,则取出 "上一轮被推迟" 的地址
- 若数量不够,则解析下一个命令行的地址表达式
- 判断该地址是否应该放入到下一批次(target_needs_new_hostgroup)
- 对该组机器,排序随机化
- 对该组机器,进行 arping 或 ping 发现。这部分属于初始存活预扫
- 记录存活主机数量,打印出主机存活日志
- 设置 raw 扫描的源 IP 地址
- 端口扫描。核心函数名为·ultra_scan·,支持多种scan type。具体功能请参见后续专门章节。
- 操作系统扫描。核心函数名为·osscan·。具体功能请参见后续专门章节。
- 进入路由跟踪扫描。
- 进入脚本扫描流程。
微信逆向解密聊天记录[附详细步骤]
原文始发于微信公众号(青木生长):网络安全对抗演练,扫描器 Nmap 原理概述(源码视角)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论