Nmap网络安全扫描器说明及使用

来源:互联网 发布:农村教育问题 知乎 编辑:程序博客网 时间:2024/03/29 18:17

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<portnumber>,默认的端口是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 <logfilename>
这是用来指定一个放置扫描结果的文件的参数——这个结果是易于阅读的。

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


-i <inputfilename>
从指定文件而不是从命令行读取数据。该文件可以存放一个主机或网络的列表,中间用空格、TAB键或者换行来分隔。如果希望从标准输入设备(文件)读取——比如在管道符的末端,你要将连字号(-)用于文件名。你可以从目标规格里找到更多关于写这一文件的资料。

-p <port ranges>
这一参数可以指定你希望扫描的端口,举例来说吧'-p 23'则只会对主机的23端口进行探测,默认扫描的是从1到1024端口,或者也可以用nmap里带的services file里的端口列表。

-F 快速扫描模式。指定只希望扫描nmap里提供的services file中列出的端口列表里的端口。这明显会比扫描所有65535个端口来得快。

-D <decoy1 [,decoy2][,ME],...>
这是一种带有诱骗模式的扫描,在远程主机的连接记录里会记下所有你所指定的诱骗性的地址。这样的话他们的数据存储器会显示有一些端口扫描从某个IP发起,然而他们无法辩别哪个是真正的IP而哪个是用来作为掩护的,这可以击败一些通过路由进行跟踪的行为,所以它是一项隐藏你的IP的很实用的技术。用逗号分隔各个欺骗地址,你可以随意地将'me'放进任意一个你希望显示真实IP的地方,如果你将'ME'放在第六位甚至最后,有些端口扫描记录器(比如Solar Designer's excellent scanlogd)可能根本就不会显示你的IP,如果你不用'ME'的话,nmap将会将它随机放置。记住你用来诱骗的主机必须是开放的或者你可以半开扫描一下你的目标。因为要从一堆实际上没有用的IP地址里判别出哪个是真正的入侵者是相当容易的。你还可能要用IP地址来代替名字,这样诱骗主机的nameserver logs里才不会记录下你来。还要记得有些(愚蠢的)"端口扫描探测器"会拒绝到达主机的端口扫描尝试。这样你无意中就会导致你扫描的主机与“诱骗主机”连接的丢失,这样可能会带来一个很大的问题是——如果这个“诱骗主机”是一个网上的网关或者甚至就是其本地的机子,其连接一样会断开!所以大家最好小心使用这个参数——从道德上的原因——这仅仅是一个诱骗,不是么?这种诱骗可以用在最初的ping扫描(用ICMP,SYN,ACK或其它)与实际的端口状态扫描中,它还可以用于远程OS的判别(-O)。当然如果你写入太多的诱骗地址也是没什么用处的,那只能减缓扫描速度以及降低一些精确度。而且一些指令处理系统还可能会过滤掉你的欺骗包,虽然多数(几乎是全部了)不会对欺骗包作出任何限制。

-S <IP_Address>
在某些环境下nmap可能无法确定你的源地址——这种情况下nmap会有提示,这时你就要用-S带IP地址来标注。另一种使用的可能性是用来欺骗目标使它认为某人在扫描它。设想一下,某个公司发现被竞争者持续不断的扫描,这是一个不被支持的用法,或者说,不是主要目的。我只是用它来提醒人们在发现一个端口扫描者时别光顾责难,可能他是无辜的呢。-e能够说明这个参数的一般用法。

-e <interface>
告诉nmap哪个界面要发送或接收。nmap能够自动探测它,如果无法做到,亦会有提示信息。

-g <portnumber>
在扫描中设定源端口号。许多“天真”的防火墙或包过滤器除了它们建立的允许DNS(53)或FTP-DATA(20)的包进来建立连接之外,其余一概过滤,显然这是很轻率的做法,因为入侵者能够轻易地编辑一个来自FTP或DNS的源端口。比如说,你如果无法从一个主机的host:port通过TCP ISN取得信息,那么通过用-g 命令,nmap会改变源端口再次尝试。需要了解的是,使用这个选项可能会有小小的延迟,因为我有时需要在源端口号中存储有用信息.

-M <max sockets>
设定用来并行进行TCP connect()扫描的最大的sockets数目(默认)。这对将扫描适度减缓是相当有效的,它可以避免把远程主机crashing。另一个途径是用-sS。

定时选项
--------*

虽然nmap在一般情况下都能够很好地在运行时间里尽可能迅速地完成扫描任务,但偶尔还是会有一些主机/端口无法侦测,这可能是nmap默认的时间策略和你的目标不太一致(相当于timeout的设定),下面就是一些选项能对扫描的时间进行控制:

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane>
这是一个可以用来便利地表达nmap时间策略优先权的参数设置。Paranoid模式用极慢的速度来扫描以避免被数字记录系统记录。它使扫描连续而不是并发而且通常等待至少五分钟才发送一个信息包。Sneaky也是类似的,只是它是每15秒发送一个信息包。Polite模式是用来减轻网络负载以减少当机的可能性,它是连续发送探针并在两个包的间隙等待0.4秒。Normal是nmap的常规用法,是尽其所能地快速扫描——除非主机或端口连接丢失。Aggressive模式是对每台主机设定了五分钟的timeout,并且等待每个探针应答不超过1.25秒。Insane模式是适应非常快的网络或者你不在乎丢失一些信息——因为太快!它的timeout设定于75秒并且只等待回应0.3秒,它允许对一个很快的网络系统进行“扫荡”,你也可以用数字(0-5)来代表参数,比如'-t 0'表示Paranoid而'-t 5'代表Insane模式。注意,这些时间设定无法在底层的控制中联合使用。(NOT be used in combination with the lower level controls given below.)

--host_timeout <milliseconds>
具体指定nmap对某个IP的扫描时间总量,超过则作不通处理,默认是不做设定。

--max_rtt_timeout <milliseconds>
指定nmap对一个探针从远程端返回回应的最大时间,默认是9000。

--initial_rtt_timeout <milliseconds>
指定最初探针的timeout时间,这通常在用-P0扫描有防火墙保护的主机时很有效,nmap会通过ping得到一个好的RTT评估以及最初少数的探针。默认值为6000。

--max_parallelism <number>
指定nmap允许的最大并行扫描数目,设定为1表明nmap每次只扫描个端口,它同样会对其它扫描如ping sweep, RPC scan等产生影响。

--scan_delay <milliseconds>
指定nmap必须等待的两个探针间的最小的时间。这是减少网络负载及使扫描在综合数据存储的记录下不那么显眼的办法。

目标说明
--------*

所有不带参数的选项都会被视为是nmap的目标主机描述。最简单的实例是仅仅在命令行列出单一的主机名或IP地址。如果你希望扫描一个IP地址的子网,你可以在主机名和IP地址中加入'/mask'。mask必需是在0(扫描整个网络)和32(特定的单一主机)。用/24则表明扫找一个C类地址,而/16则是扫描B类
……

nmap还有一些更有用的符号说明方式可以让你用list/ranges来为每个元素指定IP地址。比如你要扫描B类网址128.210.*.*,则可以用'128.210.*.*'或'128.210.0-255.0-255'或者甚至是'128.210.1-50,51-255.1,2,3,4,5-255'来表示。当然你也可以用上面提过的mask来表示:'128.210.0.0/16'。所有这些都是等价的,当你用'*'的时候记住多数的shell都要求用定界符比如引号将其标注。

另一个有趣的是你可以用其它方法将整个网络“分割”,比如你可以用'*.*.5.6-7'来扫描所有以.5.6或 .5.7结束的IP地址。要得到更多信息,你可以看看示例节。

扫描范例
--------*

这里是一些运用nmap的扫描范例,从最简单普通的到有一些复杂的例子都有。注意这里有真实的数字以及一些真实的域名——这样可以让扫描行为看起来更具体。在这里你可以用自己的网络里的名称代替其中的addresses/names。虽然端口扫描的结果分析可能会使某些人容易攻击,但我不认为它是不合法的,我曾经扫描过成百上千的机器但只收到一次抱怨。但我不是律师而一些(anal)人们对nmap探测觉得烦恼,所以最好在取得允许后扫描或者——冒险,后果由你自己承担。

nmap -v target.example.com

这样对target.example.com上所有的保留TCP端口做了一次扫描,-v表示用详细模式。

nmap -sS -O target.example.com/24

这将开始一次SYN的半开扫描,针对的目标是target.example.com所在的C类子网,它还试图确定在其上运行的是什么系统。这需要root权限,因为用到了半开扫描以及系统侦测。

nmap -sX -p 22,53,110,143,4564 128.210.*.1-127

发送一个Xmas tree扫描到B类128.210所在子网的一半范围内,我们将检测系统是否运行sshd, DNS, pop3d, imapd, 或者端口4564。要注意由于微软TCP堆栈的不完善,Xmas扫描将不能在其平台上运行成功,同样的问题可能存在于CISCO, IRIX, HP/UX, 和BSDI。

nmap -v -p 80 '*.*.2.3-5'

这是定位一个网域(将整个网络分隔成许多小部份)再进行扫描的方式,这里扫描的是所有以.2.3,.2.4, 或.2.5结束的IP地址。如果你是ROOT的话也可以用-sS。同样的你可以从127开始搜寻更多有趣的机器,你可以用'127-222'替代前面的星号——恕我直言,那个区域有着大量有趣的机器。

host -l company.com | cut '-d ' -f 4 | ./nmap -v -i -

做一个DNS zone transfer来寻找在company.com进而的主机并且将IP地址送至nmap(feed the IP addresses to nmap)。这个命令是在我的GNU/Linux平台下运行的,你可能需要用不同的选项参数或者不同的操作系统。

臭虫
----*
臭虫?有什么臭虫?如果你找到了,请告诉我,修订版将会更完善,记住要连同OS的“指印”一起给我,这样我才能有足够的数据进行修改……

作者
----*

Fyodor <fyodor@dhp.com>

发放
----*

最新版本的nmap可以从以下URL获得(以下为版权信息)

http://www.insecure.org/nmap/

使用方法

 

1.名称

nmap-网络探测和安全扫描工具

2.语法

nmap [Scan Type(s)] [Options]

3.描述

nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定。

为了提高nmap在non-root状态下的性能,软件的设计者付出了很大的努力。很不幸,一些内核界面(例如raw socket)需要在root状态下使用。所以应该尽可能在root使用nmap。

nmap运行通常会得到被扫描主机端口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的状态有:open、filtered、unfiltered。open状态意味着目标主机能够在这个端口使用accept()系统调用接受连接。filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止nmap探测其是否打开。unfiltered表示:这个端口关闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都是unfiltered状态,只有在大多数被扫描的端口处于filtered状态下,才会显示处于unfiltered状态的端口。

根据使用的功能选项,nmap也可以报告远程主机的下列特征:使用的操作系统、TCP序列、运行绑定到每个端口上的应用程序的用户名、DNS名、主机地址是否是欺骗地址、以及其它一些东西。

4.功能选项

功能选项可以组合使用。一些功能选项只能够在某种扫描模式下使用。nmap会自动识别无效或者不支持的功能选项组合,并向用户发出警告信息。

如果你是有经验的用户,可以略过结尾的示例一节。可以使用nmap -h快速列出功能选项的列表。

4.1 扫描类型

-sT
TCP connect()扫描:这是最基本的TCP扫描方式。connect()是一种系统调用,由操作系统提供,用来打开一个连接。如果目标端口有程序监听,connect()就会成功返回,否则这个端口是不可达的。这项技术最大的优点是,你勿需root权限。任何UNIX用户都可以自由使用这个系统调用。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。
-sS
TCP同步扫描(TCP SYN):因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。你可以发出一个TCP同步包(SYN),然后等待回应。如果对方返回SYN|ACK(响应)包就表示目标端口正在监听;如果返回RST数据包,就表示目标端口没有监听程序;如果收到一个SYN|ACK包,源主机就会马上发出一个RST(复位)数据包断开和目标主机的连接,这实际上有我们的操作系统内核自动完成的。这项技术最大的好处是,很少有系统能够把这记入系统日志。不过,你需要root权限来定制SYN数据包。
-sF -sF -sN
秘密FIN数据包扫描、圣诞树(Xmas Tree)、空(Null)扫描模式:即使SYN扫描都无法确定的情况下使用。一些防火墙和包过滤软件能够对发送到被限制端口的SYN数据包进行监视,而且有些程序比如synlogger和courtney能够检测那些扫描。这些高级的扫描方式可以逃过这些干扰。这些扫描方式的理论依据是:关闭的端口需要对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC 793第64页)。FIN扫描使用暴露的FIN数据包来探测,而圣诞树扫描打开数据包的FIN、URG和PUSH标志。不幸的是,微软决定完全忽略这个标准,另起炉灶。所以这种扫描方式对Windows95/NT无效。不过,从另外的角度讲,可以使用这种方式来分别两种不同的平台。如果使用这种扫描方式可以发现打开的端口,你就可以确定目标注意运行的不是Windows系统。如果使用-sF、-sX或者-sN扫描显示所有的端口都是关闭的,而使用SYN扫描显示有打开的端口,你可以确定目标主机可能运行的是Windwos系统。现在这种方式没有什么太大的用处,因为nmap有内嵌的操作系统检测功能。还有其它几个系统使用和windows同样的处理方式,包括Cisco、BSDI、HP/UX、MYS、IRIX。在应该抛弃数据包时,以上这些系统都会从打开的端口发出复位数据包。
-sP
ping扫描:有时你只是想知道此时网络上哪些主机正在运行。通过向你指定的网络内的每个IP地址发送ICMP echo请求数据包,nmap就可以完成这项任务。如果主机正在运行就会作出响应。不幸的是,一些站点例如:microsoft.com阻塞ICMP echo请求数据包。然而,在默认的情况下nmap也能够向80端口发送TCP ack包,如果你收到一个RST包,就表示主机正在运行。nmap使用的第三种技术是:发送一个SYN包,然后等待一个RST或者SYN/ACK包。对于非root用户,nmap使用connect()方法。
在默认的情况下(root用户),nmap并行使用ICMP和ACK技术。
注意,nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。如果你只是想知道目标主机是否运行,而不想进行其它扫描,才会用到这个选项。
-sU
UDP扫描:如果你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可以使用这种扫描方法。nmap首先向目标主机的每个端口发出一个0字节的UDP包,如果我们收到端口不可达的ICMP消息,端口就是关闭的,否则我们就假设它是打开的。
有些人可能会想UDP扫描是没有什么意思的。但是,我经常会想到最近出现的solaris rpcbind缺陷。rpcbind隐藏在一个未公开的UDP端口上,这个端口号大于32770。所以即使端口111(portmap的众所周知端口号)被防火墙阻塞有关系。但是你能发现大于30000的哪个端口上有程序正在监听吗?使用UDP扫描就能!cDc Back Orifice的后门程序就隐藏在Windows主机的一个可配置的UDP端口中。不考虑一些通常的安全缺陷,一些服务例如:snmp、tftp、NFS使用UDP协议。不幸的是,UDP扫描有时非常缓慢,因为大多数主机限制ICMP错误信息的比例(在RFC1812中的建议)。例如,在Linux内核中(在net/ipv4/icmp.h文件中)限制每4秒钟只能出现80条目标不可达的ICMP消息,如果超过这个比例,就会给1/4秒钟的处罚。solaris的限制更加严格,每秒钟只允许出现大约2条ICMP不可达消息,这样,使扫描更加缓慢。nmap会检测这个限制的比例,减缓发送速度,而不是发送大量的将被目标主机丢弃的无用数据包。
不过Micro$oft忽略了RFC1812的这个建议,不对这个比例做任何的限制。所以我们可以能够快速扫描运行Win95/NT的主机上的所有65K个端口。
-sA
ACK扫描:这项高级的扫描方法通常用来穿过防火墙的规则集。通常情况下,这有助于确定一个防火墙是功能比较完善的或者是一个简单的包过滤程序,只是阻塞进入的SYN包。
这种扫描是向特定的端口发送ACK包(使用随机的应答/序列号)。如果返回一个RST包,这个端口就标记为unfiltered状态。如果什么都没有返回,或者返回一个不可达ICMP消息,这个端口就归入filtered类。注意,nmap通常不输出unfiltered的端口,所以在输出中通常不显示所有被探测的端口。显然,这种扫描方式不能找出处于打开状态的端口。
-sW
对滑动窗口的扫描:这项高级扫描技术非常类似于ACK扫描,除了它有时可以检测到处于打开状态的端口,因为滑动窗口的大小是不规则的,有些操作系统可以报告其大小。这些系统至少包括:某些版本的AIX、Amiga、BeOS、BSDI、Cray、Tru64 UNIX、DG/UX、OpenVMS、Digital UNIX、OpenBSD、OpenStep、QNX、Rhapsody、SunOS 4.x、Ultrix、VAX、VXWORKS。从nmap-hackers邮件3列表的文档中可以得到完整的列表。
-sR
RPC扫描。这种方法和nmap的其它不同的端口扫描方法结合使用。选择所有处于打开状态的端口向它们发出SunRPC程序的NULL命令,以确定它们是否是RPC端口,如果是,就确定是哪种软件及其版本号。因此你能够获得防火墙的一些信息。诱饵扫描现在还不能和RPC扫描结合使用。
-b
FTP反弹攻击(bounce attack):FTP协议(RFC 959)有一个很有意思的特征,它支持代理FTP连接。也就是说,我能够从evil.com连接到FTP服务器target.com,并且可以要求这台FTP服务器为自己发送Internet上任何地方的文件!1985年,RFC959完成时,这个特征就能很好地工作了。然而,在今天的Internet中,我们不能让人们劫持FTP服务器,让它向Internet上的任意节点发送数据。如同Hobbit在1995年写的文章中所说的,这个协议"能够用来做投递虚拟的不可达邮件和新闻,进入各种站点的服务器,填满硬盘,跳过防火墙,以及其它的骚扰活动,而且很难进行追踪"。我们可以使用这个特征,在一台代理FTP服务器扫描TCP端口。因此,你需要连接到防火墙后面的一台FTP服务器,接着进行端口扫描。如果在这台FTP服务器中有可读写的目录,你还可以向目标端口任意发送数据(不过nmap不能为你做这些)。
传递给-b功能选项的参数是你要作为代理的FTP服务器。语法格式为:
-b username:password@server:port。
除了server以外,其余都是可选的。如果你想知道什么服务器有这种缺陷,可以参考我在Phrack 51发表的文章。还可以在nmap的站点得到这篇文章的最新版本。

