诸神之眼——Nmap

简介

Nmap是一款用于网络发现和安全审计的网络安全工具,由Gordon Lyon最初编写.Nmap是Network Mapper的简称。Nmap的大致用途:

  • 列举网络主机清单
  • 管理服务升级调度
  • 监控主机
  • 服务运行状况

目标说明

可以传递主机名、IP地址、网段等.

例如freeaes.com,192.168.1.1,192.168.1-254

参数

-iL:从文件内导入目标主机/目标网络

-iR:随机选择目标

--exclude <host1[,host2][,host3],...> : 排除指定目标

--excludefile <exclude_file> : 从文件中导入需要排出的列表

主机发现

主机发现和Ping命令类似,通过发送数据包到目标主机,如果收到目标的恢复,那么说明目标主机在线,Nmap支持很多种主机发现方式,可以根据当前环境灵活选择不同的方式探测,常用参数如下

参数

-sL : 列表扫描-简单的列出需要扫描的目标

-sn : 只进行主机发现,不进行端口扫描,用来探测主机是否存活,作用和ping命令差不多

-Pn : 将指定的主机视为在线的,跳过主机发现的过程

-PS/PA/PU/PY [端口列表]:分别对应TCP(SYN/ACK),UDP,SCTP进行主机发现

-PE/PP/PM : 使用ICMP echo,timestamp,netmask请求进行主机发现

-PO : 使用IP协议包探测对方主机是否在线

-n/-R:-n表示不进行DNS解析,-R表示进行DNS解析(默认时不时解析..)

--dns-servers :指定DNS服务器

--system-dns:使用系统DNS解析器

--traceroute:跟踪路由节点

重要参数详解

-sL(列表扫描)

仅列出指定网络上的每台主机,不发送任何报文到目标主机,默认情况下,Nmap会对主机进行反向域名解析以获取它们的主机名.最后会报告IP地址的总数

-sP(Ping扫描)

仅进行ping扫描,打印出有响应的主机,没有进一步扫描(如端口扫描或服务版本信息扫描),比ping广播地址更有效,因为很多主机不会会有ping广播

-P0(无ping)

跳过主机发现阶段,直接进行更高级的扫描(如端口扫描和OS探测),通常和其他参数一起使用

-PS [端口列表](TCP SYN Ping)

发送一个设置了SYN标志位的空TCP报文.默认目的端口为80.但不同的端口也可以作为选项设定.多端口以英文逗号分割,每个端口都会被并发扫描.

当发送一个SYN标志位的报文过去时,如果目标端口是关闭的,则会回复RST包,如果是开启的,则会返回SYN/ACK TCP报文.由此判断目标端口是否开放

-PA [端口列表](TCP ACK Ping)

TCP ACK Ping和SYN Ping类似,只不过将SYN标志位改成ACK.

ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立. 所以目标主机应该回应一个RST报文, 因为目标主机没有向本机发送发送连接请求.而如果目标主机没有回应,则表示目标端口未开放

-PU [端口列表](UDP Ping)

发送一个空的UDP报文到指定目标端口.默认端口为31338

如果目标端口是关闭的,那么UDP探测会收到一个ICMP端口无法到达的回应报文.用于判断目标主机是否在线,而如果目标主机不在线或者TTL超时,那么将不会收到任何回应,而如果目标端口是开放的,大多数服务会忽略这个报文,所以那么也不会收到任何回应,但也有少部分服务会响应这个空的UDP报文,所以也能证明目标主机在线

使用UDP扫描的优势在于它可以穿过大部分防火墙,因为很多防火墙只过滤TCP

-PR (ARP Ping)

局域网内最常见的扫描方式,使用ARP Ping探测目标主机是否在线,而这种扫描在局域网内成功率极高,因为发送原始报文时,操作系统必须确定对应于目标IP的Mac地址,这样它才能把以太帧送往正确的地址

-n(不进行DNS解析)

永不对发现的活动IP地址进行反向域名解析,因为不用进行DNS解析,所以这样能使扫描速度更快

-R(为所有目标进行DNS解析)

永远对目标IP地址进行反向域名解析.一般只有当确认目标在线时才会进行.

端口扫描技术

端口扫描作为Nmap的原始功能之一,虽然现在有了更多的功能,但端口扫描依然是Nmap的大儿子

Nmap将扫描的端口分成六种状态:open(开放),closed(关闭),filtered(被过滤), unfiltered(未被过滤), open|filtered(开放或者被过滤),或者closed|filtered(关闭或者被过滤)

参数

-sS/sT/sA/sW/sM:分别对应TCP SYN/Connect()/ACK/Window/Maimon扫描

-su : 使用UDP扫描

-sN/sF/sX : 指定TCP Null(空扫描),FIN(秘密FIN扫描),Xmas(圣诞树扫描)

--scanflags:自定义TCP扫描的flag标志

-sl : 使用idle scan方式来扫描目标主机,空闲扫描

-sY/sZ : 使用SCTP INIT/COOKIE-ECHO扫描SCTP协议的端口

-sO : 使用IP协议扫描

-b FTP反弹扫描

重要参数详解

-sS(TCP SYN扫描)

半开放式扫描,发送一个SYN报文,等待目标响应,如果收到SYN/ACK就表示目标端口开放,而如果收到RST则表示目标端口关闭,在收到SYN/ACK报文后不会对目标做出回应,这样TCP连接就没有完全建立,所以称为半开放式扫描,这样也会更好的隐藏

12

-sT(TCP connect()扫描)

当SYN扫描不能使用时(如用户权限不够)就会使用TCP connect()扫描.因为SYN扫描是半开放的,所以会比TCP connect快很多,而且这样也会在目标主机的日志上留下痕迹,所以当SYN扫描可用时建议使用-sS选项

-sU(UDP扫描)

使用UDP扫描,UDP扫描速度一般比TCP慢,UDP扫描可以和TCP扫描结合起来同时检查两种协议,UDP扫描发送空的UDP报文到目标的每个端口,如果返回ICMP端口不可到达错误(类型3,代码3), 那么该端口是关闭的. 如果是其它ICMP不可到达错误(类型3,代码1,2,9,10或者13)则表明该端口是被过滤的. 如果某服务偶尔会响应一个UDP报文,那么证明该端口是开放的. 但如果几次重试后还没有响应,那就被认为是开放或者被过滤的

-sN;sF;sX(TCP Null,FIN,Xmas扫描)

-sN:不设置任何标志位(TCP标志头为0)

-sF:只设置TCP FIN标志位

-sX:设置FIN,PSH和URG标志位.就像点亮圣诞树上的所有灯一样,所以称为圣诞扫描

三种扫描除了报文的标志位不同,在扫描过程上是一致的,如果收到一个RST报文,则认为该端口是关闭的,如果没响应,则认为端口是开放或者被过滤的.而如果收到ICMP不可达错误,则认为该端口为被过滤的

-sA(TCP ACK扫描)

用于发现目标防火墙规则,目标端口有没有被过滤

发送ACK标志位的报文到目标主机,如果返回RST报文,则认为目标端口未被过滤.如果目标端口无响应,或者发送特定的ICMP错误消息,则认为目标端口被过滤

端口扫描规格和扫描顺序

除了所有前面讨论的扫描方法,Nmap提供选项说明那些端口被扫描以及扫描是随机还是顺序进行.默认情况下,Nmap用指定的协议对端口1到1024以及nmap-services 文件中列出的更高的端口进行扫描.

参数

-p <端口范围> : 只扫描指定的端口,默认只随机扫描常见端口
--exclude-ports:排除指定端口
-F : 快速扫描,扫描比默认扫描更少的端口
-r : 连续扫描端口(默认扫描随机扫描端口)
--top-ports : 扫描最常见的端口
--top-ratio : 扫描常用端口里,指定频率以上的端口,比如ratio=0.3,那么就扫描常用端口内占比超过0.3的端口

重要参数详解

-p

指定扫描端口,可用逗号分隔,也可用连字符指定一段端口,-p-表示扫描所有端口.可以在端口号前面加上T:或U:指定协议,每指定一次后面的端口都受用,直到第二次指定协议为止

-F(快速扫描(有限的端口))

只扫描最常用的100个端口,也可以用–datadir参数指定包含要扫描的端口的列表文件

-r(不随机扫描)

默认情况下,Nmap会按随机顺序扫描(常用的端口会先扫描),-r选项可以指定Nmap按顺序扫描端口

服务/版本探测

当Nmap扫描到目标主机时,默认情况下它只会告诉你端口的状态和运行的服务,却不会告诉你端口运行的服务版本信息.Nmap有一个包含2000多个服务的nmap-servuces数据库,里面每个端口都有对应的服务,但是某些情况下可能不适用,因为探测到的22端口运行的并不是SSH服务,而2222端口才是,而版本探测在发现端口开启时,会询问这些端口运行的是什么服务,Nmap有一个nmap-service-probes文件,里面包含了查询不同服务的探测报文和解析识别响应的匹配表达式

参数

-sV : 探测打开的端口使用的服务/版本信息

--version-intensity : 指定探测版本信息的强度0-9,默认为7级,值越高,探测的时间越久,也越精准

--version-light : 使用轻量级模式,等价于—version-intensity 2

--version-all : 最高级别的扫描,等价于—version-intensity 9

--version-trace : 显示版本扫描的过程

重要参数详解

-sV(版本探测)

打开版本探测,扫描目标端口运行的服务和版本信息

–allports(不排除任何端口)

默认情况下,运行版本探测时,Nmap会跳过9100后的端口,因为这样可以很大程度节省时间和提高效率,allports选项可以指定扫描所有端口

–version-intensity(指定版本扫描等级)

当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值. 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没什么用.强度水平说明了应该使用哪些探测报文.数值越高,服务被识别的正确率就越高.但扫描的时间也会越高.默认等级是7级.

-sR(RPC扫描)

对所有开放的TCPUDP端口执行SunRPC程序NULL命令来判断是否为RPC端口.不过这项功能在使用-sV选项时会自动打开,所以很少会用到

脚本扫描

Nmap的脚本模块也是其最强大的功能之一,它共有599个脚本(7.80版本),同时也支持用户自己编写的脚本,几乎包含了所有你做安全研究任务可能会用到功能

脚本类型

有四种不同的类型可以帮我们提升默认的Nmap功能

  1. 规则脚本 : 这些类型的脚本在其余扫描操作之前运行,而Nmap没有有关远程目标的任何数据.
  2. 主机脚本 : Nmap默认扫描完成主机探索,检测,端口扫描或软件发现后,它将执行主机脚本.
  3. 服务脚本 : 这些是针对远程主机上的服务运行的一组特定的Nmap脚本.例如,其中包括可以在Web服务器上运行的http服务脚本。
  4. 后规则脚本 : 它们在整个Nmap扫描完成后运行,通常对解析,格式化和显示不同结果很有用.

脚本类别

Nmap脚本名称 描述
auth 各种身份验证和用户特权脚本
broadcast 局域网内使用广播请求进行情报收集的网络发现脚本
brute 用于执行暴力破解以猜测账号密码的脚本集
default 使用-sC选项扫描时用的默认脚本,提供基础脚本扫描能力
discovery 与网络,服务和主机发现有关的脚本
dos 用于测试和执行DOS和泛洪的拒绝服务攻击脚本
exploit 用于对不同的CVE执行服务利用
external 依赖第三方服务或数据的脚本
fuzzer 用于对应用程序,服务或网络进行攻击
intrusive 可能会引起防火墙注意的“攻击性”脚本
malware 恶意软件检测和探索脚本,检测目标有没有后门、木马
safe 安全且非侵入式的脚本
version 操作系统,服务和软件检测脚本
vuln 检测目标是否有常见漏洞

参数

-sC : 使用默认脚本,提供基础脚本扫描

--script-args : 为脚本提供参数

--script-args-file : 在文件中提供NSE脚本参数

--script-trace : 显示所有发送和接受的数据

--script-updatedb : 更新脚本数据库

--script-help : 显示关于脚本的帮助

操作系统检测

操作系统检测用于检测目标主机运行的操作系统,发行版本以及设备类型等

Nmap数据库nmap-os-db中有超过2500(现在具体多少个我也不知道..)个已知的操作系统的fingerprints,

参数

-O : 启用操作系统检测

--osscan-limit : 只对确定的主机进行操作系统探测(需要确定主机是在线的)

--osscan-guess : 大胆猜测,能给出对方操作系统的更多可能,但会降低准确性

时间和性能

当进行一些特定的扫描选项时,会明显增加扫描时间,同时,防火墙配置以及特殊的响应速度限制也会增加扫描检测时间.Nmap使用了并行算法和许多先进的算法加速扫描过程,可以使用选项来加快扫描时间

参数

-T : 指定扫描速度,共有0-5六个等级,等级越高扫描越快,但会更容易被检测并屏蔽掉

--min-hostgroup/max-hostgroup : 并行主机扫描组大小,将多个目标IP分成扫描组,同一时间对一个扫描组进行扫描,就是多并发的意思

--min-hostgroup : 一个扫描组的下限,--max-hostgroup : 一个扫描组的上限

--min-rtt-timeout : 主机在线和重传等待,这个选项很少会用到,一般在网络不太行的时候使用

--max-retries : 限制端口扫描重发的数量

--host-timeout : 指定每个主机扫描的超时时间

--scan-delay/--max-scan-delay : 调整扫描之间的延迟时间

--min-rate : 指定每秒最少发送的数据包数量

--max-reta : 指定每秒最多发送的数据包数量

重要参数详解

–min-hostgroup ; –max-hostgroup (调整并行扫描组的大小)

Nmap具有并行扫描多主机端口或版本的能力.将多个目标IP地址空间分成组,然后在同一时间对一个组进行扫描,这样的话越大的组效率会越高,但是要在整个组扫描完后才会显示扫描结果.

–max-hostgroup选项用于说明使用最大的组,Nmap不 会超出这个大小.–min-hostgroup选项说明最小的组

–min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout (调整探测报文超时)

Nmap会设置一个超时时间来确定等待探测报文响应的时间,如果响应时间超过这个值随后会放弃或重新发送探测报文.Nmap基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著,这个超时值会增加几秒,而当Nmap扫描无响应的主机时,这个保守值会保持一段时间,这些选项以毫秒为单位.

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置扫描速度)

如果觉得之间那些选项太麻烦,懒得记,那么可以使用-T选项.它提供了六个等级0~5,数值越高扫描速度越快,但是会更容易被防火墙检测到.数值越低越安全,但是速度也会越慢,Nmap默认使用第五个等级(4)扫描

防火墙/IDS 规避及欺骗

防火墙/IDS规避及欺骗用于绕开防火墙与IDS的检测与屏蔽,使之能够更加详细地发现目标主机的状态.Nmap提供了多种规避方法.

参数

-f : 指定使用分片、数据包的MTU值

-D : 使用一组IP地址掩盖自己的真实IP,在伪IP最后面要加上自己的真实IP

-S : 伪装成其他IP

-e : 使用指定的网卡扫描

-g/--source-port : 使用指定的端口号发送

--proxies : 使用http/socks4代理中继连接

--data <十六进制字符串>: 向发送的数据包追加一个自定义有效负载

--data-string : 向发送的数据包追加一个自定义的ASCII字符串

--data-length : 向发送的数据包追加随机数据

--ip-options : 发送指定IP选项的数据包

--ttl : 设置IP生存时间

--Spoof-mac : 伪造Mac地址

--badsum : 发送带有伪TCP/UDP/SCTP校验和的数据包

重要参数详解

-f(分片);–mtu(使用指定的MTU)

