概述

  • Nmap 定义为网络探测工具和安全/端口扫描器
  • Nmap 提供了四项基本功能(主机发现、端口扫描、服务与版本探测、操作系统探测)及丰富的脚本库
  • Nmap 既能应用于简单的网络信息扫描,也能用在高级、复杂、特定的环境中:例如扫描互联网上大量的主机;绕开防火墙/IDS/IPS;扫描Web站点;扫描路由器等等

    参考

  • Nmap 参考指南 nmap.org

  • Nmap 参考指南 gitbooks.io

    使用

    通用选项

    常用命令行选项
  • 指定扫描目标 ```

    支持以下格式

    192.168.0.1 10.0.0-255.1-254 scanme.nmap.org microsoft.com/24

或者通过 -iL 加载文本内容

-iL

  1. - 指定扫描端口
  2. ```shell
  3. -p 通过该参数指定需要扫描的端口,格式可以是以下几种:
  4. -p 22
  5. -p 1433,1521,3306
  6. -p 1-65535
  7. -p- # 扫描所有端口,与 -p1-65535 效果相同
  8. -p U:53,111,137,T:21-25,80,139,8080,S:9 # U:/T:/S: 称为协议限定符,需要根据扫描的协议同时指定扫描技术如:-sU, -sS/-sT/-sF
  9. -p 同时可以与 -sO 参数(IP 协议扫描)配合,指定扫描的协议号(0-255)

时间和性能

-T4 设置时间模板(可设置0-5共6个级别),【默认行为 -T3】,通常使用 -T4 以加快执行速度 —min-hostgroup ; —max-hostgroup 调整并行扫描组的大小 —min-parallelism ; —max-parallelism 调整探测报文的并行度 —host-timeout 放弃低速目标主机

输出

-oG 以适用于 Grep 处理的格式将结果输出到指定文件

其它选项

