一、Nmap简介

Nmap(Network Mapper,网络映射器)是一款开放源代码的网络探测和安全审核工具,俗称扫描器之王。它的设计目标是快速地扫描大型网络,当然用它扫描单个主机也没有问题。Nmap以新颖的方式使用原始 IP 报文来发现网络上有哪些主机,那些主机提供什么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息),它们使用什么类型的报文过滤器 / 防火墙,以及一堆其它功能。虽然 Nmap 通常用于安全审核, 许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息,管理服务升级计划,以及监视主机和服务的运行。

nmap 官网 

二、Nmap功能

  1. 检测存活在网络上的主机(主机发现)
  2. 检测主机上开放的端口(端口发现或枚举)
  3. 检测到相应端口(服务发现)的软件和版本
  4. 检测操作系统,硬件地址,以及软件版本
  5. 检测脆弱性的漏洞(Nmap的脚本)

三、栗子

1、检测存活在网络上的主机(主机发现)

1.1 主机发现原理

任何网络侦察任务的第一步就都是将一组(有时是巨大的)IP范围缩减为一组活动的(alive)主机。Nmap主机发现的实现分为两个阶段:地址解析阶段 + 实际探测阶段。

地址解析主要负责从主机表达式中解析出目标主机地址,将之存放在 hostbatch 中,并配置该主机所需的路由、网口、MAC 地址、源 IP 等信息。实际发现分别对解析出来的目标主机,进行实际的探测以及获取 RDNS 相关信息,例如采用 ARP 包发现局域网内主机是否在线。

Nmap 从主机表达式中获取主机地址,若取得的不是 IP 需要进行 DNS 解析,获取域名对应的 IP。在实际主机发现过程中,根据所利用的协议的不同,分为以下两种:

  • 利用网络层(IP层)协议的方式:

1)ARP方式。

ARP 方式一般用于 Nmap 对局域网进行扫描的情况下,因为基于 RFC1918 私有地址范围的网络中在一个给定的时间内绝大部分 IP 地址都是不使用的。当 Nmap 试图发送一个原始 IP 报文如 ICMP 回声请求时,操作系统必须确定对应于目标 IP 的硬件地址(需要使用 ARP),所以直接放弃 IP 报文阶段,在得到 ARP 回应时就可以知道目标主机处于活跃状态。
2)Ping 扫描。仅仅进行 ping 扫描,发送 ICMP 数据包,将作出响应的主机进行打印。

在这里插入图片描述

  • 利用传输层协议的方式:

1)发送 SYN 数据包、发送 ACK 数据包、发送 UDP 数据包。

前两种分别利用了 TCP 三次握手中的第一次握手与第二次握手。让对方觉得正在试图建立一个TCP 连接,从而做出回应,根据回应得出主机状态。UDP 则是发送一个 UDP 数据包,得到端口不可达、主机网络不可达的回应。

如果主机扫描选项没有给定,Nmap 默认发送(Nmap, 2020)

ICMP echo请求
TCP SYN 443 请求
TCP ACK 80 请求
ICMP timestamp请求(IPV6 的话这步会忽略因为 IPV6 没有 timestamp 请求)
等同于 -PE -PS443 -PA80 -PP 选项。依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。

ARP(for IPV 4)和 Neighbor Discovery (for IPv6)是个例外,他们被用于扫描本地网络。对于没有赋权的unix shell用户,默认的检测是 SYN 80和443(-PS80,443)。主机发现扫描本地网络通常是够的,但是建议使用更全面的发现手段来进行安全审核。

默认情况下,Nmap 会进行主机发现,然后对在线的主机进行端口扫描(-sn 可取消端口扫描)。即使指定了非默认主机发现类型(例如 UDP 探针(-PU)),也是如此。

1.2 主机发现方式选项

选项作用
-sL列表扫描 – 简单扫描列表目标
-snPing 扫描 – 禁用端口扫描
-Pn检测所有在线主机 — 跳过主机发现
-PS / PA / PU / PY [端口列表]TCP SYN / ACK, UDP 或 SCTP 发现指定的端口
-PE / PP / PMICMP echo、timestamp 和 netmask request 发现
-PO [协议列表]IP 协议 ping
-PR利用 ARP 协议,扫描局域网
-n/-R从不 DNS 解析/始终解析 [默认: 有时]
-dns-servers server1,2指定自定义 DNS 服务器
-system-dns使用系统自带的 DNS 解析器
-traceroute追踪每个路由节点

1.3 主机发现测试 

