Neurohazard
暮雲煙月,皓首窮經;森羅萬象,如是我聞。

Nmap 扫描的基本原理

wpadmin~June 1, 2018 /InfoSec

本文核心思想:
1 推荐观看 Nmap 作者在 Black Hat/Defcon 的几个演讲
2 关于 Nmap 扫描详细原理的一些基本介绍
3 一些常用的 Nmap 命令介绍
4 提供一个基于 python-libnmap 的内网资产发现脚本

关键字

内网巡检 / 主机发现 (Host Discovery) / 扫描式资产发现 / 与运维 CMDB 联动

一些文件

nmap-os-db
nmap-services
nmap-service-probes

Nmap 参考资料

Web 安全学习笔记之 Nmap 扫描原理与用法
https://www.cnblogs.com/JetpropelledSnake/p/9119620.html

Nmap 扫描原理与用法
https://github.com/erasin/notes/blob/master/linux/safe/nmap.md

Nmap 扫描原理与用法
https://blog.csdn.net/aspirationflow/article/details/7694274

DevSecOps的理解与思考
http://www.freebuf.com/column/145722.html

分享 | 宜人贷安全建设之端口监控服务篇
https://note.youdao.com/share/?id=f023119bb0ce6adb3048f27e0e92b9c0&type=note#/

Nmap 扫描原理

主机发现原理

默认情况下,Nmap 会发送四种不同类型的数据包来探测目标主机是否在线。

  1. ICMP echo request
  2. TCP SYN packet to port 443
  3. TCP ACK packet to port 80
  4. ICMP timestamp request

依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。

注意, 如果目标处于局域网中,不论用户是否指定了”主机发现选项”, Nmap 始终会使用 ARP 协议去检测主机在线状态

The -P* options (which select ping types) can be combined. You can increase your odds of penetrating strict firewalls by sending many probe types using different TCP ports/flags and ICMP codes. Also note that ARP/Neighbor Discovery (-PR) is done by default against targets on a local ethernet network even if you specify other -P* options, because it is almost always faster and more effective.

端口扫描原理

Nmap 端口扫描简介

端口扫描是 Nmap 最基本最核心的功能,用于确定目标主机的TCP/UDP端口的开放情况。
默认情况下,Nmap 会扫描 1000个 最有可能开放的TCP端口。

Nmap通过探测将端口划分为6个状态:

  1. open:端口是开放的。
  2. closed:端口是关闭的。
  3. filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态。
  4. unfiltered:端口没有被屏蔽,但是否开放需要进一步确定。
  5. open|filtered:端口是开放的或被屏蔽。
  6. closed|filtered :端口是关闭的或被屏蔽。

扫描类型

详细原理 参考 JetpropelledSnake 2.3.1
https://nmap.org/book/man.html
https://nmap.org/book/man-port-scanning-basics.html

  1. TCP SYN scanning
  2. TCP connect scanning
  3. TCP ACK scanning
  4. TCP FIN/Xmas/NULL scanning (Stealthy Scan / 隐秘扫描)
  5. UDP scanning

其他扫描方式简介

除上述几种常用的方式之外, Nmap 还支持多种其他探测方式。