-A 同时打开操作系统探测和版本探测,以及其他的扫描选项(如 —traceroute —script 等) —send-ip 要求 Nmap 通过原 IP 套接字发送报文,而不是低层的以太网帧

  1. <a name="OedFv"></a>
  2. ### 主机发现
  3. - **主机发现** [https://nmap.org/man/zh/man-host-discovery.html](https://nmap.org/man/zh/man-host-discovery.html)
  4. - 探测的目的是获得响应以显示某个 IP 地址是否是活动的
  5. - 指定 `-sn` 选项来禁止扫描端口,只判断主机存活
  6. 相关选项```shell
  7. # 主机发现
  8. -PR 进行 ARP 扫描(对于局域网内的目标是默认行为,如果需要明确禁用此行为,配合 --send-ip 选项)
  9. ## 针对过滤 ping 包的情况
  10. -PS [portlist] 进行 TCP SYN 扫描,默认对目标主机 80 端口发送 TCP SYN 包,不管端口开放与否,只要目标主机是运行的,Nmap 都将收到响应
  11. -PA [portlist] 进行 TCP ACK 扫描,和 -PS 类似,发送的是 TCP ACK 包,可以与 -PS 配合尝试突破一些防火墙的封锁
  12. -PU [portlist] 进行 UDP 扫描,默认对目标主机 31338 端口发送 UDP 包
  13. ## 针对过滤 TCP/UDP 包的情况
  14. -sP 发送 ICMP 回声请求与 TCP 报文到 80 端口【默认主机发现选项】
  15. -PE 发送 ICMP 信息请求
  16. -PP 发送 ICMP 时间戳请求
  17. -PM 发送 ICMP 地址掩码请求
  18. # 跳过主机发现
  19. -sL 仅列出扫描目标列表,不发送任何报文,通常配合 -n 使用(禁用 DNS 解析)
  20. -P0 无 ping 扫描,默认所有指定目标都为存活,直接执行其他扫描操作
  21. -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 也能得到正确的结果且速度更快(但可能不通用)

扫描互联网

  1. <a name="MY1JP"></a>
  2. ### 端口扫描
  3. - **端口扫描基础** [https://nmap.org/man/zh/man-port-scanning-basics.html](https://nmap.org/man/zh/man-port-scanning-basics.html)
  4. - Nmap 将识别的端口状态分为六种:`open/closed/filtered/unfiltered/open|filtered/closed|filtered`
  5. - **端口扫描技术** [https://nmap.org/man/zh/man-port-scanning-techniques.html](https://nmap.org/man/zh/man-port-scanning-techniques.html)
  6. - 大部分扫描类型只对特权用户可用,这是因为他们发送接收原始报文,这在 Unix 系统需要 root 权限
  7. - 在 Windows 上推荐使用 administrator 账户,因为特权选项让 Nmap 强大得多也灵活得多,但是当 WinPcap 已经被加载到操作系统时,非特权用户也可以正常使用 Nmap
  8. - 端口扫描类型的选项格式是 `-s<C>` 其中 `<C>` 是特指的字符
  9. - 默认情况下,Nmap 执行 TCP SYN 扫描 `-sS`
  10. - UDP 扫描 `-sU` 可以和任何一种 TCP 扫描类型结合使用
  11. - 非特权用户只能执行 TCP connect() 扫描 -sT 和 FTP bounce 扫描 -b
  12. - 选择最适合的一种(或者几种)扫描技术来完成给定的任务
  13. - **端口说明和扫描顺序** [https://nmap.org/man/zh/man-port-specification.html](https://nmap.org/man/zh/man-port-specification.html)
  14. - 默认情况下,Nmap 按随机顺序扫描端口(出于效率考虑,将常用端口前移),可以指定 `-r` 选项按顺序扫描端口
  15. 相关选项```shell
  16. -sS 进行 TCP SYN 扫描,执行速度最快,相对不容易被注意到,因为它从来不完成 TCP 连接(因此又称为半开放扫描)【默认端口扫描选项】
  17. -sT 进行 TCP connect() 扫描,通过创建 connect() 系统调用要求操作系统和目标主机以及端口建立连接,如果目标系统存在 IDS 则可能留下记录
  18. -sU 进行 UDP 扫描,一般较慢也比 TCP 扫描更难,可以和 TCP 扫描如 TCP SYN 扫描 -sS 结合使用来同时检查两种协议,可以用版本扫描 -sV 帮助区分 UDP 扫描结果中真正的开放端口和被过滤的端口
  19. # 以下四种扫描类型除了探测报文的标志位不同,在行为上完全一致:当端口关闭时,任何不包含 SYN、RST 或者 ACK 位的报文会导致一个 RST 返回,而当端口开放时,应该没有任何响应
  20. # 不足:大多数情况下只在 Unix 系统上才正常工作,另外也不能辨识端口是开放还是过滤的,只能返回 open|filtered 状态
  21. -sN 进行 TCP Null 扫描,不设置任何标志位
  22. -sF 进行 TCP FIN 扫描,只设置 TCP FIN 标志位
  23. -sX 进行 Xmas 扫描,同时设置 FIN、PSH 和 URG 标志位
  24. -sM 进行 TCP Maimon 扫描,只设置 TCP FIN/ACK 标志位,该扫描技术以发现者 Uriel Maimon 命名
  25. -sA 进行 TCP ACK 扫描,只能确定被扫描端口是 unfiltered 或是 filtered,无法判断端口是 open 还是 closed(当扫描端口未被过滤时无论端口是否开放都会返回 RST 报文)
  26. -sW 进行 TCP 窗口扫描,当收到 RST 时,根据 TCP 窗口值是正数还是 0,分别把端口标记为 open 或者 closed(除此之外,窗口扫描和 TCP ACK 扫描完全一样),但该结果不完全可信
  27. --scanflags <URG|ACK|PSH|RST|SYN|FIN> 定制的 TCP 扫描,允许指定任意 TCP 标志位来设计自己的扫描,可以是 URG、ACK、PSH、RST、SYN 和 FIN 的任何组合,标志位的顺序不重要
  28. -sI <zombie host[:probeport]> 空闲扫描,利用僵尸主机进行扫描,同时隐藏攻击者真实地址,详情查看:https://nmap.org/book/idlescan.html
  29. -sO 进行 IP 协议扫描,可以确定目标主机支持哪些 IP 协议(TCP/ICMP/IGMP 等)
  30. -b <ftp relay host> FTP 弹跳扫描,利用可访问的 FTP 主机做跳板进行扫描,优点是防火墙对内部的 FTP 服务器可能有更宽松的策略

常用命令```shell

查看 Nmap 默认扫描的端口号(1000 个)

nmap -v -oG -

nmap -n -Pn -p- x.x.x.x

  1. <a name="MG3Yp"></a>
  2. ### 服务与版本探测
  3. - **服务和版本探测** [https://nmap.org/man/zh/man-version-detection.html](https://nmap.org/man/zh/man-version-detection.html)
  4. 相关选项```shell
  5. -sV 启用服务和版本探测
  6. --allports 版本探测时扫描所有端口(默认情况下忽略 9100 打印机端口)
  7. --version-intensity <intensity> 设置版本扫描强度(1-9),数值越高,服务越有可能被正确识别,同时也花更多时间【默认值 7】
  8. --version-light 设置轻量级版本扫描强度,等同于 --version-intensity 2
  9. --version-all 等同于 --version-intensity 9
  10. --version-trace 跟踪版本扫描活动,打印出详细的正在进行的扫描的调试信息
  11. -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(一条记录一行) ```

其他资源