Nmap基础
【Nmap介绍】
Nmap,也就是Network Mapper,中文为“网络映射器”。Nmap是一款开源的网络探测和安全审核的工具,它的设计目标是快速地扫描大型网络。它是网络管理员必用的软件之一,以及用以评估网络系统保安。
【Nmap基本功能】
(1)探测一组主机是否在线
(2)扫描主机端口,嗅探所提供的网络服务
(3)推断主机所用的操作系统
【Nmap工作原理】
Nmap对目标主机进行一系列的测试,利用测试结果建立相应目标主机的Nmap指纹,然后Nmap会对指纹进行匹配,最终输出相应的结果。
Nmap TCP/IP 协议栈指纹
| 测试 | 描述 |
|---|---|
| T1 | 发送TCP数据包(Flag=SYN)到开放TCP端口 |
| T2 | 发送一个空的TCP数据包到开放的TCP端口 |
| T3 | 发送TCP数据包(Flag=SYN,URG,PSH,FIN)到开放的TCP端口 |
| T4 | 发送TCP数据包(Flag=ACK)到开放的TCP端口 |
| T5 | 发送TCP数据包(Flag=SYN)到关闭的TCP端口 |
| T6 | 发送TCP数据包(Flag=ACK)到关闭的TCP端口 |
| T7 | 发送TCP数据包(Flag=URG,PSH,FIN)到关闭的TCP端口 |
【Nmap语法】
Nmap的固定语法格式如下:
Nmap【空格】【选项|多选项|协议】【空格】【目标】
【Nmap基本用法】
- 全面扫描
全面扫描指定IP或域名的所有端口及其目标系统信息等。所需时间较长
| -A | 全面扫描/综合扫描 |
|---|---|
nmap -A 192.168.0.12
开放的端口及服务
网络距离
目标主机MAC地址
设备类型
操作系统
中央处理单元
主机详细资料

- 扫描指定网段
指定扫描一个网段。
nmap 192.168.0.0/24 或者 nmap 192.168.0.1-200(扫描1-200的主机)

该网段中的目标主机
- 简单扫描
该扫描方式可以针对IP或者域名进行扫描,扫描方式迅速,可以很方便地发现目 标端口的开放情况及主机在线情况。
nmap 192.168.0.12
简单扫描结果:
- 查看版本号
nmap -V
| 选项 | 解释 |
|---|---|
| -sP | Ping扫描 |
| -P0 | 无Ping扫描 |
| -PS | TCP SYN Ping扫描 |
| -PA | TCP ACK Ping 扫描 |
| -PU | UDP Ping扫描 |
| -PE;-PP;-PM | ICMP Ping Types扫描 |
| -PR | ARP Ping扫描 |
| -n | 禁止DNS反向解析 |
| -R | 反向域名解析 |
| —system-dns | 使用系统域名解析器 |
| -sL | 列表扫描 |
| -6 | 扫描TPv6地址 |
| —traceroute | 路由跟踪 |
| -PY | SCTP INIT Ping扫描 |
【主机发现】
- Ping扫描
Ping扫描只进行ping,然后显示出在线的主机。使用该选项扫描可以轻易获取目标信息而不会被轻易发现。在默认情况下,Nmap会发送一个ICMP回声请求和一个TCP报文到目标端口。Ping扫描的优点是不会返回太多的信息影响对结果的分析,并且扫描方式高效。
nmap -sP 192.168.0.0/24
nmap -sP 192.168.0.12
- 无Ping扫描
无ping扫描通常用于防火墙禁止ping的情况下,它能确定正在运行的机器。默认情况下,nmap只对正在运行的主机进行高强度的探测,如端口扫描,版本探测或者操作系统探测。用-P0禁止主机发现会使nmap对每一个特定的目标IP地址进行所要求的扫描,这可以穿透防火墙,也可以避免被防火墙发现。
nmap -P0 192.168.0.12
如果没有指定任何协议,nmap会使用协议1、协议2、协议4,使用—packet-trace选项查看这些协议是如何判断目标主机是否存活。
nmap -p0 —packet-trace scanme.nmap.org

以上返回的信息可看到,有4行信息被标记为SENT,并显示为ICMP和IP包。
如此可以判断主机是存活状态。Nmap支持的协议和编号如下:
- TCP:对应协议编号为6。
- ICMP:对应协议编号为1。
- IGMP:对应协议编号为2。
- UDP:对应协议编号为17。
可使用指定的TCP,UDP,IGMP协议向目标主机发送包并判断目标主机是否在线。
nmap -p0 6,17,2 —packet-trace scanme.nmap.org
- TCP SYN Ping 扫描
通常情况下,nmap默认是使用TCP ACK 和 ICMP Echo 请求对目标进行是否存活的响应,当目标主机的防火墙阻止这些请求时,可以使用TCP SYN Ping扫描来判断主机是否存活。-PS 选项发送一个设置了SYN标志位的空TCP报文。默认端口为80(可以通过改变nmap.h)文件中的DEFAULT-TCP-PROBR-PORT值进行配置,但不同的端口也可以作为选项指定,甚至可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80,115,3306,3389),在这种情况下,每个端口会被并发地扫描。
nmap -PS -v 192.168.0.12