4.2 通用选项

这些内容不是必需的,但是很有用。

-P0
在扫描之前,不必ping主机。有些网络的防火墙不允许ICMP echo请求穿过,使用这个选项可以对这些网络进行扫描。microsoft.com就是一个例子,因此在扫描这个站点时,你应该一直使用-P0或者-PT 80选项。
-PT
扫描之前,使用TCP ping确定哪些主机正在运行。nmap不是通过发送ICMP echo请求包然后等待响应来实现这种功能,而是向目标网络(或者单一主机)发出TCP ACK包然后等待回应。如果主机正在运行就会返回RST包。只有在目标网络/主机阻塞了ping包,而仍旧允许你对其进行扫描时,这个选项才有效。对于非root用户,我们使用connect()系统调用来实现这项功能。使用-PT <端口号>来设定目标端口。默认的端口号是80,因为这个端口通常不会被过滤。
-PS
对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。如果主机正在运行就返回一个RST包(或者一个SYN/ACK包)。
-PI
设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。使用这个选项让nmap发现正在运行的主机的同时,nmap也会对你的直接子网广播地址进行观察。直接子网广播地址一些外部可达的IP地址,把外部的包转换为一个内向的IP广播包,向一个计算机子网发送。这些IP广播包应该删除,因为会造成拒绝服务攻击(例如smurf)。
-PB
这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。
-O
这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志。换句话说,nmap使用一些技术检测目标主机操作系统网络协议栈的特征。nmap使用这些信息建立远程主机的指纹特征,把它和已知的操作系统指纹特征数据库做比较,就可以知道目标主机操作系统的类型。
-I
这个选项打开nmap的反向标志扫描功能。Dave Goldsmith 1996年向bugtap发出的邮件注意到这个协议,ident协议(rfc 1413)允许使用TCP连接给出任何进程拥有者的用户名,即使这个进程并没有初始化连接。例如,你可以连接到HTTP端口,接着使用identd确定这个服务器是否由root用户运行。这种扫描只能在同目标端口建立完全的TCP连接时(例如:-sT扫描选项)才能成功。使用-I选项是,远程主机的identd精灵进程就会查询在每个打开的端口上监听的进程的拥有者。显然,如果远程主机没有运行identd程序,这种扫描方法无效。
-f
这个选项使nmap使用碎片IP数据包发送SYN、FIN、XMAS、NULL。使用碎片数据包增加包过滤、入侵检测系统的难度,使其无法知道你的企图。不过,要慎重使用这个选项!有些程序在处理这些碎片包时会有麻烦,我最喜欢的嗅探器在接受到碎片包的头36个字节时,就会发生segmentation faulted。因此,在nmap中使用了24个字节的碎片数据包。虽然包过滤器和防火墙不能防这种方法,但是有很多网络出于性能上的考虑,禁止数据包的分片。
注意这个选项不能在所有的平台上使用。它在Linux、FreeBSD、OpenBSD以及其它一些UNIX系统能够很好工作。
-v
冗余模式。强烈推荐使用这个选项,它会给出扫描过程中的详细信息。使用这个选项,你可以得到事半功倍的效果。使用-d选项可以得到更加详细的信息。
-h
快速参考选项。
-oN
把扫描结果重定向到一个可读的文件logfilename中。
-oM
把扫描结果重定向到logfilename文件中,这个文件使用主机可以解析的语法。你可以使用-oM -来代替logfilename,这样输出就被重定向到标准输出stdout。在这种情况下,正常的输出将被覆盖,错误信息荏苒可以输出到标准错误stderr。要注意,如果同时使用了-v选项,在屏幕上会打印出其它的信息。
-oS  thIs l0gz th3 r3suLtS of YouR ScanZ iN a s| THe fiL3 U sPecfy 4s an arGuMEnT! U kAn gIv3 the 4rgument '-'
(wItHOUt qUOteZ) to sh00t output iNT0 stDouT!@!! 莫名其妙,下面是我猜着翻译的,相形字?:)
把扫描结果重定向到一个文件logfilename中,这个文件使用一种"黑客方言"的语法形式(作者开的玩笑?)。同样,使用-oS -就会把结果重定向到标准输出上。
-resume
某个网络扫描可能由于control-C或者网络损失等原因被中断,使用这个选项可以使扫描接着以前的扫描进行。logfilename是被取消扫描的日志文件,它必须是可读形式或者机器可以解析的形式。而且接着进行的扫描不能增加新的选项,只能使用与被中断的扫描相同的选项。nmap会接着日志文件中的最后一次成功扫描进行新的扫描。
-iL
从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL -,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息。
-iR
让nmap自己随机挑选主机进行扫描。
-p <端口范围>
这个选项让你选择要进行扫描的端口号的范围。例如,-p 23表示:只扫描目标主机的23号端口。-p 20-30,139,60000-表示:扫描20到30号端口,139号端口以及所有大于60000的端口。在默认情况下,nmap扫描从1到1024号以及nmap-services文件(如果使用RPM软件包,一般在/usr/share/nmap/目录中)中定义的端口列表。
-F
快速扫描模式,只扫描在nmap-services文件中列出的端口。显然比扫描所有65535个端口要快。
-D
使用诱饵扫描方法对目标网络/主机进行扫描。如果nmap使用这种方法对目标网络进行扫描,那么从目标主机/网络的角度来看,扫描就象从其它主机(decoy1,等)发出的。从而,即使目标主机的IDS(入侵检测系统)对端口扫描发出报警,它们也不可能知道哪个是真正发起扫描的地址,哪个是无辜的。这种扫描方法可以有效地对付例如路由跟踪、response-dropping等积极的防御机制,能够很好地隐藏你的IP地址。
每个诱饵主机名使用逗号分割开,你也可以使用ME选项,它代表你自己的主机,和诱饵主机名混杂在一起。如果你把ME放在第六或者更靠后的位置,一些端口扫描检测软件几乎根本不会显示你的IP地址。如果你不使用ME选项,nmap会把你的IP地址随机夹杂在诱饵主机之中。
注意:你用来作为诱饵的主机应该正在运行或者你只是偶尔向目标发送SYN数据包。很显然,如果在网络上只有一台主机运行,目标将很轻松就会确定是哪台主机进行的扫描。或许,你还要直接使用诱饵的IP地址而不是其域名,这样诱饵网络的域名服务器的日志上就不会留下关于你的记录。
还要注意:一些愚蠢的端口扫描检测软件会拒绝路由试图进行端口扫描的主机。因而,你需要让目标主机和一些诱饵断开连接。如果诱饵是目标主机的网关或者就是其自己时,会给目标主机造成很大问题。所以你需要慎重使用这个选项。
诱饵扫描既可以在起始的ping扫描也可以在真正的扫描状态下使用。它也可以和-O选项组合使用。
使用太多的诱饵扫描能够减缓你的扫描速度甚至可能造成扫描结果不正确。同时,有些ISP会把你的欺骗包过滤掉。虽然现在大多数的ISP不会对此进行限制。
-S <IP_Address>
在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况下,可以使用这个选项给出你的IP地址。
在欺骗扫描时,也使用这个选项。使用这个选项可以让目标认为是其它的主机对自己进行扫描。
-e
告诉nmap使用哪个接口发送和接受数据包。nmap能够自动对此接口进行检测,如果无效就会告诉你。
-g
设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者把源端口修改为20或者53,就可以摧毁防火墙的防护。在使用UDP扫描时,先使用53号端口;使用TCP扫描时,先使用20号端口。注意只有在能够使用这个端口进行扫描时,nmap才会使用这个端口。例如,如果你无法进行TCP扫描,nmap会自动改变源端口,即使你使用了-g选项。
对于一些扫描,使用这个选项会造成性能上的微小损失,因为我有时会保存关于特定源端口的一些有用的信息。
-r
告诉nmap不要打乱被扫描端口的顺序。
--randomize_hosts
使nmap在扫描之前,打乱每组扫描中的主机顺序,nmap每组可以扫描最多2048台主机。这样,可以使扫描更不容易被网络监视器发现,尤其和--scan_delay 选项组合使用,更能有效避免被发现。
-M
设置进行TCP connect()扫描时,最多使用多少个套接字进行并行的扫描。使用这个选项可以降低扫描速度,避免远程目标宕机。

