概述
- Nmap 定义为网络探测工具和安全/端口扫描器
- Nmap 提供了四项基本功能(主机发现、端口扫描、服务与版本探测、操作系统探测)及丰富的脚本库
Nmap 既能应用于简单的网络信息扫描,也能用在高级、复杂、特定的环境中:例如扫描互联网上大量的主机;绕开防火墙/IDS/IPS;扫描Web站点;扫描路由器等等
参考
- Nmap 参考指南 gitbooks.io
使用
通用选项
常用命令行选项 - 指定扫描目标
```
支持以下格式
192.168.0.1 10.0.0-255.1-254 scanme.nmap.org microsoft.com/24
或者通过 -iL 加载文本内容
-iL
- 指定扫描端口
```shell
-p 通过该参数指定需要扫描的端口,格式可以是以下几种:
-p 22
-p 1433,1521,3306
-p 1-65535
-p- # 扫描所有端口,与 -p1-65535 效果相同
-p U:53,111,137,T:21-25,80,139,8080,S:9 # U:/T:/S: 称为协议限定符,需要根据扫描的协议同时指定扫描技术如:-sU, -sS/-sT/-sF
-p 同时可以与 -sO 参数(IP 协议扫描)配合,指定扫描的协议号(0-255)
- 杂项
- 时间和性能 https://nmap.org/man/zh/man-performance.html
- 输出 https://nmap.org/man/zh/man-output.html
- 其它选项 https://nmap.org/man/zh/man-misc-options.html ```shell -n 禁用 DNS 解析 -v 输出扫描过程的更多信息 -vv 提供更详细的信息
时间和性能
-T4 设置时间模板(可设置0-5共6个级别),【默认行为 -T3】,通常使用 -T4 以加快执行速度
—min-hostgroup
输出
-oG
其它选项
-A 同时打开操作系统探测和版本探测,以及其他的扫描选项(如 —traceroute —script 等) —send-ip 要求 Nmap 通过原 IP 套接字发送报文,而不是低层的以太网帧
<a name="OedFv"></a>
### 主机发现
- **主机发现** [https://nmap.org/man/zh/man-host-discovery.html](https://nmap.org/man/zh/man-host-discovery.html)
- 探测的目的是获得响应以显示某个 IP 地址是否是活动的
- 指定 `-sn` 选项来禁止扫描端口,只判断主机存活
相关选项```shell
# 主机发现
-PR 进行 ARP 扫描(对于局域网内的目标是默认行为,如果需要明确禁用此行为,配合 --send-ip 选项)
## 针对过滤 ping 包的情况
-PS [portlist] 进行 TCP SYN 扫描,默认对目标主机 80 端口发送 TCP SYN 包,不管端口开放与否,只要目标主机是运行的,Nmap 都将收到响应
-PA [portlist] 进行 TCP ACK 扫描,和 -PS 类似,发送的是 TCP ACK 包,可以与 -PS 配合尝试突破一些防火墙的封锁
-PU [portlist] 进行 UDP 扫描,默认对目标主机 31338 端口发送 UDP 包
## 针对过滤 TCP/UDP 包的情况
-sP 发送 ICMP 回声请求与 TCP 报文到 80 端口【默认主机发现选项】
-PE 发送 ICMP 信息请求
-PP 发送 ICMP 时间戳请求
-PM 发送 ICMP 地址掩码请求
# 跳过主机发现
-sL 仅列出扫描目标列表,不发送任何报文,通常配合 -n 使用(禁用 DNS 解析)
-P0 无 ping 扫描,默认所有指定目标都为存活,直接执行其他扫描操作
-Pn 将所有主机视为在线(跳过主机发现,直接对目标进行端口扫描)
常用命令```shell
确认扫描目标范围是否正确
nmap -n -sL 10.0.2.0/24
nmap -n -sL -iL
扫描局域网段
nmap -n -sn -sP 172.16.0.0/24 # 速度更快 nmap -n -sn -PS 172.16.0.0/24 # Hyper-V 局域网内 -PS 方式更为准确,-PE 也能得到正确的结果且速度更快(但可能不通用)
扫描互联网
<a name="MY1JP"></a>
### 端口扫描
- **端口扫描基础** [https://nmap.org/man/zh/man-port-scanning-basics.html](https://nmap.org/man/zh/man-port-scanning-basics.html)
- Nmap 将识别的端口状态分为六种:`open/closed/filtered/unfiltered/open|filtered/closed|filtered`
- **端口扫描技术** [https://nmap.org/man/zh/man-port-scanning-techniques.html](https://nmap.org/man/zh/man-port-scanning-techniques.html)
- 大部分扫描类型只对特权用户可用,这是因为他们发送接收原始报文,这在 Unix 系统需要 root 权限
- 在 Windows 上推荐使用 administrator 账户,因为特权选项让 Nmap 强大得多也灵活得多,但是当 WinPcap 已经被加载到操作系统时,非特权用户也可以正常使用 Nmap
- 端口扫描类型的选项格式是 `-s<C>` 其中 `<C>` 是特指的字符
- 默认情况下,Nmap 执行 TCP SYN 扫描 `-sS`
- UDP 扫描 `-sU` 可以和任何一种 TCP 扫描类型结合使用
- 非特权用户只能执行 TCP connect() 扫描 -sT 和 FTP bounce 扫描 -b
- 选择最适合的一种(或者几种)扫描技术来完成给定的任务
- **端口说明和扫描顺序** [https://nmap.org/man/zh/man-port-specification.html](https://nmap.org/man/zh/man-port-specification.html)
- 默认情况下,Nmap 按随机顺序扫描端口(出于效率考虑,将常用端口前移),可以指定 `-r` 选项按顺序扫描端口
相关选项```shell
-sS 进行 TCP SYN 扫描,执行速度最快,相对不容易被注意到,因为它从来不完成 TCP 连接(因此又称为半开放扫描)【默认端口扫描选项】
-sT 进行 TCP connect() 扫描,通过创建 connect() 系统调用要求操作系统和目标主机以及端口建立连接,如果目标系统存在 IDS 则可能留下记录
-sU 进行 UDP 扫描,一般较慢也比 TCP 扫描更难,可以和 TCP 扫描如 TCP SYN 扫描 -sS 结合使用来同时检查两种协议,可以用版本扫描 -sV 帮助区分 UDP 扫描结果中真正的开放端口和被过滤的端口
# 以下四种扫描类型除了探测报文的标志位不同,在行为上完全一致:当端口关闭时,任何不包含 SYN、RST 或者 ACK 位的报文会导致一个 RST 返回,而当端口开放时,应该没有任何响应
# 不足:大多数情况下只在 Unix 系统上才正常工作,另外也不能辨识端口是开放还是过滤的,只能返回 open|filtered 状态
-sN 进行 TCP Null 扫描,不设置任何标志位
-sF 进行 TCP FIN 扫描,只设置 TCP FIN 标志位
-sX 进行 Xmas 扫描,同时设置 FIN、PSH 和 URG 标志位
-sM 进行 TCP Maimon 扫描,只设置 TCP FIN/ACK 标志位,该扫描技术以发现者 Uriel Maimon 命名
-sA 进行 TCP ACK 扫描,只能确定被扫描端口是 unfiltered 或是 filtered,无法判断端口是 open 还是 closed(当扫描端口未被过滤时无论端口是否开放都会返回 RST 报文)
-sW 进行 TCP 窗口扫描,当收到 RST 时,根据 TCP 窗口值是正数还是 0,分别把端口标记为 open 或者 closed(除此之外,窗口扫描和 TCP ACK 扫描完全一样),但该结果不完全可信
--scanflags <URG|ACK|PSH|RST|SYN|FIN> 定制的 TCP 扫描,允许指定任意 TCP 标志位来设计自己的扫描,可以是 URG、ACK、PSH、RST、SYN 和 FIN 的任何组合,标志位的顺序不重要
-sI <zombie host[:probeport]> 空闲扫描,利用僵尸主机进行扫描,同时隐藏攻击者真实地址,详情查看:https://nmap.org/book/idlescan.html
-sO 进行 IP 协议扫描,可以确定目标主机支持哪些 IP 协议(TCP/ICMP/IGMP 等)
-b <ftp relay host> FTP 弹跳扫描,利用可访问的 FTP 主机做跳板进行扫描,优点是防火墙对内部的 FTP 服务器可能有更宽松的策略
常用命令```shell
查看 Nmap 默认扫描的端口号(1000 个)
nmap -v -oG -
nmap -n -Pn -p- x.x.x.x
<a name="MG3Yp"></a>
### 服务与版本探测
- **服务和版本探测** [https://nmap.org/man/zh/man-version-detection.html](https://nmap.org/man/zh/man-version-detection.html)
相关选项```shell
-sV 启用服务和版本探测
--allports 版本探测时扫描所有端口(默认情况下忽略 9100 打印机端口)
--version-intensity <intensity> 设置版本扫描强度(1-9),数值越高,服务越有可能被正确识别,同时也花更多时间【默认值 7】
--version-light 设置轻量级版本扫描强度,等同于 --version-intensity 2
--version-all 等同于 --version-intensity 9
--version-trace 跟踪版本扫描活动,打印出详细的正在进行的扫描的调试信息
-sR RPC 扫描,用于确认开放的端口是否是 RPC 端口(作为 -sV 的一部分自动打开,因此很少需要使用到)
操作系统探测
- 操作系统探测 https://nmap.org/man/zh/man-os-detection.html
相关选项
shell -O 启用操作系统探测 --osscan-limit 只在发现打开或关闭的 TCP 端口时才进行操作系统探测(这种情况下检测会更有效) --osscan-guess; --fuzzy 在无法确定所探测的操作系统时,使推测的探测结果更有效(使用任一选项即可)
脚本库
示例
```shell检查内网中有多少存活主机
nmap -n -sn 192.168.0.0/16 # 指定 -sn 以禁止扫描端口,针对内网 Nmap 默认使用 -PR 选项进行 ARP 扫描以提高扫描速度,默认执行 -sP 选项发送 ICMP 回声请求与 TCP 报文来判断主机是否存活
扫描单个目标
nmap -n -Pn x.x.x.x # 不需要 -sS 选项,默认进行 TCP SYN 扫描,-Pn 跳过主机存活检测,没有指定 -p 则仅扫描常见的 1000 个端口 nmap -n -Pn x.x.x.x -p- -T4 —open # 探测大量端口时可增加 -T4 选项提高扫描速度,—open 只输出端口为 open 状态的
扫描多个目标
nmap -n -Pn -p 22,3389,3306,6379 -T4 —open -v -oG result.txt -iL ip.txt # 从 ip.txt 文本读入需要扫描的目标地址,扫描结果输出到 result.txt(一条记录一行) ```