扫描时使用小的IP包分段发送.使防火墙的检测更加困难.一个20字节的TCP头会被分成3个包,每个包都有一个IP头,使用-f选项可以减少分段数量.

使用–mtu选项可以自定义偏移的大小,在使用mtu选项时不需要使用-f,偏移量必须是8的倍数.

-D<decoy1 [,decoy2][,ME],…> (使用伪造IP隐蔽扫描)

指定一组IP地址来掩盖真实的IP地址,在ME处填写自己的IP地址.如果不添加真实IP,Nmap会自动将真实IP放在随机一个位置

将发送出去的数据包中的IP地址伪装成指定的IP,目标主机会认为是其他主机与它连接,不过这个选项要在局域网环境内才能使用,否则会收不到目标的响应包

-e (使用指定接口)

告诉Nmap使用那个网卡接口收发报文,默认情况下Nmap会自动检测.

-g/00source-port (源端口欺骗)

有些时候目标主机的端口可能会指定连接源端口,如连接DNS服务需要源端口为53才会响应,这种时候就要伪造源端口

数据输出

格式化输出是为了可以更直观的查看检测结果,Nmap提供五种不同的输出格式,其中XML是最常用的,可以转HTML格式

参数

-oN/-oX/-oS/-oG :  格式化输出到指定文件,分别对应标准输出/XML输出/交互输出/Grep输出(建议使用XML输出)

-oA : 同时输出三种主要格式

-v : 增加详细程度

-d : 增加调试级别

--reason : 显示某个端口处于特定状态的原因

--open : 只显示打开的(或可能打开的)端口

--packet-trace : 包跟踪,显示所有发送和接收的包

--iflist : 打印主机接口和路由(适用于调试)

--append-output : 追加到指定的输出文件

--resume : 恢复中止的扫描

--stylesheet XSL样式表将XML输出转换为HTML

--webxml : 从Nmap官网引用样式表以获得更可移植的XML

--no-stylesheet : 防止XSL样式表与w/XML输出相关联

重要参数详解

-oX (XML输出)

要求XML输出直接写入指定文件,XML提供了可供软件解析的稳定格式输出,常用的语言都有提供XML解析器,如C/C++、Perl、Python和Java,.针对这些语言有一些捆绑代码用于处理Nmap的输出和特定的执行程序

-v(提高输出信息的详细度)

此选项会使Nmap输出扫描过程中的更多信息.两个v会最大化输出信息

-d[level](提高或设置调试级别)

当-vv选项无法满足需求时,可以使用调试模式获取更多的信息.调试模式共有9个级别,越往上输出信息越多,但大部分时候还是适当的增加就好,不然一次性输出太多信息反而不知道看哪些好

–append-output(在输出文件中添加)

默认情况下,使用格式化输出到指定文件时,会覆盖掉之前的信息,加上此选项会保留文件内容,本次扫描信息会在在文件末尾追加

杂项

一些重要(或者不重要)的选项

参数

-6 : 启用IPv6扫描

-A : 启用OS检测,版本检测,脚本扫描和traceroute,相当于全面扫描,扫描信息最全

--datadir : 指定自定义Nmap数据文件位置

--send-eth/--send-ip : 使用原始以太网帧或IP数据包发送

--privileged : 假定最高管理员权限扫描

--unprivileged : 假定用户确实原始套接字权限

-V : 打印版本信息

-h : 打印帮助信息

重要参数详解

-A(进攻性扫描)

启用操作系统检测和服务版本扫描.提高扫描强度.仅一个-A即可全面扫描,不需要大量记忆选项功能

–privileged(假定用户具有全部权限)

一般情况下很多选项都需要高权限才能执行,如果用户不是root,那么需要类似sudo命令提升权限,或切换到root用户.否则程序会自动退出.而此选项用于告诉程序其具有足够的权限执行命令(并不是提升权限),进行源套接字包发送、报文捕获.

-V;–version(打印版本信息)

打印Nmap版本信息并退出程序