在最近的一次渗透测试中,我成功入侵了一台运行OpenNMS的服务器,并获得了该服务器的root访问权限。在渗透测试的后续阶段,我成功提取了几个本地用户的哈希密码。考虑到这些密码可能会被用于其他重要认证,我决定尝试破解这些哈希值。然而,对于OpenNMS的哈希密码,我几乎没有任何了解,并且在Google上的搜索也没有找到有价值的资源。因此,我决定开发一款Python工具,以帮助其他OpenNMS服务器的渗透测试人员。根据我的初步了解,这些哈希密码是经过base64编码的字符串,前16个字节是盐,剩余的32个字节是通过对盐和密码进行100,000次迭代的sha256计算得到的。在我的工作中,我发现了一个正在运行着老旧OpenNMS版本的服务器,而这个版本已经被曝出存在一个已知的Java反序列化漏洞。有关漏洞的详细信息可以参考FoxGlove Security发布的文章。利用这个漏洞并不容易,但我们成功将Metasploit模块指向了端口为1099的RMI接口,并将payload设置为linux/x86/shellreversetcp,最终获得了以root权限运行的shell。
OpenNMS被安装在/opt/opennms目录中,我通过shell浏览了该目录,并找到了一个定义OpenNMS本地用户帐户的文件。通过观察一些用户名,我怀疑其中一些账户可能是该组织的超级管理员账户,这进一步激发了我破解的欲望。哈希密码被存储在/opt/opennms/etc/users.xml文件中,如下所示:
L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
在这个XML文件中,我注意到了一串被加盐的字符。我首先尝试使用john和hashcat来查找OpenNMS哈希模式,但很遗憾,并没有找到任何有用的信息。然后,我进行了一番Google搜索,但仍然没有找到关于OpenNMS哈希如何进行盐化和计算的解释。因此,我决定自己来分析和破解它。
散列识别方面,大多数密码破解程序使用十六进制表示哈希值,因此我将XML中的base64值转换为十六进制。然后,我使用了一个基于Python的HASH加密方式识别工具hashID来进行初步的哈希判断。
从上述结果可以看出,这可能是SHA-384加密,但这种加密非常罕见,因此我对其准确性持怀疑态度。
明文识别方面,即使我知道了正确的哈希算法,但我仍然不知道它是如何进行盐化的,更不用说盐是什么了。我首先想到的是,盐可能被存储在OpenNMS使用的PostgresQL数据库中。由于我当前具有root权限,因此我可以连接到数据库并查看表数据。经过一番搜索,我没有找到与密码或盐有关的任何数据。因此,我断定,它一定被存储在应用程序的某个位置。
OpenNMS是一个开源系统,因此我访问了它的Github页面,并搜索了关键字”salt”。我找到了一些用于测试的users.xml文件示例。通过检查源代码,我发现了一段用于哈希密码加盐计算的断言测试。
通过对上述测试代码中的”rtc”用户哈希加盐计算后的结果与我们之前在users.xml中发现的加盐密码哈希值相同,这意味着我们成功获取到了一个本地用户的明文密码。虽然我们仍然无法获知它是如何进行盐化以及盐是什么,但这为我们提供了一个很好的判断依据。
哈希算法识别方面,现在让我们将目光从Github转回到我们的root shell。尽管Github上的源代码为我们提供了很好的参考,但服务器上的代码可能会有所不同。因此,如果我们能在服务器上找到源码,将会获得更准确的信息。我进入了opennms目录,并通过搜索关键字”salt”来定位。
可以看到,搜索结果中有很多包含”salt”关键字的JAR库文件,其中./lib/jasypt-1.9.0.jar尤为引人关注。
通过查阅Jasypt的官方主页,我了解到Jasypt是一个Java库,它允许开发人员在不深入了解加密技术工作原理的情况下,轻松为自己的项目添加基本的加密功能。通过进一步挖掘文档,我发现了一个让我感到有希望的东西:一个名为StrongPasswordEncryptor的类,它使用另一个名为StandardStringDigester的类。以下是关于StrongPasswordEncryptor类的简要描述:
Jasypt也是开源的,因此我在Github上找到了这两个类的源码(StrongPasswordEncryptor和StandardStringDigester)。通过StandardStringDigester源码中的注释信息,我最终弄清楚了digest是如何构建的。
至此,我已经获得了我所需的所有信息:混合计算方面,现在让我们验证一下算法。我们需要将盐的字节与明文连接,然后计算一个sha256摘要100,000次。我编写了一个Python脚本来帮助我们验证明文和密码。
通过使用已知的明文进行测试,可以看到经过10万次迭代后,我们得到了正确的结果!
为了方便大家破解OpenNMS哈希密码,我在Github上发布了一款Python编写的爆破脚本。您可以通过以下链接获取:
该脚本首先会提取users.xml文件中的哈希值,然后使用我们提供的字典对散列进行爆破。此外,该脚本还包含一些逻辑来解析和测试OpenNMS的无盐哈希(即MD5摘要)。以下是它的运行示例: