一、Nmap的简介
1.1. Nmap 的优势
1.2. Nmap 的主要功能包括
1.3. Nmap的下载
二、Nmap参数解析
2.1. nmap可以传入主机名、IP 地址、网络等
2.1.1. 类型说明
2.1.2. 相关参数
2.2. 主机发现
2.3. 扫描技术
2.4. 端口扫描
2.5. 服务 / 版本检测
2.6. 脚本扫描(漏扫)
2.7. 操作系统检测
2.8. 定时与性能
2.9. 防火墙 / 入侵检测系统规避与欺骗
2.10. 输出
2.11. 其他
三、常见用例
四、部分原理分析
一、没有 nmap 进行主机发现
二、没有 nmap 进行端口扫描
2.1 使用 nc(Netcat)进行端口扫描
2.3 使用 /dev/tcp 进行端口扫描
一、Nmap的简介
Nmap(Network Mapper) 是一款开源的网络扫描和安全审计工具,用于发现网络上的主机、服务、操作系统、开放端口等信息。它广泛应用于网络管理、渗透测试、安全分析等领域。Nmap 支持通过不同的扫描技术来识别网络设备、检测漏洞以及进行网络性能分析。
1.1. Nmap 的优势
nmap是一个古老又强大的扫描工具,目前市面上很多工具在端口扫描功能都还在用nmap的框架。
-
高效性:Nmap 是一款快速且高效的网络扫描工具,能够扫描大范围的 IP 地址和端口。
-
灵活性:支持多种扫描模式,用户可以根据实际需求选择合适的扫描方式。
-
强大的脚本支持:Nmap 的脚本引擎提供了丰富的扩展功能,可以对网络服务进行更细致的审计和测试。
-
跨平台支持:Nmap 可以在 Linux、Windows、macOS 等多个操作系统上运行。
-
安全性:Nmap 是一款开源工具,广泛应用于网络安全领域,具有良好的社区支持,能及时修复漏洞。
1.2. Nmap 的主要功能包括
-
端口扫描:Nmap 能够扫描目标主机的开放端口,帮助用户了解哪些服务在运行,哪些端口是开放的。这对于检查潜在的安全漏洞非常重要。
-
操作系统探测:通过分析目标主机的网络行为,Nmap 可以估计目标设备的操作系统类型和版本。
-
服务版本检测:Nmap 能够通过分析返回的响应信息来推测目标主机上运行的具体服务及其版本号。例如,它可以识别 web 服务器、邮件服务器等服务以及其版本,帮助安全人员发现服务中的潜在漏洞。
-
脚本扫描:Nmap 支持 Nmap 脚本引擎(NSE),可以执行一系列预定义的脚本来进行漏洞扫描、弱点分析、服务配置检测等。
-
防火墙绕过:Nmap 提供了多种扫描方式(如 SYN 扫描、FIN 扫描等),能够帮助用户绕过防火墙和入侵检测系统的拦截,从而有效地进行扫描。
-
主机发现:Nmap 可以通过 Ping 扫描、ARP 扫描等方式确认网络中存在哪些活动主机,从而为网络管理员提供完整的网络拓扑视图。
-
网络拓扑图绘制:通过 Nmap 可以绘制网络拓扑图,了解不同主机之间的连接关系。
1.3. Nmap的下载
windows、linux、mac版本都有,推荐取官网下载。windows版本有GUI,kali自带一个nmap。
官网:https://nmap.org/download.html
二、Nmap参数解析
2.1. nmap可以传入主机名、IP 地址、网络等
2.1.1. 类型说明
-
scanme.nmap.org:指定一个域名(例如 Nmap 官方提供的测试域名)。
-
microsoft.com/24:指定一个子网,/24 表示网络掩码为 255.255.255.0,即该网络包括从 microsoft.com 所属的整个 Class C 子网中的所有 IP 地址。
-
192.168.0.1:指定一个单一的 IP 地址。
-
10.0.0-255.1-254:指定 IP 地址范围,10.0.0-255 表示从 10.0.0.0 到 10.255.255.0,1-254 表示扫描从 1 到 254 的所有主机。
2.1.2. 相关参数
-
-iL <输⼊⽂件名> :从指定的文件中读取主机名或 IP 地址列表。
- <strong>例如,命令:nmap -iL hosts.txt</strong>
复制代码
-
-iR <主机数量> :随机选择指定数量的目标主机进行扫描。
- <strong>例如,命令:nmap -iR 1000</strong>
复制代码
-
--exclude <主机 1 , 主机 2,...> :排除指定的主机或网络不进行扫描。
- <strong>例如,命令:nmap --exclude 192.168.1.1,192.168.1.2 10.0.0.0/24</strong>
复制代码
-
--excludefile <排除⽂件> :从指定的文件中读取要排除的主机或网络列表。
- <strong>例如,命令:nmap --excludefile exclude.txt 10.0.0.0/24</strong>
复制代码
2.2. 主机发现
-
-sL :列表扫描 - 仅列出要扫描的目标。
-
-sn :Ping 扫描 - 禁用端口扫描。
-
-Pn :将所有主机视为在线状态 - 跳过主机发现步骤。
-
-PS/PA/PU/PY [端口列表] :对给定端口进行 TCP SYN/ACK、UDP 或 SCTP 发现操作。
-
-PE/PP/PM :ICMP 回显、时间戳和子网掩码请求发现探测。
-
-PO [协议列表] :IP 协议 Ping。
-
-n/-R :从不进行 DNS 解析 / 总是进行 DNS 解析(默认:有时进行)。
-
--dns-servers <服务器 1 [, 服务器 2],...> :指定自定义 DNS 服务器。
-
--system-dns :使用操作系统的 DNS 解析器。
-
--traceroute :追踪到每个主机的跃点路径。
2.3. 扫描技术
-
-sS:SYN 扫描(半开扫描) 发送 TCP SYN 数据包到目标端口。如果目标端口开放,它会回应一个 SYN-ACK 数据包,但扫描者不会完成三次握手。此方法隐蔽性较高,通常可以绕过防火墙和入侵检测系统(IDS)。
-
-sT:Connect 扫描 通过尝试完成三次握手来检测端口开放。与 SYN 扫描不同,Connect 扫描是完整的连接,容易被检测到,但适用于防火墙或网络设备无法过滤的情况。
-
-sA:ACK 扫描 发送 TCP ACK 数据包到目标端口,用来探测防火墙和路由器的存在。开放的端口会返回 RST 数据包,关闭的端口则不回应。这种扫描主要用于分析目标主机的过滤规则。
-
-sW:Window 扫描 基于 TCP 窗口大小进行端口扫描。通过分析接收到的 RST 数据包的窗口大小来推测端口的开放状态。此扫描方法依赖于操作系统和网络设备的实现,可能会被防火墙过滤。
-
-sM:Maimon 扫描 这种扫描方式发送一个包含 FIN 和 PSH 标志的 TCP 包,尝试利用某些操作系统的实现漏洞来判断端口是否开放。Maimon 扫描非常罕见,通常不被许多防火墙或 IDS 捕捉。
-
-sN:Null 扫描 发送没有任何 TCP 标志位的包(即没有 SYN、ACK、FIN 等标志)。根据响应行为来判断端口状态。大多数防火墙会将这种扫描视为异常,并且一些操作系统会根据不同的行为对 Null 扫描做出不同响应。
-
-sF:FIN 扫描 发送一个带有 FIN 标志的数据包到目标端口。如果目标端口关闭,它会返回一个 RST 数据包;如果开放,则没有响应。FIN 扫描也被认为是隐蔽的,但在某些情况下可能无法绕过防火墙。
-
-sX:Xmas 扫描 发送一个带有 FIN、URG 和 PSH 标志的数据包到目标端口,类似于圣诞树的闪烁灯光(因此得名 "Xmas")。如果目标端口关闭,会返回 RST 数据包;如果开放,则没有响应。此扫描方式常用于绕过防火墙和 IDS。
-
--scanflags <标志> 允许用户自定义 TCP 标志位以发起自定义的扫描。例如,用户可以根据特定需求调整 SYN、FIN、RST、PSH、URG 等标志。通过调整这些标志,攻击者可以尝试绕过防火墙或检测机制,进行更复杂的扫描。
-
-sI <僵尸主机 [: 探测端口]>:空闲扫描 利用另一个不直接参与扫描的主机(称为僵尸主机)作为源主机,通过该主机发送探测包进行扫描。这使得扫描者不直接暴露其真实 IP 地址。目标主机在回应时会直接发送到僵尸主机,从而隐蔽扫描者的真实位置。
-
-sY:SCTP INIT 扫描 针对 SCTP(流控制传输协议)进行扫描,发送 INIT 请求到目标端口。如果目标端口响应 SCTP COOKIE-ECHO 消息,则说明端口开放。此扫描方法通常用于 SCTP 网络协议环境。
-
-sZ:SCTP COOKIE-ECHO 扫描 发送 COOKIE-ECHO 请求以探测目标端口,适用于 SCTP 协议。如果目标端口开放,目标会响应 COOKIE-ACK 消息。SCTP 扫描用于专门的 SCTP 网络环境中。
-
-sO:IP 协议扫描 通过发送不同的 IP 协议(如 ICMP、TCP、UDP 等)到目标主机,来探测目标支持的 IP 协议类型。它可以帮助发现目标主机是否支持某些不常用的协议,适用于深度的协议分析和网络拓扑研究。
-
-b :FTP 反弹扫描 利用 FTP 服务器作为中继进行扫描,隐藏扫描者的来源地址。通过指定一个可用的 FTP 服务器,Nmap 将会将扫描请求发往该服务器,然后由该服务器将结果返回给扫描者。这种方法常用于绕过防火墙,增加隐蔽性。
2.4. 端口扫描
-
-p <端口范围>:指定扫描的端口或端口范围。
-
-p 22:仅扫描端口 22。
-
-p 1-65535:扫描所有端口。
-
-p-:扫描所有端口。
-
-p U:53,111,137,T:21-25,80,139,8080,S:9:扫描特定协议和端口
-
U: 后跟 UDP 端口(53, 111, 137)。
-
T: 后跟 TCP 端口(21-25, 80, 139, 8080)。
-
S: 后跟 SYN 扫描的端口(9)。
2.5. 服务 / 版本检测
-
-sV :探测开放端⼝以确定服务 / 版本信息。
-
--version-intensity <级别> :设置从 0(轻度)到 9(尝试所有探测)的强度。
-
--version-light :限制为最有可能的探测(强度为 2)。
-
--version-all :尝试每⼀个单独的探测(强度为 9)。
-
--version-trace :显⽰详细的版本扫描活动(⽤于调试)。
2.6. 脚本扫描(漏扫)
Nmap 脚本存储在 nmap/scripts 目录下。
你可以使用以下命令列出所有可用的脚本:nmap --script-help=default
-
使用 --script** 参数执行单个脚本:**nmap --script=http-title
这个命令会执行名为 http-title 的脚本,来获取目标的网页标题。
-
查看脚本帮助:--script-help=
-
使用 Lua 脚本:nmap --script=/path/to/your/script.nse
如果你想使用自定义 Lua 脚本,你需要指定脚本的路径,或者将脚本放置在 scripts 目录下。
-
Nmap 脚本分类:Nmap 脚本是根据不同的类别进行组织的
2.7. 操作系统检测
2.8. 定时与性能
-
-T<0 - 5> :设置定时模板(数值越⾼速度越快)。
-
--min-hostgroup/max-hostgroup <⼤⼩> :并⾏主机扫描组的⼤⼩。
-
--min-parallelism/max-parallelism <探测数量> :探测并⾏化。
-
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <时间> :指定探测往返时间。
-
--max-retries <尝试次数> :限制端⼝扫描探测的重传次数。
-
--host-timeout <时间> :在经过这段时间后放弃对⽬标的扫描。
-
--scan-delay/--max-scan-delay <时间> :调整探测之间的延迟。
-
--min-rate <数量> :每秒发送数据包的速度不低于 <数量>。
-
--max-rate <数量> :每秒发送数据包的速度不⾼于 <数量>。
2.9. 防火墙 / 入侵检测系统规避与欺骗
-
-f; --mtu <值> :对数据包进⾏分⽚(可指定 MTU 值)。
-
-D <诱饵 1, 诱饵 2 [, 我⾃⼰],...> :⽤诱饵掩盖扫描。
-
-S :伪造源地址。
-
-e <接⼝> :使⽤指定的接⼝。
-
-g/--source-port <端⼝号> :使⽤给定的端⼝号。
-
--proxies :通过 HTTP/SOCKS4 代理转发连接。
-
--data <⼗六进制字符串> :在发送的数据包上附加⾃定义负载。
-
--data-string <字符串> :在发送的数据包上附加⾃定义 ASCII 字符串。
-
--data-length <数字> :在发送的数据包上附加随机数据。
-
--ip-options <选项> :发送带有指定 IP 选项的数据包。
-
--ttl <值> :设置 IP ⽣存时间字段。
-
--spoof-mac :伪造你的 MAC 地址。
-
--badsum :发送带有错误 TCP/UDP/SCTP 校验和的数据包。
2.10. 输出
-
-oA <基本名> :同时以三种主要格式输出。
-
-v :提⾼详细程度级别(使⽤ -vv 或更⾼级别可获得更强效果)。
-
-d :提⾼调试级别(使⽤ -dd 或更⾼级别可获得更强效果)。
-
--reason :显⽰端⼝处于特定状态的原因。
-
--open :只显⽰开放(或可能开放)的端⼝。
-
--packet-trace :显⽰所有发送和接收的数据包。
-
--iflist :打印主机接⼝和路由(⽤于调试)。
-
--append-output :追加到指定的输出⽂件⽽不是覆盖它们。
-
--resume <⽂件名> :恢复⼀个中断的扫描。
-
--noninteractive :禁⽤通过键盘进⾏的运⾏时交互。
-
--stylesheet <路径 / URL> :将 XML 输出转换为 HTML 的 XSL 样式表。
-
--webxml :参考 Nmap.org 上的样式表以获得更具可移植性的 XML。
-
--no-stylesheet :防⽌将 XSL 样式表与 XML 输出关联。
2.11. 其他
-
-6 :启⽤ IPv6 扫描。
-
-A :启⽤操作系统检测、版本检测、脚本扫描和追踪路由。
-
--datadir <⽬录名> :指定⾃定义 Nmap 数据⽂件的位置。
-
--send-eth/--send-ip :使⽤原始以太⽹帧或 IP 数据包发送。
-
--privileged :假设⽤⼾具有完全的特权。
-
--unprivileged :假设⽤⼾没有原始套接字特权。
-
-V :打印版本号。
-
-h :打印此帮助概要⻚⾯
三、常见用例
1. nmap -sn 10.0.0.0/24
作用:该命令会扫描 10.0.0.0/24 网络段,检测哪些主机是在线的,但不扫描端口。常用于发现网络上的活动设备。
2. nmap -sT -sV -O --min-rate 10000 -p- 10.0.0.1
-
-sT:启用 TCP Connect 扫描,通过完全的 TCP 连接来判断端口是否开放。适合目标端口不被防火墙限制的情况。
-
-sV:启用 服务版本探测,Nmap 会尝试识别开放端口上运行的服务及其版本。
-
-O:启用 操作系统探测,尝试识别目标主机的操作系统。
-
--min-rate 10000:设置扫描时的最小包发送速率为每秒 10000 个包,用于加速扫描。
-
-p-:扫描 所有端口,从 1 到 65535 的所有端口。
-
10.0.0.1:目标主机的 IP 地址。
作用:该命令对 10.0.0.1 进行全端口扫描,检测开放的端口、识别服务版本和操作系统,并加速扫描过程。适用于全面的主机信息收集。
3. nmap -sU -sV --top-ports 20 10.0.0.1
-
-sU:启用 UDP 扫描,扫描目标主机的 UDP 端口。UDP 扫描通常比 TCP 扫描慢,因为 UDP 协议没有连接确认过程。
-
-sV:启用 服务版本探测,尝试识别开放的 UDP 服务及其版本信息。
-
--top-ports 20:扫描目标主机的 前 20 个最常用的 UDP 端口,常用于快速识别常见服务。
-
10.0.0.1:目标主机的 IP 地址。
作用:该命令对 10.0.0.1 执行 UDP 扫描,并识别最常用的 20 个端口上的服务和版本信息。适用于检测 UDP 服务的开放状态。
4. nmap --script=vuln -p22,80,443 10.0.0.1
-
--script=vuln:启用 Nmap 漏洞扫描脚本,Nmap 会运行一系列与漏洞相关的脚本来检查目标是否存在已知的安全漏洞。
-
-p22,80,443:仅扫描指定的端口,这里是常见的端口:22(SSH)、80(HTTP)和 443(HTTPS)。
-
10.0.0.1:目标主机的 IP 地址。
作用:该命令扫描 10.0.0.1 上的 22、80、443 端口,并运行漏洞扫描脚本检查是否存在已知的安全漏洞,适用于快速的漏洞评估。
5. nmap -A -T4 10.0.0.1
作用:该命令对 10.0.0.1 进行全面扫描,识别操作系统、服务版本、潜在的漏洞等信息,并加速扫描过程。适用于综合的安全扫描。
6. nmap --script=vuln -sT -sV -O --min-rate 10000 -p- -T4 10.0.0.1
作用:该命令集成了前面所有常见参数对 10.0.0.1 进行全面扫描,识别操作系统、服务版本、潜在的漏洞等信息,并加速扫描过程。适用于综合的安全扫描。
7. nmap -p- -T4 -sS 192.168.1.1
四、部分原理分析
一、没有 nmap 进行主机发现
nmap 的 -sn 选项用于执行 ICMP ping 扫描,以确定哪些主机在线。
nmap -sn 192.169.3.0/24 其实是封装的系统的ping命令
- for i in {1..254}; do ping -c 1 -W 1 192.168.3.$i | grep from; done
复制代码
命令解析:
-
for i in {1..254}:表示循环遍历 192.168.3.1 到 192.168.3.254 之间的所有主机。
-
ping -c 1 -W 1:发送一个 ICMP 请求包(-c 1)并设置超时时间为 1 秒(-W 1)。
-
目标 IP 地址是 192.168.3.$i,$i 是循环变量,会从 1 到 254 依次改变。
如果在执行 ping 命令时需要中途停止,可以使用以下方式:
二、没有 nmap 进行端口扫描
2.1 使用 nc(Netcat)进行端口扫描
nc 是一个非常常用的网络工具,可以进行端口扫描和简单的网络通信。通过 nc 可以模拟端口扫描的过程。
- nc.traditional -vv -z 192.168.3.120 1-65535 2>&1 | grep -v refused
复制代码
-
命令解析:
-
nc.traditional:使用旧版 nc 工具。
-
-vv:启用详细输出模式,以显示更多信息。
-
-z:表示仅进行端口扫描,不进行数据传输。
-
192.168.3.120:目标主机的 IP 地址。
-
1-65535:扫描的端口范围,表示从端口 1 到端口 65535。
-
2>&1:将标准错误输出(stderr)重定向到标准输出(stdout),这样可以统一处理所有输出。
-
grep -v refused:过滤掉包含 "refused" 的行,即剔除那些被拒绝的端口,只显示开放的端口。
2.3 使用 /dev/tcp 进行端口扫描
Linux 系统中的 /dev/tcp 伪设备可以直接用于通过 TCP 协议进行连接。通过使用 Bash 脚本,可以实现端口扫描。
- for i in {1..65535}; do (echo < /dev/tcp/192.168.3.120/$i) &>/dev/null && printf "\n[+] The Open Port is: %d\n" "$i" || printf "."; done
复制代码
-
命令解析:
-
for i in {1..65535}:循环遍历所有端口号(从 1 到 65535)。
-
(echo < /dev/tcp/192.168.3.120/$i):通过 /dev/tcp 伪设备尝试与目标 IP 地址 192.168.3.120 上的每个端口建立连接。
-
&>/dev/null:将输出(包括标准输出和标准错误输出)重定向到 /dev/null,即丢弃输出。
-
&&:表示前面的命令成功执行时,才执行后面的命令。
-
||:表示无论前面的命令是否成功,后面的命令都会执行。
-
printf "\n[+] The Open Port is: %d\n" "$i":如果连接成功,打印开放端口。
-
printf ".":如果连接失败,打印一个点,表示该端口不可用。
Nmap 是一个功能强大的网络扫描工具,广泛应用于网络安全领域。它不仅能够帮助管理员发现网络中的漏洞,还能为渗透测试人员提供强大的网络信息收集能力。通过不断更新和完善,Nmap 已经成为了网络安全人员、系统管理员以及渗透测试工程师的必备工具之一。
尽管如此,使用 Nmap 时也需要小心,特别是在未经授权的情况下扫描目标网络可能会引发法律和道德问题。正确的使用方式和目的,对于实现其最大价值至关重要。在合法的安全测试和网络管理中,Nmap 提供了不可或缺的支持,帮助我们更好地了解和保护网络安全。