攻击者可通过CVE-2020-11518漏洞强行进入攻击目标的Active Directory

2020-09-01 16:46:2611180人阅读

在使用Aquatone(一款子域名挖掘工具)执行一些常规的监控时,我注意到在两个不同的子域名上有一个相似的登录页面,而这两个子域名来自于两个不相关的漏洞。

1597239551796100.png

这两个子域都包含此默认登录屏幕的自定义版本

此登录屏幕后面的软件是Zoho ManageEngine ADSelfService Plus,它提供了一个门户,允许用户重置其自己的Active Directory(AD)帐户的密码。 ZOHO ManageEngine ADSelfService Plus是美国卓豪(ZOHO)公司的一套基于Web的终端用户密码管理软件。 ZOHO ManageEngine ADSelfService Plus 5.0.6之前版本中的密码重置功能存在授权问题漏洞。 该漏洞源于网络系统或产品中缺少身份验证措施或身份验证强度不足。

由于我认为我在这个产品上发现的任何漏洞都可能潜在地影响到多个公司,而且,更严重的是,因为这似乎很可能与组织的Active Directory链接在一起,所以在这里花一些时间似乎是个好主意。

经过努力,我发现了一些基本的反映跨站点脚本(XSS)漏洞,其他研究人员显然已经发现了这些漏洞。所以我得再深入一点。幸运的是,整个产品可以下载安装试用30天。

设置

由于我确信可能会找到更多的XSS漏洞,因此我决定下载并安装该软件,其目的是浏览Java源代码以查找更多漏洞。

安装软件后,我现在的优势就是能够在本地执行所有测试,并通读源代码以准确了解应用程序中发生的事情,甚至可以在安装文件夹中使用grep查找潜在的有趣文件。

为了对Java应用程序进行反向工程,我喜欢使用Bytecode Viewer(java反编译工具),它可以将Java类文件反编译并格式化为可读的Java代码。它还允许编辑字节码并即时重新编译文件,并且还可以很好地反编译Android APK文件。

1597239552608671.png

现在,我开始手动浏览一些Java源文件而没有很多有趣的发现。但是,我确实了解了软件组件以及它们如何协同工作。在寻找应用程序中的复杂漏洞时,这往往是非常宝贵的,因此绝对值得花几个小时。结果,我对应用程序功能有了很好的了解,包括主要由遗留代码组成的应用程序的部分与看起来较新的部分的对比,为修复以前的安全漏洞而修改的部分等等。

有一次,我决定构建一个应用程序端点的单词列表,该列表可以有两个目的:直接针对端点执行一些“经典”安全测试,并在针对某个类似应用程序的某个端点用作有用的资源。

漏洞

1. Java中不安全的反序列化

在枚举应用程序端点的过程中,我在一个web.xml文件中发现了以下几行:

1597239552148894.png

当我用谷歌搜索时,我在img参数中使用路径遍历找到了针对另一个ManageEngine产品上的cewolf端点的已发布RCE 。

可以肯定的是,在手动将一个文件放在我的本地安装的一个文件夹后,我可以通过浏览http://localhost:8888/cewolf/?img=/../../ path/to/evil.file来确认这个版本的ADSelfService Plus中也存在反序列化漏洞。

这意味着我在目标站点上有一个随时可用的Java反序列化漏洞,但只有当我找到一种方法先将任意文件上传到服务器上时,我才能利用它。

2.任意文件上传

查找任意文件上传漏洞似乎并不容易,为了最大限度地利用我的攻击面,我继续在我的设备上配置软件,这需要设置要使用的本地域控制器和Active Directory域。

通过数小时的下载ISO,在硬盘上腾出空间,VMware Workstation恶作剧,Microsoft Windows Server管理以及观看带有标题为“如何设置Windows Server 2019域控制器”之类的Youtube视频的快速前进,我终于有了一个允许我使用的设置登录到管理面板。

1597239552817064.png

最后,我建立了ADSelfService Plus的工作副本,以备不时之需。

通过对应用程序的完全管理员访问权限,我现在可以进一步映射应用程序功能和API端点。出于明显的原因,我花了大部分时间研究应用程序中的所有不同上载功能,直到遇到支持上载智能卡证书配置的一项功能,导致对/LogonCustomization.do?form=smartCard&operation=Add的POST请求

当我注意到上传的证书文件没有修改名称就存储在服务器的文件系统上时,我认为这可能是利用反序列化漏洞的方法!因此,我通过源代码跟踪这个API调用,以找到更多攻击它的可能方法。

如何运作如下:

1597239553471472.png

1.登录的管理员可以将智能卡配置上传到/LogonCustomization.do?form=smartCard&operation=Add;。

2.这会使用服务器端生成的秘密握手触发对/RestAPI/WC/SmartCard?HANDSHAKE_KEY=secret上服务器经过身份验证的RestAPI的后端请求;

3.在执行请求的操作之前,请针对/servlet/HSKeyAuthenticator?PRODUCT_NAME=ManageEngine+ADSelfService+Plus&HANDSHAKE_KEY=secret的第二个API端点对HANDSHAKE_KEY进行验证,根据传递的secret返回SUCCESS或FAILED;

