第6章 服务枚举

服务枚举是数一种据采集工作,用于获取目标主机开放端口、操作系统和网络服务等有关信息。渗透人员通常会首先识别出在线的目标主机,然后再进行服务枚举。在实际渗透测试中,此阶段的工作属于探测过程的一部分。

本章介绍下几个内容:

● 端口扫描,及其端口扫描工具所支持的扫描类型;

● 端口扫描工具;

● 枚举Windows 系统SMB 服务的扫描工具;

● 枚举SNMP服务的扫描工具;

● 枚举虚拟专用网络(Virtual Private Network,VPN)的扫描工具。

目标枚举旨在最大程度地收集目标主机的网络服务信息。这些信息将使我们在后续阶段的工作——识别漏洞的工作更具针对性。

6.1 端口扫描

简单说来,端口扫描是一种用来确定目标主机TCP端口和UDP端口状态的方法。主机开放了某个端口,就意味着它在这个端口提供某种网络服务。如果某个端口处于关闭状态,则说明主机在这个端口上并没有提供网络服务。

在确定某端口处于开放状态之后,攻击人员就会检查在该端口提供相应服务的程序版本,以判断这个版本的程序是否存在漏洞。例如说,主机A使用的是数年前的1.0版本的Web服务端程序,而且官方发布过这个版本的安全公告。公告内容声明了1.0版本程序存在某种漏洞。如果攻击人员能够检测到服务器A开放了Web服务器,而且能够确定这个程序的版本号,他们就能利用有关信息攻击服务器。可见,主机上服务软件的信息十分重要。

在进行端口扫描的工作之前,我们首先简要介绍一下TCP/IP协议及其应用。

6.1.1 TCP/IP协议

TCP/IP协议是很多协议的统称。这些协议里最重要的两个协议就是TCP协议和IP协议。IP协议提供了寻址、路由等主机互联的功能,而TCP协议约定了连接管理、在两台主机间建立数据通信可靠传输的标准。IP协议是OSI模型的第3层协议,而TCP协议是传输层(OSI第4层)协议。

UDP协议是和TCP同等重要的传输层协议。那么这两种协议之间的区别在哪儿呢?

简要地说,TCP有以下特点。

● TCP 协议是面向连接的协议:在使用 TCP 协议传输数据之前,发起连接的客户端和受理连接的服务器之间必须通过三次握手建立连接。

◆ 客户端向服务器发送初始化连接的 SYN 请求包。这个数据包的序列号(Sequence number)字段将包含随机的初始化序列号(ISN)信息。

◆ 服务器将客户端发送的ISN加1之后,作为自己的ACK数据序列号,以此对客户端 SYN 信息表示确认,而且服务器的数据包会使用独立的序列号。IP数据包里有个专门的ACK 标识位(flag bit),服务器把这个标识位设置为1以表示该数据包是确认数据包。

◆ 客户端再将服务器刚才回复的ISN+1,并向服务器发送ACK 确认包。此后,两台主机开始传输数据的正式过程。

ƒ TCP 协议终止连接的机制如下所示。

◆ 客户端发送一个含有FIN(finish)标志的数据包。

◆ 服务器发送ACK 确认数据,以告知客户端它已经受理了FIN 的数据包。

◆ 应用服务器在关闭连接之前,会再发送一个FIN 数据包给客户端。

◆ 客户端对服务器的FIN 请求发送ACK 确认数据包。通常情况下,客户端和服务器在发送FIN信号之后都可以独自关闭连接。

● TCP 协议是可靠的传输协议:TCP 协议使用序列号和确认信号(ACK 数据包)来识别数据包。每当接收方收到一个数据包,它都会发送 ACK 数据包以进行确认。如果任何一方没有收到对方的 ACK 数据包,它会自动重传。即使接收方收到了乱序的数据包,根据 TCP 协议,接收方可在重新整理数据包的顺序之后,再把数据传给(接收数据的)应用程序。

多数传送文件的应用程序,或者传递重要数据的程序都使用 TCP 协议。例如超文本传输协议(HTTP)和文件传输协议(FTP)都是基于TCP的传输协议。

UDP协议的特征与TCP协议相反。

● UDP 协议不是面向连接的协议。在采用这种协议传输数据时,收发双方不必建立UDP连接。

● UDP 协议旨在尽可能地将数据包发送到目标地址。如果在传输过程种发生了丢包的情况,UDP协议不会自动重传(即操作系统不负责重新传送UDP包)。由应用程序决定是否重新传送数据包。

能够接受丢包情况的应用程序,例如视频流和其他多媒体程序,多数会采用UDP协议传输数据。著名的域名解析系统(DNS)、动态主机配置协议(DHCP)和简单网络管理协议(SNMP)使用的都是UDP协议。

为了能够将网络数据正确地传送给相应的应用程序,传输层实现了一种名为端口(port)的寻址方式。在服务器端,软件程序都在特定服务端口受理网络数据;客户端向服务器端口发送的数据,将会被服务器端对应的软件程序受理。端口号码是16位的编码,取值范围是 0~65535。为了避免使用上的混乱,这些端口大多有着约定俗成的用途。

● 公认的端口(0~1023):这个范围内的端口又称为保留端口,通常供系统管理员(或高权限用户)运行的服务端程序使用。SSH(22号端口)、HTTP(80号端口)、HTTPS (443号端口)等常用服务端口都是这个范围内的端口。

● 注册的端口(1024~49151):Internet 授权地址分配组(IANA)提供这一范围内的端口的注册服务。人们可以把他们自己的客户端/服务器程序( client-server application)所使用的端口号在IANA登记备案。

● 私有端口/动态端口(49152~65535):所有人都可以随意使用这个范围内的端口,而不必向IANA注册端口号。

在简要讨论了TCP和UDP之间的区别之后,我们接下来介绍TCP和UDP数据包的具体格式。

6.1.2 TCP和UDP的数据格式

TCP数据包叫作TCP信息段(segment)。每个TCP消息段由报头(header)和数据构成。如果TCP 消息段不含有TCP 选项(TCP option),那么它的报头的大小应当是20 字节(IPv4)。整个消息段的结构如图6.1所示。

figure_0144_0075

图6.1

上述各字段的作用如下。

● 源端口和目的端口各占 16 位。源端口是发送方在发送该数据包时所使用的端口,目的端口是接收方接收该数据的端口。

● 序列号是32 位数据。在常规情况下,它是标识这个消息段的序列编号。

● 确认号同样是32 位数据。它是上一次已成功收到的数据字节序号加1。

● HLen 是TCP 报头的长度,它占了32 位数据中的头4 位。

● Rsvd 是个4 位大小的保留字段,它的值必须为零。