例如使用 SCTP INIT/COOKIE-ECHO 方式来探测 SCTP 的端口开放情况;
使用 IP protocol 方式来探测目标主机支持的协议类型(TCP/UDP/ICMP/SCTP等等);
使用 idle scan方式借助僵尸主机(zombie host,也被称为idle host,该主机处于空闲状态并且它的IPID方式为递增,来扫描目标在主机,达到隐蔽自己的目的。(详细实现原理参见:http://nmap.org/book/idlescan.html))
或者使用 FTP bounce scan,借助FTP允许的代理服务扫描其他的主机,同样达到隐藏自己的身份的目的。

Note 隐蔽扫描

idle scan
FTP bounce scan
TCP FIN/Xmas/NULL scanning

服务版本侦测

版本侦测,用于确定目标主机开放端口上运行的具体的应用程序及版本信息。

Nmap 提供的版本侦测具有如下的优点:

服务版本侦测基本原理

更详细内容请参考
Nmap Network Scanning – Chapter 7. Service and Application Version Detection – 7.3. Technique Described P149

简要的介绍版本的侦测原理。

版本侦测主要分为以下几个步骤:

  1. 首先检查 open 与 open|filtered 状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。

  2. 如果是 TCP 端口,尝试建立 TCP 连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件 nmap-services-probes 中 Probe TCP NULL q || 对应的 totalwaitms)。通常在等待时间内,会接收到目标机发送的 “Welcome Banner” 信息。 Nmap 将接收到的 Banner 与 nmap-services-probes 中 NULL probe 中的签名进行对比。查找对应应用程序的名字与版本信息。

  3. 如果通过 “Welcome Banner” 无法确定应用程序版本,那么 Nmap 再尝试发送其他的探测包(即从 nmap-services-probes 中挑选合适的 probe),将 probe 得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。

  4. 如果是UDP端口,那么直接使用 nmap-services-probes 中探测包进行探测匹配。根据结果对比分析出 UDP 应用服务类型。

  5. 如果探测到应用程序是 SSL,那么调用 openSSL 进一步的侦查运行在 SSL 之上的具体的应用类型。

  6. 如果探测到应用程序是 SunRPC,那么调用 brute-force RPC grinder 进一步探测具体服务。

服务版本选项说明

选项说明

#
#
-sV: 指定让 Nmap 进行版本侦测
--version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。
--version-light: 指定使用轻量侦测方式 (intensity 2)
--version-all: 尝试使用所有的probes进行侦测 (intensity 9)
--version-trace: 显示出详细的版本侦测过程信息。

OS 侦测

操作系统侦测用于检测目标主机运行的操作系统类型及设备类型等信息。
Nmap 拥有丰富的系统数据库 (nmap-os-db) ,目前可以识别 2600 多种操作系统与设备类型。

OS 侦测原理

Nmap 使用 TCP/IP 协议栈指纹来识别不同的操作系统和设备。在 RFC 规范中,有些地方对 TCP/IP 的实现并没有强制规定,由此不同的 TCP/IP 方案中可能都有自己的特定方式。
Nmap 主要是根据这些细节上的差异来判断操作系统的类型的。

具体实现方式如下:

  1. Nmap 内部包含了 2600 多种已知系统的指纹特征(在文件 nmap-os-db 文件中)。将此指纹数据库作为进行指纹对比的样本库。
  2. 分别挑选一个open和closed的端口,向其发送经过精心设计的 TCP/UDP/ICMP 数据包,根据返回的数据包生成一份系统指纹。
  3. 将探测生成的指纹与nmap-os-db中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。

OS 侦测选项说明

选项说明

#
#
-O: 指定 Nmap 进行 OS 侦测。  
--osscan-limit: 限制 Nmap 只对确定的主机的进行 OS 探测(至少需确知该主机分别有一个 open 和 closed 的端口)。  
--osscan-guess: 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统。  

Firewall/IDS 规避

更多信息
http://nmap.org/book/man-bypass-firewalls-ids.html

防火墙与 IDS 规避为用于绕开防火墙与IDS(入侵检测系统)的检测与屏蔽,以便能够更加详细地发现目标主机的状况。
Nmap 提供了多种规避技巧,通常可以从两个方面考虑规避方式:数据包的变换(Packet Change)与时序变换(Timing Change)。

规避原理

分片(Fragmentation)

将可疑的探测包进行分片处理(例如将TCP包拆分成多个IP包发送过去),某些简单的防火墙为了加快处理速度可能不会进行重组检查,以此避开其检查。

IP 诱骗(IP decoys)

在进行扫描时,将真实 IP 地址和其他主机的 IP 地址(其他主机需要在线,否则目标主机将回复大量数据包到不存在的主机,从而实质构成了拒绝服务攻击)混合使用,以此让目标主机的防火墙或 IDS 追踪检查大量的不同 IP 地址的数据包,降低其追查到自身的概率。注意,某些高级的 IDS 系统通过统计分析仍然可以追踪出扫描者真实 IP 地址。

IP 伪装(IP Spoofing)

顾名思义,IP 伪装即将自己发送的数据包中的 IP 地址伪装成其他主机的地址,从而目标机认为是其他主机在与之通信。需要注意,如果希望接收到目标主机的回复包,那么伪装的 IP 需要位于统一局域网内。另外,如果既希望隐蔽自己的 IP 地址,又希望收到目标主机的回复包,那么可以尝试使用 idle scan 或 匿名代理(如TOR) 等网络技术。

指定源端口

某些目标主机只允许来自特定端口的数据包通过防火墙。例如 FTP 服务器配置为:允许源端口为 21号的 TCP 包通过防火墙与FTP服务端通信,但是源端口为其他端口的数据包被屏蔽。所以,在此类情况下,可以指定 Nmap 将发送的数据包的源端口都设置特定的端口。
比如 21, 53 等。

扫描延时

某些防火墙针对发送过于频繁的数据包会进行严格的侦查,而且某些系统限制错误报文产生的频率(例如,Solaris 系统通常会限制每秒钟只能产生一个 ICMP 消息回复给 UDP 扫描),所以,定制该情况下发包的频率和发包延时可以降低目标主机的审查强度、节省网络带宽。

其他技术

Nmap 还提供多种规避技巧,比如指定使用某个网络接口来发送数据包、指定发送包的最小长度、指定发包的 MTU、指定 TTL、指定伪装的 MAC 地址、使用错误检查 (bad checksum)。

规避选项说明

选项说明

-f; --mtu <val>: 指定使用分片、指定数据包的 MTU.
-D <decoy1,decoy2[,ME],...>: 用一组IP地址掩盖真实地址,其中 ME 填入自己的 IP 地址。
-S <IP_Address>: 伪装成其他IP地址
-e <iface>: 使用特定的网络接口
-g/--source-port <portnum>: 使用指定源端口
--data-length <num>: 填充随机数据让数据包长度达到 num。
--ip-options <options>: 使用指定的 IP 选项来发送数据包。
--ttl <val>: 设置 time-to-live 时间。
--spoof-mac <mac address/prefix/vendor name>: 伪装 MAC 地址  
--badsum: 使用错误的 checksum 来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复,说明回复来自防火墙或 IDS/IPS)。  

