Nmap源码分析(端口扫描)

本文介绍了Nmap端口扫描的实现框架,包括文件组织、核心类分析和代码流程,重点讲解了UltraScanInfo、GroupScanStats、HostScanStats和UltraProbe类的作用,并简述了端口扫描原理和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nmap源码分析(端口扫描)

2012年8月19日

  端口扫描是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    端口扫描用法

扫描方式指定选项

-sS/sT/sA/sW/sM:指定使用 TCPSYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。

-sU: 指定使用UDP扫描方式确定目标主机的UDP端口状况。 

-sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。

--scanflags <flags>: 定制TCP包的flags。

-sI <zombiehost[:probeport]>: 指定使用idle scan方式来扫描目标主机(前提需要找到合适的zombie host)

-sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况。

-sO: 使用IP protocol 扫描确定目标机支持的协议类型。

-b <FTP relay host>: 使用FTP bounce scan扫描方式
端口指定选项
-p <port ranges>: 扫描指定的端口

实例:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T代表TCP协议、U代表UDP协议、S代表SCTP协议)

-F: Fast mode – 快速模式,仅扫描TOP 100的端口

-r: 不进行端口随机打乱的操作(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫描不易被对方防火墙检测到)。

--top-ports <number>:扫描开放概率最高的number个端口(nmap的作者曾经做过大规模地互联网扫描,以此统计出网络上各种端口可能开放的概率。以此排列出最有可能开放端口的列表,具体可以参见文件:nmap-services。默认情况下,nmap会扫描最有可能的1000个TCP端口)

--port-ratio <ratio>: 扫描指定频率以上的端口。与上述--top-ports类似,这里以概率作为参数,让概率大于--port-ratio的端口才被扫描。显然参数必须在在0到1之间,具体范围概率情况可以查看nmap-services文件。
 

详细端口扫描用法介绍

官方手册:http://nmap.org/book/man-port-scanning-techniques.html



2     实现框架

### Nmap 实现全端口扫描源码分析 Nmap 是一款功能强大的网络扫描工具,其核心功能之一是能够执行全端口扫描。以下是关于如何找到并理解 Nmap 的全端口扫描实现的相关信息。 #### GitHub 上的 Nmap 源码仓库 Nmap 的官方源码托管在 GitHub 上,可以通过访问以下链接获取完整的项目代码[^2]: ```plaintext https://github.com/nmap/nmap ``` 该存储库包含了 Nmap 所有版本的源码以及详细的文档说明。要了解全端口扫描的具体实现逻辑,可以重点查看以下几个文件夹中的内容: - `nmap/service_scan.cc`:此文件定义了许多服务探测的核心函数。 - `nmap/targets.cc` 和 `targets.h`:这些文件处理目标主机和端口的选择机制。 - `nmap/portlist.cc` 和 `portlist.h`:用于管理端口列表及其状态。 #### 全端口扫描的关键部分 全端口扫描通常涉及遍历所有可能的 TCP 或 UDP 端口号 (0 到 65535),并通过特定协议发送数据包来检测开放情况。具体来说,在 Nmap 中,这种行为由以下组件控制: 1. **Port Specification Parsing**: 用户输入的目标端口范围会被解析成内部结构体表示形式。这部分主要位于 `nmap/scan_engine.cc` 文件中[^3]。 2. **Scanning Engine Logic**: 主循环负责依次尝试连接到指定范围内每一个端口,并记录响应结果。这一步骤依赖于 libpcap 库或其他底层套接字操作完成实际的数据传输任务[^4]。 3. **Output Generation**: 最终生成报告展示哪些端口处于监听状态以及其他相关信息,则是在多个地方共同协作下产生的成果,比如 `output.cc` 负责格式化输出字符串给终端显示出来。 下面是一个简单的伪代码片段用来描述上述过程的一部分工作原理: ```cpp for(int port=0; port<=65535; ++port){ if(is_port_open(target_ip, port)){ add_to_result(port); } } print_results(); ``` 以上仅为示意性质并不代表真实代码细节,请参照官方发布的最新版源程序以获得最精确的信息。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值