Nmap网络安全扫描器说明

/ns/cn/tool/data/20010108031221.htm

Nmap网络安全扫描器说明(Linux )

信息来源:苏樱

作者:Fyodor 译者:quack

名称: nmap - 网络勘察工具和安全扫描器

摘要
nmap [扫描类型] [选项] <主机或网络 #1 ... [#N]>

描述
nmap被开发用于允许系统管理员察看一个大的网络系统有哪些主机以及其上运行何种
服务。它支持多种协议的扫描如UDP,TCP connect(),TCP SYN (half open), ftp
proxy (bounce attack),Reverse-ident, ICMP (ping sweep), FIN, ACK
sweep,Xmas Tree, SYN sweep, 和Null扫描。你可以从SCAN TYPES一节中察看相关细
节。nmap还提供一些实用功能如通过tcp/ip来甄别操作系统类型、秘密扫描、动态延
迟和重发、平行扫描、通过并行的PING侦测下属的主机、欺骗扫描、端口过滤探测、
直接的RPC扫描、分布扫描、灵活的目标选择以及端口的描述。

对非ROOT的用户来说,nmap的正式版可以做很多重要的东西了。不幸的是部份关键的
核心功能(比如raw sockets)需要root权限。所以尽量以root的身份运行nmap。

运行nmap后通常会得到一个关于你扫描的机器的一个实用的端口列表。nmap总是显示
该服务的服务名称,端口号,状态以及协议。状态有‘open‘,‘filtered‘和
‘unfiltered‘三种。‘open‘指的是目标机器将会在该端口接受你的连接请求。
‘filtered‘指的是有防火墙、过滤装置或者其它的网络障碍物在这个端口阻挡了
nmap 进一步查明端口是否开放的动作。至于‘unfiltered‘则只有在大多数的扫描
端口都处在‘filtered‘状态下才会出现的。

根据选项的使用,nmap还可以报告远程主机下面的特性:使用的操作系统、TCP连续
性、在各端口上绑定的应用程序用户的用户名、DNS名、主机是否是个smurf地址以及
一些其它功能。

选项
这些选项通常都是可组合使用的。使用参数可以精确地定义一个扫描模式。nmap将会
尽力捕捉并对不规范的参数组合作出提示。如果你急于开始,你可以跳过本文未尾的
示例节――那儿有最基本的使用方法的示范。你也可以使用nmap -h来打开关于nmap
选项参数的简介。

扫描类型
-sT TCP connect()扫描:这是对TCP的最基本形式的侦测。在该操作下,该
connect()对目标主机上你感兴趣的端口进行试探,如果该端口被监听,则连接成
功――否则代表这个端口无法到达。这个技术的很大好处就是你无须任何特殊权限,
在大多数的UNIX系统下这个命令可以被任何人自由地使用。
但是这种形式的探测很容易被目标主机察觉并记录下来。因为服务器接受了一个连接
但它却马上断开,于是其记录会显示出一连串的连接及错误信息。

-sS TCP SYN 扫描:这类技术通常涉及一种“半开”式的扫描――因为你不打开完整
的TCP连接,你发送一个SYN信息包就象你要打开一个真正的连接而且你在等待对方的
回应。一个SYN|ACK(应答)会表明该端口是开放监听的。一个RST(空闲?)则代表该
端口未被监听。如果SYN|ACK的回应返回,则会马上发送一个RST包来中断这个连接
(事实上是我们的系统核心在干这事)。这种扫描的最大好处是只有极少的站点会对
它作出记录,但是――你需要有root权限来定制这些SYN包。

-sF -sX -sN
Stealth FIN,Xmas Tree 或者Null扫描模式:有时甚至SYN扫描都不够隐蔽――一些
防火墙及信息包过滤装置会在重要端口守护,SYN包在此时会被截获,一些应用软件
如Synlogger以及Courtney对侦测这类型的扫描都是行家。所以呢,在另一方面要有
更进一步的扫描能在不遇到麻烦的情况下通过它们……
这个主意是关闭的端口会对你发送的探测信息包返回一个RST,而打开的端口则对其
忽略不理(你可以参阅RFC 973 PP64)。所以FIN扫描使用空的FIN信息包作为探针、
Xmas tree使用FIN,URG,PUSH标记、Null扫描则不用任何标记。但是不幸的是微软
以他们一贯的风格不理睬这一标准……所以这一扫描在WINDOWS9X以及NT下不能工
作。
从积极方面来讲,这其实也是一个很好的区分两种平台的办法――如果这次扫描发现
了打开的端口,那你就能明白这台机器不是运行WINDOWS。如果-sF,-sX,-sN的扫描显
示所有端口都是关闭的但一个SYN(-sS)扫描却显示有打开端口,那你就能大致推断它
是WINDOWS平台。这只是一个简单应用,因为现在nmap已经有了更彻底的操作系统判
别方法――当然它的原理类似上面所提到的.
这些平台包括Cisco, BSDI, HP/UX, MVS, 和IRIX。

