HTTP请求和Apache模块:创造性攻击向量

12

这里有一个稍微不太传统的问题:

我目前正在尝试使用一些自定义模块来攻击 Apache。

引发测试的原因是,Apache 会将它认为太大(例如 1 MB 的垃圾数据)的请求内部转发给适当挂钩的模块,强制让它们处理垃圾数据;由于自定义模块中缺乏对其进行处理,导致整个 Apache 系统崩溃。哎呀,疼疼疼。

虽然那个具体问题已经被解决了,但问题出现了:是否存在其他类似的漏洞。

现在,我手头有一款工具,可以向服务器发送原始 HTTP 请求(或者更确切地说,通过已建立的 TCP 连接发送原始数据,如果符合 HTTP 请求的格式,就会被解释成 HTTP 请求,例如 "GET ..."),我正在努力想出其他点子。(TCP 层攻击,例如 Slowloris 和 Nkiller2,目前不是我的重点。)

是否有人有一些好的点子,可以将服务器的自定义模块搞得晕头转向,直到自行引爆?

  • 破损的 UTF-8?(虽然我怀疑 Apache 关心编码,我想它只是处理原始字节。)
  • 一些几乎太长的东西,紧随其后的是 0 字节,然后跟着垃圾数据?
  • 等等

我认为自己不是一个很好的测试人员(我之所以这样做,是因为需要以及缺乏人手;不幸的是,我对于可以帮助我进行测试的 Apache 内部机制的理解只停留在基本层面),这就是我希望能获得深入见解的原因。也许你们中的一些人已经为自己的项目做过类似的测试?

(如果 stackoverflow 不适合这个问题,请谅解。我不确定还有哪里可以发布这个问题。)

2个回答

11
Apache是地球上最坚固的软件项目之一。在Apache的HTTPD中找到漏洞并不是一件小事,我建议您先攻击一些更容易的目标。相比之下,其他HTTPD(例如今天我看到的Nginx)中的漏洞更为常见。还有其他源代码泄露漏洞非常相似,我会看看这个,这里还有另一个lhttpd在sf.net上已经被放弃了将近十年,并且已知存在影响它的缓冲区溢出,这使得它成为一个有趣的应用程序来测试。
攻击一个项目时,应查看过去发现的漏洞类型。程序员往往会一次又一次地犯同样的错误,通常会出现模式。通过遵循这些模式,您可以找到更多漏洞。您应该尝试搜索Nist's search for CVEs等漏洞数据库。您将看到Apache模块最常被攻击。
一个像Apache这样的项目已经被大量模糊化了。有一些模糊框架,例如Peach。Peach在许多方面都有助于模糊化,其中一种方式是通过提供一些恶意测试数据来帮助您工作。如果您选择这条路,那么对于成熟项目来说,模糊化不是一个很好的方法,我会针对apache模块进行尽可能少的下载。(警告:下载量非常低的项目可能会损坏或难以安装。)
当公司担心安全问题时,他们通常会为自动源代码分析工具(例如Coverity)支付大量费用。国土安全部给Coverity提供了大量资金来测试开源项目,Apache是其中之一。我可以亲口告诉你,我通过模糊化发现了一个缓冲区溢出,而Coverity没有发现。Coverity和其他源代码分析工具(如开源Rats)会产生许多误报和漏报,但它们确实有助于缩小影响代码库的问题范围。
(当我第一次在Linux内核上运行RATS时,我的屏幕上列出了数千个对strcpy()和strcat()的调用,这让我几乎从椅子上摔下来,但是当我深入研究代码时,所有的调用都在使用静态文本,因此是安全的。)
漏洞研究和开发利用非常有趣。我建议攻击PHP/MySQL应用程序并探索The Whitebox。这个项目非常重要,因为它显示了除非你手动逐行阅读代码,否则无法找到一些真实世界中的漏洞。它还有现实世界的应用程序(博客和商店),这些应用程序非常容易受到攻击。事实上,由于安全问题,这两个应用程序都被放弃了。像Wapiti或acuentix这样的Web应用程序模糊器会攻击这些应用程序以及类似的应用程序。博客有一个技巧。新安装不太容易受到攻击。您必须稍微使用一下该应用程序,尝试以管理员身份登录,创建一个博客条目,然后扫描它。在测试SQL注入的Web应用程序时,请确保已启用错误报告。在php中,您可以在php.ini中设置display_errors=On
祝好运!

