Nmap使用说明
Nmap(Network Mapper) 是一款支持各种操作系统的开源网络扫描工具。主要用来进行主机发现、端口扫描,并通过端口扫描推断运行系统以及运行软件版本。Nmap还提供了对防火墙/IDS的相关技术与方法。
使用Nmap操作时,其基本命令格式为:Nmap [Scan Type(s)][options] {target}
下面分别叙述Nmap四种同技术与其实现流程与对防火墙的躲避技术,结尾将叙述Nmap应用方面的一些设置使用说明。
1. 主机发现
主机发现也称为ping扫描,但是Nmap中主机发现的技术已经不是简单的采用ping工具发送简单的ICMP回声请求报文。用户完全可以通过使用列表扫描(-sL)或者通过关闭ping(-P0)跳过ping的步骤,也可以使用多个端口把TPC SYN/ACK,UDP和ICMP任意组合使用。通过获得的响应以推测某个IP地址是否是活动的。下面是Nmap在主机发现过程中常用的命令:
-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 < 服务器1[,服务器2],…>:指定自定义DNS服务器
–system-dns: 使用系统自带的DNS解析器
–traceroute: 每个主机跟踪一跳路径
2. 端口扫描
端口扫描是Nmap的核心功能,使用nmap <target>可以扫描主机上的超过 1660个TCP端口。Nmap将扫描得到的端口分成六个状态: open(开放的), closed(关闭的),filtered(被过滤的),unfiltered(未被过滤的),open|filtered(开放或者被过滤的),或者 closed|filtered(关闭或者被过滤的)。下面给出了端口扫描中常用命令以及其使用方式:
-sS (TCP SYN扫描):半开放扫描,它只发送一个SYN报文然后等待回应,若SYN/ACK表示端口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响应, 该端口就被标记为被过滤。如果收到ICMP不可到达错误 (类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。
-sT (TCP connect()扫描):CPConnect()扫描是默认的TCP扫描,Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。
-sU (UDP扫描):UDP扫描发送空的(没有数据)UDP报头到每个目标端口。 如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。 其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。 偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。 如果几次重试后还没有响应,该端口就被认为是open|filtered(开放|被过滤的)。
-sN; -sF; -sX (TCP Null,FIN,and Xmas扫描):用来区分open(开放的)和 closed(关闭的)端口。利用了当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。
-sA (TCP ACK扫描):ACK扫描探测报文只设置ACK标志位(除非您使用 --scanflags)。当扫描未被过滤的系统时, open(开放的)和closed(关闭的) 端口 都会返回RST报文。Nmap把它们标记为 unfiltered(未被过滤的),意思是 ACK报文不能到达,但至于它们是open(开放的)或者 closed(关闭的) 无法确定。不响应的端口 或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。
-sW (TCP窗口扫描):利用了某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0,区分开放端口和关闭端口。
--scanflags (定制的TCP扫描):可以通过指定任意TCP标志位来设计自己的扫描。
-sO (IP协议扫描):确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。遍历的是IP协议号而不是TCP或者UDP端口号。
-b <ftp relay host> (FTP弹跳扫描):通过内网的FTP服务器对其主机端口进行扫描。
在端口扫描中,有一些附加的参数可以对扫描进行一些调整,其中
-b <ftp relay host> (FTP弹跳扫描)
-F (快速 (有限的端口) 扫描)
-r (不要按随机顺序扫描端口)
3. 版本侦测
nmap的版本侦测功能主要用来确定目标主机开放的端口上运行的应用程序及版本信息,nmap的版本侦测支持TCP/UDP协议,支持多种平台的服务侦测,支持IPV6功能,并能识别几千种服务签名,下面介绍nmap版本侦测常用命令:
-sV (版本探测):打开版本探测。
--allports:不为版本探测排除任何端口。
--version-intensity <intensity>:设置 版本扫描强度。
--version-*:与版本探测相关。
-sR (RPC扫描):与端口探测配合使用,先判断是否是RPC端口,然后判断版本号。
4. OS侦测
用TCP/IP协议栈fingerprinting进行远程操作系统探测是Nmap著名功能之一。 Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。 在进行一打测试如TCP ISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查之后, Nmap把结果和数据库nmap-os-fingerprints中超过 1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。 每个fingerprint包括一个自由格式的关于OS的描述文本, 和一个分类信息,它提供供应商名称(如Sun),下面的操作系统(如Solaris),OS版本(如10), 和设备类型(通用设备,路由器,switch,游戏控制台, 等)。
系统侦测的常用控制命令如下:
-O: 启用操作系统检测。(也可以使用-A来同时启用操作系统检测和版本检测)
--osscan-limit:针对指定的目标进行操作系统检测。
-osscan-guess; --fuzzy :推测操作系统检测结果。
5. 防火墙/IDS躲避
为了应对防火墙的拦截过滤,Nmap提供了绕过某些较弱的 防范机制的手段。有效的手段就是尝试哄骗网络,将自己想象成一个攻击者,利用FTP bounce扫描、Idle扫描、分片攻击或尝试穿透自己的代理。Nmap并不对防火墙与IDS进行破坏,只是绕过他们进行自己的探测。下面是常用绕过防火墙的相关技术与所使用的命令:
-f:报文分段, 其思路是将TCP头分段在几个包中,使得包过滤器、 IDS以及其它工具的检测更加困难。该选项使用一次,Nmap在IP 头后将包分成8个字节或更小。因此,一个20字节的TCP头会被分成3个 包,其中2个包分别有TCP头的8个字节,另1个包有TCP头的剩下4个字 节。当然,每个包都有一个IP头。再次使用-f可使用 16字节的分段(减少分段数量)。
--mtu :使用指定的MTU。(不太懂)
-D <decoy1 [,decoy2][,ME],...> :使用诱饵隐蔽扫描。
-S <IP_Address> :源地址哄骗。
--source-port <portnumber>; -g <portnumber> :源端口哄骗。
--data-length <number> :发送报文时 附加随机数据。
--spoof-mac <mac address,prefix,or vendor name>:MAC地址哄骗。
6. 关于Nmap设置的简单介绍
源端设置:
-S <IP_Address> ==> 伪造源IP地址
-e <interface> ==> 指定发包接口
-g <Sour_port> ==> 指定发包端口
--ip-options ==> 设置发包中的IP选项
--spoof-mac ==> 伪造源mac地址
输出设置:
-oN ==> 指定输出为正常文件
-oX ==> 指定输出为XML文件
--open ==> 仅仅显示处于打开监听的端口(常用) 其他:
-sV ==> 通过扫描端口猜测服务名称,版本
-O ==> 启用操作系统名称,版本扫描猜测
-T<0-5> ==> 设置扫描时间
-p port==> 指定扫描端口
Nmap实现原理分析
Nmap功能的实现基于TCP/IP协议,下面将曾从协议层面分析Nmap的实现原理。
1. 主机发现
主机发现通常在端口扫描以前,确定目标主机是否在线,也可以单独运行构建局域网拓扑。Nmap主机发现的实现分为两个阶段:地址解析阶段+实际探测阶段。地址解析主要负责从主机表达式中解析出目标主机地址,将之存放在hostbatch中,并配置该主机所需的路由、网口、MAC地址、源IP等信息。实际发现分别对解析出来的目标主机,进行实际的探测以及获取RDNS相关信息,例如采用ARP包发现局域网内主机是否在线。
Nmap从主机表达式中获取主机地址,若取得的不是IP需要进行DNS解析,获取域名对应的IP。在实际主机发现过程中,根据所利用的协议的不同,分为以下两种:
(1)利用IP层协议的方式:1)ARP方式。ARP方式一般用于Nmap对局域网进行扫描的情况下,因为基于RFC1918私有地址范围的网络中在一个给定的时间内绝大部分IP地址都是不使用的。当Nmap试图发送一个原始IP报文如ICMP回声请求时,操作系统必须确定对应于目标IP的硬件地址(需要使用ARP),所以直接放弃IP报文阶段,在得到ARP回应时就可以知道目标主机处于活跃状态。2)Ping扫描。仅仅进行ping扫描,发送ICMP数据包,将作出响应的主机进行打印。发扫描只是用来。
(2)利用运输层协议的方式:1)发送SYN数据包、发送ACK数据包、发送UDP数据包。前两种分别利用了TCP三次握手中的第一次握手与第二次握手。让对方觉得正在试图建立一个TCP连接,从而做出回应,根据回应得出主机状态。UDP则是发送一个UDP数据包,得到端口不可达、主机网络不可达的回应。
2. 端口扫描
Nmap提供的10多种类型的端口扫描方法,如TCPSYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP portunreachable/ UDP recv_from, IP protocol,SCTPINIT/SCTP COOKIE ECHO等扫描方式。这些技术全部是基于运输层与应用层的协议,原理都是基于网络数据包的特征或者网络编程API来判定端口的状态。以TCP SYN方式(Nmap的默认的TCP扫描方式)为例来简单地回顾端口扫描原理。
第一种情况表示端口处于关闭状态,第二种情况表示端口处于开放状态。
端口扫描功能会用到nmap-services数据库文件,此文件描述互联网上常见的注册端口对应的服务名称,以及该端口开放的频率和注释信息。端口开放的频率是Nmap项目组对互联网上大量的计算机进行扫描,统计出的每个端口开放的概率值,所以根据此概率可以很方便指定扫描覆盖的范围。
3. 版本侦测
扫描原理是服务指纹(或称签名)对比匹配。Nmap内部包含了几千种常见服务指纹的数据库(nmap-service-probes),对目标端口进行连接通信,产生当前端口的服务指纹,再与指纹数据库对比,寻找出匹配的服务类型。
服务与版本侦测主要分为以下几个步骤:1) 首先检查open与open|filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。2)如果是TCP端口,尝试建立TCP连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中ProbeTCP NULLq||对应的totalwaitms)。通常在等待时间内,会接收到目标机发送的“WelcomeBanner”信息。nmap将接收到的Banner与nmap-services-probes中NULLprobe中的签名进行对比。查找对应应用程序的名字与版本信息。3)如果通过“Welcome Banner”无法确定应用程序版本,那么nmap再尝试发送其他的探测包(即从nmap-services-probes中挑选合适的probe),将probe得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。4)如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配。根据结果对比分析出UDP应用服务类型。5)如果探测到应用程序是SSL,那么调用openSSL进一步的侦查运行在SSL之上的具体的应用类型。6)如果探测到应用程序是SunRPC,那么调用brute-forceRPCgrinder进一步探测具体服务。
4. OS侦测
Nmap使用TCP/IP协议栈指纹来识别不同的操作系统和设备。在RFC规范中,有些地方对TCP/IP的实现并没有强制规定,由此不同的TCP/IP方案中可能都有自己的特殊的处理方式。Nmap主要是根据这些细节上的差异来判断操作系统的类型的。
具体实现方式如下:1)Nmap内部包含了2600多已知系统的指纹特征(在文件nmap-os-db文件中)。将此指纹数据库作为进行指纹对比的样本库。2)分别挑选一个open和closed的端口,向其发送经过精心设计的TCP/UDP/ICMP数据包,根据返回的数据包生成一份系统指纹。3)将探测生成的指纹与nmap-os-db中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。
5. 如何构建端口扫描工具总结
1)主机发现。
对于主机的探测,需要使用网络层或者运输层协议。网络层用于测试主机可不可达的有ping,利用ICMP协议。但是有时防火墙或其他IDS会将ICMP数据包丢弃,所以这时就需要使用上层运输层的TCP或者UDP协议。TCP假装发起连接或者接受连接,根据目标机的回应判断。
2)端口探测。
端口的概念处于运输层,所以理论上应该利用TCP/UDP协议或者更高层应用层的协议进行探测。TCP端口的扫描相对简单,利用三次握手就可以。首先client端向server某端口发送请求连接的syn包,server的该端口如果允许连接,会给client端发一个ack与syn,client端收到server的ack包后再给server端发一个ack包,tcp连接正式建立。基于连接的建立过程,可以想到,假如要扫描某一个tcp端口,可以往该端口发一个syn包,如果该端口处于打开状态,我们就可以收到一个ack,也就是说,如果收到ack,就可以判断目标扫描出于打开状态,否则,目标端口处于关闭状态。
UDP由于是无连接的,所以其扫描比TCP麻烦很多。基本原理是发送空的UDP报头到每个目标端口。如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。如果几次重试后还没有响应,该端口就被认为是 open|filtered(开放|被过滤的)。UDP端口扫描的巨大挑战是怎样使它更快速。 开放的和被过滤的端口很少响应,让Nmap超时然后再探测,以防探测帧或者 响应丢失。关闭的端口常常是更大的问题。 它们一般发回一个ICMP端口无法到达错误。但是不像关闭的TCP端口响应SYN或者Connect 扫描所发送的RST报文,许多主机在默认情况下限制ICMP端口不可到达消息。 Linux和Solaris对此特别严格。
3)版本侦测与OS侦测:
版本侦测与OS侦测,原理上是基于端口探测结果,综合多个端口探测结果进行加权,得到签名以后跟已有的库相比较。准确性取决于能探测的端口数量与质量以及签名库的丰富程度。
4)探测准确性与效率
一种是根据实际网络场景,人工的调整扫描参数,在满足一定准确性的同时降低扫描时间。或者更智能化一点,能达到一种网络场景自适应的效果,系统本身能通过学习实时的网络场景,规避一些坑,提高效率与准确性。