Nmap简介
网络连接端扫描软件,用于主机发现,端口扫描,服务识别,系统识别。支持大量脚本
主机发现
二层主机发现
协议:ARP协议
优点:扫描速度快,可靠
缺点:不可路由
1 | nmap -sn 192.168.1.0/24 |
三层主机发现
协议:IP协议,ICMP协议
优点:可路由
缺点:较二层速度较慢,可被边界防火墙过滤
1 | nmap -sn 192.168.1.0/24 |
四层主机发现
协议:TCP协议,UDP协议
优点:可路由且可靠,不太可能被防火墙过滤,甚至可以发现所有端口都被过滤的主机
缺点:基于状态过滤的防火墙可能会过滤扫描,全端口扫描扫描速度慢
TCP主机发现
方法:
未经请求的
ACK(直接发一个ACK),活着的主机会回一个RST包;宕机主机不会回包直接发一个
SYN包,活着的主机会回一个SYN/ACK包(端口打开),回RST(端口关闭);
UDP主机发现
方法:
如果目标主机不在线,不回包;如果目标端口开启,也可能不回包。无法判断目标主机是否存活
当主机在线,发包到其未开放的端口,会回应ICMP端口不可达,则表明其主机在线
端口扫描
端口扫描即发现攻击点,发现开放端口
TCP端口扫描
全连接扫描
建立完整TCP三次连接,结果最最准确不需要任何权限,系统中的任何用户都有权利使用这个调用,而且速度快,但容易被发觉。
1 | nmap -sT 192.168.1.115 -p 100-200 |
隐蔽扫描
不建立完整的TCP连接,不在应用层留痕,只能在网络层有些迹像可循
只发送SYN包,根据目标主机返回包判断目标端口是否开放,(返回SYN+ACK为端口开放,返回RST+ACK包为端口不开放)
1 | nmap 192.168.1.115 -p100-200 #nmap默认SYN端口扫描 -sS |
僵尸扫描
僵尸机选择条件:
可实现源地址伪造
足够闲置
IPID递增
1 | nmap -p445 192.168.1.133 --script=ipidseq.nse #发现僵尸机 |
UDP端口扫描
1 | nmap -iL iplist.txt -sU -p 1-200 |
服务扫描
获取banner信息
1 | nmap -sT 192.168.1.107 -p 22 --script=banner.nse |
服务识别
1 | nmap 192.168.1.107 -p1-100 -sV |
操作系统识别
TTL起始值:
Windows系统:128(65-128)Linux/Unix:64(1-64)某些
Unix为255
1 | nmap -O 192.168.1.1 |
NMAP全部参数
目标选择
调用主机IP地址/网络的列表文件
1 | -iL <inputfilename> |
选择随机目标
1 | -iR <num hosts> |
排除主机/网络
1 | --exclude <host1[,host2][,host3],...> |
排除主机IP地址/网络的列表文件
1 | --excludefile <exclude_file> |
主机发现
列表扫描——简单地列出要扫描的目标
1 | -sL |
Ping扫描-禁用端口扫描
1 | -sn |
将所有主机视为在线——跳过主机发现
1 | -Pn |
TCP SYN Ping扫描
1 | -PS [portlist] |
TCP ACK Ping扫描
1 | -PA [portlist] |
UDP Ping扫描
1 | -PU [portlist] |
SCTP扫描
1 | -PY [portlist] |
ICMP type 8 (Ping)扫描
1 | -PE |
ICMP type 14 (时间戳响应)扫描
1 | -PP |
ICMP type 18(地址掩码响应)扫描
1 | -PM |
IP协议Ping扫描(禁止主机发现使Nmap对每一个指定的目标IP地址进行所要求的扫描 )(无Ping)
1 | -PO [protocol list] |
不对IP地址做反向域名解析
1 | -n |
永远对IP地址做反向域名解析
1 | -R |
指定自定义DNS服务器
1 | --dns-servers <serv1[,serv2],...> |
使用操作系统的DNS解析器
1 | --system-dns |
每个主机跟踪路由跳转路径
1 | --traceroute |
端口扫描
nmap所识别的端口状态
open(开放的)应用程序正在该端口接收
TCP连接或者UDP报文。发现这一点常常是端口扫描的主要目标。closed(关闭的)关闭的端口对于
Nmap也是可访问的(它接受Nmap的探测报文并作出响应),但没有应用程序在其上监听。它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行,也对部分操作系统探测有所帮助。filtered(被过滤的)由于包过滤阻止探测报文到达端口,
Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。unfiltered(未被过滤的)未被过滤状态意味着端口可访问,但
Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定端口是否开放。open|filtered(开放或者被过滤的)当无法确定端口是开放还是被过滤的,
Nmap就把该端口划分成这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。UDP,IP协议,FIN,Null,和Xmas扫描可能把端口归入此类。closed|filtered(关闭或者被过滤的)该状态用于
Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中。
TCP SYN隐蔽端口扫描
1 | -sS |
TCP全连接端口扫描
1 | -sT |
TCP ACK端口扫描
1 | -sA |
TCP窗口扫描
通过检查返回的RST报文的TCP窗口域。在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。因此,当收到RST时,窗口扫描不总是把端口标记为unfiltered, 而是根据TCP窗口值是正数还是0,分别把端口标记为open或者closed
1 | -sW |
TCP Maimon扫描
根据RFC 793 (TCP),无论端口开放或者关闭,都应该对FIN+ACK的探测响应RST报文。然而,如果端口开放,许多基于BSD的系统只是丢弃该探测报文
1 | -sM |
UDP端口扫描
1 | -sU |
TCP Null扫描(不设置任何TCP标志位)
1 | -sN |
TCP FIN扫描(只设置TCP FIN标志位)
1 | -sF |
TCP Xmas扫描(设置TCP FIN,PSH,URG标志位)
1 | -sX |
自定义TCP标志位用于扫描
1 | --scanflags <flags> |
指定僵尸机
1 | -sI <zombie host[:probeport]> |
SCTP初始化扫描
1 | -sY |
cookie-echo扫描
1 | -sZ |
IP协议扫描(用于确定目标机支持哪些IP协议 )
1 | -sO |
FTP反弹扫描
代理ftp连接。它允许用户连接到一台FTP服务器,然后要求此FTP服务器将文件送到一台第三方服务器
可导致FTP服务器对其它主机端口扫描。只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。错误消息会描述端口是开放还是关闭的。
1 | -b <username>:<password>@<server>:<port> #指定支持代理ftp连接功能的ftp服务器 |
端口规范和扫描顺序
指定端口(Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9)
1 | -p <port ranges> |
从扫描中排除指定的端口
1 | --exclude-ports <port ranges> |
快速模式-扫描比默认扫描更少的端口 (在nmap-services文件中指定端口)
1 | -F |
连续扫描端口——不要随机化
1 | -r |
扫描最常见的端口
1 | --top-ports <number> |
扫描更常见的端口
1 | --port-ratio <ratio> |
服务/版本检测
探测打开端口以确定服务/版本信息
1 | -sV |
版本探测强度(0-9)
1 | --version-intensity <level> |
限制探测强度为2
1 | --version-light |
尝试每一种探测,强度9
1 | --version-all |
显示详细的版本扫描活动(用于调试)
1 | --version-trace |
脚本扫描
1 | -sC: 等价于 --script=default |
调用脚本(多个脚本以逗号隔开)
1 | --script=<Lua scripts> |
提供脚本的参数
1 | --script-args=<n1=v1,[n2=v2,...]> |
在文件中提供脚本参数
1 | --script-args-file=filename |
显示发送和接收的所有数据
1 | --script-trace |
更新脚本数据库
1 | --script-updatedb |
查看脚本帮助信息
1 | --script-help=<Lua scripts> |
操作系统检测
检测操作系统
1 | -O |
针对指定的目标进行操作系统检测
1 | --osscan-limit |
推测操作系统检测结果 (默认)
1 | --osscan-guess |
时间和性能
默认时间选项为秒,可附加ms(毫秒),s(秒),m(分钟),h(小时)
设置定时模板
6个时间模板,使用时采用-T选项及数字(0 - 5) 或名称。模板名称有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)。
前两种模式用于IDS躲避
Polite模式降低了扫描 速度以使用更少的带宽和目标主机资源。
默认模式为Normal,因此-T3 实际上是未做任何优化。
Aggressive模式假设用户具有合适及可靠的网络从而加速扫描。
Insane模式假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。
1 | -T <0-5> |
并行主机扫描组大小
1 | --min-hostgroup <milliseconds> |
调整探测报文的并行度
1 | --min-parallelism <milliseconds> |
调整探测报文超时时间
1 | --min-rtt-timeout <milliseconds> |
端口扫描探测重传上限
1 | --max-retries <tries> |
放弃目标时间
1 | --host-timeout <time> |
调整探测之间的延迟
1 | --scan-delay <time> |
设置发送数据包的速度
1 | --min-rate <number> |
防火墙/ IDS逃避和欺骗
报文分段,指定MTU
1 | -f |
使用诱饵隐蔽扫描
噪声攻击扫描,将自己的真实IP隐藏在大量的伪造IP中,ME表示真实IP
1 | -D <decoy1,decoy2[,ME],...> |
源IP地址欺骗
1 | -S <IP_Address> |
使用指定的网络接口
1 | -e <iface> |
源端口欺骗
1 | -g <portnum> ; --source-port <portnum> |
设置nmap代理(http,socks4)
1 | --proxies <url1,[url2],...> |
将一个定制的payload附加到发送数据包
1 | --data <hex string> |
将一个定制的ASCII字符串附加到发送数据包
1 | --data-string <string> |
将随机数据附加到发送数据包
1 | --data-length <num> |
用指定的ip选项发送数据包
1 | --ip-options <options> |
设置IP TTL
1 | --ttl <val> |
MAC地址伪造
1 | --spoof-mac <mac address/prefix/vendor name> |
用伪造的tcp/udp/sctp校验和发送数据包
1 | --badsum |
输出
标准输出
1 | -oN <files> |
XML输出
1 | -oX <files> |
脚本小子输出
1 | -oS <files> |
Grep输出
1 | -oG <files> |
同时输出三种主要格式 (标准格式、XML格式和Grep格式 )
1 | -oA <basename> |
显示详细信息,显示最大详细信息
1 | -v |
设置调试级别,设置最大调试级别
1 | -d [level] |
显示一个端口处于特定状态的原因
1 | --reason |
只显示开放端口
1 | --open |
显示发送和接收的所有数据包
1 | --packet-trace |
显示主机接口和路由(用于调试)
1 | --iflist |
附加到指定的输出文件
-oX,-oN,-oG会覆盖输出文件,此选项对输出文件进行追加(XML输出文件无效)
1 | --append-output |
继续中断的扫描
使用选项并指定标准/Grep扫描输出文件,不允许使用其它参数,Nmap会解析输出文件并使用原来的格式输出。 Nmap将把新地结果添加到文件中,这种方式不支持XML输出格式
1 | --resume <file> |
设置XSL样式表,转换XML输出为HTML
1 | --stylesheet <path/URL> |
从Nmap引用样式表,用于更可移植的XML
1 | --webxml |
禁止Nmap的XML输出关联任何XSL样式表
1 | --no-stylesheet |
杂项
启用IPv6扫描
1 | -6 |
启用操作系统检测、版本检测、脚本扫描和路由追踪
1 | -A |
指定自定义Nmap数据文件位置
Nmap在运行时从文件中获得特殊的数据,这些文件有 nmap-service-probes, nmap-services, nmap-protocols, nmap-rpc, nmap-mac-prefixes和 nmap-os-fingerprints。Nmap首先 在--datadir选项说明的目录中查找这些文件。 未找到的文件,将在BMAPDIR环境变量说明的目录中查找。 接下来是用于真正和有效UID的~/.nmap或Nmap可执行代码的位置(仅Win32);然后是是编译位置, 如/usr/local/share/nmap或/usr/share/nmap。 Nmap查找的最后一个位置是当前目录
1 | --datadir <dirname> |
使用原以太网帧发送数据
要求Nmap在以太网(数据链路)层而不是IP(网络层)发送报文
1 | --send-eth |
使用原IP数据包发送数据
1 | --send-ip |
假定用户具有全部权限
告诉Nmap假定其具有足够的权限进行源套接字包发送、报文捕获和类似UNIX系统中根用户操作的权限。
1 | --privileged |
假设用户缺少原始socket特权
1 | --unprivileged |
打印版本信息
1 | -V ; --version |
帮助信息
1 | -h ; --help |
Nmap常用脚本
脚本默认存放位置
1 | /xx/nmap/scripts |
常用脚本分类
auth:负责处理鉴权证书(绕过)的脚本broadcast:在局域网内探查更多服务的开启情况brute:对常见的应用进行暴力破解default:使用-sC或-A选项扫描时的默认脚本discovery:对网络进行更多的信息收集dos:用于拒绝服务攻击exploit:利用已知漏洞入侵系统external:利用第三方的数据库或资源查询目标地址信息fuzzer:模糊测试脚本intrusive:入侵性脚本,可能被目标IPS/IDS发现malware:探测目标是否感染病毒,开启后门等信息safe:安全性脚本version:负责增强服务与版本扫描功能的脚本vuln:负责检查目标是否存在常见漏洞