工具
Metasploit Framework
Nmap
SQLMap
Dirb
Gobuster
Netcat
反弹shell
Hydra
wfuzz
wpscan
searchsploit
字典
arp-scan
hashcat
Netdiscover
Cobalt Strike
Goby
Nessus
Xray
Nuclei
-
+
首页
Nmap
nmap 官网地址:https://nmap.org/ ## 概述 Nmap(Network Mapper)是一个开源的、功能强大的网络探测和安全审计工具。它被设计用于快速扫描大型网络,同时也能够对单个目标进行精细扫描。 Nmap 的工作原理基于网络扫描技术,通过发送特定的网络数据包到目标主机,并分析回应来收集信息。 > 语法格式 ```bash nmap [ <扫描类型> ...] [ <选项> ] { <扫描目标说明> } ``` > 主要功能 - 主机发现:确定在网络上哪些主机是开启的。 - 端口扫描:确定主机上哪些端口是开放的,以及它们提供的服务。 - 版本检测:识别开放端口上运行的服务及其版本号。 - 操作系统指纹识别:尝试确定目标主机的操作系统类型和版本。 - NSE 脚本扫描(Nmap Scripting Engine)是 Nmap 的 “插件系统”,通过执行 Lua 脚本实现超越基础扫描的功能,涵盖漏洞探测、信息收集、暴力破解、服务利用等场景。 > 典型工作流程 一次典型的 Nmap 扫描遵循以下流程: 1. 目标界定:指定要扫描的主机或网络范围。 2. 主机发现:确定哪些主机在线。 3. 端口扫描:对在线的目标主机进行端口扫描。 4. 服务检测:识别开放端口上运行的服务。 5. OS 检测:猜测目标主机的操作系统。 6. 脚本扫描:(可选)运行 NSE 脚本进行深入探测。 7. 结果输出:将扫描结果以指定格式呈现给用户。 ## 目录结构 nmap在kali中的默认路径: ```bash ┌──(kali㉿kali)-[~/Desktop] └─$ cd /usr/share/nmap ┌──(kali㉿kali)-[/usr/share/nmap] └─$ ll total 10056 -rw-r--r-- 1 root root 10829 May 15 11:37 nmap.dtd -rw-r--r-- 1 root root 1218140 May 15 11:37 nmap-mac-prefixes -rw-r--r-- 1 root root 5306593 May 15 11:37 nmap-os-db -rw-r--r-- 1 root root 6845 May 15 11:37 nmap-protocols -rw-r--r-- 1 root root 43529 May 15 11:37 nmap-rpc -rw-r--r-- 1 root root 2573533 May 15 11:37 nmap-service-probes -rw-r--r-- 1 root root 997433 May 15 11:37 nmap-services -rw-r--r-- 1 root root 31936 May 15 11:37 nmap.xsl drwxr-xr-x 3 root root 4096 Sep 25 03:08 nselib -rw-r--r-- 1 root root 49961 May 15 11:37 nse_main.lua drwxr-xr-x 2 root root 36864 Sep 25 03:08 scripts ``` > 核心数据库文件 | nmap-mac-prefixes | 1.2MB | MAC地址厂商前缀数据库 | | ------------------- | ----- | ---------------------- | | nmap-os-db | 5.3MB | 操作系统指纹数据库 | | nmap-protocols | 6.8KB | IP协议号映射数据库 | | nmap-rpc | 68KB | RPC服务编号数据库 | | nmap-service-probes | 2.5MB | 服务版本检测探针数据库 | | nmap-services | 997KB | 端口服务映射数据库 | > 配置和样式文件 | 文件名 | 大小 | 描述 | | -------- | ------ | ------------------------- | | nmap.dtd | 10.8KB | XML输出格式的文档类型定义 | | nmap.xsl | 31KB | XML到HTML转换的样式表 | > 脚本引擎 | | | | | ------------ | ----------------- | --------------------- | | nse_main.lua | 49KB | NSE脚本引擎主入口文件 | | nselib/ | NSE脚本库文件目录 | | | scripts/ | NSE脚本主目录 | | ## 常用参数说明 常见选项:https://svn.nmap.org/nmap/docs/nmap.usage.txt > 注意事项 命令行参数区分大小写。 不带参数的选项是单破折号的,并且通常可以组合在一起。例如,命令 nmap -sS -O -v <目标> 可以写成 nmap -sSOv <目标>。 带参数的选项是双破折号的,不能组合,双破折号选项的长选项名称可以缩短为任何唯一的前缀。例如,--version 可以指定为 --vers。 > 目标参数 | 参数 | 描述 | | -------------------------------------- | ----------------------------------------------------- | | -iL \<inputfilename> | 从主机/网络列表文件中输入目标 | | -iR \<num hosts> | 选择随机目标 | | --exclude <host1[,host2]\[,host3],...> | 排除主机/网络 | | --excludefile <exclude_file> | 从文件中排除列表 | | 目标IP/域名 | 基本目标指定,如 nmap 192.168.1.1 或 nmap example.com | | 192.168.1.1-100 | IP范围扫描 | | 192.168.1.0/24 | CIDR网段扫描 | > 主机发现 | 参数 | 描述 | | --------------------------------- | -------------------------------------------- | | -sL | 列表扫描 - 仅列出要扫描的目标 | | -sn | Ping 扫描 - 禁用端口扫描 | | -Pn | 将所有主机视为在线 -- 跳过主机发现 | | -PS/PA/PU/PY[portlist] | 对给定端口进行 TCP SYN/ACK、UDP 或 SCTP 发现 | | -PO[protocol list] | IP 协议 Ping | | -n/-R | 从不进行 DNS 解析 / 总是解析 [默认:有时] | | --dns-servers <serv1[,serv2],...> | 指定自定义 DNS 服务器 | | --system-dns | 使用操作系统的 DNS 解析器 | | --traceroute | 跟踪到每个主机的跳转路径 | | -PR | ARP Ping扫描(局域网最有效) | > 端口扫描 | 参数 | 描述 | | ------------------------------ | ------------------------------------------------------------ | | -sS | TCP SYN扫描(默认,半开放扫描) | | -sT | TCP连接扫描(无需root权限) | | -sU | UDP扫描 | | -sN | TCP NULL扫描(隐蔽扫描) | | -sF | TCP FIN扫描(隐蔽扫描) | | -sX | TCP Xmas扫描(FIN/PSH/URG标志) | | -sA | TCP ACK扫描(防火墙规则探测) | | -sI <zombie host[:probeport]> | 空闲扫描 | | -b \<FTP relay host> | FTP 反弹扫描 | | -p \<port ranges> | 只扫描指定的端口 例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9 | | --exclude-ports \<port ranges> | 从扫描中排除指定端口 | | -F | 快速模式 - 扫描比默认扫描更少的端口 | | -r | 顺序扫描端口 - 不要随机化 | | --top-ports \<number> | 扫描 \<number> 个最常见的端口 | > 服务/版本探测 | 参数 | 描述 | | ----------------------- | ------------------------------------------------------------ | | -sV | 探测开放端口以确定服务/版本信息 | | --version-intensity 0-9 | 设置版本检测强度(0-轻量,9-全面) | | --version-all | 尝试所有版本检测(等同于强度9) | | -A | 激进模式,启用OS检测、版本检测、脚本扫描和跟踪路由、系统检测 | | --version-trace | 显示详细的版本扫描活动(用于调试) | | --version-light | 限制为最可能的探测(强度 2) | > 脚本扫描 | 参数 | 描述 | | --------------------------------- | -------------------------------- | | -sC | 使用默认脚本集进行扫描 | | --script=\<Lua scripts> | 使用逗号分隔的脚本列表或脚本类别 | | --script-args=<n1=v1,[n2=v2,...]> | 为脚本提供参数 | | --script-args-file=filename | 在文件中提供 NSE 脚本参数 | | --script-trace | 显示所有发送和接收的数据 | | --script-updatedb | 更新脚本数据库。 | > 操作系统探测 | 参数 | 描述 | | -------------- | -------------------------------- | | -O | 启用操作系统检测 | | --osscan-limit | 将操作系统检测限制为有希望的目标 | | --osscan-guess | 更积极地猜测操作系统 | > 时序和性能 | 参数 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | -T<0-5> | 时序模板(0-偏执,1-偷偷摸摸,2-礼貌,3-正常,4-积极,5-疯狂) | | --min-hostgroup 大小 | 并行扫描的主机组大小 | | --min-parallelism 数量 | 探测并行化数量 | | --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout \<time> | 指定探测往返时间 | | --max-retries \<tries> | 端口扫描探测重传的最大次数 | | --host-timeout \<time> | 在此时间后放弃目标 | | --scan-delay/--max-scan-delay \<time> | 调整探测之间的延迟 | | -n | 永不进行 DNS 解析 [默认:关闭] | | --rate \<num> | 固定速率:每秒发送不超过num个数据包 | | --min-rate \<num> | 最小速率:每秒至少发送num个数据包 | | --max-rate \<num> | 最大速率:每秒最多发送num个数据包 | > 防火墙/IDS 规避和欺骗 | 参数 | 描述 | | -------------------------------------------- | ---------------------------------------- | | -f; --mtu \<val> | 分段数据包(可选指定 MTU) | | -D <decoy1,decoy2[,ME],...> | 使用诱饵隐藏扫描 | | -S <IP_Address> | 欺骗源地址 | | -e \<iface> | 使用指定的接口 | | --source-port \<portnum>/ -g \<portnum> | 使用指定的端口号 | | --data-length \<num> | 向发送的数据包添加随机数据 | | --ip-options \<options> | 使用指定的 IP 选项发送数据包 | | --ttl \<val> | 设置 IP 生存时间字段 | | --spoof-mac <mac address/prefix/vendor name> | 欺骗你的 MAC 地址 | | --badsum | 发送带有虚假 TCP/UDP/SCTP 校验和的数据包 | > 输出 | 参数 | 描述 | | ----------------------- | ------------------------------------------------------------ | | -oN 文件名 | 正常输出到文件 | | -oX 文件名 | XML格式输出 | | -oG 文件名 | Grepable格式输出 | | -oS 文件名 | Script kiddie格式输出 | | -oA 基础名 | 同时输出三种主要格式 | | -v | 增加详细程度(-vv更详细) | | -d | 增加调试级别(-dd更详细) | | --reason | 显示端口处于特定状态的原因 | | --open | 仅显示开放(或可能开放)的端口 | | --packet-trace | 显示所有发送和接收的数据包 | | --iflist | 打印主机接口和路由(用于调试) | | --append-output | 附加到指定的输出文件而不是覆盖 | | --resume \<filename> | 恢复中止的扫描 | | --stylesheet <path/URL> | 将 XML 输出转换为 HTML 的 XSL 样式表 | | --webxml | 引用 [Nmap.Org](https://Nmap.Org) 的样式表以获取更可移植的 XML | | --no-stylesheet | 防止将 XSL 样式表与 XML 输出关联 | > 其他选项 | 参数 | 描述 | | -------------------- | ---------------------------------------------- | | -6 | 启用 IPv6 扫描 | | -A | 启用操作系统检测、版本检测、脚本扫描和路由跟踪 | | --datadir \<dirname> | 指定自定义 Nmap 数据文件位置 | | --send-eth/--send-ip | 使用原始以太网帧或 IP 数据包发送 | | --privileged | 假设用户拥有全部权限 | | --unprivileged | 假设用户缺少原始套接字权限 | | -V | 打印版本号 | | -h | 打印此帮助摘要页。 | ## 目标参数 对于nmap而言,目标可以是一个目标IP地址,也可以是192.168.10.0/24这样的网络段,还可以是域名xxx.nmap.org,还可以是IPv6的IP地址。 虽然目标通常在命令行中指定,也可以通过下列选项控制目标的选择: ```txt -iL <inputfilename> (从列表中输入) 从<inputfilename>文件中读取目标,每个目标必须以一个或多个空格,制表符或换行符分开。 -iR <hostnum> (随机选择目标) 选项 0 意味着永无休止的扫描。 --exclude <host1[,host2][,host3],...> (排除主机/网络) 以逗号分隔的列表排除它们。 --excludefile <excludefile> (排除文件中的列表) 只是所排除的目标是用以 换行符,空格,或者制表符分隔的 <excludefile>提供的,而不是在命令行上输入的。 ``` ## 主机发现 主机发现有时候也叫做ping扫描,但是nmap的主机发现不仅使用了发送简单的ICMP回声请求报文,用户可以通过使用列表扫描(-sL) 或者 通过关闭ping (-P0)跳过ping的步骤,也可以使用多个端口把TCP SYN/ACK,UDP和ICMP任意组合起来。 探测目的是获得响应以显示某个IP地址是否是活动的(正在被某主机或者网络设备使用)。 如果没有给出主机发现的参数,Nmap默认情况下就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标机器。 对于非特权UNIX的shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK,这些默认行为和使用-PA -PE选项的效果相同。 > -sL (列表扫描) 仅列出指定网络上的每台主机,不发送任何报文到目标主机。 ```bash └─$ sudo nmap -sL 192.168.186.0/24 [sudo] password for kali: Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-30 03:16 EDT Nmap scan report for 192.168.186.0 (192.168.186.0) Nmap scan report for 192.168.186.1 (192.168.186.1) Nmap scan report for 192.168.186.2 (192.168.186.2) Nmap scan report for 192.168.186.3 (192.168.186.3) Nmap scan report for 192.168.186.4 (192.168.186.4) Nmap scan report for 192.168.186.5 (192.168.186.5) Nmap scan report for 192.168.186.6 (192.168.186.6) Nmap scan report for 192.168.186.7 (192.168.186.7) Nmap scan report for 192.168.186.8 (192.168.186.8) Nmap scan report for 192.168.186.9 (192.168.186.9) Nmap scan report for 192.168.186.10 (192.168.186.10) Nmap scan report for 192.168.186.11 (192.168.186.11) Nmap scan report for 192.168.186.12 (192.168.186.12) ``` > -sP (Ping扫描) 仅进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机,没有进一步的测试 (如端口扫描或者操作系统探测)。 -sP选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR),除非使用了--send-ip选项。 一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。 ```bash ┌──(kali㉿kali)-[~/Desktop] └─$ sudo nmap -sP 192.168.186.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-30 03:21 EDT Nmap scan report for 192.168.186.1 (192.168.186.1) Host is up (0.00055s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168.186.2 (192.168.186.2) Host is up (0.00018s latency). MAC Address: 00:50:56:EC:88:83 (VMware) Nmap scan report for 192.168.186.131 (192.168.186.131) Host is up (0.00026s latency). MAC Address: 00:0C:29:E6:CB:9C (VMware) Nmap scan report for 192.168.186.254 (192.168.186.254) Host is up (0.000070s latency). MAC Address: 00:50:56:EF:45:80 (VMware) Nmap scan report for 192.168.186.128 (192.168.186.128) Host is up. Nmap done: 256 IP addresses (5 hosts up) scanned in 1.94 seconds ``` > -P0 (无ping) 该参数跳过主机发现阶段。 通常Nmap在进行高强度的扫描时用它确定正在运行的机器,默认情况下,Nmap只对正在运行的主机进行高强度的探测(如端口扫描,版本探测,或者操作系统探测)。 注意-P0 是一个已被弃用的参数,它的功能完全被 -Pn 所取代。 -Pn 参数的作用就是告诉Nmap:“跳过这个主机发现阶段,直接把所有目标主机都当作在线的来处理,并对它们进行完整的端口扫描。” > -PS [portlist] (TCP SYN Ping) 该参数发送一个设置了SYN标志位的空TCP报文,默认目的端口为80。 SYN标志位告诉对方您正试图建立一个连接,如果目标端口是关闭的,一个RST (复位) 包会发回来;如果端口是开放的,目标会进行TCP三步握手的第二步,回应一个SYN/ACK TCP报文,然后运行Nmap的机器则会扼杀这个正在建立的连接,发送一个RST而非ACK报文。 Nmap并不关心端口开放还是关闭,无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。 在UNIX机器上,通常只有特权用户 root 能发送和接收原始的TCP报文。 对于非特权用户, Nmap会为每个目标主机进行系统调用connect(),它也会发送一个SYN 报文来尝试建立连接。如果connect()迅速返回成功或者一个ECONNREFUSED 失败,下面的TCP堆栈一定已经收到了一个SYN/ACK或者RST,该主机将被 标志位为在运行。 如果连接超时了,该主机就标志位为down掉了。这种方法也用于IPv6 连接,因为Nmap目前还不支持原始的IPv6报文。 > -PA [portlist] (TCP ACK Ping) 该参数发送一个设置了ACK标志位的空TCP报文,默认目的端口为80。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。所以远程主机应该总是回应一个RST报文,因为它们并没有发出过连接请求到运行Nmap的机器,但是这样表示该主机正在运行。 提供SYN和ACK两种ping探测的原因是使通过防火墙可能性比较大。 > -PU [portlist] (UDP Ping) 发送一个空的UDP报文到给定的端口,如果不指定端口,默认是31338。 默认使用这样一个奇怪的端口是因为对开放端口进行这种扫描一般都不受欢迎。 如果目标机器的端口是关闭的,UDP探测应该马上得到一个ICMP端口无法到达的回应报文,这对于Nmap意味着该机器正在运行。 如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。 该扫描类型的主要优势是它可以穿越只过滤TCP的防火墙和过滤器。 > -PE; -PP; -PM (ICMP Ping Types) Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址,期待从运行的主机得到一个type 0 (回声响应)报文。 > -PR (ARP Ping) 最常见的Nmap使用场景之一是扫描一个以太局域网. 当进行ARP扫描时,Nmap用它优化的算法管理ARP请求。 默认情况下,如果Nmap发现目标主机就在它所在的局域网上,它会进行ARP扫描。即使指定了不同的ping类型(如 -PI或者-PS) ,Nmap也会对任何相同局域网上的目标机使用ARP,如果不想要ARP扫描,指定 --send-ip。 > -n (不用域名解析) 告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。 > -R (为所有目标解析域名) 告诉Nmap 永远对目标IP地址作反向域名解析,一般只有当发现机器正在运行时才进行这项操作。 > --system-dns (使用系统域名解析器) 默认情况下,Nmap通过直接发送查询到主机上配置的域名服务器来解析域名。 该选项的作用为使用系统自带的解析器。 ## 端口扫描状态 许多传统的端口扫描器只列出所有端口是开放还是关闭的,Nmap的信息粒度比它们要细得多。 把端口分成六个状态: open(开放的), closed(关闭的),filtered(被过滤的), unfiltered(未被过滤的), open|filtered(开放或者被过滤的),或者 closed|filtered(关闭或者被过滤的)。 > open(开放的) 应用程序正在该端口接收TCP连接或者UDP报文。 > closed(关闭的) 关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 > filtered(被过滤的) 由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。 过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。 > unfiltered(未被过滤的) 未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描 或者 FIN扫描来扫描未被过滤的端口可以帮助确定端口是否开放。 > open|filtered(开放或者被过滤的) 当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成这种状态。 > closed|filtered(关闭或者被过滤的) 该状态用于Nmap不能确定端口是关闭的还是被过滤的,它只可能出现在IPID Idle扫描中。 ## 端口扫描顺序 Nmap提供选项说明那些端口被扫描以及扫描是随机还是顺序进行。 默认情况下,Nmap用指定的协议对端口1到1024以及nmap-services 文件中列出更高的端口进行扫描。 > -p <port ranges> (只扫描指定的端口) 该选项指明您想扫描的端口,覆盖默认值。 单个端口和用连字符表示的端口范围(如 1-1023)都可以。 可以指定-p-从端口1扫描到65535。 当既扫描TCP端口又扫描UDP端口时,可以通过在端口号前加上T: 或者U:指定协议。 例如,参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描UDP 端口53,111,和137,同时扫描列出的TCP端口。 注意,要既扫描 UDP又扫描TCP,您必须指定 -sU ,以及至少一个TCP扫描类型(如 -sS,-sF,或者 -sT)。如果没有给定协议限定符, 端口号会被加到所有协议列表。 > -F (快速 (有限的端口) 扫描) 在nmap的nmap-services件中指定您想要扫描的端口,这比扫描所有65535个端口快得多。 > -r (不要按随机顺序扫描端口) 默认情况下,Nmap按随机顺序扫描端口,可以指定-r来顺序端口扫描。 ## 端口扫描技术 大部分扫描类型只对特权用户可用,因为他们发送接收原始报文,这在Unix系统需要root权限。 在Windows上推荐使用administrator账户,但是当WinPcap已经被加载到操作系统时, 非特权用户也可以正常使用Nmap。 所有结果都是基于目标机器(或者它们前面的防火墙)返回的报文的,这些主机也许是不值得信任的,它们可能响应以迷惑或误导Nmap的报文。 一般情况下一次只用一种端口扫描方法, 除了UDP扫描(-sU)可能和任何一种TCP扫描类型结合使用。 端口扫描类型的选项格式是-s\<C>, 其中\<C> 是个显眼的字符,通常是对应扫描技术的第一个字符。 默认情况下,Nmap执行一个 SYN扫描,但是如果用户没有权限发送原始报文(在UNIX上需要root权限)或者如果指定的是IPv6目标,Nmap调用connect()。 非特权用户只能执行connect()和ftp bounce扫描。 > -sS (TCP SYN扫描) SYN扫描作为默认的也是最受欢迎的扫描选项,执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口。 可以明确可靠地区分open(开放的), closed(关闭的),和filtered(被过滤的) 状态。 常常被称为半开放扫描, 因为它不打开一个完全的TCP连接,它只发送一个SYN报文。 SYN/ACK表示端口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响应, 该端口就被标记为被过滤。 如果收到ICMP不可到达错误 (类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。 > -sT (TCP connect()扫描) 当SYN扫描不能用时,CP Connect()扫描就是默认的TCP扫描。 当用户没有权限发送原始报文或者扫描IPv6网络时,就会出现这种情况,Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 > -sU (UDP扫描) 可以和TCP扫描,如 SYN扫描 (-sS)结合使用来同时检查两种协议。 UDP扫描发送空的(没有数据)UDP报头到每个目标端口。 如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。 其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。如果几次重试后还没有响应,该端口就被认为是 open|filtered(开放|被过滤的)。 > -sN; -sF; -sX (TCP Null,FIN,and Xmas扫描) 如果扫描系统遵循[TCP RFC](http://www.rfc-editor.org/rfc/rfc793.txt),当端口关闭时,任何不包含SYN、RST、或者ACK位的报文会导致一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK, 任何其它三种(FIN,PSH,and URG)的组合都行。Nmap有三种扫描类型利用这一点: ```txt Null扫描 (-sN) 不设置任何标志位(tcp标志头是0) FIN扫描 (-sF) 只设置TCP FIN标志位。 Xmas扫描 (-sX) 设置FIN,PSH,和URG标志位。 ``` 除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个RST报文,该端口被认为是 closed(关闭的),而没有响应则意味着 端口是open|filtered(开放或者被过滤的)。 如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为 被过滤的。 > -sA (TCP ACK扫描) 该选项与其它扫描不同之处在于 它不能确定open(开放的)或者 open|filtered(开放或者过滤的))端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。 ACK扫描探测报文只设置ACK标志位,当扫描未被过滤的系统时, open(开放的)和closed(关闭的) 端口 都会返回RST报文。Nmap把它们标记为 unfiltered(未被过滤的),意思是 ACK报文不能到达,但至于它们是open(开放的)或者 closed(关闭的) 无法确定。不响应的端口 或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。 > -sW (TCP窗口扫描) 当收到RST时不总是打印unfiltered, 窗口扫描和ACK扫描完全一样。 它通过检查返回的RST报文的TCP窗口域,在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。因此,当收到RST时,窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是0,分别把端口标记为open或者 closed > -sM (TCP Maimon扫描) 根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。 > --scanflags (定制的TCP扫描) --scanflags选项允许通过指定任意TCP标志位来设计您自己的扫描。 > -sI <zombie host[:probeport]> (Idlescan) 允许对目标进行真正的TCP端口盲扫描 > -sO (IP协议扫描) IP 协议扫描可以让您确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描。 > -b <ftp relay host> (FTP弹跳扫描) FTP协议的一个有趣特征([RFC 959](http://www.rfc-editor.org/rfc/rfc959.txt)) 是支持所谓代理ftp连接。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。 这个特性在很多层次上被滥用,所以许多服务器已经停止支持它了。其中一种就是导致FTP服务器对其它主机端口扫描。 只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。 这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。 Nmap用-b选项支持ftp弹跳扫描。 参数格式是 \<username>:\<password>@\<server>:\<port>。 ## 服务和版本探测 用某种其它类型的扫描方法发现TCP 或者UDP端口后,版本探测会询问这些端口,确定到底什么服务正在运行。 nmap-service-probes 数据库包含查询不同服务的探测报文和解析识别响应的匹配表达式。 Nmap试图确定服务协议(如 ftp,ssh,telnet,http),应用程序名(如ISCBind,Apache httpd,Solaris telnetd),版本号,主机名,设备类型(如 打印机,路由器),操作系统家族(如Windows,Linux)以及其它的细节。 当Nmap从某个服务收到响应,但不能在数据库中找到匹配时,它就打印一个特殊的fingerprint和一个URL。 Nmap有350种以上协议如smtp,ftp,http等,大约3000条模式匹配。 > -sV (版本探测) 打开版本探测,也可以用-A同时打开操作系统探测和版本探测。 > --allports (不为版本探测排除任何端口) 默认情况下,Nmap版本探测会跳过9100 TCP端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页HTTP get请求,二进制SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变,您也可以不理会任何Exclude指示符,指定--allports扫描所有端口。 > --version-intensity <intensity> (设置 版本扫描强度) 当进行版本扫描(-sV)时,nmap发送一系列探测报文,每个报文都被赋予一个1到9之间的值。被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没什么用。 数值越高,服务越有可能被正确识别。然而,高强度扫描花更多时间。强度值必须在0和9之间,默认是7。 > --version-light (打开轻量级模式) --version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。 > --version-all (尝试每个探测) --version-intensity 9的别名, 保证对每个端口尝试每个探测报文。 > --version-trace (跟踪版本扫描活动) Nmap打印出详细的关于正在进行的扫描的调试信息。 > -sR (RPC扫描) 这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图 确定它们是否RPC端口,如果是, 是什么程序和版本号。 ## 操作系统探测 Nmap最著名的功能之一是用TCP/IP协议栈fingerprinting进行远程操作系统探测。 Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。在进行一打测试如TCPISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查之后,Nmap把结果和数据库nmap-os-fingerprints中超过1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。每个fingerprint包括一个自由格式的关于OS的描述文本,和一个分类信息,它提供供应商名称(如Sun),下面的操作系统(如Solaris),OS版本(如10),和设备类型(通用设备,路由器,switch,游戏控制台,等)。 如果Nmap不能猜出操作系统,并且有些好的已知条件(如至少发现了一个开放端口和一个关闭端口),Nmap会提供一个URL。 > -O (启用操作系统检测) 也可以使用-A来同时启用操作系统检测和版本检测。 > --osscan-limit (针对指定的目标进行操作系统检测) 如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。 > --osscan-guess; --fuzzy (推测操作系统检测结果) 当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认 进行这种匹配。 ## 时间和性能 在本地网络对一个主机的默认扫描(nmap hostname)需要1/5秒。 一些特定的扫描选项会明显增 加扫描时间,如UDP扫描和版本检测。同样,防火墙配置以及特殊的响应速度限制也会 增加时间,Nmap使用了并行算法和许多先进的算法来加速扫描。 > --min-hostgroup <size>;--max-hostgroup <size> (调整并行扫描组的大小) Nmap具有并行扫描多主机端口或版本的能力,Nmap将多个目标IP地址空间分成组,然后在同一时间对一个组进行扫描。 缺点是只有当整个组扫描结束后才会提供主机的扫描结果。 默认方式下,Nmap采取折中的方法,开始扫描时的组较小, 最小为5,这样便于尽快产生结果;随后增长组的大小,最大为1024。 --max-hostgroup选项用于说明使用最大的组,Nmap不 会超出这个大小。 --min-hostgroup选项说明最小的组,Nmap 会保持组大于这个值。 > --min-parallelism <numprobes>; --max-parallelism <numprobes> (调整探测报文的并行度) 用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下, Nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, Nmap降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值 可能为1,在好的条件下,可能会增长至几百。 --min-parallelism值大于1,以加快 性能不佳的主机或网络的扫描。这个选项具有风险,如果过高则影响准确度,同时 也会降低Nmap基于网络条件动态控制并行度的能力。这个值设为10较为合适, 这个值的调整往往作为最后的手段。 --max-parallelism选项通常设为1,以防止Nmap在同一时间 向主机发送多个探测报文。 > --min-rtt-timeout <milliseconds>, --max-rtt-timeout <milliseconds>, --initial-rtt-timeout <milliseconds> (调整探测报文超时) Nmap使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新 发送探测报文。Nmap基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著 和不定,这个超时值会增加几秒。初始值的比较保守(高),而当Nmap扫描无响应 的主机时,这个保守值会保持一段时间。 选项以毫秒为单位,采用小的--max-rtt-timeout值,使 --initial-rtt-timeout值大于默认值可以明显减少扫描时间,特别 是对不能ping通的扫描(-P0)以及具有严格过滤的网络。如果使用太 小的值,使得很多探测报文超时从而重新发送,而此时可能响应消息正在发送,这使得整个扫描的时 间会增加。 如果所有的主机都在本地网络,对于--max-rtt-timeout值来 说,100毫秒比较合适。如果存在路由,首先使用ICMP ping工具ping主机,或使用其 它报文工具如hpings,可以更好地穿透防火墙。 --initial-rtt-timeout设成这个时间的2倍,--max-rtt-timeout 可设成这个时间值的3倍或4倍。通常,不管ping的时间是多少,最大的rtt值不得小于100ms, 不能超过1000ms。 > --host-timeout <milliseconds> (放弃低速目标主机) 由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因, 一些主机需要很长的时间扫描。这些极少数的主机扫描往往占 据了大部分的扫描时间。因此,最好的办法是减少时间消耗并且忽略这些主机,使用 --host-timeout选项来说明等待的时间(毫秒)。通常使用1800000 来保证Nmap不会在单个主机上使用超过半小时的时间。需要注意的是,Nmap在这半小时中可以 同时扫描其它主机,因此并不是完全放弃扫描。 > --scan-delay <milliseconds>; --max-scan-delay <milliseconds> (调整探测报文的时间间隔) 用于Nmap控制针对一个主机发送探测报文的等待时间(毫秒),在带宽 控制的情况下这个选项非常有效。Solaris主机在响应UDP扫描探测报文报文时,每秒 只发送一个ICMP消息,因此Nmap发送的很多数探测报文是浪费的。--scan-delay 设为1000,使Nmap低速运行。Nmap尝试检测带宽控制并相应地调整扫描的延迟,但 并不影响明确说明何种速度工作最佳。 > -T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置时间模板) Nmap提供了一些简单的 方法,使用6个时间模板,使用时采用-T选项及数字(0 - 5) 或名称。 模板名称有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)。 前两种模式用于IDS躲避,Polite模式降低了扫描 速度以使用更少的带宽和目标主机资源。 默认模式为Normal,因此-T3 实际上是未做任何优化。 Aggressive模式假设用户具有合适及可靠的网络从而加速 扫描。 Insane模式假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。 用户可以根据自己的需要选择不同的模板,由Nmap负责选择实际的时间值。 模板也会针对其它的优化控制选项进行速度微调。例如,-T4 针对TCP端口禁止动态扫描延迟超过10ms,-T5对应的值为5ms。 模板可以和优化调整控制选项组合使用,但模板必须首先指定,否则模板的标准值 会覆盖用户指定的值。建议在扫描可靠的网络时使用 -T4。 T0选项的主要影响是对于连续扫描,在一个时间只能扫描一个端口, 每个探测报文的发送间隔为5分钟。T1和T2选项比较类似, 探测报文间隔分别为15秒和0.4秒。T3是Nmap的默认选项,包含了并行扫描。 T4选项与 --max-rtt-timeout 1250 --initial-rtt-timeout 500 等价,最大TCP扫描延迟为10ms。T5等价于 --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --host-timeout 900000,最大TCP扫描延迟为5ms。 ## 输出 Nmap提供5种不同的输出格式。默认的方式是interactive output, 发送给标准输出(stdout)。normal output方式类似于 interactive,但显示较少的运行时间信息 和告警信息,这是由于这些信息是在扫描完全结束后用于分析,而不是交互式的。 交互式输出是默认方式,没有相应的命令行选项,其它四种格式选项 使用相同的语法,采用一个参数,即存放结果的文件名。 > -oN <filespec> (标准输出) 将标准输出直接写入指定 的文件。 > -oX <filespec> (XML输出) XML输出直接写入指定 的文件。Nmap包含了一个文档类型定义(DTD),使XML解析器有效地 进行XML输出。这主要是为了程序应用,同时也可以协助人工解释 Nmap的XML输出。DTD定义了合法的格式元素,列举可使用的属性和 值。 > -oG <filespec> (Grep输出) 不建议使用,它是一种简单格式,每行一个主机,可以 通过UNIX工具(如grep、awk、cut、sed、diff)和Perl方便地查找和分解。常可 用于在命令行上进行一次性测式。 > -oA <basename> (输出至所有格式) 使用方便,利用-oA<basename>选项 可将扫描结果以标准格式、XML格式和Grep格式一次性输出。 分别存放在 <basename>.nmap,<basename>.xml和 <basename>.gnmap文件中。也可以在文件名前 指定目录名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。 > -v (提高输出信息的详细度) 通过提高详细度,Nmap可以输出扫描过程的更多信息。 > -d [level] (提高或设置调试级别) 当详细模式也不能为用户提供足够的数据时,使用调试可以得到更 多的信息。使用细节选项(-v)时,可启用命令行参数 (-d),多次使用可提高调试级别。也可在-d 后面使用参数设置调试级别。 例如,-d9设定级别9,这是 最高的级别。 > --packet-trace (跟踪发送和接收的报文) 要求Nmap打印发送和接收的每个报文的摘要,通常用于调试,有助于新用户更好地理解Nmap的真正工作。 > --iflist (列举接口和路由) 输出Nmap检测到的接口列表和系统路由,用于调试路由 问题或设备描述失误(如Nmap把PPP连接当作以太网对待)。 ## 脚本引擎 Nmap 脚本引擎 (NSE) 是 Nmap 最强大的功能之一,它使用 Lua 编程语言 来扩展 Nmap 的功能,将简单的端口扫描器转变为全面的网络安全评估平台。 > 基本脚本执行参数 | 参数 | 描述 | 示例 | | ----------------- | ------------------------ | ----------------------------------- | | -sC | 运行默认类别的脚本,等价于 --script=default,表示执行默认脚本集合(default category)中的脚本。 | nmap -sC target.com | | --script <脚本名> | 执行指定的脚本或脚本类别 | nmap --script http-title target.com | > 脚本指定参数 | 参数 | 描述 | 示例 | | --------------------- | ------------------ | --------------------------------- | | --script <脚本名> | 执行单个脚本 | --script ssh-brute | | --script <类别> | 执行整个类别脚本 | --script vuln或者 --scrip=vuln | | --script <通配符> | 使用通配符匹配脚本 | --script "http-" | | --script "多个脚本" | 执行多个脚本 | --script "http-title,ssh-hostkey" | | --script "not <类别>" | 排除特定类别 | --script "not intrusive" | > 常用脚本类别及用途 NSE 脚本按功能划分为多个类别,每个类别对应特定场景 | 类别 | 用途说明 | 典型脚本示例 | | --------- | ------------------------------------------------------------ | ------------------------------------------------ | | auth | 处理认证相关任务(如检测弱口令、绕过认证等) | ftp-anon(检测 FTP 匿名登录) | | broadcast | 通过广播包发现局域网内的设备或服务(如 DHCP、UPnP) | broadcast-dhcp-discover | | brute | 对服务进行暴力破解(如 SSH、FTP、数据库密码) | ssh-brute、mysql-brute | | default | Nmap 默认运行的脚本(基础信息收集,非侵入性) | ssh-hostkey(获取 SSH 主机密钥) | | discovery | 发现网络中的隐藏设备或服务(如 DNS 爆破、SNMP 探测) | dns-brute(DNS 子域名爆破) | | dos | 检测或利用拒绝服务(DoS)漏洞(**谨慎使用,可能影响目标可用性**) | http-slowloris | | exploit | 尝试利用已知漏洞(如 MS17-010、心脏出血等) | smb-vuln-ms17-010 | | external | 调用外部服务(如 WHOIS、Shodan)获取信息(可能需要 API 密钥) | whois-ip | | intrusive | 侵入性脚本(可能对目标造成干扰,如大量请求、修改配置) | udp-proto-scan | | safe | 安全脚本(非侵入性,不影响目标运行) | http-server-header(获取服务器头) | | vuln | 检测常见漏洞(如 CVE 漏洞、配置缺陷) | vuln(综合漏洞检测)、heartbleed(心脏出血漏洞) | | version | 增强服务版本探测能力(补充默认-sV的信息) | ssl-version(检测 SSL 版本) | > 逻辑组合参数 | 参数 | 描述 | 示例 | | ---------------------- | ---------------- | -------------------------------- | | --script "A and B" | 同时满足条件A和B | --script "default and safe" | | --script "A or B" | 满足条件A或B | --script "discovery or safe" | | --script "A and not B" | 满足A但不满足B | --script "default and not brute" | > 参数传递参数 | 参数 | 描述 | 示例 | | ------------------------- | ------------------ | -------------------------------- | | --script-args <参数> | 向脚本传递参数 | --script-args "userdb=users.txt" | | --script-args-file <文件> | 从文件读取脚本参数 | --script-args-file args.txt | > 执行控制参数 | 参数 | 描述 | 示例 | | ----------------------- | ---------------- | ------------------------ | | --script-timeout <时间> | 设置脚本超时时间 | --script-timeout 5m | | --script-updatedb | 更新脚本数据库 | nmap --script-updatedb | | --script-help <脚本名> | 显示脚本帮助信息 | --script-help http-title |
毛林
2025年10月9日 10:19
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码