# Nmap 摘要 (ESP) {{#include ../../banners/hacktricks-training.md}} ``` nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24 ``` ## 参数 ### 要扫描的 IP - **`,`:** 直接指示 IP - **`-iL `:** list_IPs - **`-iR `**: 随机 IP 的数量,可以使用 `--exclude ` 或 `--excludefile ` 排除可能的 IP。 ### 设备发现 默认情况下,Nmap 启动一个发现阶段,包括:`-PA80 -PS443 -PE -PP` - **`-sL`**: 这不是侵入性的,它列出目标并发出 **DNS** 请求以解析名称。它有助于了解例如 www.prueba.es/24 所有 IP 是否都是我们的目标。 - **`-Pn`**: **不 ping**。如果你知道它们都是活动的,这很有用(如果不是,你可能会浪费很多时间,但这个选项也会产生错误的负面结果,表示它们不活跃),它会阻止发现阶段。 - **`-sn`** : **不端口扫描**。完成侦察阶段后,不扫描端口。它相对隐蔽,并允许小规模网络扫描。具有权限时,它向 80 发送 ACK (-PA),向 443 发送 SYN(-PS) 和回声请求以及时间戳请求,若没有权限则始终完成连接。如果目标是网络,它仅使用 ARP(-PR)。如果与其他选项一起使用,则仅丢弃其他选项的数据包。 - **`-PR`**: **Ping ARP**。在分析我们网络中的计算机时默认使用,它比使用 ping 更快。如果不想使用 ARP 数据包,请使用 `--send-ip`。 - **`-PS `**: 向端口发送 SYN 数据包,如果回应 SYN/ACK 则表示开放(回应 RST 以避免结束连接),如果回应 RST 则表示关闭,如果没有回应则表示不可达。如果没有权限,则自动使用完全连接。如果未给出端口,则默认为 80。 - **`-PA `**: 与前一个相似,但使用 ACK,结合使用可以获得更好的结果。 - **`-PU `**: 目标相反,发送到预期关闭的端口。一些防火墙仅检查 TCP 连接。如果关闭,则回应端口不可达,如果回应其他 ICMP 或没有回应,则视为目标不可达。 - **`-PE, -PP, -PM`** : ICMP PINGS: 回声回复、时间戳和地址掩码。它们被发出以确定目标是否活跃。 - **`-PY`**: 默认向 80 发送 SCTP INIT 探测,回应可以是 INIT-ACK(开放)、ABORT(关闭)或无回应或 ICMP 不可达(不活跃)。 - **`-PO `**: 在报头中指示协议,默认 1(ICMP)、2(IGMP)和 4(封装 IP)。对于 ICMP、IGMP、TCP(6)和 UDP(17)协议,发送协议报头,对于其他协议仅发送 IP 报头。这样做的目的是由于报头的畸形,回应协议不可达或同协议的回应,以了解其是否活跃。 - **`-n`**: 不使用 DNS - **`-R`**: 始终使用 DNS ### 端口扫描技术 - **`-sS`**: 不完成连接,因此不会留下痕迹,如果可以使用,非常好。(需要权限)这是默认使用的。 - **`-sT`**: 完成连接,因此会留下痕迹,但可以确保使用。默认情况下没有权限。 - **`-sU`**: 较慢,针对 UDP。主要是:DNS(53)、SNMP(161,162)、DHCP(67 和 68),(-sU53,161,162,67,68):开放(回应)、关闭(端口不可达)、过滤(其他 ICMP)、开放/过滤(无回应)。在开放/过滤的情况下,-sV 发送大量请求以检测 nmap 支持的任何版本,并可以检测真实状态。这样会大大增加时间。 - **`-sY`**: SCTP 协议未能建立连接,因此没有日志,工作方式类似于 -PY - **`-sN,-sX,-sF`:** Null、Fin、Xmas,可以穿透某些防火墙并提取信息。它们基于标准合规机器应对所有没有 SYN、RST 或 ACK 的请求回应 RST 的事实,延迟:开放/过滤(无回应)、关闭(RST)、过滤(ICMP 不可达)。在 Windows、Cisco、BSDI 和 OS/400 上不可靠。在 Unix 上是可以的。 - **`-sM`**: Maimon 扫描:发送 FIN 和 ACK 标志,适用于 BSD,目前将所有返回为关闭。 - **`-sA, sW`**: ACK 和窗口,用于检测防火墙,以了解端口是否被过滤。-sW 确实区分开放/关闭,因为开放的回应具有不同的窗口值:开放(RST 窗口不为 0)、关闭(RST 窗口 = 0)、过滤(ICMP 不可达或无回应)。并非所有计算机都以这种方式工作,因此如果全部关闭,则不工作;如果有几个开放,则工作正常;如果有很多开放和少量关闭,则工作方式相反。 - **`-sI`:** Idle 扫描。对于存在活动防火墙但我们知道它不过滤特定 IP 的情况(或当我们只是想要匿名时),可以使用僵尸扫描器(适用于所有端口),要查找可能的僵尸,可以使用脚本 ipidseq 或利用辅助扫描器 auxiliary/scanner/ip/ipidseq。该扫描器基于 IP 数据包的 IPID 编号。 - **`--badsum`:** 发送错误的和,计算机会丢弃数据包,但防火墙可能会回应某些内容,用于检测防火墙。 - **`-sZ`:** "奇怪"的 SCTP 扫描器,当发送带有 cookie 回声片段的探测时,如果开放则应被丢弃,如果关闭则应回应 ABORT。它可以穿透 init 无法穿透的防火墙,坏处是它无法区分过滤和开放。 - **`-sO`:** 协议 IP 扫描。发送错误和空报头,有时甚至无法区分协议。如果 ICMP 不可达协议到达,则表示关闭;如果不可达端口到达,则表示开放;如果到达其他错误,则表示过滤;如果没有到达,则表示开放|过滤。 - **`-b `:** FTPhost--> 用于从另一台主机扫描主机,通过连接另一台机器的 ftp 并请求其将文件发送到要从另一台机器扫描的端口,根据回应我们将知道它们是否开放。 \[\:\@]\\[:\]几乎所有 ftps 服务器不再允许这样做,因此实用性不大。 ### **重点分析** **-p:** 用于指定要扫描的端口。要选择所有 65,335 个端口:**-p-** 或 **-p all**。Nmap 有一个基于流行度的内部分类。默认情况下,它使用前 1000 个端口。使用 **-F**(快速扫描)分析前 100 个。使用 **--top-ports ** 分析该数量的前端口(从 1 到 65,335)。它以随机顺序检查端口;要防止这种情况,请使用 **-r**。我们还可以选择特定端口:20-30,80,443,1024-(后者表示从 1024 开始查找)。我们还可以按协议对端口进行分组:U:53,T:21-25,80,139,S:9。我们还可以选择 Nmap 流行端口中的范围:-p [-1024] 分析到 1024 端口的所有端口,这些端口包含在 nmap-services 中。**--port-ratio ** 分析在 0 到 1 之间的比率内最常见的端口。 **-sV** 版本扫描,强度可以从 0 调整到 9,默认是 7。 **--version-intensity ** 我们调节强度,越低只会发出最可能的探测,但不是全部。这样可以大大缩短 UDP 扫描时间。 **-O** 操作系统检测。 **--osscan-limit** 为了正确扫描主机,至少需要一个开放端口和一个关闭端口。如果未满足此条件且我们设置了此选项,则不会尝试 OS 预测(节省时间)。 **--osscan-guess** 当操作系统检测不完美时,这会使其更加努力。 **脚本** --script __|__|__|__[,...] 要使用默认脚本,请使用 -sC 或 --script=default。 可用类型有:auth、broadcast、default、discovery、dos、exploit、external、fuzzer、intrusive、malware、safe、version 和 vuln。 - **Auth:** 执行所有可用的身份验证脚本。 - **Default:** 执行基本的默认工具脚本。 - **Discovery:** 从目标或受害者处检索信息。 - **External:** 使用外部资源的脚本。 - **Intrusive:** 使用被认为对受害者或目标具有侵入性的脚本。 - **Malware:** 检查恶意代码或后门打开的连接。 - **Safe:** 执行非侵入性脚本。 - **Vuln:** 发现最常见的漏洞。 - **All:** 执行所有可用的 NSE 扩展脚本。 要搜索脚本: **nmap --script-help="http-\*" -> 以 http- 开头的那些** **nmap --script-help="not intrusive" -> 除了那些** **nmap --script-help="default or safe" -> 其中任何一个或两个的那些** **nmap --script-help="default and safe" --> 两者都有的那些** **nmap --script-help="(default or safe or intrusive) and not http-\*"** --script-args __=__,__={__=__},__={__,__} --script-args-file __ --script-help __|__|__|__|all[,...] --script-trace ---> 提供有关脚本进展的信息。 --script-updatedb **要使用脚本,只需输入: nmap --script Script_Name target** --> 使用脚本时,脚本和扫描器都会执行,因此也可以添加扫描器选项。我们可以添加 **"safe=1"** 以仅执行安全的脚本。 **时间控制** **Nmap 可以修改时间为秒、分钟、毫秒:** --host-timeout 参数 900000ms、900、900s 和 15m 都是相同的。 Nmap 将要扫描的主机总数分成组,并以块的方式分析这些组,因此在所有主机都被分析之前不会移动到下一个块(用户在块分析完成之前不会收到任何更新)。这样,Nmap 使用大组更为优化。默认情况下,在 C 类中,它使用 256。 这可以通过 **--min-hostgroup** _****_**;** **--max-hostgroup** _****_(调整并行扫描组大小)来更改。 您可以控制并行扫描器的数量,但最好不要这样做(Nmap 已根据网络状态自动控制):**--min-parallelism** _****_**;** **--max-parallelism** _****_。 我们可以修改 RTT 超时,但通常没有必要:**--min-rtt-timeout** _**