使用Nmap进行端口扫描和服务识别
第1章 Nmap的简介[1]
Nmap (“Network Mapper(网络映射器)”) 是一款开放源代码的 网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个 主机也没有问题。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,那些 主机提供什么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息), 它们使用什么类型的报文过滤器/防火墙,以及一堆其它功能。虽然Nmap通常用于安全审核, 许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。
Nmap输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项。 “所感兴趣的端口表格”是其中的关键。那张表列出端口号,协议,服务名称和状态。状态可能是 open(开放的),filtered(被过滤的), closed(关闭的),或者unfiltered(未被过滤的)。 Open(开放的)意味着目标机器上的应用程序正在该端口监听连接/报文。 filtered(被过滤的) 意味着防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap无法得知 它是 open(开放的) 还是 closed(关闭的)。 closed(关闭的) 端口没有应用程序在它上面监听,但是他们随时可能开放。 当端口对Nmap的探测做出响应,但是Nmap无法确定它们是关闭还是开放时,这些端口就被认为是 unfiltered(未被过滤的) 如果Nmap报告状态组合 open|filtered 和 closed|filtered时,那说明Nmap无法确定该端口处于两个状态中的哪一个状态。 当要求进行版本探测时,端口表也可以包含软件的版本信息。当要求进行IP协议扫描时 (-sO),Nmap提供关于所支持的IP协议而不是正在监听的端口的信息。
除了所感兴趣的端口表,Nmap还能提供关于目标机的进一步信息,包括反向域名,操作系统猜测,设备类型,和MAC地址。
图1.1 Nmap支持的扫描种类[2]
第2章 Nmap的下载与安装
本文使用Windows2000系统作为操作平台,下载Nmap的win32安装版本,下载地址为 http://insecure.org/Nmap/dist/Nmap-4.00-setup.exe
安装过程如下一系列交互图构成
图2.1
图2.2
图2.3
图2.4
安装完后运行cmd窗口,输入Nmap看到如下选项列表界面表示安装成功了。
图2.5
第3章 使用Nmap进行端口扫描
使用Nmap进行端口扫描的格式为
Nmap [ 扫描类型 ...] [ 选项 ] { 扫描目标说明 }
Nmap可以进行多种扫描类型的扫描,它们是[1]
-sS (TCP SYN扫描)
-sT (TCP connect()扫描)
-sU (UDP扫描)
-sN; -sF; -sX (TCP Null,FIN,and Xmas扫描)
Null扫描 (-sN)
FIN扫描 (-sF)
Xmas扫描 (-sX)
-sA (TCP ACK扫描)
-sW (TCP窗口扫描)
-sM (TCP Maimon扫描)
--scanflags (定制的TCP扫描)
--scanflags
-sI <zombie host[:probeport]> (Idlescan)
-sO (IP协议扫描)
-b <ftp relay host> (FTP弹跳扫描)
具体的扫描原理和说明可以参照Nmap参考指南(Man Page)[1] ,这里只对SYN扫描进行举例叙述。
默认情况下,Nmap使用SYN方式进行扫描,扫描原理如下图
图3.1 SYN扫描原理图[2]
SYN被称为半开放扫描,因为它不打开一个完全的TCP连接。它发送一个SYN报文,就像您真的要打开一个连接,然后等待响应。 SYN/ACK表示端口在监听 (开放),而 RST (复位)表示没有监听者[1] 。
以下我们以SYN进行端口扫描实验,用EtherDetect Packet Sniffer软件进行抓包分析。实验中,我们以202.193.161.196 为目标地址,以本机 202.193.161.242为源地址进行扫描,扫描目标地址的135,136端口,我们已知目标地址135为开放的,136为关闭的,下面是扫描和抓包分析截图。
扫描命令为 Nmap -p 135-136 202.193.161.196
图3.2 用Nmap进行端口扫描返回结果视图
图3.3 SYN扫描135端口分析视图(1)
图3.4 SYN扫描135端口分析视图(2)
图3.5 SYN扫描135端口分析视图(3)
图3.6 SYN扫描135端口分析视图(4)
图3.7 SYN扫描136端口分析视图(1)
图3.8 SYN扫描136端口分析视图(2)
图3.9 SYN扫描136端口分析视图(3)
如图所示,cmd窗口返回的信息可以看出目标地址的135端口是开放的,136端口是关闭的,在Service一栏,135运行的服务是msrpc,136是profile。而通过我们的抓包分析,我们已经了解了进行SYN扫描的整个过程,但这里有一个问题,我们在上面的SYN扫描过程中,并没有对服务进行识别,那么为什么Nmap返回了两个端口的服务,何况136端口是关闭的,更没有办法获得服务类型,我们在下一章中介绍Nmap的服务识别原理。
第4章 使用Nmap进行服务识别
上章最后我们提出了问题,为什么Nmap没有进行服务识别的相关操作也得到了服务类型呢?我们知道,一般情况下,ftp服务是运行在21端口的,http是80端口,诸如这些端口都是 周知(well-know)端口。我们在进行Nmap端口扫描时,Nmap并没有进行服务的识别,而是将端口号在自己的 端口服务表 数据库中进行查找,然后返回告诉你一般情况下,这个端口开放的服务是这个,也就是说,这种返回的服务只是数据库中的,并非事实中端口所运行的服务,只是一般情况下大家都会使用固定的端口进行固定的服务。那如果要进行更精确的服务检测呢?Nmap提供了更精确的服务及版本检测选项。我们通过添加选项 –sV 来进行服务和版本识别,服务和版本识别还有更多的选项,这里就不做介绍了,如有兴趣可参照Nmap参考指南(Man Page)[1] 。
实验:应用Nmap的服务和版本识别扫描目标主机的135端口。
扫描命令: Nmap –p 135 –sV 202.193.161.196
图4.1 Nmap服务及版本识别输出结果
图4.2 抓包视图
图4.3 进行服务识别视图(1)
图4.4进行服务识别视图(2)
图4.5进行服务识别视图(3)
图4.6进行服务识别视图(4)
图4.7进行服务识别视图(5)
图4.8进行服务识别视图(6)
图4.9 进行版本识别视图(1)
图4.10 进行版本识别视图(2)
图4.11 进行版本识别视图(2)
由以上一系列图,我们可以分析Nmap的服务识别大致过程如下:
1 首先进行端口扫描,默认情况下使用SYN扫描
2 进行服务识别,发送探针报文,得到返回确认值,确认服务。
3 进行版本识别,发送探针报文,得到返回的报文信息,分析得出服务的版本。
第5章 使用Nmap输出扫描结果
Nmap还具有输出扫描结果的选项,使结果可以供用户和其它软件使用,其中包含了方便直接查看的交互方式和方便软件处理 的XML格式。
Nmap输出格式
-oN <filespec> (标准输出)
-oX <filespec> (XML输出)
-oS <filespec> (ScRipT KIdd|3 oUTpuT)
-oG <filespec> (Grep输出)
-oA <basename> (输出至所有格式)
关于各种输出格式及其意义,读者可参照Nmap参考指南(Man Page)[1] ,这里只对输出xml格式文件进行描述。
实验:输出扫描结果到 testnmap.xml 文件。
扫描命令: nmap -oX C:/testnmap.xml -p 135 -sV 202.193.161.196
图5.1 Nmap操作窗口
图5.2 生成的testnmap.xml
图5.3 testnmap.xml的内容
XML提供了可供软件解析的稳定格式输出,主要的计算机 语言都提供了免费的XML解析器,如C/C++,Perl,Python和Java。 针对这些语言有一些捆绑代码用于处理Nmap的输出和特定的执行程序。 例如perl CPAN中的Nmap::Scanner 和Nmap::Parser。 对几乎所有与Nmap有接口的主要应用来说,XML是首选的格式。[1]
【参考文献】
[1] Nmap参考指南(Man Page). http://insecure.org/Nmap/man/zh/, 2006-11-18
[2] James Messer. Secrets of Network Cartography:A Comprehensive Guide to Nmap. http://www.networkuptime.com/nmap/index.shtml, 2006-11-18
[3] W.R Stevens. TCP/IP 详解 卷一:协议.范建华等译. 北京: 机械工业出版社, 2000:169-199
WR Stevens. TCP/IP Illustrated Volume 1:The Protocols. Addison-Wesley.1994
附录1:选项概要列表
Usage: Nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
Can pass hostnames, IP addresses, networks, etc.
Ex: scanme.Nmap.org, microsoft.com/24, 192.168.0.1; 10.0-255.0-255.1-254
-iL <inputfilename>: Input from list of hosts/networks
-iR <num hosts>: Choose random targets
--exclude <host1[,host2][,host3],...>: Exclude hosts/networks
--excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
-sL: List Scan - simply list targets to scan
-sP: Ping Scan - go no further than determining if host is online
-P0: Treat all hosts as online -- skip host discovery
-PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery probes to given ports
-PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
-n/-R: Never do DNS resolution/Always resolve [default: sometimes resolve]
SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
-sN/sF/sX: TCP Null, FIN, and Xmas scans
--scanflags <flags>: Customize TCP scan flags
-sI <zombie host[:probeport]>: Idlescan
-sO: IP protocol scan
-b <ftp relay host>: FTP bounce scan
PORT SPECIFICATION AND SCAN ORDER:
-p <port ranges>: Only scan specified ports
Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080
-F: Fast - Scan only the ports listed in the Nmap-services file)
-r: Scan ports consecutively - don't randomize
SERVICE/VERSION DETECTION:
-sV: Probe open ports to determine service/version info
--version-light: Limit to most likely probes for faster identification
--version-all: Try every single probe for version detection
--version-trace: Show detailed version scan activity (for debugging)
OS DETECTION:
-O: Enable OS detection
--osscan-limit: Limit OS detection to promising targets
--osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
-T[0-6]: Set timing template (higher is faster)
--min-hostgroup/max-hostgroup <msec>: Parallel host scan group sizes
--min-parallelism/max-parallelism <msec>: Probe parallelization
--min_rtt_timeout/max-rtt-timeout/initial-rtt-timeout <msec>: Specifies
probe round trip time.
--host-timeout <msec>: Give up on target after this long
--scan-delay/--max_scan-delay <msec>: Adjust delay between probes
FIREWALL/IDS EVASION AND SPOOFING:
-f; --mtu <val>: fragment packets (optionally w/given MTU)
-D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
-S <IP_Address>: Spoof source address
-e <iface>: Use specified interface
-g/--source-port <portnum>: Use given port number
--data-length <num>: Append random data to sent packets
--ttl <val>: Set IP time-to-live field
--spoof-mac <mac address, prefix, or vendor name>: Spoof your MAC address
OUTPUT:
-oN/-oX/-oS/-oG <file>: Output scan results in normal, XML, s|<rIpt kIddi3,
and Grepable format, respectively, to the given filename.
-oA <basename>: Output in the three major formats at once
-v: Increase verbosity level (use twice for more effect)
-d[level]: Set or increase debugging level (Up to 9 is meaningful)
--packet-trace: Show all packets sent and received
--iflist: Print host interfaces and routes (for debugging)
--append-output: Append to rather than clobber specified output files
--resume <filename>: Resume an aborted scan
--stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
--no_stylesheet: Prevent Nmap from associating XSL stylesheet w/XML output
MISC:
-6: Enable IPv6 scanning
-A: Enables OS detection and Version detection
--datadir <dirname>: Specify custom Nmap data file location
--send-eth/--send-ip: Send packets using raw ethernet frames or IP packets
--privileged: Assume that the user is fully privileged
-V: Print version number
-h: Print this help summary page.
EXAMPLES:
Nmap -v -A scanme.Nmap.org
Nmap -v -sP 192.168.0.0/16 10.0.0 .0/8
Nmap -v -iR 10000 -P0 -p 80