NSE 脚本引擎

NSE 脚本引擎 (Nmap Scripting Engine) 是 Nmap 最强大最灵活的功能之一,允许用户自己编写脚本来执行自动化的操作或者扩展 Nmap 的功能。
NSE 使用 Lua 脚本语言,并且默认提供了丰富的脚本库,目前已经包含 14 个类别的 350 多个脚本。

NSE 的设计初衷主要考虑以下几个方面:

基本原理

建议观看
Black Hat USA / Defcon 2010 – Mastering the Nmap Scripting Engine

NSE 选项说明

选项说明

-sC=<Lua Script> 等价于 --script=default,使用默认类别的脚本进行扫描。
--script=<Lua scripts>: <Lua scripts>使用某个或某类脚本进行扫描,支持通配符描述
--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供默认参数
--script-args-file=filename: 使用文件来为脚本提供参数
--script-trace: 显示脚本执行过程中发送与接收的数据
--script-updatedb: 更新脚本数据库
--script-help=<Lua scripts>: 显示脚本的帮助信息,其中<Luascripts>部分可以逗号分隔的文件或脚本类别。 

其他功能

Runtime Interaction 运行时交互

NMap 101: NDiff and Your Tips! HakTip 108

?               display help infomation
v/V             verbosity
d/D             debugging
p/P             packet tracing
anything else   print status

Ndiff

ndiff scan_1.xml scan_2.xml

ndiff scan_1.xml scan_2.xml
ndiff -v scan_1.xml scan_2.xml
- scan_1.xml
+ scan_2.xml

参考资料

来自原作者的

https://nmap.org/presentations/

  1. ShmooCon 2006 — Advanced Network Reconnaissance with Nmap

  2. Black Hat USA / Defcon 2008 — Nmap: Scanning the Internet

  3. Black Hat USA / Defcon 2010 — Mastering the Nmap Scripting Engine
    https://www.youtube.com/watch?v=PMtHPKnzMII

  4. Nmap Network Scanning: The Official Nmap Project Guide to Network Discovery and Security Scanning
    Nmap 创始人 Fyodor 编写的 Nmap 权威指南,非常详尽地描述 Nmap 的设计细节、实现原理及使用方法。Nmap 官方文档正是来自该书部分章节。
    https://www.amazon.com/Nmap-Network-Scanning-Official-Discovery/dp/0979958717
    nmap_network_scanning.pdf (360云盘)

  5. Nmap 常见用法思维导图
    https://nmap.org/docs/nmap-mindmap.pdf

其他资料

  1. Secrets of Network Cartography
    该书对 Nmap 的实现原理及使用场景有比较丰富的介绍。

  2. Nmap in the Enterprise: Your Guide to Network Scanning
    这本书描述 Nmap 在企业领域的运用。

  3. 《Nmap 渗透测试指南》 商广明

其他常用选项说明

其他选项

这里仅说明了一些笔者觉得常用的选项。

在未指定扫描端口时, Nmap 默认扫描 1000个 最有可能开放的端口 (这 1000 端口的选择是基于千万级 IP 大规模互联网扫描的开放端口的经验性统计结果)
关于 Nmap 默认扫描端口的详细信息可以参考 nmap-service 文件。

-n, 如果不想使用 DNS 或 Reverse DNS 解析,那么可以使用该选项。 在大规模网络扫描中,DNS 解析 与 Reverse DNS 解析是拖慢扫描事件的主要原因。
-T4, 指定扫描过程使用的时序(Timing),总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况良好的情况推荐使用 T4
--reasion, 端口被认定为此状态的原因。
-F, Fast mode 快速模式,仅扫描 TOP 100 的端口
-r, 不进行端口随机打乱的操作(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫描不易被对方防火墙检测到)。

整理的扫描端口列表

其实具体在端口的选择上还是要根据公司的 业务范围技术栈 来具体细化,减少不必要的端口扫描,提高扫描速度。

设计端口列表时的参考资料

Wikipedia 的常见 TCP/UDP 端口说明 【非常全】
https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

混在运维部的安全员说”端口与口令安全”
http://www.freebuf.com/articles/web/165340.html

TCP/IP WELL KNOWN PORT NUMBERS (0 TO 1023)
http://www.meridianoutpost.com/resources/articles/well-known-tcpip-ports.php

星环科技文档
https://docs.transwarp.io/4.7/goto?file=InstallManual__hdfs%E7%9B%B8%E5%85%B3%E7%AB%AF%E5%8F%A3.html#_hdfs%E7%9B%B8%E5%85%B3%E7%AB%AF%E5%8F%A3

Leave a Reply

Your email address will not be published. Required fields are marked *