-sP Ping扫描:有时你仅希望了解网络上有哪些主机是开放的,nmap可以通过对你指
定的IP地址发送ICMP的echo request信息包来做到这一点,有回应的主机就是开放的
啦。但令人讨厌的是一些站点比如microsoft.com对echo request包设置了障碍。这
样的话nmap还能发送一个TCP ack包到80端口(默认),如果获得了RST返回,机器是
开放的。第三个方法是发送一个SYN信息包并等待RST 或SYN/ACK响应了。作为非root
的用户可以使用的,常用connect()模式。对root来说,默认的nmap同时使用ICMP和
ACK的方法扫描,当然你也可以改变-P选项。注意你最好先ping一下用户,只有有回
应的主机才有必要扫描,只有你不想探测任何的实际端口扫描只想大面积地搜索一下
活动的主机,你可以使用此选项。

-sU UDP扫描:这一方法是用来确定哪个UDP(User Datagram Protocol,RFC 768)端口
在主机端开放。这一技术是以发送零字节的UDP信息包到目标机器的各个端口,如果
我们收到一个ICMP端口无法到达的回应,那么该端口是关闭的,否则我们可以认为它
是敞开大门的。有些人或许会认为UDP扫描是无意义的,我通常会以最近的Solaris
rcpbind漏洞来提醒他们。Rpcbind会隐藏在一个非正式的UDP端口于32770口以上,因
此对111进行防火墙过滤是无关紧要的.但你是否查找过在30000以上的端口是否处在
监听状态中……,用UDP扫描你就能轻松地做到这一点!或者大家还可以想想cDc出品
的Back Orifice木马(BO),它可以在Windows的机器中配置一个UDP端口,更不用说
如此众多可以利用UDP的、易受攻击的服务如snmp,tftp,NFS等了。但有一点不得不提
及的是UDP扫描在目标主机按照RFC 1812(4.3.2.8节)建议的那样限制ICMP错误信息
的传送速率时会令人痛苦的缓慢。举例来说吧,Linux 的核心配置(在
net/ipv4/icmp.h)限制了每4秒产生80次的无法到达信息――每次产生1/4秒的延迟。
Solaris有着更严格的限制(大约每秒两次就会延迟),所以这要耗费相当长的时
间。nmap会侦测到这种限制并自动减缓速度――这也胜过用无意义的会被目标主机忽
略的大量信息包来填充这个网络。如以往一样,微软还是不在乎RFC所建议的事而且
没有任何限制性措施实行于WINDOWS或NT上,这样我们可以把多达65K的端口以极高的
速度扫描完毕,欢呼吧!

-sR RPC扫描:这一方法是结合nmap多种扫描的一种模式,它取得所有的TCP/UDP开放
端口并且用SunRPC程序NULL命令来试图确定是否是RPC端口并且――如果是的话,其
上运行什么程序,何种版本。这样你可以在目标主机躲在防火墙后或者由TCP
wrappers防护着,它都能取得效果近似于‘rpcinfo -p‘的信息。但Decoys现在还不
能正常工作在RPC扫描下,在以后我会在UDP RPC扫描中加入Decoy支持的。

-b(ftp relay host)
FTP 跳跃攻击:FTP协议的一个有趣的特点是它支持代理FTP连接(RFC 959),用另一
句话说,我可以从evil.com连接到一个FTP服务器target.com并且要求目标主机发送
文件到因特网的*任何地方*!在1985年这一RFC被写下来后这一特性便渐渐施行,但
在现在的网络上我们不允许人们能够随意地“抢劫”一个FTP SERVER并请求数据到任
何地方。所以在Hobbit于1995年写下的有关这一协议缺陷时说到“它可以用来从许多
站台上发出事实上难以追查的信件、新闻以及攻击性行为――填充你的硬盘,试图使
防火墙失效或者更多是烦人而无意义的骚扰。我开发出它来是为了通过一个代理FTP
服务器察看TCP端口,这样你可以连上一个在防火墙后的FTP服务器然后扫描它看来仿
佛堵塞的端口(139是很好的例子)。如果FTP服务器允许你读甚至写进某些目录(比
如/incoming),你可以发送任意信息到你发现打开了的端口(当然nmap不干这
事)。对于你要通过‘b‘选项来使主机成为你的代理时,标准的URL格式形式是:
username:password@server:port。要确定一个服务器是否易受这样的攻击,你可以
看看我在Phrack 51期上的文章。它的更新版本在http://www.insecure.org/nmap。

