1. NMAP功能及原理
1.1 主机发现
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数据包,将作出响应的主机进行打印。Figure 1: ICMP echo(AspirationFlow, 2020)
-
利用传输层协议的方式:
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.1.2 主机发现方式选项
选项 | 作用 |
---|---|
-sL | 列表扫描 – 简单扫描列表目标 |
-sn | Ping扫描 – 禁用端口扫描 |
-Pn | 检测所有在线主机 — 跳过主机发现 |
-PS/PA/PU/PY[端口列表] | TCP SYN/ACK, UDP 或 SCTP 发现指定的端口 |
-PE/PP/PM | ICMP echo, timestamp, 和netmask request发现 |
-PO[协议列表] | IP协议ping |
-PR | 利用ARP协议,扫描局域网 |
-n/-R | 从不DNS解析/始终解析 [默认: 有时] |
-dns-servers server1,2 | 指定自定义DNS服务器 |
-system-dns | 使用系统自带的DNS解析器 |
-traceroute | 追踪每个路由节点 |
1.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: 主机发现
1.2 端口扫描
1.2.1 端口扫描原理
简单的命令nmap 扫描主机上的1,000个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端口开放或被屏蔽:
1.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 |
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个端口)
1.3 版本侦测
版本侦测,用于确定目标主机开放端口上运行的具体的应用程序及版本信息。
1.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进一步探测具体服务。
1.3.2 版本侦测的用法
版本侦测方面的命令行选项比较简单。
选项 | 作用 |
---|---|
-sV | 指定让Nmap进行版本侦测 |
--version-intensity <level> | 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。 |
--version-light | 指定使用轻量侦测方式 (intensity 2) |
--version-all | 尝试使用所有的probes进行侦测 (intensity 9) |
--version-trace | 显示出详细的版本侦测过程信息。 |
1.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
1.4 OS侦测
操作系统侦测用于检测目标主机运行的操作系统类型及设备类型等信息。
Nmap拥有丰富的系统数据库nmap-os-db,目前可以识别2600多种操作系统与设备类型。
1.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中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。
1.4.2 OS侦测用法
OS侦测的用法简单,Nmap提供的命令比较少。
选项 | 作用 |
---|---|
-O | 指定Nmap进行OS侦测。 |
–osscan-limit | 限制Nmap只对确定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)。 |
–osscan-guess | 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统。 |
1.4.3 OS侦测实例
2 Nmap 常见使用场景以及相关命令
2.1 Nmap常用扫描命令
2.1.1 扫描固定端口,以sql Server为例
# 扫描并输出数据库信息
nmap -sS -p 1433,1434 -f --script=ms-sql-info -oG - -oX m
s-sql.xml 110.42.96.0/24
# 爆破数据库
nmap -sT -p 1433,1434 -f --script ms-sql-brute -script-arg
s userdb=C:\WorkSpace\Nmap\temp\sqluser.dic,passdb C:\WorkSpace\Nmap\temp\sqlpas s.dic -oG - -oX ms-sql-test.xml 110.42.96.0/24
2.1.2 获取远程主机的系统类型及开放端口
nmap -sS -P0 -sV -O
这里的 < target > 可以是单一 IP, 或主机名,或域名,或子网
-sS TCP SYN 扫描 (又称半开放,或隐身扫描)
-P0 允许你关闭 ICMP pings.
-sV 打开系统版本检测
-O 尝试识别远程操作系统其它选项:
-A 同时打开操作系统指纹和版本检测
-v 详细输出扫描情况.
nmap -sS -P0 -A -v
2.1.3 列出开放了指定端口的主机列表
nmap -sT -p 80 -oG – 192.168.1.*
2.1.4 在网络寻找所有在线主机
nmap -sP 192.168.0.*
nmap -sP 192.168.0.0/24
2.1.5 Ping 指定范围内的 IP 地址
nmap -sP 192.168.1.100-254
2.1.6 在某段子网上查找未占用的 IP
nmap -T4 -sP 192.168.2.0/24 && egrep “00:00:00:00:00:00″ /proc/net/arp
2.1.7 在局域网上扫找 Conficker 蠕虫病毒
nmap -PN -T4 -p139,445 -n -v –script=smb-check-vulns –script-args safe=1 192.168.0.1-254
2.1.8 扫描网络上的恶意接入点 (rogue APs)
nmap -A -p1-85,113,443,8080-8100 -T4 –min-hostgroup 50 –max-rtt-timeout2000 –initial-rtt-timeout 300 –max-retries 3 –host-timeout 20m–max-scan-delay 1000 -oA wapscan 10.0.0.0/8
2.1.9 使用诱饵扫描方法来扫描主机端口
nmap -R -sL 209.85.229.99/27 | awk ‘{if($3==”not”)print”(“$2″) no PTR”;else print$3″ is “$2}’ | grep ‘(‘
2.1.10 为一个子网列出反向 DNS 记录
nmap -R -sL 209.85.229.99/27 | awk ‘{if($3==”not”)print”(“$2″) no PTR”;else print$3″ is “$2}’ | grep ‘(‘
2.1.11 显示网络上共有多少台 Linux 及 Win 设备?
sudo nmap -F -O 192.168.0.1-255 | grep "Running: " > /tmp/os; echo "$(cat /tmp/os | grep Linux \| wc -l) Linux device(s)"; echo "$(cat /tmp/os | grep Windows | wc -l) Window(s) device"
2.2 Nmap脚本使用
nmap脚本主要分为以下几类,在扫描时可根据需要设置--script=
类别这种方式进行比较笼统的扫描:
类别 | 作用 |
---|---|
auth | 负责处理鉴权证书(绕开鉴权)的脚本 |
broadcast | 在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务 |
brute | 提供暴力破解方式,针对常见的应用如http/snmp等 |
default | 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力 |
discovery | 对网络进行更多的信息,如SMB枚举、SNMP查询等 |
dos | 用于进行拒绝服务攻击 |
exploit | 利用已知的漏洞入侵系统 |
external | 利用第三方的数据库或资源,例如进行whois解析 |
fuzzer | 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽 |
malware | 探测目标机是否感染了病毒、开启了后门等信息 |
safe | 此类与intrusive相反,属于安全性脚本 |
version | 负责增强服务与版本扫描(Version Detection)功能的脚本 |
vuln | 负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067 |
2.2.1 探测Web应用防火墙,以及防火墙指纹检测
nmap -p80,443 --script http-waf-detect --script-args="http-waf-detect.aggro,http-waf-detect.detectBodyChanges" targetWebsite.com
nmap -p80,443 --script http-waf-fingerprint targetWebsite.comStarting
nmap -p80,443 --script http-waf-fingerprint --script-args http-waf-fingerprint.intensive=1 targetWebsiteStarting
2.2.2 探测Web应用错误代码
nmap -p80,443 --script=http-errors baidu.com
下面是五个HTTP状态代码类别的列表:
- 1xx(信息):收到请求,继续处理
- 2xx(成功):请求已成功接收,理解和接受
- 3xx(重定向):需要采取进一步措施才能完成请求
- 4xx(客户端错误):请求包含错误的语法或无法满足
- 5xx(服务器错误):服务器无法满足明显有效的请求在HTTP的错误的Nmap脚本可用于确定进一步调查有趣的状态代码。
2.2.3 爬取Web应用
nmap -vv -p80,443 --script http-errors --script-args "httpspider.url=/docs/,httpspider.maxpagecount=3,httpspider.maxdepth=1" targetwebsite.com
2.2.4 爆破子域
nmap -p80,443 --script dns-brute targetWebsite.com
nmap -p80,443 --script dns-brute --script-args dns-brute.threads=25,dns-brute.hostlist=custom-subdomain-wordlist.txt targetWebsite.com
2.2.5 提取图片嵌入式信息EXIF
从照片中提取EXIF数据
可交换图像文件(更多称为EXIF)是以JPEG,PNG,PDF和更多文件类型存储的信息。此嵌入数据有时可以显示有趣的信息,包括时间戳,设备信息和GPS坐标。大多数网站仍然无法正确清理图像中的EXIF数据,从而使自己或用户面临风险。
作为渗透测试人员,了解目标使用何种设备将有助于我们确定要生成哪种类型的有效负载。用于捕捉黑帽子的EXIF数据的典型例子是Higinio Ochoa被捕。FBI代理使用Higinio上传到互联网的照片中的GPS数据推断出女友的地理位置。
Nmap的http-exif-spider脚本可用于从网站上的照片中提取有趣的EXIF数据。这样的脚本对Instagram,Twitter和Facebook等主流网站没用。当用户上传新照片时,主要网站会擦除EXIF数据。但是,个人博客,小型企业和企业组织可能不会采取强有力的安全预防措施或监控员工在线发布的内容。在照片中找到GPS数据并不罕见。
nmap -p80,443 --script http-exif-spider targetWebsite.com
尝试从大型照片中提取EXIF数据时,Nmap可能会生成一条错误消息,指出“当前的http缓存大小超过最大大小”。这是Nmap告诉我们照片太大并且超出了默认的最大文件大小值。使用http.max-cache-size参数并根据需要增加值。下面我把它设置为一个任意高的数字。
nmap -p80,443 --script http-exif-spider --script-args="http.max-cache-size=99999999" targetW
Reference
- Nmap, Host Discovery, viewed 21 Feb 2020, https://nmap.org/book/man-host-discovery.html
- AspirationFlow Nmap扫描原理与用法 , viewed 21 Feb 2020,https://blog.csdn.net/AspirationFlow/article/details/7694274?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- Clannad_niu, Nmap使用说明以及扫描原理, viewed 21 Feb 2020, https://blog.csdn.net/Clannad_niu/article/details/80235324