sudo nmap -sn -PE -PS80,135 -PU53 --dns-servers 8.8.8.8 baidu.com
# -sn 不进行端口扫描
# -PS 使用TCP SYN方式
# -PU 使用UDP 53端口方式
# -PE ICMP echo方式

Figure 1: 主机发现

主机发现

2 端口扫描

2.1 端口扫描原理

简单的命令 nmap 扫描主机上的 1000 个 TCP 端口。Nmap 将端口分为六个状态:打开,关闭,已过滤,未过滤,已打开或已关闭(open, closed, filtered, unfiltered, open|filtered, or closed|filtered)。 这些状态不是端口本身的固有属性,而是 Nmap 判定的。例如,从与目标服务器相同的网络进行的 Nmap 扫描可能会将端口 135 / tcp 显示为打开,而使用 Internet 上的相同选项同时进行的扫描可能会将该端口显示为已过滤。

TCP 半连接扫描(TCP SYN scanning)

这是 Nmap 默认的扫描方式,通常被称作半开放扫描(Half-open scanning)。该方式发送 SYN 到目标端口,如果收到 SYN / ACK 回复,那么判断端口是开放的;如果收到 RST 包,说明该端口是关闭的。如果没有收到回复,那么判断该端口被屏蔽(Filtered)。因为该方式仅发送 SYN 包对目标主机的特定端口,但不建立的完整的 TCP 连接,所以相对比较隐蔽,而且效率比较高,适用范围广。

TCP SYN探测到端口关闭:

在这里插入图片描述

TCP SYN探测到端口打开:

在这里插入图片描述

TCP全连接扫描(TCP connect scanning)
TCP connect scanning 探测到端口关闭:

在这里插入图片描述

TCP connect scanning 探测到端口开放: 

TCP ACK scanning
向目标主机的端口发送 ACK 包,如果收到 RST 包,说明该端口没有被防火墙屏蔽;没有收到RST 包,说明被屏蔽。该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助 TCP SYN 的方式来判断目标主机防火墙的状况。

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 包。

TCP FIN 探测到主机端口是关闭的:

在这里插入图片描述

TCP FIN 探测到主机端口是开放或屏蔽的:

在这里插入图片描述

UDP scanning
UDP 扫描方式用于判断 UDP 端口的情况。向目标主机的 UDP 端口发送探测包,如果收到回复“ICMP port unreachable”就说明该端口是关闭的;如果没有收到回复,那说明 UDP 端口可能是开放的或屏蔽的。因此,通过反向排除法的方式来断定哪些 UDP 端口是可能出于开放状态。

UDP 端口关闭:

在这里插入图片描述

UDP 端口开放或被屏蔽: 

在这里插入图片描述

2.2 端口扫描方式选项 

选项作用
-sS / sT / sA / sW / sM

指定使用 TCP SYN / Connect() / ACK / Window / Maimon scans 的方式

来对目标主机进行扫描。

-sU指定使用 UDP 扫描方式确定目标主机的 UDP 端口状况。
-sN / sF / sX

指定使用 TCP Null、FIN and Xmas scans 秘密扫描方式

来协助探测对方的TCP端口状态。

–scanflags定制 TCP 包的 flags 。
-sI <zombiehost[:probeport]>

僵尸扫描,指定使用 idle scan 方式来扫描目标主机

(前提需要找到合适的僵尸机 zombie host )

-sY / sZ

使用 SCTP INIT / COOKIE-ECHO 来扫描 SCTP 协议

端口的开放的情况。

-sO使用 IP protocol 扫描确定目标机支持的协议类型。
-b使用 FTP bounce scan 扫描方式
-p <port ranges>扫描给的端口,e.g. 1-1023
–exclude-ports <port ranges>不扫描给的端口
-F快速扫描(限定端口)
-r不按随机顺序扫描(默认是随机扫描,为了安全)
–top-ports <n>

扫描最常见的 n 个端口,除了 –exclude-ports 指定的端口外。

<n> 至少大于1

2.3 端口扫描演示 

nmap –sS –sU –T4 –top-ports 300 192.168.56.102
# -sS: TCP SYN 方式
# -sU UDP 方式
# -T4:时间级别配置4级;
# --top-ports 300:扫描最有可能开放的300个端口(TCP和UDP分别有300个端口)

3、版本侦测

版本侦测,用于确定目标主机开放端口上运行的具体的应用程序及版本信息。

3.1 版本侦测原理

简要的介绍版本的侦测原理。

版本侦测主要分为以下几个步骤:

