Nmap 官方文档 ( 中文文档是 Nmap 版本4.50,英文文档是最新的 ):
- 英文文档:https://nmap.org/book/man.html
- 中文文档:https://nmap.org/man/zh/index.html#man-description
- 官方 Nmap 项目指南 :https://nmap.org/book/toc.html
Nmap 速查手册 ( 命令、示例 ) :https://highon.coffee/blog/nmap-cheat-sheet/
铁匠运维网:https://www.tiejiang.org/wlaqgcs/infiltration
注意:nmap 区分大小写。在 nmap 运行时直接按键盘的 d 键打 "断点",按下 X 键可以知道运行的进度。终极必杀:man nmap
1、nmap 简介
Nmap 是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字 Nmap 是 Network Mapper 的简称。Nmap 最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一,号称扫描之王。nmap 除了最主要的端口扫描,还能提供关于目标机的进一步信息,包括反向域名,操作系统猜测,设备类型,和MAC地址。
一般情况下 Nmap 可以用来:
- 扫描网络上有哪些主机,检测目标机是否在线、
- 端口开放情况。( 端口号,协议,服务名称和状态 )
- 侦测主机提供什么服务 ( 应用程序名和版本 )
- 侦测主机的操作系统与设备类型等信息。
- 侦测主机使用什么类型的报文过滤器 / 防火墙,以及一堆其它功能
- 等等。
script 是 nmap 最强大的功能之一。可以用来检测 SQL 注入,网页爬取,数据库密码检测,快速的探测服务等。在 nmap 安装目录下的 script 目录下,存在 ".nse" 后缀结尾的文本文件,这就是 nmap 的脚本,
// 使用时尽量加上双引号 ( --script="脚本名" 或者 --script "脚本名" ) ,防止脚本名出现空格的情况。
nmap 192.168.0.3 --script="http-*" -v 加载 http-* 脚本, * 是 通配符
nmap all 192.168.0.3 -v 加载所有脚本,也可以 --script=*
下载、安装
- Windows、Linux、macOS :https://nmap.org/download.html
- Zenmap ( 是 Nmap 的官方 GUI 版本 )
- Kali Linux 自带 nmap。
在线帮助:https://svn.nmap.org/nmap/docs/nmap.usage.txt
-Pn :禁用主机检测。如果主机屏蔽了 ping 请求,Nmap 认为该主机没有开机,从而不会进一步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作。为了克服这一问题,就 需要禁用Nmap的主机检测功能。在指定这个选项之后,Nmap会认为目标主机已经开机并会 进行全套的检测工作
nmap --help
Nmap 7.92 (https://nmap.org)
用法:nmap [扫描类型] [选项] {要扫描的目标}
扫描的目标:
可以是 主机名、IP 地址、网络等。
例如:scanme.nmap.org、microsoft.com/24、192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>: 从文件中读取要扫描的主机列表
-iR <num hosts>: 选择随机目标
--exclude <host1[,host2][,host3],...>:要排除的 主机/网络
--excludefile <exclude_file>: 从文件中选择要排除的主机列表
主机发现:
-sL: 列表扫描 - 打印主机的列表(对域名进行扫描时,可以得到IP列表 )
-sn: Ping 扫描,同时禁用端口扫描,用来检查主机存活状态。
-Pn: 禁用 Ping 扫描,默认所有主机都是存活状态
-PS/PA/PU/PY[portlist]:对指定的端口通过 TCP SYN/ACK、UDP 或 SCTP 扫描来发现主机
-PE/PP/PM: 对指定的端口通过 ICMP、时间戳和网络掩码请求发现和探测主机
-PO[协议列表]: IP 协议 Ping
-n/-R: 不进行DNS解析/ 进行DNS解析 [默认]
--dns-servers <serv1[,serv2],...>: 指定自定义 DNS 服务器
--system-dns: 使用操作系统的 DNS 解析器
--traceroute: 跟踪每个主机的跃点路径
扫描技术:
-sS/sT/sA/sW/sM: TCP SYN / Connect() / ACK / Window / Maimon 扫描
-sU: UDP 扫描
-sN/sF/sX: TCP Null、FIN 和 Xmas 扫描
--scanflags <flags>: 自定义 TCP 扫描标志
-sI <僵尸主机[:probeport]>: 空闲扫描
-sY/sZ: SCTP INIT/COOKIE-ECHO 扫描
-sO: IP 协议扫描
-b <FTP 中继主机>: FTP 反弹扫描
指定扫描端口、扫描顺序:
-p <端口范围>:只扫描指定的端口
例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <端口范围>: 从扫描中排除指定端口
-F: 快速模式。 扫描比默认扫描更少的端口
-r: 连续扫描端口。不要随机化,即按顺序扫描端口
--top-ports <number>: 扫描<number>个最常用的端口
--port-ratio <ratio>: 扫描比<ratio>更常见的端口
服务/版本检测:
-sV: 探测开放端口以确定服务/版本信息
--version-intensity <level>:设置从 0(轻)到 9(尝试所有探针)
--version-light: 限制最可能的探测(强度 2)
--version-all: 尝试每一个探测(强度 9)
--version-trace: 显示详细的版本扫描活动(用于调试)
脚本扫描:
-sC: 相当于--script=default
--script=<Lua scripts>: 使用脚本进行扫描,多个脚本时用逗号分隔,支持通配符。
--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供参数
--script-args-file=filename: 从文件中提供 NSE 脚本参数
--script-trace: 显示所有发送和接收的数据
--script-updatedb: 更新脚本数据库。
--script-help=<Lua 脚本>: 显示有关脚本的帮助。
操作系统检测:
-O: 启用操作系统检测
--osscan-limit: 将操作系统检测限制为有希望的目标
--osscan-guess: 更积极地猜测操作系统
时间和性能:
默认是秒,也可以 “ms”(毫秒),'s'(秒)、'm'(分钟)或 'h'(小时)到值(例如 30m)。
-T<0-5>: 设置时序模板(越高扫描速度越快,但是准确性降低)
--min-hostgroup/max-hostgroup <size>: 并行主机扫描组大小
--min-parallelism/max-parallelism <numrobes>:探针并行化
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <时间>: 指定探测往返时间。
--max-retries <tries>: 限制端口扫描探测重传的次数。
--host-timeout <time>: 多长时间后放弃目标
--scan-delay/--max-scan-delay <time>:调整探针之间的延迟
--min-rate <number>: 每秒发送数据包不低于 <number>
--max-rate <number>: 每秒发送数据包的速度不超过 <number>
防火墙/IDS 逃避和欺骗:
-f; --mtu <val>: 分片数据包(可选地 w/给定的 MTU)
-D <decoy1,decoy2[,ME],...>:使用诱饵隐藏扫描。即发送参杂着假ip的数据包检测
-S <IP_Address>: 欺骗源地址。就是伪造源主机IP地址。
-e <iface>: 指定从哪个网卡发送和接收数据包。
-g/--source-port <portnum>: 使用给定的端口号。针对防火墙只允许的源端口
--proxies <url1,[url2],...>: 通过 HTTP/SOCKS4 代理中继连接
--data <hex string>: 将自定义有效负载附加到发送的数据包
--data-string <string>: 将自定义 ASCII 字符串附加到发送的数据包中
--data-length <num>: 将随机数据附加到发送的数据包中。
改变发生数据包的默认的长度,防止被识别出来。
--ip-options <options>: 发送带有指定ip选项的数据包
--ttl <val>: 设置 IP 生存时间字段
--spoof-mac <mac地址/前缀/供应商名称>: 欺骗你的MAC地址
--badsum: 发送带有虚假 TCP/UDP/SCTP 校验和的数据包
输出:
-oN/-oX/-oS/-oG <file>: 扫描结果写入到文件。
正常,XML,s|<rIpt kIddi3,Grepable 格式,
-oA <basename>: 一次输出三种主要格式
-v: 增加详细程度(使用 -vv 或更多以获得更好的效果)
-d: 增加调试级别(使用 -dd 或更多以获得更好的效果)
--reason: 显示端口处于特定状态的原因
--open: 仅显示打开(或可能打开)的端口
--packet-trace: 显示所有发送和接收的数据包
--iflist: 打印主机接口和路由(用于调试)
--append-output: 附加到而不是破坏指定的输出文件
--resume <文件名>: 恢复中止的扫描
--noninteractive: 通过键盘禁用运行时交互
--stylesheet <path/URL>:将 XML 输出转换为 HTML 的 XSL 样式表
--webxml: 参考 Nmap.Org 的样式表以获得更便携的 XML
--no-stylesheet: 防止 XSL 样式表与 XML 输出相关联
杂项:
-6: 启用 IPv6 扫描
-A: 也叫全面扫描。操作系统检测、版本检测、脚本扫描和跟踪路由。
--datadir <dirname>: 指定自定义 Nmap 数据文件位置
--send-eth/--send-ip:使用原始以太网帧或 IP 数据包发送
--privileged: 假设用户拥有完全特权
--unprivileged: 假设用户缺乏原始套接字权限
-V:打印版本号
-h:打印此帮助摘要页。
例子:
nmap -vv -A scanme.nmap.org
nmap -vv -sn 192.168.0.0/16 10.0.0.0/8
nmap -vv -iR 10000 -Pn -p 80
有关更多选项和示例,请参见手册页 (https://nmap.org/book/man.html)
延时策略 :-T(0-5) 默认为 3
- 0 即Paranoid模式。为了避开IDS的检测使扫描速度极慢,nmap串所有的扫描,每隔至少5分钟发送一个包
- 1 即Sneaky模式。也差不多,只是数据包的发送间隔是15秒
- 2 即Polite模式。不增加太大的网络负载,串行每个探测,并使每个探测间隔 0.4秒
- 3 即Normal模式。nmap的默认选项,在不使网络过载或者主机/端口丢失的情况下尽可能快速地扫描
- 4 即Aggressive模式。设置5分钟的超时限制,对每台主机的扫描时间不超过5分钟,并且对每次探测回应的等待时间不超过1.5秒。
- 5 即lnsane模式。只适合快速的网络或者不在意丢失默些信息,每台主机的超时 限制为75秒,对每次探测只等待0.3秒。
Nmap 端口分成六个状态:
- open ( 开放的 ):目标机器上的应用程序正在该端口监听连接/报文。
- closed ( 关闭的 ):表示端口没有应用程序在它上面监听,但是他们随时可能开放。
- filtered ( 被过滤的 ):意味着有防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap 无法得知 它是 open 还是 closed 。
- unfiltered ( 未被过滤的 ):当端口对 Nmap 的探测做出响应,但是 Nmap 无法确定它们是关闭还是开放时,这些端口就被认为是 unfiltered(未被过滤的)
- open | filtered ( 开放或者被过滤的 ):无法确定该端口处于两个状态中的哪一个状态。
- closed | filtered ( 关闭或者被过滤的 ):无法确定该端口处于两个状态中的哪一个状态。
2、nmap 的功能
要想入侵一台电脑,必须先找到一台目标主机,获取主机的 IP,然后查出开放的端口,才能进行入侵。 找出网络上的主机,测试哪些端口在监听,这些工作通常是由扫描来实现的。
通过扫描网络,寻找存在漏洞的目标主机。一旦发现了有漏洞的目标,接下来就是对监听端口的扫描。扫描每个 IP 的每个端口很慢,通常也没必要。网管也许只对运行特定服务的主机感兴趣,从事安全的人士则可能对一个 端口 都感兴趣,只要它有IP地址,系统管理员也许仅仅使用 Ping 来定位内网上的主机,外部入侵测试人员则可能绞尽脑汁用各种方法试图突破防火墙的封锁。
2.1 扫描技术
扫描方式:
- 全连接扫描:三次握手 防火墙能有效拦截,故很少使用 (产生大量日志,很少使用)
- 半链接扫描:又叫 间接扫描。三次握手前两次,源SYN 目标SYN/ACK 端口开放,源SYN 目标RST/ACK 端口关闭 (不记日志,隐蔽性好)。
- 秘密扫描:发送 FIN,返回 RST (端口关闭,回复RST包;端口开放,不回复)
TCP 扫描 选项
类型 选项 目标类型
-sT TCP扫描 全链接扫描。这种扫描方法准确速度快,但是容易被防火墙和IDS发现并记录,
所以这种方法,实际中并不多用
-sS SYN扫描 半链接扫描
-sF FIN扫描 秘密扫描 除SYN、ACK其它位置1
-sX Xmas扫描 秘密扫描 FIN、URG、PUSH位置1
-sN Null扫描 秘密扫描 标志位全为0,发送TCP分组
-sP ping扫描 同时使用ICMP和TCP ACK 80,返回RST说明主机运行(外网)
-sU UDP扫描 发送0字节UDP包,快速扫描Windows的UDP端口
-sA ACK扫描 TCP ACK扫描,当防火墙开启时,查看防火墙有未过虑某端口
-sW 滑动窗口扫描
-b FTP反弹攻击(FTP Bounce attack) 外网用户通过FTP渗透内网
FIN 扫描、Xmas 扫描、Null 扫描 对 Windows 无效
- TCP 连接扫描(-sT):指定这个选项后,程序将和目标主机的每个端口都进行完整的三次 握手。如果成功建立连接,则判定该端口是开放端口。由于在检测每个端口时都需要进行三 次握手,所以这种扫描方式比较慢,而且扫描行为很可能被目标主机记录下来。如果启动 Nmap的用户的权限不足,那么默认情况下Nmap程序将以这种模式进行扫描。
- SYN 扫描(-sS):该选项也称为半开连接或者SYN stealth。采用该选项后,Nmap将使用 含有SYN标志位的数据包进行端口探测。如果目标主机回复了SYN/ACK包,则说明该端口处 于开放状态:如果回复的是RST/ACK包,则说明这个端口处于关闭状态;如果没有任何响应 或者发送了ICMP unreachable信息,则可认为这个端口被屏蔽了。SYN模式的扫描速度非常 好。而且由于这种模式不会进行三次握手,所以是一种十分隐蔽的扫描方式。如果启动Nmap 的用户有高级别权限,那么在默认情况下Nmap程序将以这种模式进行扫描。
- TCP NULL(-sN)、FIN(-sF)及 XMAS(-sX)扫描:NULL 扫描不设置任何控制位; FIN扫描仅设置FIN标志位:XMAS扫描设置FIN、PSH和URG的标识位。如果目标主机返回 了含有RST标识位的响应数据,则说明该端口处于关闭状态;如果目标主机没有任何回应, 则该端口处于打开|过滤状态。
- TCP Maimon扫描(-sM):Uriel Maimon 首先发现了TCP Maimom扫描方式。这种模式的 探测数据包含有FIN/ACK标识。对于BSD衍生出来的各种操作系统来说,如果被测端口处于 开放状态,主机将会丢弃这种探测数据包;如果被测端口处于关闭状态,那么主机将会回复 RST。
- TCP ACK 扫描(-sA):这种扫描模式可以检测目标系统是否采用了数据包状态监测技术 (stateful)防火墙,并能确定哪些端口被防火墙屏蔽。这种类型的数据包只有一个ACK标识 位。如果目标主机的回复中含有RST标识,则说明目标主机没有被过滤。
- TCP 窗口扫描(-sW):这种扫描方式检测目标返回的RST数据包的TCP窗口字段。如果目 标端口处于开放状态,这个字段的值将是正值;否则它的值应当是0。
- TCP Idle扫描(-sI):采用这种技术后,您将通过指定的僵尸主机发送扫描数据包。本机 并不与目标主机直接通信。如果对方网络里有 IDS,IDS 将认为发起扫描的主机是僵尸主机。
UDP 扫描 选项
UDP 只有一种扫描方式(-sU)。虽然 UDP 扫描结果没有 TCP 扫描结果的可靠度高,但不能因此而轻视UDP扫描。但是 UDP 扫描的最大问题是性能问题。由干 Linux 内核限制1秒内最多发送一次 ICMP Port Unreachable 信息。按照这个速度,对一台主机的 65536 个 UDP 端口进行完整扫描,总耗时必 定会超过18个小时。
示例,指定扫描 53 端口和 161 端口:nmap -sU 192.168.182.132 -p 53,161
2.2 nmap script Engine (NSE)
Nmap 的漏洞检测是通过 Nmap 的扩展脚本实现的。Nmap 本身内置有丰富的 NSE 脚本,可以非常方便的利用起来,当然也可以使用定制化的脚本完成个人的需求。NES 脚本是用 lua 编写的。
在某些时候,大部分都是使用 Nmap 进行扫描,然后再通过 Metasploit 进行漏洞利用,但是这个过程比较繁琐,一个个漏洞去验证的话还需要打开 MSF 去设置参数,最后 run/exploit。
脚本列表:NSEDoc Reference Portal: NSE Scripts — Nmap Scripting Engine documentation
查看 nmap 本地 nes 脚本数量:ls /usr/share/nmap/scripts/ | wc -l
nmap script engine 官网:https://nmap.org/book/man-nse.html
-sC: 相当于--script=default
--script=<Lua scripts> 使用脚本进行扫描,多个脚本时用逗号分隔,支持通配符
--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供参数
--script-args-file=filename: 从文件中提供 NSE 脚本参数
--script-trace: 显示所有发送和接收的数据
--script-updatedb: 更新脚本数据库。
--script-help=<Lua 脚本>: 显示有关脚本的帮助。
nmap 脚本分类:
- 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 信息搜集 相关脚本
示例:
nmap --script all 172.27.42.110 //使用所有脚本对 172.27.42.110 主机进行扫描
// whois 通常读作 who is , 用来查询互联网中 域名的IP 和 所有者的信息
nmap --script whois www.0day.co//很多网站启用了who is 保护,可以查询who is 的历史记录,早期的可能没有保护。
nmap --script whois --script-args whois.whodb=nofollow www.0day.conmap -sn --script whois -v -iL host.txt //如果目标域名比较多,可以使用列表形式
nmap --script http-email-harvest www.0day.co //搜集email 信息// ip反查,将所有绑定该 IP 的域名显示出来,可以清楚的知道有几个站点在这台服务器上。
nmap -sn --script hostmap-ip2hosts www.0day.conmap --script dns-brute www.xxxxx.com //dns 信息搜集 ,默认 5线程
nmap --script dns-brute dns-brute.threads=10 www.xxxxx.com //dns 信息搜集,指定线程数是10
nmap --script dns-brute --script-args dns-brute.domain=www.baidu.com // 对 baidu.com 子域名的列举// nmap下提供了很多web漏洞的检测脚本, http-stored-xss.nse 可以发现网站的XSS(跨站脚本攻击)
nmap -p80 --script http-stored-xss.nse www.xxx.com// http-sql-injection 可以发现SQL 注入漏洞。在TOP 漏洞排行里,XSS 与 SQL 一直居高不下。
nmap -sV --script http-sql-injection www.xxx.com
使用实例:
nmap --script=auth IP // 负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令
http-php-version // 获得PHP版本信息
Http-enum // 枚举Web站点目录
smtp-strangeport // 判断SMTP是否运行在默认端口
dns-blacklist // 发现IP地址黑名单nmap --script=vuln 192.168.137.* // 扫描常见漏洞
smb-check-vulns // 检测smb漏洞
samba-vuln-cve-2012-1182 // 扫描Samba堆溢出漏洞
扫描 wordpress 应用的脚本
http-wordpress-plugins
http-wordpress-enum
http-wordpress-brute
测试 WAF 是否存在
nmap -p 80,443 --script=http-waf-detect 192.168.0.100
nmap -p 80,443 --script=http-waf-fingerprint www.victom.com
示例:telnet 爆破脚本
查询是否有 telnet 脚本:ls /usr/share/nmap/scripts/ | grep telnet
查看 telnet 脚本的详细信息:nmap --script-help=telnet-brute
可以看到一个文档信息,该文档为telnet脚本的文档。
使用例子:nmap -p 23 --script telnet-brute --script-args userdb=myusers.lst,passdb=mypwds.lst,telnet-brute.timeout=8s <target>
可以看到,因为23端口是关闭的,所以该指令并没有起作用。
23 端口为 telnet 的端口。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
打开 23 telnet 服务。开始->运行->services.msc 。找到 Telnet 服务 ( 默认是禁用的 )->双击->常规->启动类型->改成手动->启动。
再次使用 telnet 脚本进行爆破:
示例:vuln 漏洞脚本
该脚本可以对目标主机或网段扫描是否存在常见的漏。
nmap --script=vuln 192.168.182.132