4.3 适时选项

通常,nmap在运行时,能够很好地根据网络特点进行调整。扫描时,nmap会尽量减少被目标检测到的机会,同时尽可能加快扫描速度。然而,nmap默认的适时策略有时候不太适合你的目标。使用下面这些选项,可以控制nmap的扫描timing:

-T
设置nmap的适时策略。Paranoid:为了避开IDS的检测使扫描速度极慢,nmap串行所有的扫描,每隔至少5分钟发送一个包;Sneaky:也差不多,只是数据包的发送间隔是15秒;Polite:不增加太大的网络负载,避免宕掉目标主机,串行每个探测,并且使每个探测有0.4秒种的间隔;Normal:nmap默认的选项,在不是网络过载或者主机/端口丢失的情况下尽可能快速地扫描;Aggressive:设置5分钟的超时限制,使对每台主机的扫描时间不超过5分钟,并且使对每次探测回应的等待时间不超过1.5秒钟;b>Insane:只适合快速的网络或者你不在意丢失某些信息,每台主机的超时限制是75秒,对每次探测只等待0.3秒钟。你也可是使用数字来代替这些模式,例如:-T 0等于-T Paranoid,-T 5等于-T Insane。
这些适时模式不能下面的适时选项组合使用。
--host_timeout
设置扫描一台主机的时间,以毫秒为单位。默认的情况下,没有超时限制。
--max_rtt_timeout
设置对每次探测的等待时间,以毫秒为单位。如果超过这个时间限制就重传或者超时。默认值是大约9000毫秒。
--min_rtt_timeout
当目标主机的响应很快时,nmap就缩短每次探测的超时时间。这样会提高扫描的速度,但是可能丢失某些响应时间比较长的包。使用这个选项,可以让nmap对每次探测至少等待你指定的时间,以毫秒为单位。
--initial_rtt_timeout
设置初始探测的超时值。一般这个选项只在使用-P0选项扫描有防火墙保护的主机才有用。默认值是6000毫秒。
--max_parallelism
设置最大的并行扫描数量。--max_parallelism 1表示同时只扫描一个端口。这个选项对其它的并行扫描也有效,例如ping sweep, RPC scan。
--scan_delay
设置在两次探测之间,nmap必须等待的时间。这个选项主要用于降低网络的负载。

