NMAP
NMAP (Network Mapper) 是一款基于 GNU GPLv2 的 License (Nmap Public Source License Version 0.92)的开源软件,使用 C 语言和 Lua 语言编写,一般用于网络发现和安全审核。许多系统和网络管理员还使用它进行管理服务升级计划以及监视主机或服务是否正常运行。
黑客也使用 namp 进行漏洞扫描从而计划攻击的方法。Nmap 以新颖的方式使用原始 IP 数据包来确定网络上可用的主机,以及这些主机提供的服务(应用程序名称和版本),它们正在运行的操作系统(和 OS 版本)等。
它旨在快速扫描大型网络,也可以在单个主机上正常运行。
Nmap 可在所有主流的计算机操作系统上运行,官方二进制软件包可用于 Linux,Windows 和 Mac OSX。
Nmap 主要包括四个方面的扫描功能,主机发现、端口扫描、应用与版本侦测、操作系统侦测。
主机发现
主机发现 (Host Discovery) 即用于发现目标主机是否被占用。
默认情况下,Nmap 会发送四种不同类型的数据包来探测目标主机是否在线。
- ICMP echo request
- a TCP SYN packet to port 80
- a TCP ACK packet to port 80
- an ICMP timestamp request
依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。
通过上面可知在实际主机发现过程中,根据协议的不同,可以分为已下两种方式:
- 利用二层协议
- 在二层中也就是不经过路由器在同一网段下,使用 ARP 协议枚举扫描网段下的 ip 收到 arp 的回包可以知道目标主机是否处于活跃状态。
- PING 扫描 发送 ICMP 数据包,将做出响应的主机处于活跃状态。
- 利用三层协议
- TCP 协议 利用 TCP 三次握手中的第一次握手与第二次握手。让对方觉得正在试图建立一个 TCP 连接,从而做出回应,根据回应得出主机状态。
- UDP 协议 则是发送一个 UDP 数据包,得到端口不可达、主机网络不可达的回应。
值得注意的是:
如果在同一网段,则无论主机发现参数如何指定,Nmap 都使用 ARP 扫描完成主机发现。
参数 | 描述 | 是否常用 |
---|---|---|
-sL | 仅列出指定参数有哪些 IP,并反向查询域名信息。 | 一般 |
-sn | 只单独进行主机发现过程 ,默认的主机发现方式。 | 常用 |
-Pn | 不进行主机发现,直接进入端口扫描阶段,能绕过 ICMP 过滤,老版本为-P0。 | 常用 |
-PS/-PA/-PU/-PY | 分别用 TCP SYN/TCP ACK/UDP/SCTP 技术进行主机发现。 | 常用 |
-PE/-PP/-PM | 分别用 ICMP ECHO/ICMP TIMESTAMP/ICMP MASK 技术进行主机发现。 | 一般 |
-PO | 使用参数指定的协议(如 TCP)对主机进行扫描。 | 不常用 |
ARP 扫描
Nmap 所在的机器会向整个网段广播 arp 包,如果收到回包则说明该 ip 地址处于活跃状态。但是 arp 是二层协议,无法扫描不同 vlan 不同网段的主机。
Ping 扫描
ping 扫描使用 arp 协议结合三层路由协议向不同 vlan 不同广播域发送 icmp 报文,根据 icmp 的响应报文判断主机是否可达。
-sn Ping Scan 只进行主机发现,不进行端口扫描。
nmap -sn -T4 --packet-trace 192.168.1.146
TCP/UDP 扫描
TCP 主机发现是基于 TCP 三次握手,尝试发送一个 TCP SYN 包,收到回包就证明目标机处于活跃状态。详情见端口扫描。
端口扫描
端口扫描 (Port Scanning) namp 最核心的功能,用于确定主机目标的 TCP/UDP 端口开放情况。默认情况下,Nmap 会扫描 1000 个最有可能开放的 TCP 端口。
- open:端口是开放的。
- closed:端口是关闭的。
- filtered:端口被防火墙 IDS/IPS 屏蔽,无法确定其状态。
- unfiltered:端口没有被屏蔽,但是否开放需要进一步确定。
- open | filtered : 端口是开放的或被屏蔽。
- closed| filtered : 端口是关闭的或被屏蔽。
Nmap 在端口扫描方面非常强大,提供了十多种探测方式。
TCP SYN scanning
SYN scanning 是 Nmap 默认的扫描方式,被称作半开放扫描(Half-open scanning)。发送 SYN 到目标端口,如果收到 SYN/ACK 回复,那么判断端口是开放的;如果收到 RST 包,则说明该端口是关闭的。如果没有收到回复,那么就判断该端口被屏蔽(Filtered)。因为该方式仅发送 SYN 包对目标主机的特定端口,但不建立的完整的 TCP 连接,所以相对于其他方式比较隐蔽,并且效率较高,适用范围广。
-sS: 指定使用 TCP SYN 的方式来对目标主机进行扫描。
TCP SYN 检测到端口关闭:
TCP SYN 检测到端口开放:
TCP connect scanning
TCP connect 方式使用系统网络 API connect 向目标主机的端口发起连接,如果无法连接,说明该端口关闭。该方式扫描速度比较慢,而且由于建立完整的 TCP 连接会在目标机上留下记录信息,不够隐蔽。所以,TCP connect 是 TCP SYN 无法使用才考虑选择的方式。
-sT :指定使用 TCP Connect 的方式来对目标主机进行扫描。
TCP connect 检测到端口关闭:
TCP connect 检测到端口开放:
TCP ACK scanning
向目标主机的端口发送 ACK 包,如果收到 RST 包,说明该端口没有被防火墙屏蔽;没有收到 RST 包,说明被屏蔽。该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助 TCP SYN 的方式来判断目标主机防火墙的状况。
-sA: 指定使用 TCPACK 的方式来对目标主机进行扫描。
TCP ACK 探测到端口被屏蔽:
TCP ACK 探测到端口未被屏蔽:
TCP FIN/Xmas/NULL scanning
这三种扫描方式被称为秘密扫描(Stealthy Scan),因为相对比较隐蔽。FIN 扫描向目标主机的端口发送的 TCP FIN 包或 Xmas tree 包/Null 包,如果收到对方 RST 回复包,那么说明该端口是关闭的;没有收到 RST 包说明端口可能是开放的或被屏蔽的(open filtered)。
其中 Xmas tree 包是指 flags 中 FIN URG PUSH 被置为 1 的 TCP 包;NULL 包是指所有 flags 都为 0 的 TCP 包。
- -sN/sF/sX: 指定使用 TCP Null, FIN, and Xmas scans 秘密扫描方式来协助探测对方的 TCP 端口状态。
- --scanflags : 定制 TCP 包的 flags。
TCP FIN 探测到端口关闭:
TCP FIN 探测到端口开放/被屏蔽
UDP scanning
UDP 扫描方式用于判断 UDP 端口的情况。向目标主机的 UDP 端口发送探测包,如果收到回复“ICMP port unreachable”就说明该端口是关闭的;如果没有收到回复,那说明 UDP 端口可能是开放的或屏蔽的。因此,通过反向排除法的方式来断定哪些 UDP 端口是可能出于开放状态。
- -sU: 指定使用 UDP 扫描方式确定目标主机的 UDP 端口状况。
UDP 端口关闭:
UDP 端口开放/被屏蔽:
其他方式
除上述几种常用的方式之外,Nmap 还支持多种其他探测方式。例如使用 SCTP INIT/COOKIE-ECHO 方式来探测 SCTP 的端口开放情况;使用 IP protocol 方式来探测目标主机支持的协议类型(TCP/UDP/ICMP/SCTP 等等);使用 idle scan 方式借助僵尸主机(zombie host,也被称为 idle host,该主机处于空闲状态并且它的 IPID 方式为递增。或者使用 FTP bounce scan,借助 FTP 允许的代理服务扫描其他的主机,同样达到隐藏自己的身份的目的。
- -sI zombiehost[:probeport]: 指定使用 idle scan 方式来扫描目标主机(前提需要找到合适的 zombie host)
- -sY/sZ: 使用 SCTP INIT/COOKIE-ECHO 来扫描 SCTP 协议端口的开放的情况。
- -sO: 使用 IP protocol 扫描确定目标机支持的协议类型。
版本侦测
nmap 提供了确定目标主机开放端口上运行的具体程序信息和版本信息 (Version Detection)。
nmap 内置了广泛的应用程序数据库(nmap-services-probes) ,目前 Nmap 可以识别几千种服务的签名,包含了 180 多种不同的协议。
-sV:开启端口服务版本探测
原理:
- 先检查端口是否 open
- 如果是 TCP 端口,就尝试建立 TCP 连接,通常在等待时间内会接收到目标机器发送的“WelcomeBanner”信息。nmap 将接收到的 Banner 与 nmap-services-probes 中 NULL probe 中的签名进行对比。查找对应应用程序的名字与版本信息。
- 如果通过“Welcome Banner”无法确定应用程序版本,那么 nmap 再尝试发送其他的探测包(即从 nmap-services-probes 中挑选合适的 probe),将 probe 得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
- 如果是 UDP 端口,那么直接使用 nmap-services-probes 中探测包进行探测匹配。根据结果对比分析出 UDP 应用服务类型。
- 如果探测到应用程序是 SSL,那么调用 openSSL 进一步的侦查运行在 SSL 之上的具体的应用类型。
- 如果探测到应用程序是 SunRPC,那么调用 brute-force RPC grinder 进一步探测具体服务。
操作系统侦测
操作系统侦测 (Operating System Detection) 于检测目标主机运行的操作系统类型及设备类型等信息。
os 侦测返回的是推断为可能的操作系统列表
-O:开启操作系统探测
- --osscan-limit: 限制 Nmap 只对确定的主机的进行 OS 探测(至少需确知该主机分别有一个 open 和 closed 的端口)。
- --osscan-guess: 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统。
Nmap 拥有丰富的系统数据库 nmap-os-db,目前可以识别 2600 多种操作系统与设备类型。
- Nmap 内部包含了 2600 多已知系统的指纹特征(在文件 nmap-os-db 文件中)。将此指纹数据库作为进行指纹对比的样本库。
- 分别挑选一个 open 和 closed 的端口,向其发送经过精心设计的 TCP/UDP/ICMP 数据包,根据返回的数据包生成一份系统指纹。
- 将探测生成的指纹与 nmap-os-db 中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。
脚本
nmap 支持使用 lua 语言来为 nmap 进行脚本开发。使用 Python 或者其他语言来调用 Nmap 进行格式解析,这种方式无法预估扫描进度,不能进行状态交互,效率很差,如果有需要我们可以自己编写定制化的的 Nmap 脚本。
脚本分类
- auth 处理身份验证
- broadcast 网络广播
- brute 暴力猜解
- default 默认
- discovery 服务发现
- dos 拒绝服务
- exploit 漏洞利用
- external 外部扩展
- fuzzer 模糊测试
- intrusive 扫描可能造成不良后果
- malware 检测后门
- safe 扫描危害较小
- version 版本识别
- vuln 漏洞检测
这些脚本 nmap 都内置在安装目录的 script 目录里面
漏洞扫描
nmap 内置了一个 vuln 分类支持漏洞扫描如果想要使用这个分类下的所有脚本,可以在--script 的后面加上分类名称,同样我们可以用相似的方法来提高目标版本的检测功能,以及将目标端口设置为全部有效端口。
nmap -p- -sV --version-all --script vuln 192.168.1.146
-p- 指的是将目标端口指定为全部有效端口, -sV --version-all 用来提高版本检测的效率。
也可以指定详细的某个漏洞类型,如果填--script=vuln 则扫描所有漏洞库
nmap --script http-slowloris-check 192.168.1.146
下图是在 146 上扫描出端口为 8080 的服务也就是 keycloak 的一个漏洞
测试 Web 服务器是否受到 Slowloris DoS 攻击的漏洞,而无需实际发起 DoS 攻击。
更多漏洞扫描脚本详情 https://nmap.org/nsedoc/categories/vuln.html
Vulscan,它是 Nmap 的一个漏洞扫描增强模块,通过它可以把 Nmap 打造成一款实用高效免费的漏洞扫描器。Vulscan 目前包含了 CVE、OSVDB、Exploit-db、openvas 等多个漏洞平台指纹数据,具备离线扫描功能,对主机系统漏洞有很好的探测识别效果。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于