● 控制位的4 位数据可以通过排列组合表示8 个1bit 的标志位。在旧有的RFC 793规范中(RFC 793的下载地址是http://www.ietf. org/rfc/rfc793.txt), TCP只有6个标志位。

ƒ SYN:同步标志位,此位在建立会话时使用。

ƒ ACK:包含该确认字段的TCP 数据,是对以前接收到的数据包的确认。

ƒ RST:重置连接的标识位。

ƒ FIN:表示发送方已经没有数据需发送,将要以正常方式关闭连接。

ƒ PSH:告诉接收方应当把缓冲区的数据立即推送给应用程序,而不要再等待接收更多的数据。

ƒ URG:这个标识位用以说明TCP报头里的紧急指针(Urgent Pointer)有特殊含义。紧急指针和序号字段相加的和,表示最后一个紧急数据的下一字节的序号。

● 后来,新推出的 RFC 3168(http://www.ietf.org/rfc/rfc3168.txt)增加了两个标志位。

ƒ Congestion Window Reduced(CWR):窗口调整标识位。数据发送方通过这个标识位通知接收方“由于网络拥塞,不得不减小发送队列的长度(缩小TCP窗口)”。

ƒ Explicit Connection Notification-Echo(ECN-Echo):拥塞通告标识位。这个标识位表明网络连接存在拥塞问题。

● 窗口大小占报文头的16 位。它用来声明接收方将接收的字节数量。

● 校验和占16 位,用于校验TCP 报头和数据体。

这些标志位可单独设置。

如需全面了解TCP协议的各项规范,请参阅RFC 793和RFC 3168。

在使用含有SYN的数据包进行端口扫描时,攻击者可能收到的远程响应分为以下几种。

● 目标主机回应 SYN-ACK 包。如果收到了这种数据包,我们可以确定该端口处于开放状态。这是 TCP 规范(RFC 793)中定义的标准响应方式。依据 RFC 793,开放端口在收到SYN包时必须回应SYN-ACK包,而不处理SYN包里的具体数据。

● 目标主机可能会返回数据包,而且这个数据包设有RST标识位和ACK 标识位。这意味该端口处于关闭状态。

● 目标主机可能会返回一个 ICMP 消息(例如,ICMP Port Unreachable)。多数情况下,这是防火墙阻止了SYN数据包造成的。

● 目标主机还有可能不进行响应。无论目标主机的这个端口没有开放网络服务,还是防火墙以静默模式阻塞了探测的SYN包,都可能发生这种情况。

渗透测试人员只对开放的端口感兴趣,因为这些开放端口的背后必然是某种服务程序,而这些服务端程序正是后续测试的对象。

要想使渗透测试的攻击工作富有成效,就要在充分理解 TCP 行为的基础上进行端口扫描。

下文将从报头格式开始介绍UDP协议。我们首先介绍UDP数据的报头(见图6.2)。

figure_0146_0076

图6.2

上图中各字段的功能如下。

● 和 TCP 报头一样,UDP 报头也有相应的源端口和目的端口。这两个字段各占 16位。源端口是发送数据包的主机使用的端口,目的端口是接收数据的目标主机的端口。

● UDP 长度是UDP 报头的长度。

● UDP 校验和是用于检测UDP 报头和数据错误的16 位校验和。

请注意UDP报文头没有序列号和确认号,也没有控制位。

在扫描目标主机的UDP端口时,攻击者可能收到的响应分为以下几种。

● 目标主机回复UDP 数据包。如果收到了回复数据,可判断该端口处于开放状态。

● 目标主机可能会返回ICMP消息(例如,ICMP Port Unreachable)。这种消息表明该端口处于关闭状态。但是如果收到的是ICMP Port Unreachable 以外的ICMP信息,则意味着防火墙阻止了到这个端口的通信。

● 目标主机还可能不进行任何响应,以下情况都可能发生这种情况:

○ 端口处于关闭状态;

○ 入站(inbound)UDP 包被过滤了;

○ 目标主机的响应被屏蔽了。

UDP端口扫描结果的可靠程度不及TCP扫描。在某些情况下,工作于UDP协议的服务端程序可能只响应特定类型的 UDP 数据包。所以在进行 UDP 端口扫描时,即使某些端口处于开放状态,目标主机同样可能没有任何响应。

前文已经简要介绍了端口扫描的理论,后文将介绍实践的环节。后续章节里,我们通过几款工具进行网络扫描。

为了便于本书演示,我们将对装有Metasploitable的虚拟主机进行扫描。第1章介绍过它的安装和配置方法。在后续篇幅里,除非特别声明,Metasploitable虚拟机的IP地址是192.168.56.103,而我们进行渗透测试的主机地址是192.168.56.102。

6.2 网络扫描程序

本节将介绍多款工具。这些工具可发现开放端口,识别远程主机的操作系统,枚举运行其上的各种服务。

服务枚举是在特定主机、特定端口上识别服务端程序版本的方法。有了服务器端软件的版本信息,测试人员就可以查找该版本上存在的安全漏洞。

确实有一些管理员有定期更改服务程序运行端口的习惯。例如,SSH 服务程序的通常运行在22号端口上,但是系统管理员可能把它改为2222之类的其他端口。渗透测试人员如果只是检测了SSH的常规端口,就不会发现目标主机运行了SSH服务。在非标准端口上运行的专用程序往往也是渗透测试人员的一大难题。服务枚举工具能够在一定程度上减轻这两方面的问题。使用服务枚举工具对全部端口进行无差别扫描,会增加识别成功的几率。

6.2.1 Nmap

Nmap 是被专业人员广泛使用的一款功能全面的端口扫描工具。它由 Fyodor 编写并维护。由于Nmap品质卓越,使用灵活,它已经是渗透测试人员必备的工具。

除了端口扫描外,Nmap还具备如下功能。

● 主机探测:Nmap 可査找目标网络中的在线主机。默认情况下,Nmap 通过4种方式——ICMP echo 请求(ping)、向443端口发送TCP SYN 包、向80端口发送TCP ACK包和ICMP时间戳请求——发现目标主机。

● 服务/版本检测:在发现开放端口后,Nmap 可进一步检查目标主机的检测服务协议、应用程序名称、版本号等信息。

● 操作系统检测:Nmap 向远程主机发送一系列数据包,并能够将远程主机的响应与操作系统指纹数据库进行比较。如果发现了匹配结果,它就会显示匹配的操作系统。它确实可能无法识别目标主机的操作系统;在这种情况下,如果您知道目标系统上使用的何种操作系统,可在它提供的 URL 里提交有关信息,更新它的操作系统指纹数据库。

● 网络路由跟踪:它通过多种协议访问目标主机的不同端口,以尽可能访问目标主机。Nmap路由跟踪功能从TTL的高值开始测试,逐步递减TTL,直到它到零为止。

● Nmap 脚本引擎:这个功能扩充了Nmap 的用途。如果您要使用Nmap 实现它(在默认情况下)没有的检测功能,可利用它的脚本引擎手写一个检测脚本。目前,Nmap可检査网络服务的漏洞,还可以枚举目标系统的资源。

应当养成时常更新Nmap 的好习惯。如果需要在Kali Linux 里安装最新版本的Namp 程序,您可使用下述指令。

apt-get update

apt-get install nmap

在控制台终端启动Nmap的指令如下。

nmap

上述命令将显示该程序的所有可选项及使用说明。刚刚接触 Nmap 的新手可能会因为信息量太大而觉得无从下手。

幸运的是,您仅需指定一个参数即可启动扫描。这个参数就是目标主机的IP地址或主机名称(如果要使用主机名称,您首先需要给您的主机配置一个能够解析它的 DNS 服务器)。例如,您可以使用下述指令。

nmap 192.168.56.103

在没有指定其他选项的情况下,上述指令的输出结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0046s latency).

Not shown: 977 closed ports

PORT STATE SERVICE

21/tcp open ftp

22/tcp open ssh

23/tcp open telnet

25/tcp open smtp

53/tcp open domain

80/tcp open http

111/tcp open rpcbind

139/tcp open netbios-ssn

445/tcp open microsoft-ds

512/tcp open exec

513/tcp open login

514/tcp open shell

1099/tcp open rmiregistry

1524/tcp open ingreslock

2049/tcp open nfs

2121/tcp open ccproxy-ftp

3306/tcp open mysql

5432/tcp open postgresql

5900/tcp open vnc

6000/tcp open X11

6667/tcp open irc

8009/tcp open ajp13

8180/tcp open unknown

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 13.49 seconds

上述结果表明目标主机开放了很多端口。我们可以依此判断它容易遭受攻击。

在继续演示Nmap之前,我们介绍一下Nmap可以识别出的6种端口状态。这6种端口状态如下。

● 开放:工作于开放端口的服务器端的应用程序可以受理TCP 连接、接收UDP 数据包或者响应SCTP(流控制传输协议)请求。

● 关闭:虽然我们确实可以访问有关的端口,但是没有应用程序工作于该端口上。

● 过滤:Nmap 不能确定该端口是否开放。包过滤设备屏蔽了我们向目标发送的探测包。

● 未过滤:虽然可以访问到指定端口,但Nmap 不能确定该端口是否处于开放状态。

● 打开|过滤:Nmap 认为指定端口处于开放状态或过滤状态,但是不能确定处于两者之中的哪种状态。在遇到没有响应的开放端口时,Nmap 会作出这种判断。这可以是由于防火墙丢弃数据包造成的。

● 关闭|过滤:Nmap 认为指定端口处于关闭状态或过滤状态,但是不能确定处于两者之中的哪种状态。

介绍了端口状态之后,下面将介绍几个在渗透测试中常用的 Nmap 选项。而后,我们将进行实际演示。

1.指定扫描目标

Nmap 把指令中选项和参数以外的内容均当作目标主机来处理。我们建议您以主机 IP地址而非主机名的形式指定目标主机。以 IP 地址的形式指定目标主机,Nmap 就不必在扫描之前进行DNS解析,这样可以提高端口扫描的速度。

您可以以下述几种形式,为当前版本的Nmap指定扫描目标的IPv4地址。

● 单个主机,如192.168.0.1。

● 以 CIDR 标记法表示的地址相连的整个网段。例如,192.168.0.0/24 表示从192.168.0.0到192.168.0.255的256个IP地址。

● 十进制的IP区间。例如,192.168.2-4,6.1 表示4个IP地址:192.168.2.1、192.168.3.1、192.168.4.1和192.168.6.1。

● 多个主机目标,如192.168.2.1 172.168.3-5,9.1。

Nmap仅支持标准格式的IPv6地址和以主机名方式指定的IPv6主机地址。

除了可在命令行里指定目标主机以外,您还可以指定-iL <inputfilename>选项,令 Nmap 程序从指定的文本文件中读取目标主机的清单。当需要从其他程序的运行结果里导出IP地址给Nmap使用时,这个功能就十分有用。

务必确保文件采用的是 Nmap 支持的指定格式。即,使用空格、制表符或换行符号间隔不同的目标主机。

举例来说,目标清单文件可以如下所示。

192.168.1.1-254

192.168.2.1-254

现在,我们开始扫描192.168.56.0/24这个网段。另外,我们需要使用数据包捕获(监听)工具观察Nmap发送的数据包。此时可以使用tcpdump程序。

我们可以打开终端窗口,然后使用下述指令。

tcpdump -nnX tcp and host 192.168.56.102

在本例中,192.168.56.102是运行Nmap程序的主机的IP地址。请根据您的实际情况进行相应调整。

现在新建一个终端窗口,然后并执行下述命令。

nmap 192.168.56.0/24

tcpdump终端窗口会显示捕获的数据包。

22:42:12.107532 IP 192.168.56.102.49270 > 192.168.56.103.23:

Flags [S], seq 239440322, win 1024, options [mss 1460], length 0

0x0000: 4500 002c eb7f 0000 3006 ad2e c0a8 3866 E..,....0.....8f

0x0010: c0a8 3867 c076 0017 0e45 91c2 0000 0000 ..8g.v...E......

0x0020: 6002 0400 4173 0000 0204 05b4   '...As......

根据以上信息,我们知道实施扫描的主机从49270端口向目标主机的23端口(telnet)发送了含有SYN 标识位的数据包。默认情况下,在Kali Linux 里以特权用户(如root)身份启动Nmap后,程序发送的数据包都会设有SYN标识位。

tcpdump程序还会收集实施扫描的主机发送的其他数据包(见图6.3)。

figure_0151_0077

图6.3

目标主机可能会回复的下述响应信息。

22:36:19.939881 IP 192.168.56.103.1720 > 192.168.56.102.47823:

Flags [R.], seq 0, ack 1053563675, win 0, length 0

0x0000: 4500 0028 0000 4000 4006 48b2 c0a8 3867 E..(..@.@.H...8g

0x0010: c0a8 3866 06b8 bacf 0000 0000 3ecc 1b1b ..8f........>...

0x0020: 5014 0000 a243 0000 0000 0000 0000  P....C........

请注意:上述报头文含有R(即reset[重置])标识。也就是说,目标主机的1720端口处于关闭状态。我们可以根据Nmap的扫描结果验证这个判断。

但是,如果端口处于开放状态,您看到的网络流量则会大体如下。

22:42:12.108741 IP 192.168.56.103.23 > 192.168.56.102.49270:

Flags [S.], seq 1611132106, ack 239440323, win 5840,

options [mss 1460], length 0

0x0000: 4500 002c 0000 4000 4006 48ae c0a8 3867 E..,..@.@.H...8g

0x0010: c0a8 3866 0017 c076 6007 ecca 0e45 91c3 ..8f...v'....E..

0x0020: 6012 16d0 e1bf 0000 0204 05b4 0000

从中可以看出,这个数据包确认了前一个数据包的序列号。前一个数据包的序列号是239440322,这个数据包的确认号是239440323。

2.TCP扫描选项

只有操作系统的高权限用户( UNIX 环境下的 root 级别用户或者 Windows 下的administrator级别用户)才能使用Nmap多数选项。程序需要相应的权限才能发送和接收原始数据包。默认情况下,Nmap 会采用 TCP SYN 扫描。在权限不足的情况下,Nmap 将进行TCP连接扫描。具体来说,Nmap程序支持的扫描方式分别如下。

● 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。

● TCPACK 扫描(-sA):这种扫描模式可以检测目标系统是否采用了数据包状态监测技术(stateful)防火墙,并能确定哪些端口被防火墙屏蔽。这种类型的数据包只有一个ACK标识位。如果目标主机的回复中含有RST标识,则说明目标主机没有被过滤。

● TCP 窗口扫描(-sW):这种扫描方式检测目标返回的RST数据包的TCP窗口字段。如果目标端口处于开放状态,这个字段的值将是正值;否则它的值应当是0。

● TCP Idle 扫描(-sI):采用这种技术后,您将通过指定的僵尸主机发送扫描数据包。本机并不与目标主机直接通信。如果对方网络里有IDS,IDS将认为发起扫描的主机是僵尸主机。

Nmap的scanflags选项可设定自定义的TCP扫描方式。这个选项的参数可以用数字表示(例如,9代表PSH和FIN标识)。这个选项也支持标识位的符号缩写。在使用符号缩写时,仅需要将URG、ACK、PSH、RST、SYN、FIN、ECE、CWR、ALL和NONE以任意顺序进行组合。例如:--scanflags URGACKPSH 将设置URG、ACK 和PSH 标识位。

3.UDP扫描选项

Nmap有多种TCP扫描方式,而UDP扫描仅有一种扫描方式(-sU)。虽然UDP扫描结果没有TCP扫描结果的可靠度高,但渗透测试人员不能因此而轻视UDP扫描,毕竟UDP端口代表着可能会有价值的服务端程序。

UDP扫描的最大问题是性能问题。由干Linux内核限制1秒内最多发送一次ICMP Port Unreachable信息。按照这个速度,对一台主机的65536个UDP端口进行完整扫描,总耗时必定会超过18个小时。

改善扫描速度的方式主要有:

● 进行并发的UDP 扫描;

● 优先扫描常用端口;

● 在防火墙后面扫描;

● 启用--host-timeout 选项以跳过响应过慢的主机。

这些方法能够减少UDP端口扫描所需的总体时间。

假如我们需要找到目标主机开放了哪些 UDP 端口。为提高扫描速度,我们仅扫描 53端口(DNS)和161端口(SNMP)。此时需要使用下述指令。

nmap -sU 192.168.56.103 -p 53,161

上述指令的返回结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0016s latency).

PORT STATE SERVICE

53/udp open domain

161/udp closed snmp

4.目标端口选项

默认情况下,Nmap将从每个协议的常用端口中随机选择1000个端口进行扫描。其nmap-services文件对端口的命中率进行了排名。

如需更改端口配置,可使用Nmap的以下几个选项。

● -p端口范围:只扫描指定的端口。扫描1~1024号端口,可设定该选项为–p 1-1024。扫描1~65535端口时,可使用-p-选项。

● -F(快速扫描):将仅扫描100 个常用端口。

● -r(顺序扫描):指定这个选项后,程序将从按照从小到大的顺序扫描端口。

● --top-ports <1 or="" greater="">:扫描nmap-services 里排名前N 的端口。

以NULL方式扫描目标主机的22、25端口的指令如下所示。

nmap -sN -p 22,25 192.168.56.103

上述指令的返回结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.00096s latency).

