扫描器之王-----nmap(一)
一。简介
nmap用于允许系统管理员察看一个大的网络系统有哪些主机以及其上运行的何种服务程序。它支持多种协议的扫描,如udp、tcp connect()、tcp syn(半开)、ftp proxy(跳板攻击)、reverse-ident、icmp(ping)、fin、ack sweep、xmas tree、syn sweep和null扫描。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[扫描选项][扫描目标]即可进行扫描分析。
使用扫描选项可以精确的定义扫描的模式。下面就介绍一些nmap的常用扫描选项,这些选项通常都是可组合使用的。即使错误的使用了选项也没有关系,nmap将会对不规范的参数组合作出提示。如果你在扫描过程中需要查询nmap的选项用法,可以使用nmap -h来打开关于nmap选项参数的简介。
-sT:tcp connect()扫描
这是对tcp得最基本形式的侦测。在该操作下,该connect()对目标主机上感兴趣的端口进行试探,如果该端口被监听,则连接成功,否则代表这个端口无法到达。
-sS:tcp syn扫描
“半开”式的扫描----不打开完整的tcp连接,发送一个syn信息包并等待对方的回应。这种扫描的的最大好处是只有极少的站点会对他作出记录,但是需要有root权限来定制这些syn包。
-sF -sX -sN
tealth FIN、Xmas Tree或者Null扫描模式有时甚至syn扫描都不够隐蔽,一些防火墙及信息包过滤装置会在重要端口守护,syn包在此时会被截获,一些应用软件如Synlogger以及Courtney对侦测这种类型的扫描都是行家。所以,要有更进一步的扫描。
由于关闭的端口会对发送的探测信息返回一个rst,而打开得端口则对其忽略不理(想要了解详细资料可以参阅rfc973第64页)。所以fin扫描使用空的fin信息包作为探针,Xmas tree使用fin、urg、push标记,Null扫描则不用任何标记。但是不幸的是,微软以它一贯的风格不理睬这一标准,所以这一扫描在windows 9x以及nt下不能工作。
从积极的方面来讲,这其实也是一个很好的区分两种平台的办法---如果这次扫描发现了打开的端口,那就能知道这台机器运行的不是windows。如果-sF、-sX、-sN的扫描显示所有端口都是关闭的,但一个syn(-sS)扫描却显示有打开端口,那就能大致推断他是windows平台。这只是一个简单应用,因为现在nmap已经有了更彻底的操作系统辨别方法。
-sP
ing扫描有时攻击者仅希望了解网络上有哪些主机是开放的,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端口在主机端开放。这一技术是发送零字节的udp信息包到目标机器的各个端口,如果收到一个icmp端口无法到达的回应,那么该端口是关闭的,否则可以认为它是敞开的。有些人或许认为udp扫描是无意义的,但现在的solaris rpcbind漏洞否定了这一点。
rpcbind会把一个非正式的udp端口隐藏在32770以上的端口,因此仅对
rpcbind得端口(111)进行防火墙过滤是毫无用处的。通过查找30000以上的端口是否处在监听状态中就可以发现相关的rpc服务,而使用udp扫描就能轻松的做到这一点。
或者我们还可以想想cdc出品的back orifice木马。它可以在windows的机器中配置一个udp端口,更不用说如此众多可以利用udp的易受攻击的服务,如snmp、ftp、nfs等。但有一点不得不提及的是udp扫描,在目标主机按照rfc1812建议的那样限制icmp错误信息的传送速率时,会造成及其运行非常慢。举例来说,linux的核心配置限制了每4秒产生80次得无法到达信息----每次产生1/4秒的延迟。solaris有着更严格的限制(大约每秒两次就会延迟),所以这要耗费相当长的时间。nmap会侦测到这种限制并自动减缓速度----这也胜过用无意义的、会被目标主机忽略的大量信息包来填充这个网络。微软不在乎rfc所建议的事,而且没有任何限制性措施实行与windows9x或nt上,这样我们就可以把多达65k得端口以极高的速度扫描完毕。
------未完,待续。
-sR:RPC扫描
这一方法是结合nmap多种扫描的一种模式,它取得所有的tcp/udp开放端口,并且用sunrpc程序的null命令来试图确定是否是rpc端口,如果是的话,就察看其上运行的是什么程序、何种版本。这样,在目标主机多在防火墙后或者由tcp wrappers防护时,它都能取得效果近似于“rpcinfo-p”的信息。Decoy现在还不能正常工作在rpc扫描下,但相信以后会在udp rpc扫描中加入Decoy支持的。
-b (ftp relay host):FTP跳跃攻击
ftp协议的一个有趣的特点是它支持代理ftp连接,也就是说,可以从evil.com连接到一个ftp服务器target.com,并且要求目标主机发送文件到因特网的任何地方。ftp这一特性被公布并逐渐地施行起来。但现在的网络上不允许人们能够随意的“抢劫”一个ftp服务器,并请求数据到任何地方。所以在hobbit于1995年写下有关这一协议的缺陷时说到,它可以用来从许多站点上发出事实上难以追查的信件、新闻以及攻击性行为来填充硬盘,试图使防火墙失效或者更多的是烦人而无意义的骚扰。开发nmap是为了通过一个代理ftp服务器察看tcp端口,这样可以连上一个在防火墙后的ftp服务器,然后扫描他的看起来被关闭的端口(例如139端口)。如果ftp服务器允许读甚至写进行某些目录(比如/incoming),可以发送任意信息到打开的端口(当然nmap不能进行这项工作)。要通过“b"选项来使主机成为代理时,标准的url格式形式是:usename
assword@serverort。它的更新本本在http://www.insecure.org/nmap。下面我要说的是一些常规选项,这些选项并非必须,但有些是非常实用的。-P0
在扫描前不尝试 ping主机。这是用来扫描那些不允许icmp echo请求的主机。microsoft.com就是其中的一个例子,我们必须使用-p0或者-p80来查看microsoft.com的端口。
-PT
用tcp的ping来确定主机是否打开。作为替代发送icmp echo请求抱并等待回应,打开的主机会返回一个rst。这一参数可以使用ping信息包被阻塞时仍能高效率的扫描一个网络/主机。对于非root的用户,可以用connect(),以如下格式设置目标探针:PT,默认的端口是80,因为这个端口往往被过滤。
-PS
这一选项是root用户使用的,能用syn(连接请求)包替代ack包,打开的主机会有一个rst(或者syn/ack,但比较少见)应答。
―Pl
这一选项是使用一个真正的ping(icmp echo request)包,它找到开放的主机并且将该子网中的广播地址全数搜寻----该广播地址能够到达并能正确解析ip包。如果其被大量的dos攻击时,我们就能找到它。
-PB
默认的ping形式,用于ack(-PT)与icmp(-pI)并行攻击,以这一形式可以通过防火墙或包过滤。
-O
经由tcp/ip获取“指纹”来判别主机的操作系统类型,用另一种说法,就是用一连串的信息包探测出所扫描的主机位于操作系统有关堆栈的信息,并区分其精细差异,以此判别操作系统。它用搜集到的信息建立一个“指纹”,用来同已知的操作系统的指纹相比较(the nmap-os-fingerrprints file),这样判定操作系统就有了依据。
但有时nmap也会得到错误的诊断信息,比如系统有端口开放。但nmap返回不可识别的操作系统,这也是有可能的,这时可以用另一个办法----nmap的-d参数来测试。
-l
这是用ident扫描方式的参数,如Dave Goldsmith于1996年在bugtraq中所说的,这个ident协议允许通过tcp连接到拥有进程的用户名----即使这个连接不是有该进程发起的。所以可以通过ident连接到一个http端口并找出该进程是否由root运行,但这只能在“全开”的对目标端口的tcp连接中使用(像-sT扫描参数)。当用-I参数时,远程主机的ident在开放的端口接收连接查询-----很明显,如果主机不运行ident的话,它就无法正常工作。
-f
这个参数配