Nmap备忘单:从探索到漏洞利用 第三章 NSE脚本的使用
众所周知nmap是经常用来进行端口发现、端口识别。除此之外我们还可以通过nmap的nse脚本做很多事情,比如邮件指纹识别,检索whois记录,使用udp服务等。
发现地理位置
gorjan petrovski提交了个nmap的nse脚本,帮助我们定位远程ip的地理位置:ip-geolocation-maxmind,ip-geolocation-ipinfodb,和ipgeolocation-geobytes。
这将告诉我们如何设置并使用附带的nmap nse的地理位置脚本。
ip-geolocation-maxmind
为了能调用该脚本,需要先下载maxmind的城市数据库http://geolite.maxmind.com/download/geoip/database/geolitecity.dat.gz。解压到本地的nmap数据文件夹($nmap_data/nselib/data/)。
命令:
nmap --script ip-geolocation-* ip
提交新的地理位置提供商
有时地理位置可能是错误的,因为地理位置取决于的maxmind数据库。因此我们必须给nmap提供一个新的数据库。
获得whois记录信息
whois记录通常包含如注册人的姓名和联系方式的重要数据。虽然这里有很多工具可以查询whois协议,但nmap的证明了自身的优秀,因为它能够批量处理ip范围和主机列表。
命令:nmap --script whois 目标
--script whois查询参数告诉nmap的,以获得给定目标的记录。此脚本使用iana分配的数据来选择rir,它的结果在本地缓存。另外,我们可以覆盖此行为,并选择服务提供商的说法whodb使用的顺序:
参数--script whois告诉nmap去查询区域互联网注册管理机构whois数据库来获得给定目标的whois记录。这个脚本使用iana分配的数据选择rir并在本地缓存结果。或者我们可以覆盖这一行为,指定whois数据库的提供商并依次查询。
命令:
nmap --script whois --script-args whois.whodb=arin+ripe+afrinic <目标>
该脚本将会按顺序在whois提供商中查询记录或者推荐记录,要忽略推荐记录请指定参数值nofollow。
命令:nmap --script whois --script-args whois.whodb=nofollow <目标>
要批量查询的主机名列表(-il <文件名>)的whois记录而不启用端口扫描(-sn)。命令:nmap -sn –script whois -v -il hosts.txt (hosts.txt包含主机或者ip的列表)
禁用缓存
有时候whois查询返回的是缓存的结果而不是最新的,可以指定参数禁止查询缓存。
命令:
nmap -sn --script whois -script-args whois.whodb=nocache scanme. nmap.org
检查主机是否有恶意行为
nmap通过调用谷歌安全浏览服务api来检查主机是否进行恶意软件分发或者网络钓鱼攻击的行为。
使用脚本http-google-malware之前,先获取谷歌安全浏览服务api的密钥:
命令:
nmap -p80 -script http-google-malware -script-args http-google-malware.api=<api> <目标>
如果不使用api,也可以进行查询。
命令:nmap -p80 --script http-google-malware -v scanme.nmap.org
收集有效的邮箱
收集邮箱对渗透测试非常有用,我们可以对这些邮箱进行钓鱼工具或者暴力破解攻击。nmap可以进行邮箱的收集,但是脚本http-google-email不在nmap的官方资料库中,我们需要手动下载http://seclists.org/nmap-dev/2011/q3/att-401/http-google-email.nse,并把它复制到本地脚本目录。正如你所看到的,下面的截图有电子邮件收集脚本的详细信息:
但作为一名安全研究人员必须要了解脚本,因为脚本可能包含恶意的东西。所以下面介绍关于脚本的详细信息。下面就是下载的脚本内容,这样你就不必再下载,可以直接使用该脚本。
找到所有的nse脚本的最简单方法是使用find命令如下所示。
description = [[ http-google-email queries the google web search engine and google groups for e-mails pertaining to a specific domain. ]] --- -- @usage -- nmap -p80 --script http-google-email <host> -- -- @output -- port state service -- 80/tcp open http -- | http-google-email: -- | nmap-dev () insecure org -- | nmap-svn () insecure org -- |_fyodor () insecure org -- -- @args http-google-email.domain domain to search for. -- @args http-google-email.pages the number of results pages to be requested from google web search and google group search respectively. default is 5. --- author = "shinnok" license = "same as nmap--see http://nmap.org/book/man-legal.html" categories = {"discovery", "safe", "external"} require "http" require "shortport" portrule = shortport.http --builds google web search query --@param domain --@param page --@return url local function google_search_query(domain, page) return string.format("http://www.google.com/search?q=%%40%s&hl=en&lr=&ie=utf-8&start=%s&sa=n", domain, page) end --builds google groups search query --@param domain --@param page --@return url local function google_groups_query(domain, page) return string.format("http://groups.google.com/groups?q=%s&hl=en&lr=&ie=utf-8&start=%s&sa=n", domain, page) end --- --main --- action = function(host, port) local pages = 50 local target local emails = {} if(stdnse.get_script_args("http-google-email.pages")) then pages = stdnse.get_script_args("http-google-email.pages")*10 end -- check if we have the domain argument passed if(stdnse.get_script_args("http-google-email.domain")) then target = stdnse.get_script_args("http-google-email.domain") else -- verify that we have a hostname available if not(host.targetname) then return string.format("[error] host can not be resolved to a domain name.") else target = host.targetname end end stdnse.print_debug(1, "%s: checking domain %s", script_name, target) -- google web search for page=0, pages, 10 do local qry = google_search_query(target, page) local req = http.get_url(qry) stdnse.print_debug(2, "%s", qry) stdnse.print_debug(2, "%s", req.body) body = req.body:gsub('<em>', '') body = body:gsub('</em>', '') if body then local found = false for email in body:gmatch('[a-za-z0-9%.%%%+%-]+@' .. target) do for _, value in pairs(emails) do if value == email then found = true end end if not found then emails[#emails+1] = email end end end end -- google groups search for page=0, pages, 10 do local qry = google_groups_query(target, page) local req = http.get_url(qry) stdnse.print_debug(2, "%s", qry) stdnse.print_debug(2, "%s", req.body) body = req.body:gsub('<b>', '') body = body:gsub('</b>', '') if body then local found = false for email in body:gmatch('[a-za-z0-9%.%%%+%-]+@' .. target) do for _, value in pairs(emails) do if value == email then found = true end end if not found then emails[#emails+1] = email end end end end if #emails > 0 then return "\n" .. stdnse.strjoin("\n", emails) end end
find / -name ‘*.nse’
一般情况下的路径可能是usr/share/nmap/scripts。
找到脚本文件所在的目录后,切换到这个目录,执行wget命令,当然你也可以手动拷贝一份到这个目录。
看下脚本内容是否正确。
拷贝了http-google-email.nse之后,我们需要手动更新脚本数据库,执行如下的命令:
nmap -script-updatedb
更新完成后,就可以运行脚本了。
nmap -p80 –script http-google-email <目标>
nse脚本参数
选项–script-args是用于设置nse脚本的参数。例如:
nmap -sv --script http-title --script-args http.useragent=”mozilla 999 ” <目标>
以上命令设置了参数useragent的值。
获取主机信息并进一步深入
作为一个专业的安全测试人员我们应该进一步获得关于网络或主机的附加信息去推动渗透测试。
-o参数用来探测目标操作系统:
命令:nmap -o 目标
通过分析目标的响应是否符合某些操作系统的特征,从而判断目标操作系统的类型。为了能更准确的探测操作系统,目标主机至少要有一个开放的端口和关闭的端口。当扫描多个目标时,选项–osscan-limit可以忽略不满足这个要求的主机以加快扫描速度。使用选项-v可以展示扫描过程。
命令:nmap -v -o 目标
在某些情况下nmap不能确定操作系统时,它会显示一个指纹。该指纹可以提交到nmap的数据库中(nmap.org/submit/)
提交生成的指纹,并正确识别目标的操作系统,我们可以改善nmap的操作系统检测功能在未来的版本中的准确性。
猜测操作系统
如果nmap无法确定操作系统类型,通过选项–osscan-guess强制识别os。
命令:nmap -o –osscan-guess 目标
它将列出的nmap脚本数据库操作系统的所有可能的匹配。–fuzzy可以用作–osscan-guess的快捷方式。
如果目标至少有一个开放和一个关闭的tcp端口那么操作系统的类型识别会比较有效。选项–osscan-limit将会使nmap不对没有满足这个要求的目标进行操作系统的识别。这样可以节省大量的时间,尤其是在对许多主机-pn扫描。它只与选项-o或者-a搭配使用。
–max-os-tries(设置针对目标的操作系统检测的最大尝试次数)
当nmap针对目标进行操作系统检测,并未能找到一个完美的匹配时,它通常会重复尝试。默认情况下,如果环境条件比较好,nmap会尝试五次,如果条件比较差那么只会尝试二次。指定 –max-os-tries的值比较低的话(比如1)会加快nmap的速度,但可能会错过潜在的可识别的目标。
命令:map -o –max-os-tries 目标
扫描时显示调试信息
选项 –version-trace会让nmap显示详细的扫描内容。
命令:nmap -sv –version-trace 目标
执行rpc扫描
选项-sr对目标进行rpc(远程过程调用)扫描
命令:nmap -sr 目标
上述-sr扫描的输出显示有关目标系统上运行的rpc服务的信息。rpc与unix和linux系统上的nfs(网络文件系统)服务关系很紧密。
nmap扫描使用-hostmap选项
此hostmap脚本基于第三方服务,而官方版本只支持bfk的dns历史记录。正如我前面所说的,下载脚本
(nmap.org/nmap/scripts/hostmap-bfk.nse)并更新nmap的脚本数据库,然后执行命令:
nmap -p80 –script hostmap nmap.org
这些参数–script hostmap -p80告诉nmap的启动http版的hostmap脚本,并限制只扫描80端口以加快这一任务。
该hostmap.nse查询两个不同的web服务:bfk dns记录和ip2hosts.com。 bfk dns记录是一项免费服务,从公共dns数据和ip2hosts收集其信息。这两项服务都是免费的,滥用他们将很有可能让你禁止使用该服务。
可以设定参数指定不同的搜索引擎。
nmap -p80 –script hostmap –script-args hostmap.provider=bing <目标>
nmap -p80 –script hostmap –script-args hostmap.provider=bfk <目标>
nmap -p80 –script hostmap –script-args hostmap.provider=all <目标>
为了保存扫描每个ip的主机名,使用参数hostmap.prefix。设置此参数将创建一个在我们的工作目录<前缀><目标>文件名的文件:
nmap -p80 –script hostmap-script-args hostmap.prefix=hostfile <目标>
暴力破解dns记录
这是用于试图通过暴力枚举dns主机名猜测常见的子域。指定dns-brute.srv,dns-bruter也将尝试列举常见的dns srv记录。
nmap的时间选项
时间选项是什么,为什么?
作为一个渗透测试人员,我们通常会在在nmap上设置时间选项,但我们必须得了解时间选项是什么,为什么要设置这个选项?
我们使用nmap的时候经常会遇到防火墙,这些防火墙会阻碍某些请求。我们会根据需求设置时间选项以加快或减慢nmap的扫描速度。
当在快速网络中(比如内网)扫描大量的主机时,我们可能需要增加并行操作的数量以便更快的获得结果。另外在扫描速度慢的网络时(或在互联网上),你可能需要减慢扫描速度以获得更准确的结果,或者逃避入侵检测系统。下面是一些nmap的时间选项。
时间参数
默认情况下我们扫描使用的nmap是在几秒钟内开始扫描。但是我们可以通过设置时间参数进一步提高性能。nmap支持下列的时间格式:
m-分钟
s-秒
ms-毫秒
h-小时
有时如何选择时间参数可能会让人感到困惑,我们将设置多少时间用于扫描。要解决这些问题,nmap的提供了如下多种扫描时序选项。
命令:nmap -t[0-5] 目标
选项0:
这是一个非常缓慢的扫描选项,以便防火墙或ids不会阻断该请求。
命令:nmap -t0 目标
选项1:
比选项0稍微快一点点的扫描速度,用于绕过防火墙和ids。
命令:nmap -t1 目标
虽然t0和t1对于避免ids报警非常有用,但它们将会花非常多的时间来扫描数千个端口或者服务器。
选项2:
比较“礼貌”的选项,占用较少的带宽以及目标计算机的资源。
命令:nmap -t2 目标
选项3:
这是nmap的默认选项,常规的扫描速度和资源占用。
命令:nmap -t3 目标
选项4和5:
在t4和t5是一个非常快速和侵略性的扫描。假设在一个相当快速和可靠的网络中,t4可以加速扫描。t5则是在此基础之上牺牲了准确性。
命令:nmap -t4/-t5 目标
并行选项:
作为一个pentester我们不应该通过一个接一个的扫描浪费我们的时间。相反,我们可以通过并行扫描来优化。nmap将目标ip段进行分组,然后在一次扫描一个组。一般情况下较大的分组是更有效的。缺点直到整个分组完成才能知道目标主机的情况。
并行处理有两个选项:最大值和最小值。
min:
选项–min-parallelism用于指定并行端口扫描操作的最小数量。
nmap –min-parallelism [数量] [目标]
手动设置–min-parallelism选项可能会提升扫描性能,设置过高可能会产生不准确的结果。
max:
选项–max-parallelism用于指定并行端口扫描操作的最大数量。
nmap –max-parallelism [数量] [目标]
主机分组大小选项:
nmap也可以设置主机分组的最大值和最小值。
max:
选项–max-hostgroup用于指定的nmap并行扫描主机数的最大值。
nmap –max-hostgroup [数目] [目标]
min:
选项–min-hostgroup用于指定的nmap并行扫描主机数的最小值。
nmap –min-hostgroup [数目] [目标]
在扫描一个ip段或整个子网时nmap将并行扫描多个目标以节省时间。默认情况下,基于扫描类型和网络条件nmap会 自动调整正在执行的主机组的大小。通过指定–min-hostgroup选项,nmap尝试保持主机组的大小为指定值。
设置最大值会有效避免网络拥堵和避免网内安全设备的告警。
rtt 超时
tcp连接中,rtt(往返超时)是用于在通信中的滑动窗口协议超时值的测定,并依赖于以下要点:如果超时值太小,源很快就超时,造成不必要的重传;另一方面,如果在超时值太大,则源会花费太长的时间以从错误中恢复。
nmap会维持一个超时值,决定它等待探针响应的时间,以及再次发送探针的间隔。这是基于以前的探针的响应时间来计算。
在扫描过程中,nmap计算这些响应时间值的内部流程如下:
srtt - 平滑往返时间:这个响应时间的 估算是基于观察客户端到服务端之间的通信状况如何。这个值以微秒计算。
rttvar - 往返时间方差:网络通信可以是非常难以预测的,而nmap通过创造一系列超时值去补偿这种不确定性。如果未在此方差内接收响应,则nmap认为这一个响应不可能永远出现。
nmap初始超时
它控制网络响应初始超时。
命令:nmap –initial-rtt-timeout [时间] [目标]
增加时间值将减少因超时分组重发的次数。通过降低值我们可以加快扫描,但我们必须小心这样做。设置rtt超时值太低,可以抵消任何潜在的性能提升,并导致结果不准确。
rtt最大值
选项–max-rtt-timeout用于指定最大rtt(往返时间)数据包响应超时。
命令:nmap –max-rtt-timeout [时间] [目标]
默认情况下为达到最佳效果nmap会动态调整rtt超时选项。最大rtt超时缺省值为10秒。手动降低 最大rtt超时将允许更快的扫描(尤其是当扫描大块地址)。提高最大rtt超时将防止nmap在网络状况不佳的情况进行扫描时过早地放弃。典型值是在 100毫秒(快速/可靠的网络)和10000毫秒( 慢速/不可靠的网络)之间。
最大尝试次数
这个选项用于设置每个探针最大的重复次数。
命令:nmap –max-retries [数目] [目标]
默认情况下,nmap基于网络状况自动调整探针重传次数。如果我们要覆盖默认设置或解决连接问题的可以使用–max-retries选项。指定的数值会增加它完成一个扫描需要的时间,但会产生更精确的结果。降低–max-retries 我们可以加快扫描,但我们可能无法得到准确的结果。
ttl选项
ttl(存活时间)是因特网协议(ip)报文分组中的一个值,用于告诉网络路由器分组是否已经在网络中的时间过长而应丢弃。从渗透测试者的角度来看,一个ttl值可以帮助了解有关目标的大量信息。
选项–ttl用于指定扫描中的ttl值。
命令:nmap –ttl [时间] [目标]
使用此选项发送的数据包都会有指定的ttl值。扫描目标时连接速度很慢,其中正常数据包可能会接收到响应之前超时,此选项很有用。
主机超时选项
选项–host-timeout指定nmap在超时多少时间后放弃对主机的扫描。
命令:nmap –host-timeout [时间] [目标]
如果它位于慢速或不可靠的网络上主机可能需要较长的时间来扫描。由速率限制防火墙保护的系统也可能需要相当长的时间来进行扫描。选项–host-timeout指示nmap如果如果指定时间内未能完成扫描则放弃目标。在上述的例子中,扫描实际上花费更长的时间(超过一分钟)才能完成,这将导致的nmap终止扫描(因为已经指定一分钟内)。扫描跨wan或internet连接的多个系统时,此选项特别有用。
最小扫描延迟
选项–scan-delay指示nmap在发送探针之间的指定的最小时间间隔是多久。
命令:nmap –scan-delay [时间] [目标]
一些系统会采用速率限制阻碍nmap扫描尝试。默认情况下nmap会检测系统的速率限制自动调节扫描延迟。在某些情况下我们需要自己设置扫描延迟比如在限速或有ids防护的情况下。
最大扫描延迟
选项–max-scan-delay指示nmap在发送探针之间的指定的最大时间间隔是多久。
命令:nmap –max-scan-delay [时间] [目标]
指定–max-scan-delay这样可以加快扫描,但是会降低扫描精度,同时网络负载会变大。
最小发包速率
选项–min-rate用来指定nmap每秒钟发送的数据包数量最小是多少。
命令:nmap –min-rate [数量] [目标]
最大发包速率
选项–max-rate用来指定nmap每秒钟发送的数据包数量最大是多少。
命令:nmap –max-rate [数量] [目标]
在上面的例子中,–max-rate 30指示nmap每秒发送不超过30个数据包。这会大大减缓扫描速度,但对试图躲避入侵检测系统或者扫描有速率限制的目标有帮助。
绕过rst包速率限制
选项–defeat-rst-ratelimit用于通过发送rst(重置请求)包来进行速率限制的主机。
命令:nmap –defeat-rst-ratelimit [目标]
选项–defeat-rst-ratelimit在目标通过发送rst包来限制扫描速率的情况下非常有用,它可以加快扫描速度,然而会影响结果的准确度。不过这种情况非常少见,正因如此也很少使用这个选项。
到这里文章就结束了,在下一部分,我会介绍如何使用nmap进行防火墙绕过,web服务审计,web应用程序渗透测试,以及nmap脚本引擎的开发。
引用:
*参考来源:resources.infosecinstitute,fb小编东二门陈冠希编译,转载请注明来自freebuf黑客与极客(freebuf.com)