@The Rook,感谢你提供了全面的答案,但是这里应该是feat而不是feet! - Martin Smith
"在Apache的HTTPD中找到一个漏洞可不是小事情。" - 我并不是试图找出Apache的漏洞,而是寻找与Apache模块如何传递信息相关的漏洞,因为我们有自定义模块,而且正因为Apache非常强大,所以很容易陷入像请求过长这样的陷阱。我会修改粗体的问题,使其更加清晰(只读那个问题让我觉得:我当时是怎么了!它恳求着被误解)。 (我马上会写另一条评论!)" - pinkgothic
我现在已经为你的问题点了赞。我非常喜欢你提供的一些链接。它们大多数并不是我的问题的答案,但我想让你知道,我仍然永远感激它们。毫无疑问,它们会派上用场。Nist和PeachFuzzing看起来可能会在这个特定情况下对我有所帮助,但我目前只是初步浏览了一下。我会回报的! - pinkgothic
@pinkgothic 如果您有任何问题,请随时在此处发布,我会查看我的消息。 - rook
@The Rook:给你一些反馈:Peach Fuzzer 绝对是非常受欢迎的,非常感谢你提供这个链接! :) - pinkgothic
显示剩余2条评论

4

根据你使用的其他模块以及激活它们的其他条件(或者只是过大的请求?),您可能需要尝试以下一些方法:

  • 错误编码 - 例如,像您提到的那样的过长的utf-8,有些情况下,模块会依赖于它,例如某些参数。
  • 参数操作 - 再次取决于模块的功能,某些参数可能会捣乱,无论是通过更改值,删除预期参数还是添加意外的参数。
  • 与您的其他建议相反,我会查看“几乎足够短”的数据,即比最大长度短一两个字节,但是使用不同的组合-不同的参数、头文件、请求正文等。
  • 了解HTTP请求走私(也可以在这里在这里)- 不良请求头或无效组合,例如多个Content-Length或无效终止符,可能导致模块误解来自Apache的命令。
  • 还要考虑gzip、分块编码等。很可能自定义模块实现了长度检查和解码,但顺序不正确。
  • 部分请求怎么样?例如导致100-Continue响应或范围请求的请求?
  • @TheRook推荐的模糊测试工具Peach也是一个不错的方向,但是第一次使用时不要期望有很高的回报率。
  • 如果您可以访问源代码,则重点进行安全代码审查是一个好主意。或者,即使是使用像Coverity(如@TheRook所提到的)或更好的工具进行自动化代码扫描也可以。
  • 即使您没有源代码访问权限,也请考虑进行安全渗透测试,无论是由经验丰富的顾问/渗透测试人员还是至少使用自动化工具(有很多这样的工具)-例如appscan、webinspect、netsparker、acunetix等等。

感谢您的回应!这听起来非常有帮助。关于您最后两点:我们正在寻找可以审查代码的人,但是,迄今为止已经一个月了,还没有找到合适的人选。你会认为找到一个 C 代码审核员比这容易多了。 :) 渗透测试将会进行,只是稍后一些;在这个开发/测试过程中,开发人员试图在事情交由测试之前进行一些自己的测试。 - pinkgothic
关于瀑布式测试/渗透测试,你应该能够设置一个开发服务器,即使只是运行有限的初始渗透测试/模糊测试。可能会有一些工作重复,但我发现尽早进行这项工作通常是值得的——除非涉及所有权等政治问题...无论如何,如果你计划进行代码审查,那么推迟渗透测试直到之后也没问题。 - AviD
我决定接受你的答案,因为它更像是一个“答案”,而不是The Rook的回复(希望有一种方法可以分割赏金)。 :) (顺便说一句,我会通过领英联系你(至少是为了减少stackoverflow评论的混乱),但我不使用那个网站,显然我需要付费才能这样做,这似乎对于我不使用的网站来说有些过度了。) - pinkgothic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接