枚举启用的 apache 模块的技术

信息安全 渗透测试 阿帕奇
2021-08-26 03:13:41

安全测试人员注意到的一个常见问题是 Apache Web 服务器在标头中报告了一个比最新可用版本更旧的版本。

这通常会导致 CVE 列表详细说明该版本产品中存在的漏洞,黑盒测试人员面临的一个典型挑战是确定服务器上启用了哪些模块,因为漏洞通常存在于模块中,而不是核心 Apache 服务器.

所以问题是,是否有任何通用技术可用于黑盒安全测试,以识别/枚举正在运行的 Apache 服务器上启用的模块?

3个回答

是否有任何通用技术可用于黑盒安全测试,以识别/枚举正在运行的 Apache 服务器上启用的模块?

tl;dr:您无法检测到所有已安装/启用的模块,如果您不想 X-MISS 某些东西,则需要手动分析标头

我们使用自定义工具来调查所有服务器标头;这个用python编写的工具模拟浏览器请求并显示从服务器发回的所有内容(下面的示例)

除了 apache/module-version 之外,X-Powered-by 也很有趣,因为如果没有正确过滤,它可能会提示您使用的应用程序服务器(如果有)或 php 版本(谷歌:php easteregg)。rack(如在 ruby​​-on-rails 中),例如,泄漏了很多 headers,表明使用了 rails (X-Rack-*)

哦,标题分析是手动完成的;我不知道任何可能像这样工作的工具(如果标题 X 然后警告 Y);这只是经验

编辑 1

根据标头检测已安装的模块

  • apache-only,因为 nginx 只显示nginxǹginx/VERSION
  • 请注意:安装的模块也可能会显示在默认错误页面上,如以下从默认 404 错误页面的 html 页面中提取的内容,当ServerSignature On设置时: <address>Apache/2.2.22 (Debian) mod_fcgid/2.3.6 PHP/5.4.4-14+deb7u8 mod_python/3.3.1 Python/2.7.3 Server at localhost Port 80</address>

  • 如果 apache 显示已安装/启用的模块取决于配置选项的设置,称为ServerTokens; 从配置:

    #
    # ServerTokens
    # This directive configures what you return as the Server HTTP response
    # Header. The default is 'Full' which sends information about the OS-Type
    # and compiled in modules.
    # Set to one of:  Full | OS | Minimal | Minor | Major | Prod
    # where Full conveys the most information, and Prod the least.
    
    # examples
    # ServerTokens Full
    Server: Apache/2.2.22 (Debian) mod_fcgid/2.3.6 PHP/5.4.4-14+deb7u8 mod_python/3.3.1 Python/2.7.3
    
    # examples
    # ServerTokens OS
    Server: Apache/2.2.22 (Debian)
    
    # examples
    # ServerTokens Minimal
    Server: Apache/2.2.22
    
    
    # examples
    # ServerTokens Minor
    Server: Apache/2.2
    
    
    # examples
    # ServerTokens Major
    Server: Apache/2
    
    
    # examples
    # ServerTokens Prod
    Server: Apache
    
  • apache2ctl -S -M此外,并非所有加载的模块都与 server-header 一起显示(比较 SeverTokens Full 与来自同一服务器的以下提取

    Loaded Modules:
     core_module (static)
     log_config_module (static)
     logio_module (static)
     version_module (static)
     mpm_prefork_module (static)
     http_module (static)
     so_module (static)
     alias_module (shared)
     auth_basic_module (shared)
     authn_file_module (shared)
     authz_default_module (shared)
     authz_groupfile_module (shared)
     authz_host_module (shared)
     authz_user_module (shared)
     autoindex_module (shared)
     cgi_module (shared)
     deflate_module (shared)
     dir_module (shared)
     env_module (shared)
     fcgid_module (shared)
     headers_module (shared)
     mime_module (shared)
     evasive20_module (shared)
     negotiation_module (shared)
     php5_module (shared)
     python_module (shared)
     reqtimeout_module (shared)
     rewrite_module (shared)
     setenvif_module (shared)
     status_module (shared)
    Syntax OK
    

示例,完整标题

  • 谷歌标题

    [+] sending now:
    
    GET / HTTP/1.1
    Host: www.google.com
    Connection: close
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.7.3) Gecko/20040910
    
    
    [+] lines ins answer: 17  
    [+] www.google.com :: 173.194.69.104 
    
    
    HTTP/1.1 302 Found
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    Location: http://www.google.de/?gfe_rd=cr&ei=GzpBU8fYBIGKtQaAo4GYCA
    Content-Length: 258
    Date: Sun, 06 Apr 2014 11:27:23 GMT
    Server: GFE/2.0
    Alternate-Protocol: 80:quic
    Connection: close
    
  • server-headers,泄露 php-version,易受php 复活节彩蛋攻击

    [+] sending now:
    
    
    GET / HTTP/1.1
    Host: www.cs.utexas.edu
    Connection: close
    User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204
    
    
    
    > ssl-info
    ('128.83.120.139', 443)
    ('DHE-RSA-AES256-SHA', 'TLSv1/SSLv3', 256)
    > do you want to check with openssl? [y|N] : 
    
    [+] lines ins answer: 14  
    [+] www.cs.utexas.edu :: 128.83.120.139 
    
    
    HTTP/1.1 200 OK
    Date: Sun, 06 Apr 2014 12:36:16 GMT
    Server: Apache/2.2.14 (Ubuntu)
    X-Powered-By: PHP/5.3.2-1ubuntu4.23
    Set-Cookie: SESScf56....; path=/; domain=.cs.utexas.edu
    Last-Modified: Sun, 06 Apr 2014 12:33:53 GMT
    ETag: "4eb53eded35299af56b68617202f579c"
    Expires: Sun, 19 Nov 1978 05:00:00 GMT
    Cache-Control: must-revalidate
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=utf-8
    
  • server-headers, 可能在 rails 前的反向代理, 泄露 rack-version, 可能已经过时并且容易受到一些已经发布的漏洞的攻击

    [+] sending now:
    
    
    GET / HTTP/1.1
    Host: XXXXX.COM
    Connection: close
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.3b) Gecko/20030210
    
    
    
    > ssl-info
    ('1.2.3.4', 443)
    ('ECDHE-RSA-AES128-SHA256', 'TLSv1/SSLv3', 128)
    > do you want to check with openssl? [y|N] : 
    
    [+] lines ins answer: 18  
    [+] XXXXX.COM :: 1.2.3.4
    
    
    HTTP/1.1 200 OK
    Date: Sun, 06 Apr 2014 12:38:02 GMT
    Server: Apache
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: Fri, 01 Jan 1990 00:00:00 GMT
    X-Runtime: 11
    X-Powered-By: rack 1.2
    Set-Cookie: _mailservice_session=BAh7BzoPc...-; path=/; HttpOnly; secure
    ETag: "813d4fb6faa576ffd22fbbe44abfa0d9"
    Content-Length: 17654
    Status: 200 OK
    Vary: Accept-Encoding
    Connection: close
    