4.4 目标设定

在nmap的所有参数中,只有目标参数是必须给出的。其最简单的形式是在命令行直接输入一个主机名或者一个IP地址。如果你希望扫描某个IP地址的一个子网,你可以在主机名或者IP地址的后面加上/掩码。掩码在0(扫描整个网络)到32(只扫描这个主机)。使用/24扫描C类地址,/16扫描B类地址。

除此之外,nmap还有更加强大的表示方式让你更加灵活地指定IP地址。例如,如果要扫描这个B类网络128.210.*.*,你可以使用下面三种方式来指定这些地址:128.210.*.*、128.21-.0-255.0-255或者128.210.0.0/16这三种形式是等价的。

5.例子

本节将由浅入深地举例说明如何使用nmap。

nmap -v target.example.com
扫描主机target.example.com的所有TCP端口。-v打开冗余模式。

nmap -sS -O target.example.com/24
发起对target.example.com所在网络上的所有255个IP地址的秘密SYN扫描。同时还探测每台主机操作系统的指纹特征。需要root权限。

nmap -sX -p 22,53,110,143,4564 128.210.*.1-127
对B类IP地址128.210中255个可能的8位子网的前半部分发起圣诞树扫描。确定这些系统是否打开了sshd、DNS、pop3d、imapd和4564端口。注意圣诞树扫描对Micro$oft的系统无效,因为其协议栈的TCP层有缺陷。

nmap -v --randomize_hosts -p 80 '*.*.2.3-5'
只扫描指定的IP范围,有时用于对这个Internet进行取样分析。nmap将寻找Internet上所有后两个字节是.2.3、.2.4、.2.5的IP地址上的WEB服务器。如果你想发现更多有意思的主机,你可以使用'127-222',因为在这个范围内有意思的主机密度更大。

host -l company.com | cut '-d ' -f 4 | ./nmap -v -iL -
列出company.com网络的所有主机,让nmap进行扫描。注意:这项命令在GNU/Linux下使用。如果在其它平台,你可能要使用 其它的命令/选项。

 
原创粉丝点击