上面结果可得知Nmap是通过SYN/ACK和RST响应来对目标主机是否存活进行判断,但在特定情况下防火墙会丢弃RST包,这时结果会不准确,我们需要指定一个端口或端口范围来避免这种情况。
nmap -PS80,100-200 -v 192.168.0.12
- TCP ACK Ping 扫描
使用-PA选项可以进行TCP ACK Ping扫描,它与TCP SYN Ping扫描非常类似,区别在于设置的TCP标志位是ACK而不是SYN,使用这种方式扫描可以探测阻止SYN包或ICMP Echo请求的主机。
nmap -PA -v 192.168.0.12
同时使用-SP与-PA选项命令如下:
nmap -PA -PS 192.168.0.12
- UDP Ping扫描
使用UDP Ping扫描时Nmap会发送一个空UDP包到目标之间,如果目标主机相应则返回一个ICMP端口不可达错误,如果目标主机不是存活状态则会返回各自ICMP错误信息。
nmap -PU -v 192.168.0.12

- ICMP Ping Types 扫描
ICMP是控制报文协议。nmap发送一个ICMP type8(回声请求)报文到目标ip地址,从运行的主机得到一个type0(回声相应)报文。-PE选项简单的来说是通过向目标发送ICMP Echo数据包来探测目标主机是否在线,使用-PE选项打开该回声请求功能。-PP选项是ICMP时间戳ping扫描,-PM选项可以进行icmp地址掩码ping扫描
nmap -PE -v 192.168.0.12
nmap -PP -v 192.168.0.12
nmap -PM -v 192.168.0.12
- ARP Ping扫描
-PR 通常在扫描局域网时使用,在内网的情况下,使用ARP ping扫描方式是最有效的,在本地局域网中防火墙不会禁止ARP请求,这就使得它比其他ping扫描都更加高效。
nmap -PR 192.168.0.12
- 扫描列表
列表扫描时主机发现的退化形式,它仅仅列出指定网络上的每台主机,不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取它们的名字。
nmap -sL 192.168.0.0/24
- 禁止反向域名解析
如果单纯扫描一段IP,使用该选项可以大幅度减少目标主机的相应时间,从而更快的得到结果。
namp -n -sL 192.168.0.0/24
- 反向域名解析
nmap -R -sL *. 192.168.0.0/24
- 扫描TPv6地址
nmap -6 fe80::20c:29ff:fee0:2e76
- 路由跟踪
通过此选项可以轻松地查找出本地计算机到目标之间所经过的网络节点,并可以看到通过各个节点的时间。
nmap —traceroute -v www.baidu.com
- SCTP INIT Ping扫描
SCTP(流控制传输协议)是IETF在2000年定义的一个传输层协议。SCTP可以看作是TCP协议的改进,它改进了TCP的一些不足,SCTP INIT Ping扫描通过向目标发送INIT包,根据目标主机的相应判断目标主机是否存活。
nmap -PY -v 192.168.0.12
【端口扫描】
| 选项 | 解释 |
|---|---|
| -T | 时序选项 |
| -p | 端口扫描顺序 |
| -sS | TCP SYN 扫描 |
| -sT | TCP 连接扫描 |
| -sU | UDP扫描 |
| -sN;-sF;-sX | 隐蔽扫描 |
| -sA | TCP ACK扫描 |
| -sW | TCP 窗口扫描 |
| -sM | TCP Maimon扫描 |
| —scanflags | 自定义TCP扫描 |
| -sI | 空闲扫描 |
| -sO | IP协议扫描 |
| -b | FTP Bounce扫描 |
- 从nmap识别端口状态
- Open:对外开放
- Closed:端口关闭状态
- Filtered:防火墙过滤或者网络堵塞
- Unfiltered:未被过滤,端口可访问,但是无法判断是开放还是关闭状态
- Open|Filtered:开放还是被过滤
- Closed|Filtered:不能确定是关闭还是被过滤,只可能出现在IPID Idle扫描中。
- 时序选项
在nmap中使用-T(0-5)可以启用时序选项,对于时序选项这里有0~5不同选项。
-T0(偏执的):非常慢的扫描,用于IDS逃避。
-T1(鬼祟的):缓慢的扫描,用于IDS逃避。
-T2(文雅的):降低速度以降低对带宽的消耗,此选项不常用。
-T3(普通的):默认,根据目标的反应自动调整时间。
-T4(野蛮的):快速扫描,常用扫描方式,需要在很好的网络环境下进行扫描, 请求可能会淹没目标。
-T5(疯狂的):极速扫描,这种扫描方式以牺牲准确度来提示扫描速度。
nmap -T4 192.168.0.12
- 常用扫描方式
- -p :指定扫描端口号,可以指定唯一的值也可以指定一个范围。
nmap -p 80 192.168.0.12
如果既想扫描TCP端口又想扫描UDP端口,可以在端口号前加上“T:”或“U:”,分别代表TCP协议与UDP协议。(要既扫描UDP又扫描TCP,必须指定-sU以及至少一个TCP扫描类型如:-sS,-sF,-sT)如果没有给定协议限定符,端口号会被加到所有协议列表。)
nmap -sS -p T:111, U:445 192.168.0.12
- -F : 使用该选项可以快速地扫描端口,但并不是所有的端口都会扫描,只会扫描有限的端口。
nmap -F 192.168.0.12
- -r :使用该选项不会对端口进行随机顺序扫描,默认情况下,Nmap是随机顺序端口的,一般我们也会选择nmap进行随机扫描,但也可以以使用这个选项进行排序。
- —top-ports:发现具体而又有用的端口。
nmap —top-ports 100 192.168.0.12
- TCP SYN 扫描
半开放扫描,扫描速度快,扫描方式隐蔽。(在SYN扫描不能用时,TCP连接扫描会使用默认的TCP扫描)
nmap -sS 192.168.0.12
- TCP 连接扫描
端口扫描中最基础,最稳定的扫描方式
nmap -sT 192.168.0.12
- UDP扫描
UDP扫描非常缓慢,UDP端口扫描通过发送UDP数据包到目标主机并等待响应,它将判断目标端口是否开放状态,如果目标返回ICMP不可达的错误,说明端口是关闭的,如果得到正确的适当的响应,这说明端口是开放的。
nmap -sU -p 80-500 192.168.0.12
- 隐蔽扫描
-sN是Null扫描,是通过发送非常规的TCP通信数据包对计算机进行探测,很多情况下Null扫描与Xmas扫描恰好相反,因为Null扫描不会标记任何数据包,若目标主机的相应端口是关闭的,会响应一个RST数据包,若目标端口是开放的则不会响应任何信息。
nmap -sN 192.168.0.12
-sF是FIN扫描,当我们使用TCP SYN扫描时可能会被目标主机的防火墙发现,会阻止SYN数据包,这时我们使用TCP FIN扫描方式会有很好的穿透效果,因为TCP FIN扫描并不需要完成TCP握手。TCP FIN扫描就是向目标端口发送一个FIN包,如果收到目标响应的RST包,则说明目标端口是开放的,如果没有收到RST包则说明目标端口是关闭的。
nmap -sF 192.168.0.12
-sX是Xmas扫描,数据包的FIN、PSH和URG标记位置打开,既标志位1,根据RFC 793规定如果目标主机端口是开放的则会响应一个RST标志包。
nmap -sX 192.168.0.12
- TCP ACK 扫描
使用该扫描不能确定端口是否是开放还是被过滤的。
nmap -sA -v 192.168.0.12
- TCP 窗口扫描
当收到RST包时,根据TCP窗口的值是正数还是0来判断目标端口是开放还是关闭的。
从输出结果来看是不准确的,如果扫描的端口都是开放状态或者只有少数几个是关闭状态就很不准确。
nmap -sW -v -F 192.168.0.12
- TCP Maimon扫描
探测报文是FIN/ACK 根据 RFC 793(TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文,如果端口开放,许多基于BSD的系统只是丢弃该探测报文。
nmap -sM -T4 192.168.0.12
- 自定义TCP扫描
可以通过指定任意的TCP标志位来进行扫描。
nmap -sT —scanflags SYNURG 192.168.0.12
- 空闲扫描
空闲扫描允许端口完全欺骗扫描。可以使攻击者能够不使用自己的IP向目标主机发送数据包,它可以利用不活跃的僵尸主机反弹给攻击者一个旁通信道,从而进行端口扫描。IDS会把不活跃的僵尸主机当做攻击者,这是一种非常隐蔽的扫描方法。
nmap -sI www.0day.co:80 192.168.0.12
这是利用僵尸主机为www.0day.co的主机对192.168.0.12进行空闲扫描,如果有IDS,IDS则会把www.0day.co当做扫描者。选择的端口必须不能被自己的nmap主机或目标主机过滤掉并且必须为开放的。
- IP协议扫描
扫描IP协议号。IP协议扫描可以帮助用户确定目标主机哪些是支持IP协议的,例如TCP,ICMP.IGMP。虽然它遍历的是IP协议号并不是TCP或UDP端口,但仍可以使用-p选项选择需要扫描的协议号。它不是在UDP报文的端口域上循环,而时在IP协议域的2位上循环,发送空的IP报文头。
nmap -sO -T4 192.168.0.12
- FTP Bounce扫描
使用-b选项就可以进行FTP Bounce Scan扫描。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器,这种扫描方式被支持较少,但可绕过防火墙。
nmap -b 192.168.0.12
【指纹识别与探测】
| 选项 | 解释 |
|---|---|
| -sV | 版本探测 |
| —allports | 全端口版本探测 |
| —version-intensity | 设置扫描强度 |
| —version-light | 轻量级扫描 |
| —version-all | 重量级扫描 |
| —version-trace | 获取详细版本信息 |
| -sR | RPC扫描 |
| -O | 启用操作系统探测 |
| —osscan-limit | 对指定的目标进行操作系统检测 |
| —osscan-guess;—fuzzy | 推测系统识别 |
- 版本探测
使用-sV选项即可启用版本探测。通过相应的端口对应相应的服务,根据服务指纹识别出相应的版本。
nmap -sV 192.168.0.12
namp -sV -A 192.168.0.12 (借助-A 进行操作系统探测和版本探测)
- 全端口版本探测
nmap会跳过9100 TCP端口,只有使用—allports才可以扫描所有端口
nmap -sV —allports 192.168.0.12
- 设置扫描强度
使用Nmap进行扫描的时候,Nmap发送一系列探测报文,—version-intensity选项可以为每个报文赋予1~9之间的值。被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没有实际作用,强度水平说明了应该使用哪些探测报文。当我们赋予的值越高,服务越有可能被正确识别,但是这也会牺牲相当长的一段实际,强度必须在0~9,默认的强度是7。
nmap -sV —version-intensity 1 192.168.0.12
- 轻量级扫描
使用 —version-light 进行轻量级扫描。可以大幅度的节省时间,但会牺牲准确性。与—version-intensity 2 等价
nmap -sV —version-light 192.168.0.12
- 重量级扫描
使用 —version-all选项可以进行重量级扫描对应—version-intensity 9的快捷方式。时间长,准确性高。
namp -sV —version-all 192.168.0.12
- 获取详细版本信息
nmap -sV —version-trace 192.168.0.12
NSE信息
- RPC扫描
该选项对用于与其他端口扫描选项相结合使用,它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图确定它们是否为RPC端口,如果是RPC端口,则返回程序和版本号。
nmap -sS -sR 192.168.0.12
- 启用操作系统探测
nmap -O 192.168.0.12
- 对指定的目标进行操作系统检测
使用—osscan-limit选项可以对指定的目标进行操作系统检测。Nmap只对满足“具有打开和关闭的端口”条件的主机进行操作系统检测,这样可以节约时间,特别是在使用-P0扫描多个主机时。这个选项仅在使用-O或-A进行操作系统检测时起作用。
nmap -O —osscan-limit 192.168.0.0/24

- 推测系统并识别
使用—osscan-guess;—fuzzy选项可以推测系统并识别。Nmap对系统进行识别时并不一定都能准确识别,当无法准确识别的时候,Nmap会从最近的数据中取值,猜测系统。
nmap -O —osscan-guess 192.168.0.12
【nmap保存和输出】
- 标准保存
nmap -F -oN test1.txt 192.168.0.12
- XML保存
nmap -F -oX test1.xml 192.168.0.12
- 133t保存
namp -F -oS test2.txt 192.168.0.12
- Grep保存
nmap -F -oG test3.txt 192.168.0.12
- 保存到所有格式
nmap -F -oA testA 192.168.0.12
- 补充保存文件
nmap -F —append-output -oN test1.txt 192.168.0.12
Nmap高级用法
【Nmap 脚本引擎】
Nmap Scripting Engine(NSE) 是 Nmap 非常重要的特性,它允许用户使用 Lua 语言编写简单的脚本程序来实现各种网络管理任务的自动化运行。目前 Nmap 已提供超过 150 个脚本,可以在 https://nmap.org/nsedoc/ 查看和下载这些脚本,或者在本地 Nmap 安装目录下的 scripts 目录中查看这些脚本,或者编写 Lua 程序定制脚本。
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 |
nmap的脚本默认目录为:/usr/share/nmap/scripts/
【扫描优化】
| 选项 | 解释 |
|---|---|
| —min-hostgroup | 调整并行扫描组的大小 |
| —min-parallelism | 调整探测报文的并行度 |
| —max-parallenlism | |
| —min-rtt-timeout | 调整探测报文超时 |
| —max-rtt-timeout | |
| —initial-rtt-timeout | |
| —host-timeout | 放弃低速目标主机 |
| —scan-delay | 调整探测报文的时间间隔 |
| —max-scan-delay |
1.调整并行扫描组的大小
Nmap默认情况下在进行扫描的时候,首先开始扫描较小的组,最小为5,随后慢慢增长组的大小,最大为1024,为了保证效率,Nmap会针对UDP或少量端口的TCP扫描。
—max-hostgroup选项用于说明使用最大的组,Nmap不会超过这个大小。—min-hostgroup选项说明最小的组,Nmap会保持组大于这个值。
nmap —min-hostgroup 30 192.168.0.12/24
nmap —max-hostgroup 10 192.168.0.12/24
2.调整探测报文的并行度
—min-parallelism大于1可以在网络或主机不好的情况下更好地扫描,但会影响准确度。—max-parallelism应该设置为1,防止Nmap对同一主机同一时间发送多次报文。
nmap —min-parallelism 100 192.168.0.12/24
nmap —max-parallelism 100 192.168.0.12
3.调整探测报文超时
使用—max-rtt-timeout选项时,规定100毫秒比较合适。一般情况下,rtt值不得小于100毫秒,也最好不要超过1000毫秒。
namp —initial-rtt-timeout 1000ms 192.168.0.12
nmap —max-rtt-timeout 500ms 192.168.0.12
nmap —min-rtt-timeout 500ms 192.168.0.12
4.放弃缓慢的目标主机
nmap —host-timeout 100ms 192.168.0.12/24
5.调整报文适合时间间隔
改选项可以控制Nmap对一个或多个主机发送探测报文的等待时间,等待时间以毫秒为单位,很多时候Nmap会发送很多不必要的报文,会时Nmap运行速度降低。当我们的带宽不是很乐观的情况下可以使用该选项,但此选项并不能将Nmap应有的性能发挥出来,对于这个选项还是需要谨慎使用。
nmap —scan-delay ls 192.168.0.12
nmap—max-scan-delay 30s 192.168.0.12
【防火墙/IDS逃逸】
| 选项 | 解释 |
|---|---|
| -f | 报文分段 |
| —mtu | 指定偏移大小 |
| -D | IP欺骗 |
| -sI | 源地址欺骗 |
| —source-port | 源端口欺骗 |
| —data-length | 指定发包长度 |
| —randomize-hosts | 目标主机随机排序 |
| —spoof-mac | MAC地址欺骗 |
- 报文分段
在Nmap使用-f选项时会将TCP头分段在几个包中,使得包过滤器、IDS以及其他工具的检测更加困难。Nmap在IP头后会将包分为8个字节或更小。
一些主机会禁止相应ICMP请求,对于这种情况就可以使用报文分段的方法来逃避目标防火墙的规则。
nmap -f -v 192.168.121.1
- 指定偏移大小
此值设定TCP/IP协议传输数据报时的最大传输单元。使用指定MTU可以达到逃逸防火墙/IDS的目的,需要注意的是偏移量必须是8的倍数。
nmap —mtu 16 192.168.126.131
- IP欺骗
在使用该选项对目标进行扫描的时候,会让目标主机误认为是在利用诱饵进行扫描,而不是一个真实的扫描,这样可以躲避防火墙和某些规则的限制,也可以达到隐藏自身的目的,这在实际的扫描中是非常有用的一个选项。
可以使用英文的逗号对每个诱饵主机进行分割,当然也要领会目标主机管理员的想法,他可能会认为该扫描使用的是诱饵主机进行的扫描,而不是真实的扫描地址,因此会忽略这次扫描,反而可以使用自己的真实IP去进行扫描,会达到欺骗目标主机管理员的目的,这样做时最好与诱饵主机交叉使用。
IP欺骗语法如下:
Nmap -D【decoy1,decoy2…|RND:number】【目标】
使用-D选项可以指定多个IP地址,或使用RND随机生成几个地址,在指定的诱饵之间使用逗号进行分割,需注意的是在进行版本检测或者TCP扫描的时候诱饵是无效的。
nmap -D RND:11 192.168.126.131
nmap -D 192.168.0.1,192.168.0.2,192.168.0.254 192.168.121.1
nmap -D 192.168.0.1,192.168.0.2,192.168.0.254,ME 192.168.121.1
注意:诱饵主机必须处于工作状态,否则会导致目标主机的syn洪水攻击。
- 源地址欺骗
使用-sI可以进行源地址欺骗,如果Nmap无法确定你的源地址,Nmap会给出相应的提示,我们使用该选项指定所需要发包的接口IP地址。
nmap -sI www.oday.co:80 192.168.126.131
- 源端口欺骗
使用—source-port选项就可以进行源端口欺骗,也可以使用-g,我们只需提供一个端口号,Nmap就可以从这些端口中发送数据,因为防火墙对服务器的设置会根据端口选择是否信任数据流,管理员可能会认为这些端口不会有攻击发生,可以利用这些端口进行扫描。
nmap —source-port 53 192.168.126.131
- 指定发包长度
通常情况下,TCP包时40个字节,ICMP Echo 有28个字节,所以在原来的报文基础上附加随机数据达到规避防火墙的效果。
nmap —data-length 30 192.168.126.131
- 目标主机随机排序
使用—randomize-hosts选项就可以对目标主机的顺序进行随机排序,最多可达8096个主机。单方面使用这个选项对防火墙/IDS逃逸效果不大,如果配合时间选项则会有很好的效果。
nmap -randomize-hosts 192.168.126.1-200
- MAC地址欺骗
使用—spoof-mac选项就可以进行MAC欺骗。冒失的指定一个MAC定制反而会引起管理员的怀疑,这时我们可以使用字符串“0”随机分配一个MAC地址。指定的MAC地址最好真实存在,这样才能起到欺骗效果。
—spoof-mac选项可以使用 的参数包括0、MAC Address、Vendor Name。0表示随机生成一个MAC地址,MAC Address表示用户手动指定一个MAC地址,Vendor Name表示从指定的厂商生成一个MAC地址。
nmap -sT -PN —spoof-mac 0 192.126.131
【Nmap技巧】
nmap中不常用但是却非常有用的选项。
| 选项 | 解释 |
|---|---|
| —send-eth | 发送以太网数据包 |
| —send-ip | 网络层发送 |
| —privileged | 假定拥有所有权 |
| —interactive | 在交互模式中启动 |
| -d | 设置调试级别 |
| —packet-trace | 跟踪发送接受的报文 |
| -iflist | 列举接口和路由 |
| -e | 指定网络接口 |
| -oG | 继续中断扫描 |
| firewalk | 探测防火墙 |
| vmauthd-brute | VM认证破解 |
- 发送以太网数据包
该选项会要求Nmap在数据链路层发送报文,而不是在网络层发送报文。注意:在UNIX中无论是否使用该选项,Nmap都会使用原IP包。
nmap —send-eth 192.168.126.131
- 网络层发送
该选项要去Nmap通过网络层发送报文,而不是在数据链路层发送报文,这个选项与—send-eth选项在实际运用中相互补充。
nmap —send-ip 192.168.126.131
- 假定拥有所有权
—privileged选项要求Nmap假定其具有足够的权限进行源套接字包发送、报文捕获和类似UNIX系统中根用户操作的权限。默认状态下,如果由getuid()请求的类似操作不为0,Nmap将退出。
—pricileged在具有Linux内核性能的类似系统中使用非常有效,这些系统配置允许非特权用户可以进行原报文扫描。需要明确的是,其他选项之前使用这些西药权限的选项(SYN扫描、操作系统检测等)。Nmap-PRIVILEGED变量设置等价于—privileged选项。
- 在交互模式中启动
Nmap提供交互模式,便于进行多个扫描。如果使用这个选项,需要对shell终端的命令足够熟悉。
nmap —interactive
n -T4 192.168.126.163
- 设置调试级别
当详细模式也不能为问提供充足的数据时,可以启用-d选项,在-d选项后面填入输入表示调试级别可选1~9,-d 9 是最高阶别,这时候产生的数据会非常多。
nmap -d 1 192.168.126.131
- 跟踪发送接受的报文
该选项经常用于调试,而不是实际运用到扫描网络。该选项会要求Nmap将接收到的每个报文打印出来。未来便于分析,可以使用-p选项控制端口而产生少量的报文,便于我们分析。
nmap —packet-trace -p 20-30 192.168.126.131
- 列举接口和路由
该选项会告诉Nmap打印出检测到的接口列表和路由,多用于调试路由。
nmap —iflist www.0day.co
- 指定网络接口
-e选项可以指定从哪个网络接口发送数据。
nmap -e eth0 192.168.126.131
- 继续中断扫描
在使用Nmap扫描网络的时候可能会需要很长的时间,但是我们可能需要在多个时间的进行扫描,或者由于其他的原因导致网络中断时,我们可以使用—resume选项继续扫描,但是必须配合-oN选项或者-oG选项使用。
我们使用-oG将扫描结果保存为TXT,然后在扫描过程中按下Ctrl+C中断扫描。
nmap -oG 1.txt -v 192.168.126.1/24
nmap —resume 1.txt
- Nmap的分布式实现-Dnmap
Dnmap是一款基于Nmap的分布式框架,使用客户端/服务器架构,服务器接受命令并发送至客户端进行Nmap安全扫描,扫描完毕后,客户端返回扫描结果。
首先再http://sourceforge.net/projects/dnmap/下载Dnmap。
下载安装好之后
新建一个文件,写入需要扫描的命令,每行一条,如下所示:
启动Dnmap服务。-f选项指定我们的命令文件。
./dnmap_server.py -f /home/test
重新打开一个终端,让Dnmap链接服务器。
./dnmap_client.py -s 192.168.126.130 -a test
此时两个Dnmap的窗口数据会不断滚动直到扫描完成。
在nmap_output文件夹下面有Dnmap保存的扫描结果。
- 探测防火墙
在Nmap的firewalk脚本通过发送一个请求并分析TTL值,可以探测防火墙的规则。
nmap —script=firewalk —traceroute 192.168.131.1
- VMWare认证破解
Nmap中的vmauthd-brute脚本可以破解安装虚拟机系统的用户名与密码。
nmap -p 902 —script vmauthd-brute 192.168.121.1
Nmap进行渗透测试
【信息收集】
| 脚本 | 解释 |
|---|---|
| —script ip-geolocation-* | IP信息搜集 |
| whois | WHOIS查询 |
| http-email-harvest | 搜集E-mail信息 |
| hostmap-ip2hosts | IP反查 |
| dns-brute | DNS信息搜集 |
| membase-http-info | 检索系统信息 |
| smb-security-mode.nse | 后台打印机服务漏洞 |
| smb-check-vulns.nse | 系统漏洞扫描 |
| http-stored-xss.nse | 扫描web漏洞 |
| snmp-win32-services | 通过Snmp列举Windows服务/账户 |
| dns-brute | 枚举DNS服务器的主机名 |
| http-headers/http-sitemap-generator | HTTP信息收集 |
| ssl-enum-ciphers | 枚举SSL秘钥 |
| ssh-hostkey | SSH服务密钥信息探测 |
- IP信息搜集
nmap —script ip-geolocation-* www.0day.co
可以获取目标域名的IP地址,并且还可以确定该IP地址为一个香港地区IP,这个IP的开放端口有80端口、443端口。如果目标域名使用了CDN,那么这个方法无效,我们获取的知识目标域名的CDN的相关情况,并不是目标域所对应的真正IP地址。
- WHOIS查询
nmap —script whois www.0day.co
大部分的网站现在启用了whois保护,对于域名所有者的姓名、电话都会隐藏,我们可以查询该域名的历史whois,历史whois可能还没有启用whois保护。
nmap —script whois —script-args whois.whodb=nofollow www.0day.co
如果目标域名较多,可以使用列表的方式进行查询。
nmap -sn —script whois -v -iL host.txt
- 搜集E-mail信息
namp —script http-email-harvest www.0day.co
- IP反查
IP反查可以将所有绑定到该IP的域名显示出来,这样我们就可以很清楚的知道有几个站点在同一个服务器上。
nmap -sn —script hostmap-ip2hosts www.0day.co
IP反查会查询绑定在这一个IP上的所有域名,如果是单一的Ip则不会有结果,如果目标使用的是虚拟主机则会显示结果;如果目标使用了CDN也会显示相关结果,但是这个结果是不准确的,此时查询的IP并不是真正的IP。
- DNS信息搜集
nmap —script dns-brute www.xxxx.com 基于暴力破解
- 检索系统信息
nmap -p 445 192.168.126.131 —script membase-http-info
- 后台打印机服务漏洞
nmap —script smb-security-mode.nse -p 445 192.168.126.128
- 系统漏洞扫描
nmap —script smb-vuln-*.nse -p445 192.168.10.32
- 扫描web漏洞
nmap -p80 —script http-stored-xss.nse www.xxx.com
- 通过Snmp列举Windows服务/账户
nmap -sU -p 161 —script=snmp-win32-services 192.168.126.128
- 枚举DNS服务器的主机名
nmap —script dns-brute —script-args dns-brute.domain=baidu.com
- HTTP信息搜集
使用-sV选项即可对HTTP版本进行探测
nmap -sV -p 80 www.0day.com
对目标地址进行HTTP头部信息探测
nmap -p 80 —script=http-headers baidu.com
web目录结构
nmap -p 80 —script=http-sitemap-generator www.baidu.com
- 枚举SSL秘钥
TSL与SSL在传输层对网络连接进行加密
nmap -p 443 —script=ssl-enum-ciphers www.baidu.com
- SSH服务秘钥信息探测
查看SSH服务的密钥信息
nmap -p 22 —script ssh-hostkey —script-args ssh_hostkey=full 127.0.0.1
【数据库渗透】
| 脚本 | 解释 |
|---|---|
| mysql-databases | MySQL列举数据库 |
| mysql-variables | 列举MySQL变量 |
| mysql-empty-password | 检查MySQL密码 |
| mysql-brute | 审计MySQL密码 |
| mysql-audit | 审计MySQL安全配置 |
| oracle-brute | 审计Oracle密码 |
| ms-sql-brute | 审计msSQL密码 |
| ms-sql-empty-password | 检查msSQL空密码 |
| ms-sql-tables | 读取msSQL数据 |
| ms-sql-xp-cmdshell | msSQL执行系统命令 |
| pgsql-brute | 审计PgSQL密码 |
- MySQL列举数据库
nmap -p3306 —script mysql-databases —script-args mysqluser=root,mysqlpass 192.168.84.1
如果我们已知目标MySQL的账号和密码,就可以轻易地夺取目标MySQL的所有数据库。如果目标数据库段端口更改了,我们也需要使用-p参数指定相应的数据库端口,使用mysqluser指定目标数据库账号,mysqlpass指定目标数据库密码,如果密码为空则不需要填写任何东西,最后指向目标IP
- 列举MySQL变量
nmap -p3306 —script=mysql —variables 192.168.84.1
如果仍无法确定可以使用-sV扫描端口
nmap -sV —script=mysql —variables 192.168.84.1
- 检查MySQL密码
nmap -p3306 —script=mysql-empty-password 192.168.84.1
如果无法确定目标开放的端口,可以用-sV选项扫描
nmap -sV —script=mysql-empty-password 192.168.84.1
- 审计MySQL密码
nmap —script=mysql-brute 192.168.84.1
该脚本用于MySQL弱口令,默认Nmap会扫描全部的端口用于查找MySQL端口,但是我们可以使用-p选项指定一个端口,也可以自定义账号密码字典。
nmap -p 3306 —script=mysql-brute userdb=/root/passdb.txt passdb=/root/pass.txt 192.168.0.110
- 审计MySQL安全配置
nmap -p 3306 —script mysql-audit —script-args “mysql-audit.username=’root’,\mysql-audit.password=’ ‘ , mysql-audit.filename=’nselib/data/mysql-cis.audit’” 192.168.84.1
- 审计Oracle密码
nmap —script oracle-brute -p 1521 —script-args oracle-brute.sid=test 192.168.126.131
使用字典
nmap —script oracle-brute -p 1521 —script-args oracle-brute.sid=test —script-args
userdb=/tmp/username.txt,passdb=/tmp/passwords.txt 192.168.126.131
- 审计msSQL密码
nmap -p 1433 —script ms-sql-brute —script-args userdb=name.txt,passdb=pass.txt
- 检查msSQL空密码
nmap -p 1433 —script ms-sql-empty-password 192.168.126.1
- 读取msSQL数据
nmap -p 1433 -script ms-sql-tables -script-args mssql.username=sa,mssql.password=sa 192.168.126.131
- msSQL执行系统命令
nmap -p 1433 —script ms-sql-xp-cmdshell —script-args mssql.username=sa, mssql.password=sa, ms-sql-xp-cmdshell.cmd=”ipconfig” 192.168.126.1
- 审计PgSQL密码
nmap -p 5432 —script pgsql-brute 192.168.126.131
【渗透测试】
| 脚本 | 解释 |
|---|---|
| http-brute | 审计HTTP身份验证 |
| ftp-brute | 审计FTP服务器 |
| http-wordpress-brute | 审计Wordpress程序 |
| http-joomla-brute | 审计Joomla程序 |
| pop3-brute | 审计邮件服务器 |
| smb-brute.nse | 审计SMB口令 |
| vnc-brute | 审计VNC服务器 |
| smtp-brute | 审计SMTP服务器 |
| stuxnet-detect | 检测Stuxnet蠕虫 |
| snmp-netstat | SNMP安全审计 |
| snmp-processes | |
| snmp-win32-services | |
| snmp-brute |
- 审计HTTP身份验证
nmap —script http-brute -p 80 www.0day.com
- 审计FTP服务器
nmap —script ftp-burte -p 21 192.168.126.128
使用字典爆破
nmap —script ftp-burte —script-args userdb=user.txt,passdb=pass.txt -p 21 192.168.126.128
- 审计Wordpress程序
nmap -p80 —script http-wordpress-brute 192.168.126.131
使用字典
nmap -p80 —script http-wordpress-brute —script-args userdb=user.txt,passdb=passwd.txt 192.168.126.131
设置线程数
nmap -p80 —script http-wordpress-brute —script-args http-wordpress-brute.threads=10 192.168.126.131
- 审计Joomla程序
nmap -p80 —script http-joomla-brute 192.168.126.131
使用字典
nmap -p80 —script http-joomla-brute —script-args userdb=users.txt,passdb=passwds.txt 192.168.126.131
增加线程
nmap -p80 —script http-joomla-brute —script-args userdb=users.txt,passdb=passwds.txt, http-joomla-brute.threads=5 192.168.126.131
- 审计邮件服务器
nmap -p110 —script=pop3-brute 192.168.126.131
- 审计SMB口令
nmap —script smb-brute.nse -p445 192.168.126.128
使用字典
nmap —script smb-brute.nse —script-args passdb=pass.txt -p445 192.168.126.128
- 审计VNC服务器
nmap —script vnc-brute -p 5900 192.168.126.131
- 审计SMTP服务器
nmap -p 25 —script smtp-brute 192.168.126.131
枚举远程系统所有用户
namp -p 25 —script=smtp-enum-users.nse smtp.xx.com
- 检测Stuxnet蠕虫
nmap —script stuxnet-detect -p 445 192.168.126.131
- SNMP安全审计
nmap -sU -p 161 —script=snmp-netstat 192.168.121.3
在nmap中snmp-processes脚本可以通过SNMP服务协议枚举运行的系统进程。
nmap -sU -p 161 —script=snmp-processes 192.168.131.1
获得windows服务器的服务
nmap -sU -p 161 —script=snmap-win32-services 192.168.121.1
对目标服务器snmp服务进行口令审计
nmap -sU -p 161 —script snmp-brute 192.168.121.1
【Nmap脚本引擎原理】
虽然Nmap内嵌的服务于版本探测已足够强大,但是在某些情况下我们需要多伦次的交互才能够探测到服务器的信息,这时候就需要自己编写NSE插件实现这个功能。NSE插件能够完成网络发现、复杂版本探测、脆弱性探测、简单漏洞利用等功能。
由上图可以看到四类脚本的运行阶段,以及他们的功能。
1)在nmap_main里面,调用init_main()进行详细的初始化过程,加载Lua标准库与Nmap扩展库,准备参数环境,加载并执行nse_main.lua文件;这个文件加载用户选择的脚本文件,执行完之后返回函数对象给init_main(),被保存到Lua注册表中。
2)在nse_main.lua中,定义两个核心的类,Script和Thread,Script用于管理NSE脚本,当新的脚本被加载时,调用 Script.new创建脚本对象,该对象被保存下来在后续的扫描过程中使用;Thread用于管理脚本的执行,该类中也包含对脚本健全性的检查。在脚本执行时,如果脚本之间存在依赖关系,那么会将基础的无依赖的脚本统一执行完毕,再执行依赖性的脚本。
3)执行脚本扫描时,从nmap_main()中调用script_scan()函数。在进入script_scan()后,会标记扫描阶段类型,然后进入到初始化阶段返回的main()函数(来自nse_main.lua脚本中的main)中,在函数中解析具体的扫描类型。
4)main()函数负责处理三种类型的脚本扫描:预扫描(SCRIPT_PRE_SCAN)、脚本扫描(SCRIPT_SCAN)、后扫描 (SCRIPT_POST_SCAN)。预扫描即在Nmap调用的最前面(没有进行主机发现、端口扫描等操作)执行的脚本扫描,通常该类扫描用于准备基本的信息,例如到第三服务器查询相关的DNS信息。而脚本扫描,是使用NSE脚本来扫描目标主机,这是最核心的扫描方式。后扫描,是整个扫描结束后,做一些善后处理的脚本,比如优化整理某些扫描。
5)在main()函数中核心操作由run函数负责。而run()函数的本身设计用于执行所有同一级别的脚本(根据依赖关系划分的级别),直到所有线程执行完毕才退出。run()函数中实现三个队列:执行队列(Running Queue)、等待队列(Waiting Queue)、挂起队列(Pending Queue),并管理三个队列中线程的切换,直到全部队列为空或出错而退出。
参考资料:
| 《nmap渗透测试指南》 | 商广明 编写 |
|---|---|
| https://nmap.org/nsedoc/ | nmap脚本说明文档 |
| https://nmap.org/nmap-fingerprinting-article-cn.html | 使用TCP/IP协议栈指纹进行远程操作系统辨识 |
| https://www.jianshu.com/p/4978fb900de3 | 谈谈扫描器 |
| http://www.cnblogs.com/st-leslie/p/5115280.html | 端口扫描之王 |
| http://www.bubuko.com/infodetail-368336.html | 安全工具 nmap强悍的扫描工具 |
| https://zhuanlan.zhihu.com/p/26676508 | 渗透神器nmap |
| http://www.cnblogs.com/liun1994/p/7041373.html | Nmap脚本引擎原理 |
| https://blog.csdn.net/whatday/article/details/73823959 | nmap脚本使用总结 |