4.如果成功,上传的证书将写入C:\ManageEngine\ADSelfService Plus\bin;

有趣的是,/ RestAPI端点是可公开访问的,因此任何带有有效HANDSHAKE_KEY的请求都将绕过用户身份验证,并由服务器处理。

此外,/servlet/HSKeyAuthenticator也是可公开访问的,允许未经授权的用户手动验证身份验证秘密是否有效。考虑到这一点,我回到了现在熟悉的源代码。

3. Bruteforceable认证密钥

在grep和安装的PostgreSQL数据库的帮助下,我确定了两个有趣的Java类,其中包含有用的API端点及其身份验证需求清单:

1597239553120718.png

本地安装软件的另一个好处是可以完全访问基础数据库

com.manageengine.ads.fw.servlet中HSKeyAuthenticator.class的代码片段:

1597239554644105.png

还有一个来自com.manageengine.ads.fw.api包中的RestAPIKey.class:

1597239554823754.png

从这些代码中可以看到,服务器的API身份验证密钥设置为当前时间(以毫秒为单位),并且有效期为2分钟。这意味着在任何给定时刻,都有120000个可能的身份验证密钥(120秒* 1000毫秒/秒)。

换句话说,如果我可以在2分钟的时间内连续每秒生成最少1000个请求,那么在身份验证密钥过期并重新生成的那一刻,我就可以保证命中率。对于网络级别的攻击来说,这似乎是一个很大的数目,但成功的攻击并不一定超出可能的范围。尤其要记住,即使在低于100%的成功率下,并且有足够的时间,成功击中的可能性也会越来越大。

在实践中,我很快有了一个有效的概念证明,可以在几分钟之内强行破解了本地实例的秘密。

1597239554111001.png

我使用暴力破解在本地实例上强行揭秘这个秘密

但是,在对一个活动目标(即通过实际的互联网连接)使用该脚本时,我就没那么幸运了。我用不同的配置和设置运行并重新运行了几个小时,整夜都没有结果,我开始担心我的方法将不得不被放弃。

此外,我暂时转移了注意力,因为我不确定我的目标服务器在哪个时区运行。最后,我使用我自己的CET (CET)中的多个偏移量重新运行了我的脚本,直到我发现Java的currentTimeMillis显然是以协调世界时(UTC)返回时间,而我本不必为此烦恼。

最后,经过更多的尝试和漏洞,我找到了以下Turbo Intruder脚本,该脚本根据实际的每秒请求数(rps),尝试使用当前时间戳前后的每一个rps / 2毫秒进行身份验证。这提供了合理的覆盖范围,并将潜在盲点降至最低:

1597239555163769.png

并将HTTP请求移至base.txt文件中,以使用无标头Turbo Intruder进行攻击准备,Turbo Intruder 是一个 BurpSuite 插件,用于发送大量HTTP请求并分析结果。它的设计目的是补充 Intruder 的不足。它的特点如下:

1. 快速:Turbo Intruder 使用了一个重写的 HTTP 栈 ,用于提升速度。在许多目标上,它甚至可能超过流行的异步 Go 脚本。

2.可扩展 :Turbo Intruder 运行时使用很少的内存,从而可以连续运行几天。同时可以脱离 burpsuite 在命令行下使用。

3.灵活: Turbo Intruder 的攻击是使用 Python 配置的。这样可以处理复杂的要求,例如签名的请求和多步攻击序列。此外,自定义 HTTP 栈意味着它可以处理其他库无法处理的畸形格式请求。

4. 方便:它的结果可以通过 Backslash Powered Scanner 的高级差异算法自动过滤。这意味着您可以单击两次即可发起攻击并获得有用的结果。

1597239555133471.png

现在,所需要的只是一点点耐心和很多运气。

1597239556254886.png

正如预期的那样,尽管我怀疑,身份验证密钥可以成功地强制执行,即使远远低于理想的每秒1000个请求。

漏洞利用

现在,可以开始漏洞利用了。我用反序列化框架ysoserial生成了一堆Java有效载荷,发现以下工作有效:

1597239556514000.png

接下来,我从上面通过脚本强行使用了身份验证密钥,并使用它通过经过身份验证的RestAPI将ysererial有效载荷上传到服务器:

1597239556444684.png

为了完成任务,我向/cewolf/?img=/../../../bin/pieter发出了一个简单的GET请求,结果如下:

1597239557169957.png

可以看出,成功的Java反序列化攻击导致DNS查询请求。

总结

面对一连串导致AD连接服务器上RCE的漏洞,我认为攻击者可能使用Domain Controller的链接滥用来劫持域帐户或在AD域上创建新帐户,从而导致更广泛的访问公司的内部网络,例如通过其公共VPN门户访问内部服务。

目前我已将发现的漏洞报告给两家公司,其中一个被评为“严重”。

1597239558314269.png


本文转载自:嘶吼

作者:luochicun

本文翻译自:https://honoki.net/2020/08/10/cve-2020-11518-how-i-bruteforced-my-way-into-your-active-directory/

原文地址:https://www.4hou.com/posts/AAgO

0
现金券
0
兑换券
立即领取
领取成功