常规选项
这些选项并非必需的,但有些会非常实用。

-P0 在扫描前不尝试或者PING主机,这是用来扫描那些不允许ICMP echo 请求(或应
答)的主机。microsoft.com就是这其中的一个例子,我们就必须使用-P0或者-PT80来
察看microsoft.com的端口。

-PT 用TCP的ping来确定主机是否打开。作为替代发送ICMP echo请求包并等待回应的
方式,我们可以大量发送TCP ACK包往目标网络(或者单机)并一点点地等待它的回
应,打开的主机会返回一个RST。这一参数可以让你在ping信息包阻塞时仍能高效率
地扫描一个网络/主机。对非root的用户,我们用connect(),以如下格式设置目标探
针-PT,默认的端口是80,因为这相端口往往未被过滤。

-PS 这一选项是root用户使用的,能用SYN(连接请求)包替代ACK包,打开的主机会有
一个RST(或者SYN|ACK――但比较少见)应答。

-PI 这一选项是使用一个真正的ping(ICMP echo request)包。它找到开放的主机并
且将该子网中的广播地址全数搜寻――该广播地址是能够到达并能正确解析IP包的。
如果其会被大量的DoS(denial of service)攻击时,我们就能找到它。

-PB 默认的ping形式,它用于ACK(-PT)与ICMP(-PI)并行攻击,以这一形式可以通过
防火墙或包过滤。

-O 经由TCP/IP获取‘指纹’来判别主机的OS类型,用另一说法,就是用一连串的信
息包探测出你所扫描的主机位于操作系统有关堆栈信息并区分其精细差别,以此判别
操作系统。它用搜集到的信息建立一个“指纹”用来同已知的操作系统的指印相比较
(the nmap-os-fingerprints file)
――这样判定操作系统就有了依据。
如果你发现一台机器开了至少一个端口并得到错误的诊断信息,那么你可以写信告诉
我相关细节比如操作系统版本或侦测到的操作系统版本图,如果他有端口开放但nmap
返回‘不可识别的操作系统‘,这可能也是有用的,你可以将它的IP告诉我或者另一
个办法是用nmap的-d参数并告诉我它返回的“指印”――操作系统和版本号,这样
做,也算是对nmap在判定操作系统的进一步开发中做了些事情,以便后续版本中它能
更精确地判别系统类型。

-I 这是用ident扫描方式的参数,如Dave Goldsmith于1996年在Bugtraq中所说的,
这个ident协议(rfc 1413)允许通过TCP连接得到拥有进程的用户名――即使这个连接
不是由该进程发起的。所以呢,举个例吧,你可以通过ident连接到一个http端口并
找出该进程是否由root运行,但这只能在“全开”的对目标端口的TCP连接中使用
(象-sT扫描参数)。当你用-I参数时,远程主机的identd在开放的端口接受连接质
询――很明显的,如果主机不运行identd的话,那它就无法正常工作。

-f 这个参数配置以细小的IP碎片包实现SYN,FIN,XMAS或NULL扫描请求。这个想法
是把TCP包头分别放在几个不同的信息包中,使包过滤器难于运作,而后你就可以闯
入系统做你想做的事了。但要注意,部份程序可能会对这些小信息包处理错误。比方
说我最喜欢的sniffer segmentation在接收第一个36字节的信息碎片时就出现麻烦,
之后又来了个24字节的!当包过滤器和能将IP碎片排列的防火墙没有获得此顺序时
(就象linux内核中的CON-FIG_IP_ALWAYS_DEFRAG选项),一些网络系统就不能反映
出找到目标,并且放弃。
记住这个参数不一定能很好地工作在任何系统上,它在我的Linux,FreeBSD以及
OpenBSD下是正常的,当然也有一些人说它能在部份不同的*NIX环境下工作。

-v 详细模式。这是被强烈推荐的选项,因为它能带来你想要的更多信息。你可以重
复使用它以获得更大效果。如果你需要大量翻动屏幕请使用 -d 命令两次

-h 这是一个快捷的帮助选项,可以在屏幕上显示nmap的参数使用方法――象你注意
到的那样,这个man page实在不是一个“快速入门参考”

-o
这是用来指定一个放置扫描结果的文件的参数――这个结果是易于阅读的。

-m
这也是存放扫描结果的参数,但它是存放机器可解析(machine parseable)结果
的,你可以用-m 带‘-‘(引号不用)将其输出到标准输出里(用shell的管道
符……)。在这种形式下,正常的输出被禁止了,你需要察看一些错误信息来了解情
况。