编辑 2

标题可能会说明更多信息;以下代码段是在黑盒安全分析期间收集的,可识别应可见的其他服务器,从而检测到运行有漏洞的 smtp 服务的过时、过时的防火墙;在 30 分钟内完全访问该盒子并访问内部网络

    X-Cache: MISS from proxy232.xxxx.com
    X-Cache-Lookup: MISS from proxy232.xxxx.com:80
    Via: 1.1 proxy232.xxxx.com:80 (squid/2.7.STABLE3)

这是在黑盒渗透测试的指纹识别步骤中完成的,通常通过漏洞扫描器(例如 Nikto、Nessus、Acunetix、Qualys)通过签名、模式匹配和/或来自 Apache 服务器的信息泄漏来实现。

个人而言,我先进行扫描,如果这还不够,并且我想调查一些可能有趣的事情,我会进入手动模式(总是从谷歌开始)。该方法实际上取决于模块正在做什么,我不知道有任何通用技术用于此目的,我不知道它存在。

这正是 PCI 合规性测试的用途。测试对他们来说什么是黑匣子(即您的服务器)并告诉您他们发现了什么以及是否需要修复(即他们有一个级别来定义是否必须进行修复以考虑您的盒子实际上是安全的。)

它的完成方式相当简单。你编写一个打开并连接到一个 HTTP 端口的软件,你发送一个 GET、POST 和其他方法,然后分析答案。答案包括标题和内容,如果你想进入那个级别,TCP/IP 套接字反应(即他们喜欢做的一个测试是检查 TCP 编号是否被认为是连续的,如果是这样,它更容易中间人拦截未来的连接。即他们连接一次,得到数字 N,然后知道下一个数字将是 N + 1。这有点复杂,但它是可以让你捎带别人的连接......)

一般来说,至少从我目前看到的情况来看,它是针对所有存在的 CVE 完成的。不幸的是,至少对于我合作过的少数 PCI 合规公司来说,他们似乎并不积极主动地告诉你在收到 CVE 之前你应该做的事情......(尽管至少他们不限制自己只是 CVE,他们也经常使用其他来源。)