首先检查 open 与 open | filtered 状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
如果是 TCP 端口,尝试建立 TCP 连接。尝试等待片刻(通常 6 秒或更多,具体时间可以查询文件 nmap-services-probes 中 Probe TCP NULL q|| 对应的 totalwaitms)。通常在等待时间内,会接收到目标机发送的“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 进一步探测具体服务。

3.2 版本侦测的用法

版本侦测方面的命令行选项比较简单。

选项作用
-sV指定让Nmap进行版本侦测
--version-intensity <level>

指定版本侦测强度(0-9),默认为7。数值越高,

探测出的服务越准确,但是运行时间会比较长。

--version-light指定使用轻量侦测方式 (intensity 2)
--version-all尝试使用所有的probes进行侦测 (intensity 9)
--version-trace显示出详细的版本侦测过程信息。

3.3 版本侦测实例

sudo nmap -sV --version-trace 49.235.23.187
Starting Nmap 7.80 ( https://nmap.org ) at 2020-02-22 13:52 GMT
PORTS: Using top 1000 ports found open (TCP:1000, UDP:0, SCTP:0)
--------------- Timing report ---------------
  hostgroups: min 1, max 100000
  rtt-timeouts: init 1000, min 100, max 10000
  max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
  parallelism: min 0, max 0
  max-retries: 10, host-timeout: 0
  min-rate: 0, max-rate: 0
---------------------------------------------
NSE: Using Lua 5.3.
NSE: Arguments from CLI: 
NSE: Loaded 45 scripts for scanning.
Packet capture filter (device eth0): dst host 192.168.42.136 and (icmp or icmp6 or ((tcp or udp or sctp) and (src host 49.235.23.187)))
We got a TCP ping packet back from 49.235.23.187 port 80 (trynum = 0)
Overall sending rates: 70.33 packets / s, 2672.53 bytes / s.
mass_rdns: Using DNS server 192.168.42.2
mass_rdns: Using DNS server 8.8.8.8
mass_rdns: 0.14s 0/1 [#: 2, OK: 0, NX: 0, DR: 0, SF: 3, TR: 4]
DNS resolution of 1 IPs took 0.14s. Mode: Async [#: 2, OK: 0, NX: 0, DR: 1, SF: 4, TR: 4, CN: 0]
Packet capture filter (device eth0): dst host 192.168.42.136 and (icmp or icmp6 or ((tcp or udp or sctp) and (src host 49.235.23.187)))
Overall sending rates: 86.74 packets / s, 3813.49 bytes / s.
NSE: Script scanning 49.235.23.187.
NSE: Starting runlevel 1 (of 2) scan.
NSE: Starting runlevel 2 (of 2) scan.
Nmap scan report for 49.235.23.187
Host is up (0.053s latency).
All 1000 scanned ports on 49.235.23.187 are filtered
Final times for host: srtt: 52723 rttvar: 106011  to: 476767

Read from /usr/bin/../share/nmap: nmap-payloads nmap-service-probes nmap-services.
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.02 seconds

4、OS侦测

操作系统侦测用于检测目标主机运行的操作系统类型及设备类型等信息。

Nmap 拥有丰富的系统数据库 nmap-os-db,目前可以识别 2600 多种操作系统与设备类型。

4.1 OS 侦测原理

Nmap 使用 TCP / IP 协议栈指纹来识别不同的操作系统和设备。在 RFC 规范中,有些地方对TCP/ IP 的实现并没有强制规定,由此不同的 TCP / IP 方案中可能都有自己的特定方式。Nmap 主要是根据这些细节上的差异来判断操作系统的类型的。

具体实现方式如下:

Nmap内部包含了 2600 多已知系统的指纹特征(在文件nmap-os-db文件中)。将此指纹数据库作为进行指纹对比的样本库。
分别挑选一个 open 和 closed 的端口,向其发送经过精心设计的 TCP / UDP / ICMP 数据包,根据返回的数据包生成一份系统指纹。
将探测生成的指纹与 nmap-os-db 中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。

4.2 OS 侦测用法

OS 侦测的用法简单,Nmap 提供的命令比较少。

选项作用
-O指定Nmap进行OS侦测。
–osscan-limit

限制Nmap只对确定的主机的进行OS探测

(至少需确知该主机分别有一个open和closed的端口)。

–osscan-guess

大胆猜测对方的主机的系统类型。

由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统。

转载:NMAP详解_黎先生你好的博客-CSDN博客_nmap解释 

(SAW:Game Over!)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