PORT STATE   SERVICE

22/tcp open|filtered ssh

25/tcp open|filtered smtp

80/tcp open|filtered http

3306/tcp open|filtered mysql

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 14.38 seconds

tcpdump捕获的信息如下。

23:23:38.581818 IP 192.168.56.102.61870 > 192.168.56.103.22: Flags [], win 1024, length 0

0x0000: 4500 0028 06e4 0000 2f06 92ce c0a8 3866 E..(..../.....8f

0x0010: c0a8 3867 f1ae 0016 dd9e bf90 0000 0000 ..8g............

0x0020: 5000 0400 2ad2 0000      P...*...

23:23:38.581866 IP 192.168.56.102.61870 > 192.168.56.103.25: Flags [], win 1024, length 0

0x0000: 4500 0028 1117 0000 3106 869b c0a8 3866 E..(....1.....8f

0x0010: c0a8 3867 f1ae 0019 dd9e bf90 0000 0000 ..8g............

0x0020: 5000 0400 2acf 0000      P...*...

23:23:39.683483 IP 192.168.56.102.61871 > 192.168.56.103.25: Flags [], win 1024, length 0

0x0000: 4500 0028 afaf 0000 2706 f202 c0a8 3866 E..(....'.....8f

0x0010: c0a8 3867 f1af 0019 dd9f bf91 0000 0000 ..8g............

0x0020: 5000 0400 2acc 0000      P...*...

23:23:39.683731 IP 192.168.56.102.61871 > 192.168.56.103.22: Flags [], win 1024, length 0

0x0000: 4500 0028 5488 0000 3506 3f2a c0a8 3866 E..(T...5.?*..8f

0x0010: c0a8 3867 f1af 0016 dd9f bf91 0000 0000 ..8g............

0x0020: 5000 0400 2acf 0000      P...*...

根据以上信息,我们可以得出下述结论。

● 第1 个数据包,是实施扫描的主机检测目标主机的22 端口状态的数据包。一段时间之后,它发出了第2个数据包,检测目标主机的25端口。

● 第3 个数据包,是实施扫描的主机检测目标主机的25 端口状态的数据包。一段时间之后,它发出了第4个数据包,检测目标主机的22端口。

● 过了一段时间之后,目标主机仍然没有进行任何响应。Nmap 判定这两个端口处于开放状态或过滤状态。

5.输出选项

Nmap可以把扫描结果保存为外部文件。在需要使用其他工具处理Nmap的扫描结果时,这一功能十分有用。

即使您设定程序把扫描结果保存为文件,Nmap还是会在屏幕上显示扫描结果。

Nmap支持以下几种输出形式。

● 交互(屏幕)输出:Nmap把扫描结果发送到标准输出设备上(通常为终端/控制台),这是默认的输出方式。

● 正常输出(-oN):与交互输出类似,但是不显示runtime 信息和警告信息。

● XML 文件(-oX):生成的 XML 格式文件可以转换成 HTML 格式文件,还可被Nmap 的图形用户界面解析,也便于导入数据库。本文建议您尽量将扫描结果输出为XML文件。

● 生成便于Grep使用的文件(-oG):虽然这种文件格式已经过时,但仍然很受欢迎。这种格式的文件,其内容由注释(由#开始)和信息行组成。信息行包含6个字段,每个字段的字段名称和字段值以冒号分割,字段之间使用制表符隔开。这些字段的名称分别为Host、Ports、Protocols、Ignored State、OS、Seq Index、IP ID Seq 和 Status。这种格式的文件便于 grep 或 awk 之类的 UNIX 指令整理扫描结果。

还可以通过-oA选项,让Nmap程序把扫描结果同时以三种形式(正常输出、XML文件和便于Grep使用的文件)进行输出。

如需把保存扫描结果保存为XML文件(myscan.xml),可使用下述指令。

nmap 192.168.56.103 -oX myscan.xml

以下是XML文件中的部分内容。

<?xml version="1.0"?>

<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl"

type="text/xsl"?>

<verbose level="0"/>

<debugging level="0"/>

<host starttime="1374339025" endtime="1374339038"><status

state="up" reason="arp-response" reason_ttl="0"/>

<address addr="192.168.56.103" addrtype="ipv4"/>

因为 HTML 格式的文件比 XML 格式的文件更易于阅读,所以我们通常会把 XML格式文件转换成HTML格式文件。我们可使用xsltproc进行这种格式转换。该程序的用法如下。

xsltproc myscan.xml -o myscan.html

使用Kali Linux 自带的Iceweasel Web 浏览器打开这个HTML 文件(见图6.4)。

XML的处理程序能够处理Nmap生成的XML文件。很多编程语言都带有XML通用处理库。其中,下述几种语言专门开发出了可供处理Nmap XML 报告的库。

● Perl:Nmap-Parser(http://search.cpan.org/dist/Nmap-Parser/)。

● Python:python-nmap(http://xael.org/norman/python/python-nmap/)。

● Ruby:Ruby Nmap(http://rubynmap.sourceforge.net/)。

● PowerShell:专门处理Nmap XML格式报告的PowerShell脚本程序(http://www. sans.org/windows-security/2009/06/11/powershell-script-toparse-nmap-xml-output)。

figure_0158_0078

图6.4

6.时间排程控制选项

Nmap可通过-T选项指定时间排程控制的模式。它有6种扫描模式。

● paranoid(0):每5分钟发送一次数据包,且不会以并行方式同时发送多组数据。这种模式的扫描不会被IDS检测到。

● sneaky(1):每隔15秒发送一个数据包,且不会以并行方式同时发送多组数据。

● polite(2):每0.4 秒发送一个数据包,且不会以并行方式同时发送多组数据。

● normal(3):此模式同时向多个目标发送多个数据包,为 Nmap 默认的模式,该模式能自动在扫描时间和网络负载之间进行平衡。

● aggressive(4):在这种模式下,Nmap 对每个既定的主机只扫描5 分钟,然后扫描下一台主机。它等待响应的时间不超过1.25秒。

● insane(5):在这种模式下,Nmap 对每个既定的主机仅扫描75 秒,然后扫描下一台主机。它等待响应的时间不超过0.3秒。

我们的经验表明,默认的扫描模式通常都没有问题。除非您想要进行更隐匿或更快速的扫描,否则没有必要调整这一选项。

7.常用选项

本节将讨论Nmap的几个非常有用的选项。

服务版本识别

Nmap 程序可以在进行端口扫描的时候检测服务端软件的版本信息。版本信息将使后续的漏洞识别工作更有针对性。

如需启用这一功能,就要指定Nmap的–sV选项。

例如,在获取目标主机22端口上的服务程序的版本信息时,可使用下述指令。

nmap -sV 192.168.56.103 -p 22

上述指令的返回结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0016s latency).

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)

上述信息表明:目标主机的22端口处于开放状态,它的服务端程序是4.7p1版本的OpenSSH,通信协议是SSH 2.0。

操作系统检测

Nmap还能识别目标主机的操作系统。

如需启用这一功能,就要指定Nmap的–O选项。

例如,在获取目标主机的操作系统信息时,可使用下述指令。

nmap -O 192.168.56.103

上述指令的返回结果如下。

Host is up (0.0037s latency).

Not shown: 977 closed ports

PORT STATE SERVICE

21/tcp open ftp

22/tcp open ssh

23/tcp open telnet

25/tcp open smtp

53/tcp open domain

80/tcp open http

111/tcp open rpcbind

139/tcp open netbios-ssn

445/tcp open microsoft-ds

512/tcp open exec

513/tcp open login

514/tcp open shell

1099/tcp open rmiregistry

1524/tcp open ingreslock

2049/tcp open nfs

2121/tcp open ccproxy-ftp

3306/tcp open mysql

5432/tcp open postgresql

5900/tcp open vnc

6000/tcp open X11

6667/tcp open irc

8009/tcp open ajp13

8180/tcp open unknown

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Device type: general purpose

Running: Linux 2.6.X

OS CPE: cpe:/o:linux:linux_kernel:2.6

OS details: Linux 2.6.9 - 2.6.33

Network Distance: 1 hop

上述信息表明,服务器使用的是基于2.6.9-2.6.33版本Linux内核的Linux系统。如果这个Linux内核上存在漏洞,我们就可以利用这些漏洞。

禁用主机检测

如果主机屏蔽了ping请求,Nmap可能会认为该主机没有开机。这将使得Nmap无法进行进一步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作。为了克服这一问题,就需要禁用Nmap的主机检测功能。在指定这个选项之后,Nmap会认为目标主机已经开机并会进行全套的检测工作。

如需启用这一功能,就要指定Nmap的–Pn选项。

强力检测选项

启用-A选项之后,Nmap将检测目标主机的下述信息:

● 服务版本识别(-sV);

● 操作系统识别(-O);

● 脚本扫描(-sC);

● Traceroute(--traceroute)。

这种扫描类型的扫描时间较长。举例来说,可使用下述扫描指令。

nmap -A 192.168.56.103

上述指令的返回结果如下。

PORT STATE SERVICE VERSION

21/tcp open ftp  vsftpd 2.3.4

|_ftp-anon: Anonymous FTP login allowed (FTP code 230)

22/tcp open ssh  OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)

| ssh-hostkey: 1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)

|_2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)

80/tcp open http  Apache httpd 2.2.8 ((Ubuntu) DAV/2)

|_http-methods: No Allow or Public header in OPTIONS response (status code 200)

|_http-title: Metasploitable2 – Linux

...

Host script results:

|_nbstat: NetBIOS name: METASPLOITABLE, NetBIOS user: <unknown>, NetBIOS

MAC: <unknown>

| smb-os-discovery:

| OS: Unix (Samba 3.0.20-Debian)

| NetBIOS computer name:

| Workgroup: WORKGROUP

|_ System time: 2013-07-21T09:20:22-04:00

TRACEROUTE

HOP RTT ADDRESS

1 1.66 ms 192.168.56.103

8.扫描IPv6主机

前文介绍过,Nmap能够扫描IPv6环境里的主机,本节将进行细致说明。

本例涉及的IP v6 地址如下。

目标主机:fe80::a00:27ff:fe43:1518

启用Nmap的-6选项即可扫描IPv6的目标主机。

当前,您只能逐个指定目标主机的IPv6地址。举例来说,可采用下述指令扫描IPv6地址的目标主机。

nmap -6 fe80::a00:27ff:fe43:1518

上述指令的返回结果如下。

Nmap scan report for fe80::a00:27ff:fe43:1518

Host is up (0.0014s latency).

Not shown: 996 closed ports

PORT STATE SERVICE

22/tcp open ssh

53/tcp open domain

2121/tcp open ccproxy-ftp

5432/tcp open postgresql

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds

上述信息表明,同一台主机在IPv6网络里开放的端口比它在IPv4网络里开放的端口数量要少。这是因为部分服务程序尚未支持IPv6网络。

9.脚本引擎

Nmap 本身就是功能强大的网络探测工具。而它的脚本引擎功能(Nmap Scripting Engine,NSE)更让 Nmap 如虎添翼。NSE 可使用户的各种网络检査工作更为自动化,有助于识别应用程序中新发现的漏洞、检测程序版本等Nmap原本不具有的功能。虽然Nmap软件包具有各种功能的脚本,但是为了满足用户的特定需求,它还支持用户撰写自定义脚本。

NSE自带的脚本由Lua语言(http://www.lua.org)编写。这些脚本可以分成12个类别。

● auth:此类脚本使用暴力破解等技术找出目标系统上的认证信息。

● default:启用--sC 或者-A 选项时运行此类脚本。这类脚本同时具有下述特点:

ƒ 执行速度快;

ƒ 输出的信息有指导下一步操作的价值;

ƒ 输出信息内容丰富、形式简洁;

ƒ 必须可靠;

ƒ 不会侵入目标系统;

ƒ 能泄露信息给第三方。

● discovery:该类脚本用于探索网络。

● dos:该类脚本可能使目标系统拒绝服务,请谨慎使用。

● exploit:该类脚本利用目标系统的安全漏洞。在运行这类脚本之前,渗透测试人员需要获取被测单位的行动许可。

● external:该类脚本可能泄露信息给第三方。

● fuzzer:该类脚本用于对目标系统进行模糊测试。

● instrusive:该类脚本可能导致目标系统崩溃,或耗尽目标系统的所有资源。

● malware:该类脚本检査目标系统上是否存在恶意软件或后门。

● safe:该类脚本不会导致目标服务崩溃、拒绝服务且不利用漏洞。

● version:配合版本检测选项(-sV),这类脚本对目标系统的服务程序进行深入的版本检测。

● vuln:该类脚本可检测检査目标系统上的安全漏洞。

在Kali Linux系统中,Nmap脚本位于目录/usr/share/nmap/scripts。目前,Kali Linux收录的6.25版的Nmap带有430多个脚本。

在使用NSE脚本时,可以下命令行里使用下述选项。

● -sC 或--script=default:启动默认类NSE 脚本。

● --script <filename>|<category>|<directories>:根据指定的文件名、类别名、目录名,执行相应的脚本。

● --script-args <args>:这个选项用于给脚本指定参数。例如,在使用认证类脚本时,可通过这个选项指定用户名和密码。

举例来说,如果要使用默认类的脚本对主机 192.168.56.103 进行扫描,可使用下述指令。

nmap -sC 192.168.56.103

上述指令的运行结果如下。

Nmap scan report for 192.168.56.103

Not shown: 977 closed ports

PORT STATE SERVICE

21/tcp open ftp

|_ftp-anon: Anonymous FTP login allowed (FTP code 230)

22/tcp open ssh

| ssh-hostkey: 1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)

|_2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)

25/tcp open smtp

|_smtp-commands: metasploitable.localdomain, PIPELINING, SIZE 10240000,

VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN,

| ssl-cert: Subject: commonName=ubuntu804-base.localdomain/

organizationName=OCOSA/stateOrProvinceName=There is no such thing outside

US/countryName=XX

| Not valid before: 2010-03-17T14:07:45+00:00

|_Not valid after: 2010-04-16T14:07:45+00:00

|_ssl-date: 2013-07-21T08:40:20+00:00; -4s from local time.

53/tcp open domain

| dns-nsid:

|_ bind.version: 9.4.2

111/tcp open rpcbind

| rpcinfo:

| program version port/proto service

| 100000 2   111/tcp rpcbind

| 100000 2   111/udp rpcbind

| 100003 2, 3, 4 2049/tcp nfs

| 100003 2, 3, 4 2049/udp nfs

| 100005 1, 2, 3 35075/udp mountd

| 100005 1, 2, 3 59685/tcp mountd

| 100021 1, 3, 4 37466/tcp nlockmgr

| 100021 1, 3, 4 60726/udp nlockmgr

| 100024 1  36880/udp status

|_ 100024 1  38557/tcp status

3306/tcp open mysql

| mysql-info: Protocol: 10

| Version: 5.0.51a-3ubuntu5

| Thread ID: 7

| Some Capabilities: Connect with DB, Compress, SSL, Transactions, Secure Connection

| Status: Autocommit

|_Salt: !'BijWW-x7HCVi,<*[l

5900/tcp open vnc

| vnc-info:

| Protocol version: 3.3

| Security types:

|_ Unknown security type (33554432)

6667/tcp open irc

| irc-info: Server: irc.Metasploitable.LAN

| Version: Unreal3.2.8.1. irc.Metasploitable.LAN

| Lservers/Lusers: 0/1

| Uptime: 0 days, 0:15:26

| Source host: 50388A6E.97684684.FFFA6D49.IP

|_Source ident: OK nmap

8180/tcp open unknown

|_http-favicon: Apache Tomcat

|_http-methods: No Allow or Public header in OPTIONS response (status code 200)

|_http-title: Apache Tomcat/5.5

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Host script results:

|_nbstat: NetBIOS name: METASPLOITABLE, NetBIOS user: <unknown>, NetBIOS

MAC: <unknown>

| smb-os-discovery:

| OS: Unix (Samba 3.0.20-Debian)

| NetBIOS computer name:

| Workgroup: WORKGROUP

|_ System time: 2013-07-21T04:40:20-04:00

Nmap done: 1 IP address (1 host up) scanned in 46.87 seconds

可见,在使用NSE的默认类脚本后,Nmap获取的信息更为全面。

您还可能需要获取目标主机的特定信息。此时可以单独使用脚本文件。如果要获取HTTP服务器的信息,将会发现NSE的脚本里有很多脚本都是分析HTTP服务的。这些脚本有http-enum、http-headers、http-methods和http-php-version。我们可以使用下述指令。

nmap --script http-enum,http-headers,http-methods,http-php-version -p 80

192.168.56.103

上述指令的运行结果如下。

Nmap scan report for 192.168.56.103

Host is up (0.0010s latency).

PORT STATE SERVICE

80/tcp open http

| http-enum:

| /tikiwiki/: Tikiwiki

| /test/: Test page

| /phpinfo.php: Possible information file

| /phpMyAdmin/: phpMyAdmin

| /doc/: Potentially interesting directory w/ listing on 'apache/2.2.8 (ubuntu) dav/2'

| /icons/: Potentially interesting folder w/ directory listing

|_ /index/: Potentially interesting folder

| http-headers:

| Date: Sun, 21 Jul 2013 08:45:07 GMT

| Server: Apache/2.2.8 (Ubuntu) DAV/2

| X-Powered-By: PHP/5.2.4-2ubuntu5.10

| Connection: close

| Content-Type: text/html

|

|_ (Request type: HEAD)

|_http-methods: No Allow or Public header in OPTIONS response (status code 200)

| http-php-version: Versions from logo query (less accurate): 5.1.3 - 5.1.6, 5.2.0 - 5.2.17

| Versions from credits query (more accurate): 5.2.3 - 5.2.5

|_Version from header x-powered-by: PHP/5.2.4-2ubuntu5.10

MAC Address: 08:00:27:43:15:18 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 24.47 seconds

相比不使用脚本而言,在使用与HTTP相关的NSE脚本之后,我们得到与Web服务有关的更多信息。

● Web 服务器上有多个值得关注的目录:Tikiwiki、test 和phpMyAdmin。

● 服务器上的phpinfo.php 可提供更多信息。

● 服务器上PHP 是5.2.3-5.2.5 之间的某个版本。

在介绍Nmap的时候,我们不得不提一个端口扫描脚本。

NSE脚本之中,有一个名为Nmap NSEVulscan的脚本。它可从http://www.computec. ch/mruef/software/nmap_nse_vulscan-1.0.tar.gz 下载。这个脚本能够根据目标主机的版本信息,在多个网站上搜索这些版本的相关漏洞。这些网站包括 CVE (http://cve.mitre.org)、OSVDB(http://www.osvdb.org/)、scip VulDB (http://www.scip.ch/?vuldb)、SecurityTracker(http://securitytracker.com/)和Security Focus(http://www.securityfocus.com/)。

使用上述脚本之后,可获取的扫描结果如图6.5所示。

figure_0168_0079

图6.5

10.规避检测的选项

在渗透测试的工作中,目标主机通常处于防火墙或 IDS 系统的保护之中。在这种环境中使用 Nmap 的默认选项进行扫描,不仅会被发现,而且往往一无所获。此时,我们就要使用Nmap规避检测的有关选项。

● -f(使用小数据包):这个选项可避免对方识别出我们探测的数据包。指定这个选项之后,Nmap将使用8字节甚至更小数据体的数据包。

● --mtu:这个选项用来调整数据包的包大小。MTU(Maximum Transmission Unit,最大传输单元)必须是8的整数倍,否则Nmap将报错。

● -D(诱饵):这个选项应指定假 IP,即诱饵的 IP。启用这个选项之后,Nmap 在发送侦测数据包的时候会掺杂一些源地址是假IP(诱饵)的数据包。这种功能意在以藏木于林的方法掩盖本机的真实 IP。也就是说,对方的log还会记录下本机的真实IP。您可使用RND生成随机的假IP地址,或者用RND:number的参数生成<number>个假IP地址。您所指定的诱饵主机应当在线,否则很容易击溃目标主机。另外,使用了过多的诱饵可能造成网络拥堵。尤其是在扫描客户的网络的时候,您应当极力避免上述情况。

● --source-port <portnumber>或-g(模拟源端口):如果防火墙只允许某些源端口的入站流量,这个选项就非常有用。

● --data-length:这个选项用于改变Nmap 发送数据包的默认数据长度,以避免被识别出来是Nmap的扫描数据。

● --max-parallelism:这个选项可限制Nmap 并发扫描的最大连接数。

● --scan-delay <time>:这个选项用于控制发送探测数据的时间间隔,以避免达到IDS/IPS端口扫描规则的阈值。

Nmap的官方手册详细介绍了规避探测的各种选项。如果您需要详细了解这些内容,请参照官方手册http://nmap.org/book/man-bypass-firewalls-ids.html。

6.2.2 Unicornscan

Unicornscan是信息收集和关联分析的引擊。它能对TCP/IP设备发起主动扫描,并根据其响应进行分析。Unicornscan具备下述特性:

● 可进行异步无状态TCP 端口扫描;

● 可通过异步无状态TCP 扫描获取TCP banner;

● 可进行异步UDP 端口扫描;

● 可通过主动方式和被动方式识别远程操作系统和应用程序。

默认安装的Kali Linux 并不带有Unicornscan 程序。您可通过软件仓库安装它。

apt-get install unicornscan

如需启动Unicornscan,可在终端中使用下述指令。

unicornscan -h

该指令将显示所有的选项及使用方法。

Unicornscan 和其他类似工具主要区别在于其扩展性和高效性。经验表明,UDP 端口扫描的耗时都很长,扫描整个网段的UDP端口的耗时更长。不过Unicornscan在这方面的性能卓越。

您可以设置Unicornscan毎秒发送多少个包。每秒发送包(PPS)设置得越高,扫描的速度也就越快,但会导致网络负载加重,注意谨慎使用此功能。PPS的默认值是300。

本文将使用Unicornscan的默认选项扫描一台目标主机,以介绍指令和输出。

假设我们要扫描主机 192.168.56.103,检测它的 UDP 协议(-m U)的 1-65535端口,并查看程序的详尽输出(-Iv),那么我们需要使用下述指令。

unicornscan -m U -Iv 192.168.56.103:1-65535

运行上述指令后,程序的提示信息如下。

adding 192.168.56.103/32 mode 'UDPscan' ports '1-65535' pps 300

using interface(s) eth0

scaning 1.00e+00 total hosts with 6.55e+04 total packets, should take a little longer than 3 Minutes, 45 Seconds

上述信息表明,在使用 PPS 的默认值的情况下,Unicornscan 的扫描时间大约是 3分钟。为了加快扫描速度,我们把发包速率调整为1 万(-r 10000)。

unicornscan -m U -Iv 192.168.56.103/24:1-65535 -r 10000

运行上述指令后,程序的提示信息如下。

adding 192.168.56.103/32 mode 'UDPscan' ports '1-65535' pps 10000

using interface(s) eth0

scaning 1.00e+00 total hosts with 6.55e+04 total packets, should take a little longer than 13 Seconds

调整发包速率 PPS 参数之后,扫描速度提升很多。请注意您只能在网络速度足够快的情况下才能修改这个参数,否则将拖垮整个网络。

上述指令的扫描结果如下。

UDP open 192.168.56.103:137 ttl 64

UDP open 192.168.56.103:53 ttl 64

UDP open 192.168.56.103:41250 ttl 64

UDP open 192.168.56.103:2049 ttl 64

UDP open 192.168.56.103:111 ttl 64

sender statistics 7586.6 pps with 65544 packets sent total

listener statistics 14 packets recieved 0 packets dropped and 0 interface drops

UDP open  domain[ 53]  from 192.168.56.103 ttl 64

UDP open  sunrpc[ 111]  from 192.168.56.103 ttl 64

UDP open netbios-ns[ 137]  from 192.168.56.103 ttl 64

UDP open  shilp[ 2049]  from 192.168.56.103 ttl 64

UDP open  unkown[41250]  from 192.168.56.103 ttl 64

6.2.3 Zenmap

Zenmap是Nmap的图形化工具。相较于Nmap,Zenmap具备如下优势。

● Zenmap 的交互性更好,输出更为直观,甚至能将网络的探索结果绘制成拓扑图。

● 可以比较两次扫描的结果。

● 能够记录扫描的结果。

● 渗透人员可调整Zenmap 的配置文件,以使用相同的配置进行多次扫描。

● 会显示所执行的指令,便于渗透测试人员检査指令的正确性。

如需启动 Zenmap 程序,可在桌面菜单中依次选中Kali Linux | Information Gathering | Network scanners | Zenmap,也可在终端中使用下述指令。

zenmap

该命令执行将显示Zenmap主窗口(见图6.6)。Zenmap预设有10种扫描模式的配置文件。点击菜单Profile就可以看到相应扫描方式以及相应的命令选项。程序的Command文本框会显示具体的指令和选项。

figure_0171_0080

图6.6

如果预设的扫描选项未能符合我们的需求,我们可以创建一个新的扫描配置文件(profile),还可以编辑已有的配置文件。我们可以通过Profile菜单完成这些操作。

如需新建配置文件,可选择菜单项New Profile或编辑Command 文本框,或使用快捷键Ctrl+P。如需编辑已有的配置文件,可选择菜单项Edit Selected Profile或使用快捷键Ctrl+E。

在调整选项时,可在选项卡(Profile、Scan、Ping、Scripting、Target、Source、Other和Timing)下根据需求进行相应配置。在调整过配置选项之后,单击Save Changes按钮保存该扫描配置。这个过程如图6.7所示。

figure_0172_0081

图6.7

本文选用Regular Scan(常规扫描)的配置文件,扫描192.168.56.1-254的所有主机,如图6.8所示。

figure_0172_0082

图6.8

如果需要查看网络拓扑图,可点击Topology标签,这将看到图6.9所示的界面。

figure_0173_0083

图6.9

如需保存Zenmap的扫描结果,可在Scan菜单中选择Save Scan。Zenmap将会询问将文件保存至何处,默认情况下将保存为XML文件(见图6.10)。

figure_0173_0084

图6.10

如需比较两次扫描结果之间的差异,首先进行第一次扫描,并保存第一次扫描的扫描结果。在修改扫描目标之后,进行第二次扫描并再次保存扫描结果。然后,在Tools菜单中选择Compare Results,对扫描结果进行比较。

点击两个Open按钮,分别指定A Scan 和B Scan的扫描结果,如图6.11 所示。

figure_0174_0085

图6.11

字符“-”代表B Scan的结果中没有该项内容;相对地,字符“+”表明B Scan的扫描结果中增加了该项扫描结果。

上述扫描结果表明,在第二次扫描中的SSH端口和MySQL端口都不再处于开放状态,关闭端口的数目也从977个相应变化为979个。

6.2.4 Amap

Amap程序可检测在指定端口上运行的应用程序信息。Amap向目标端口发送检测数据,在收到目标响应之后,将响应信息与数据库中结果进行匹配,并显示出匹配的应用程序。

在Kali Linux 中,Amap 检测数据包的配置文件为/usr/etc/appdefs.trig,而响应信息的文件是/usr/etc/appdefs.resp。

如需启动Amap程序,可在终端中使用下述指令。

amap

该命令将显示它的使用说明和指令范例。

本例将使用Amap程序分析目标主机22端口上运行的应用程序。我们启用-b选项以获取端口的banner信息,同时通过-q选项禁止程序报告关闭的(或不可识別的)端口。我们使用下述指令。

amap -bq 192.168.56.103 22

上述指令的运行结果如下。

Protocol on 192.168.56.103:22/tcp matches ssh - banner: SSH-2.0OpenSSH_4.7p1 Debian-8ubuntu1\n

Protocol on 192.168.56.103:22/tcp matches ssh-openssh - banner: SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Amap程序还能够识别指定端口上运行的应用类型及其版本信息。

如需扫描更多的端口,可在命令行中指定多个端口,端口之间用空格分隔,例如:

amap -bq 192.168.56.103 80 3306

上述指令的运行结果如下。

Protocol on 192.168.56.103:3306/tcp matches mysql - banner:

\n5.0.51a-3ubuntu5/?,'~yel,nd,M~Ti3ap/5Bad handshake

Protocol on 192.168.56.103:22/tcp matches ssh - banner:

SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Protocol on 192.168.56.103:22/tcp matches ssh-openssh - banner:

SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Amap可以识别在3306端口上运行的是MySQL服务,但在识别22端口上运行的服务时,却找到了多个匹配。

在快速识别应用服务程序方面,Amap程序可谓一枝独秀。

6.3 SMB枚举

如果您所测试的目标主机是 Windows 主机,那么使用 nbtscan 之类的 SMB(Server Message Block)枚举工具可以直截了当地获取该系统的信息。

nbtscan工具可以扫描IP地址并获取NetBIOS名称信息。它所生成的扫描报告含有相应主机的IP地址、NetBIOS计算机名、服务名称、已登录的用户名和MAC地址信息。

这些信息在渗透测试的后续阶段将发挥作用。Kali的nbtscan程序和Windows自带的nbtstat程序不同,它可对一个网段内所有IP地址进行操作。您可以想象得出来,这款工具将产生大量的网络流量,而且可能被目标主机记录在Log里。

如需了解NetBIOS报告中每个服务的功能,可在微软知识库(URL地址为 http://support.microsoft.com/kb/163409 )里查询NetBIOS服务名称的第16个字符(即NetBIOS后缀)。

可以在终端中直接输入nbtscan来启动它。

如欲搜索192.168.56.0内各主机的NetBIOS名称,可使用下述指令。

nbtscan 192.168.56.1-254

该指令的返回结果如下。

Doing NBT name scan for addresses from 192.168.56.1-254

IP address  NetBIOS Name Server User MAC address



192.168.56.103 METASPLOITABLE <server> METASPLOITABLE

00:00:00:00:00:00

上述结果表明,程序找到了1个名为METASPLOITABLE的NetBIOS名称。

接下来,我们使用下述指令查看这台主机的网络服务。

nbtscan -hv 192.168.56.103

该指令的返回结果如下。

Doing NBT name scan for addresses from 192.168.56.103

NetBIOS Name Table for Host 192.168.56.103:

Incomplete packet, 281 bytes long.

Name   Service   Type


METASPLOITABLE Workstation Service

METASPLOITABLE Messenger Service

METASPLOITABLE File Server Service

METASPLOITABLE Workstation Service

METASPLOITABLE Messenger Service

METASPLOITABLE File Server Service

WORKGROUP  Domain Name

WORKGROUP  Browser Service Elections

WORKGROUP  Domain Name

WORKGROUP  Browser Service Elections

Adapter address: 00:00:00:00:00:00


上述结果表明,主机METASPLOITABLE运行着File Server Service和Messenger Service等网络服务。

6.4 SNMP枚举

本节将介绍检查SNMP(Simple Network Monitoring Protocol)协议的几款工具。虽然多数SNMP信息看上去并不那么重要,但是对于渗透测试人员来说,他们可以从配置不当的SNMP设备上获取配置文件,挖掘重要信息,甚至可能有权限修改它的配置文件。

建议您在渗透测试的工作中检查SNMP设备,可能会遇到的惊喜。

6.4.1 onesixtyone

onesixtyone 程序是 SNMP 扫描程序,它可扫描指定设备,确定它们是否支持某些特定SNMP字符串。它与其他SNMP扫描程序不同,可以以最快速度(间隔10毫秒)发送所有的SNMP请求,然后等待目标响应并将之记录。如果某台设备支持SNMP协议,这个设备就会以包含SNMP字符串的信息进行响应。

如需启动onesixtyone程序,可在终端中直接输入onesixtyone。

默认安装的Metasploitable 2并没有SNMP 服务端程序。如果这台主机联入网络,您可使用下述命令安装SNMP服务端程序。

apt-get install snmpd

然后修改它的配置文件/etc/default/snmpd。

sudo vi /etc/default/snmpd

找到含有SNMPDOPTIONS的那行,删除掉本机地址127.0.0.1,然后重启SNMPD服务。

sudo /etc/init.d/snmpd restart

要注意的是,这台Metaslpoitable 2的主机应当与互联网隔绝开来,否则很快将招致攻击。

而后,我们使用onesixtyone程序搜索192.168.56.103这台主机支持的SNMP字符串。此时我们需要使用下述指令。

onesixtyone 192.168.56.103

上述指令的扫描结果如下。

Scanning 1 hosts, 2 communities

192.168.56.103 [public] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

192.168.56.103 [private] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

可见这台主机支持public和private的SNMP字符串。

如果需要进行更细致的扫描,可以启用-d选项。

onesixtyone -d 192.168.56.103

上述指令的返回结果如下。

Debug level 1

Target ip read from command line: 192.168.56.103

2 communities: public private

Waiting for 10 milliseconds between packets

Scanning 1 hosts, 2 communities

Trying community public

192.168.56.103 [public] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

Trying community private

192.168.56.103 [private] Linux metasploitable 2.6.24-16-server #1 SMP

Thu Apr 10 13:58:00 UTC 2008 i686

All packets sent, waiting for responses.

done.

6.4.2 snmpcheck

如需使用snmpcheck程序搜集SNMP设备的有关信息,可使用下述指令。

snmpcheck -t 192.168.56.103

上述指令获取的SNMP信息如图6.12所示。

figure_0179_0086

图6.12

6.5 VPN枚举

在本节中,我们将讨论虚拟专用网络(VPN)系统的识别和扫描。

数年之前,当分支机构需要与总部实现内部通信时,需要在二者之间架设专用线路。这种方法的主要缺点是成本髙昴。专线的租用费用非常昂贵。

所幸的是,VPN 技术解决了这种问题。分支机构可以使用公共网络(Internet)通过VPN连接联入总部。相对于租用专线而言,公共网络Internet的联入费用要低很多。同时,VPN能够使分支机构像使用本地局域网(LAN)一样使用总部的应用。另外,VPN 采取了加密技术,可保护通信内容的私密性。

根据其所采用的技术方法,VPN至少可以分为以下三种。

● 基于IPSec 技术的VPN:分支机构联入总部局域网的VPN 解决方案,多数是这类方案。采用这种方案后,分支机构需要在网关上安装IPSec VPN客户端,总部网关上也要安装 IPSec VPN服务器。由于配置过程十分复杂,单个用户联入总部网络的方案通常不是这种方案。采用这种方法连接入单位局域网的用户,通常被叫做公路战士(road warrior)。

● OpenVPN:这是一种公路战士十分偏爱的 VPN 解决方案。采用 OpenVPN 方案的客户端电脑通过OpenVPN客户端连接到VPN的服务器。这种方案设置简单,而且不要求用户具有管理员级别的权限。

● 基于SSL 技术的VPN:这种方案不要求用户安装专用的VPN 客户端。只要客户端电脑装有支持SSL连接技术的Web浏览器,VPN用户就可以通过浏览器连接到VPN服务器。

ike-scan

ike-scan是探测、识别并测试IPSecVPN系统的安全工具。IPSec是特别常见的Lan-to-Lan连接技术,同时也是多数VPN方案所采用的远程访问技术。

IPSec采用了下述三种主要协议。

● Authentication Headers(AH):提供了数据的完整性。

● Encapsulating Security Payloads(ESP):保障数据的完整性和保密性。

● Internet Key Exchange(IKE):通信终端之间进行参数协商的通信协议。它用于安全关联(Security Association)的建立、维持和终止。

IKE建立安全关联时分为下述几个阶段。

● IKE phase 1:在两个IPSec 终端间协商参数,协商加密算法、完整性算法、认证类型、密钥分发机制、生命周期等,以建立安全的通信隧道。IKE phase 1 会采用main mode 或aggressive mode建立双向安全关联。main mode 通过3 对消息协商安全关联。相比之下,aggressive mode通过3 对消息的交换,却能提供更快的安全关联。

● IKE phase 2:用于数据保护。

● IKE phase 1.5 或extended authentication phase:这个阶段是可选阶段,通常出现在远程访问的VPN方案里。

ike-scan程序向VPN服务器发送IKE phase 1的数据包,然后分析目标主机的响应数据。

ike-scan程序具备下述几个特点。

● 能够向任意数量目标主机发送IKE 数据包。

● 能够以灵活的方式组建IKE 的探测数据包。

● 能够解码并显示所有的服务器响应数据包。

● 能够配合psk-crack 工具破解预共享密钥。

总而言之,ike-scan程序具有下述作用。

● 探测:通过显示响应IKE 请求的主机,搜索运行IKE 的主机。

● 识别:识别IPSec VPN服务器采用的IKE 实现手段。通常,响应信息包含VPN 服务器厂商和型号。这在接下来漏洞分析过程中是十分有用的。

通常来说,只有ike-scan 这类工具才能找到IPSec VPN服务器。因为IPSec 服务端程序并不监听TCP 端口,所以端口扫描程序不能探测IPSec VPN服务器。而且这种服务器并不会回复ICMP unreachable 的错误信息,所以UDP 扫描程序也无法搜索到IPSec VPN服务器。另外,无论是向UDP 500 端口发送随机数据,还是向50 号或51 号IP 协议发送随机数据,这类服务器并不进行任何响应。也就是说,如果要搜索 IPSec VPN 服务,就只能使用发送合法IKE数据包的检测程序,分析服务器的有关响应。

如需在终端中启动ike-scan程序,可使用下述指令。

ike-scan

该命令将在屏幕上显示指令说明和使用范例。本例将通过下述指令,探测、识别、测试一台IPSec VPN服务器。

ike-scan -M -A –Pike-hashkey 192.168.0.10

其中,各选项的作用分别如下。

● -M:将payload 的解码信息分为多行显示,以便于阅读。

● -A:使用IKE 的aggressive mode。

● -P:将aggressive mode 的预共享密钥的哈希值保存为文件。

上述指令的运行结果如图6.13所示。

figure_0182_0087

图6.13

其中,在SA(安全关联)payload中有意义的信息如下。

● Encryption:3DES。

● Hash:SHA1。

● Auth:PSK。

● Diffie-Hellman group:2。

● SA life time:28800 seconds。

该指令将预共享密钥的哈希值被保存为ike-hashkey文件。

之后,我们使用psk-crack程序破解VPN连接的哈希值。有关指令如下。

psk-crack –d rockyou.txt ike-hashkey

此处,-d选项用于指定字典文件。

上述指令的运行结果如图6.14所示。

figure_0183_0088

图6.14

上述信息表明,密钥是123456。您可以使用这个密钥连接到VPN服务器。

下一步任务是识别VPN服务器。这时要不断尝试各种转换(transform)参数,直到找到可接受的参数为止。

有关转换参数的详细介绍,请参见http://www.nta-monitor.com/wiki/index.php/Ike-scan_User_Guide#Trying_Different_Transforms。

参考前文的安全关联payload信息,我们使用下述指令进行识别。

ike-scan -M --trans=5,2,1,2 --showbackoff 192.168.0.10

上述指令的运行结果如图6.15所示。

figure_0183_0089

图6.15

可见,ike-scan程序猜测远程VPN服务器所用的版本可能是FreeS/WAN、OpenSwan或strongSwan。

6.6 本章总结

本章讨论服务枚举的方法和用途。这部分内容还介绍了以端口扫描的方式进行服务枚举的具体方法。您相继接触到了不同类型的端口扫描,以及几款常用的扫描工具,例如Nmap、Unicornscan和Amap。接下来,介绍了nbtscan进行SMB服务枚举的方法,和onesixtyone和snmpcheck程序进行SNMP枚举的方法。最后绍了VPN枚举和相应的扫描工具ike-scan。

在下一章中,我们将关注如何在目标环境中识别并分析安全漏洞。