我认为“那边的那个人”给了你很好的例子。然而,尽管 Apache2 模块可能是一种负担,但大多数漏洞都存在于添加的脚本中,例如 PHP 或 Perl。我可以在我的网站上看到的大多数攻击都会检查您是否在运行 Wordpress、Drupal、Joomla、phpBB……或我最喜欢的攻击之一:phpMyAdmin。这些通常比 Apache2 模块更容易渗透。

但是,无论哪种方式,技术都是相同的。

发送一些 HTTP/1.0 或 HTTP/1.1 GET 以确定该网站上存在的基本内容,然后从那里继续。例如:

wget -S http://www.example.com/ >example.com 2>&1

如您所见,我们将所有输出保存到example.com. 然后运行各种测试以查看可用的标头,以及正文中可能包含的内容(即最常见的,您在<meta ...>标签中找到的内容),您可以检查获取页面需要多长时间,是否有 aLocation: ...等。简单的例子,就是使用sedApache 版本来提取可用的。

默认情况下,Apache2 服务器可能会返回如下内容:

Server: Apache/2.4.18 (Ubuntu)

使用诸如sed(如果您了解 perl,那就更好...)之类的工具,您可以:

sed -e '/^  Server: Apache\//!d' \
    -e '/^  Server: Apache\// s/^  Server: Apache\/\([^\s]*\)\s.*/\1/' \
        example.com

结果将是:

2.4.18

在大多数情况下,如果您要一遍又一遍地重复工作(即自动化测试),将其编写为可以一次又一次地重新运行的脚本是最好的方法。(即你运行一个测试,看到一个问题,让测试失败,请求开发人员修复问题,重新运行测试,如果仍然失败,再次询问开发人员......)显然,如果您不相信自己编写完美正则表达式的能力,您想验证您的脚本是否按照预期执行,尤其是随着时间的推移,随着其他事情的变化。

实际上,您可能需要许多带有“驱动程序脚本”的脚本。即脚本 (1) 可以测试功能 A,然后是脚本 (2) 功能 B,等等。保存各种信息,当您到达脚本 (1001) 时,您可以检查更高级的功能,比如 Wordpress,因为现在您知道了该网站运行该系统,它是 1.2.3 版,因此您知道可能有一个黑客可以用来访问计算机和脚本(1001)是运行该黑客以查看它是否有效。

试图隐藏黑客用来知道你在运行什么的东西几乎是不可能的。Server: ...上面示例中标题一样,公然公然肯定不是一个好主意,即使一个好的黑客有可能确定您的网站正在运行的系统是什么。但是有很多事情是你无法隐藏的。例如,一个 Drupal 站点总是有一个/node页面。虽然你可以隐藏那个,但是有很多这样的可能性(一个好的是/cron.php在 Drupal 下!你真的无法摆脱那个,虽然你可以重命名它......),最后,你不能把它们全部隐藏起来,黑客仍然能够确定你有一个 Drupal 站点,至少是它的主要版本以及它的大部分模块。(也就是说,真的,试图隐藏任何东西都是浪费时间。最好有最新的安全版本......) Wordpress 有众所周知的 wp-admin 和 wp-include 目录。如果 wp-include 得到 403,则该网站可能正在运行 Wordpress。如果您得到的是 404,则很可能该网站没有运行 Wordpress。

同样,虽然我会说它有点复杂,但接收各种标头并非不可能揭示 Apache2 服务器设置的某些部分,但可能不是全部。如另一个答案中所述,例如,默认情况下,Apache2 和 PHP 会将签名放在您的标头中。如果您打开错误的语言支持,那么您将获得一种形式的 Vary 标头...

其他模块可能不会输出特定的标头,但它们会添加各种功能,您可以通过访问/触发该功能来测试这些功能。如果发生,则安装它。如果没有发生,则不会安装。如您所知,有很多模块,因此要通过所有模块是一项相当艰巨的工作。但我将举一个简单的例子:如果您可以连接到端口 443 并且随之而来的是有效的 SSL 连接(无论是否可验证),则安装了其中一个 SSL 模块。

附带说明一下,像 Wordpress 和 Drupal 这样的 CMS 系统也会调整返回的标题。所以你必须小心,因为这两种机制可能会重叠。大多数标头的优先级被赋予脚本(少数标头由 Apache2 强制管理,因为它控制着相应的功能,例如 Keep-Alive 功能,因为 Apache2 持有客户端套接字。)