看我如何破解OpenNMS哈希密码?

背景

在最近的一次渗透测试中,我拿下了一台运行OpenNMS的服务器,并获取了该服务器的root访问权限。在后利用阶段我提取了几个本地用户的哈希密码,我想尝试破解这些哈希值因为这些密码可能会被重复用在其他重要认证上。但对于OpenNMS的哈希密码我几乎一无所知,通过在Google上的一番搜索也并未发现任何有价值的资源。为此,我决定发布一款Python工具以帮助那些OpenNMS服务器的渗透测试者。具初步了解这些哈希密码是base64编码的字符串,前16个字节是盐,剩余的32个字节是sha256(salt.password)的100,000次迭代。

百疏一漏

我们发现了一个服务器当前正运行着一个老旧的OpenNMS版本,而该版本曾被曝出存在一个已知的Java反序列化漏洞。漏洞详情可以参考FoxGlove Security发布的这篇文章。

Metasploit模块的利用并不容易。我们将模块指向了端口为1099的RMI接口,将payload设置为linux/x86/shell_reverse_tcp,并给予了以root权限运行的shell:

OpenNMS被安装在/opt/opennms中,我通过shell浏览了该目录,并找到了一个定义OpenNMS的本地用户帐户的文件。通过对一些用户名的观察,我意识到其中一些账户很可能是该组织的超级管理员账户,这更激起了我的破解欲望。

哈希被存储在/opt/opennms/etc/users.xml中,如下所示:

以上XML中被加盐的这串字符引起了我的注意:

L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn

我首先想到了john和hashcat并查看了它们的帮助页面,看是否有OpenNMS哈希模式,但可惜的是并没有发现任何有用的信息。然后我又使用Google进行了查询,仍然没有找到任何有关OpenNMS哈希是如何盐化和/或计算的解释。因此我决定自己来分析和破解它。

散列识别

大多数密码破解程序都会使用十六进制来表示哈希,因此我将XML中的base64值转换为十六进制:

接着,我使用了一个基于Python的HASH加密方式识别工具hashID来帮助我进行初步的hash判断:

从以上结果可以看到这可能是SHA-384加密,但这种加密是非常罕见的,因此我对其准确性持怀疑态度。

明文识别

即便我知道了它正确的哈希算法,但我仍然不知道它是如何加的盐,更不用说它加的盐是什么。我首先想到的是,盐可能被存储在OpenNMS使用的PostgresQL数据库中。由于我当前的权限为root,因此我可以连接数据库并查看表数据。经过一番查找并没有发现任何与密码或盐有关的数据。据此我断定,它一定被存储在应用程序的某个位置。

OpenNMS是一个开源的系统,因此我来到了它的Github页面并搜索了关键字“salt”。我获取到了一些用于测试的users.xml文件示例。

通过对源代码的检索,我发现了一处哈希密码加盐的断言测试:

经过对上述测试代码中的“rtc”用户哈希加盐计算后我们发现,其结果与我们之前发现的users.xml中的加盐密码哈希值相同。这意味着我们成功获取到了一个本地用户的明文密码。

  • 明文:rtc
  • 加盐哈希:L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn

虽然我们仍然无法获知它是如何加的盐以及盐是什么,但是这为我们提供了一个很好的判断依据。

哈希算法识别

现在让我们把视线从Github上转回到我们的root shell。虽说Github上的源代码为我们提供了一个很好的参考依据,但服务器上代码可能会有所不同。因此,如果在服务器上找到源码会获得更准确的信息。

我进入到了opennms目录,并通过搜索关键字“salt”来定位:

可以看到搜索出了大量包含”salt”关键字的JAR库文件,这里我们尤其关注./lib/jasypt-1.9.0.jar这个文件。

从他们的官方主页上我们了解到,Jasypt是一个java库,它允许开发人员不需要深入了解加密技术的工作原理,就可以轻松的为自己项目添加基本的加密功能。

通过对文档的进一步挖掘,我发现了一个让我看到有希望的东西:一个名为StrongPasswordEncryptor的类,它使用另一个被称为StandardStringDigester的类。以下是文档中关于StrongPasswordEncryptor类的简单描述:

Jasypt同样是开源的,因此我在Github上找到了这两个类的源码(StrongPasswordEncryptor和StandardStringDigester)。通过StandardStringDigester源码中的注释信息,我终于弄明白了digest是如何构建的。

至此,我已经获取到了所有我需要的信息:

  • 明文: “rtc”
  • Digest: L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
  • 盐长度: 16字节
  • Digest格式: (salt.password)
  • 算法:sha256
  • 迭代:100,000

混合计算

现在让我们来验证一下算法,我们需要将盐的字节与明文连接,然后计算一个sha256摘要100,000次。我写了一个Python脚本来帮助我们验证明文和密码:

并用已知的明文进行测试,可以看到10万次迭代后我们得到了正确的结果!

编写一个破解器

为了方便大家对opennms哈希密码的额破解,我在Github上发布了一款Python编写的爆破脚本。你可以通过以下链接获取到:

https://github.com/ropnop/opennms_hash_cracker

该脚本首先会提取users.xml文件中的哈希值,然后使用我们提供的字典对散列进行爆破。此外,该脚本也包含了一些逻辑来解析和测试OpenNMS的无盐哈希(也就是MD5摘要)。以下是它的运行示例:

虽然这个脚本的速度和成功率可能都不太理想。但是如果你使用的爆破字典较小或爆破对象使用的是弱密码,那么它将非常的有用。如果你懂得编程开发,你还可以将这个脚本移植到hashcat。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

CTF---Web入门第十三题 拐弯抹角

拐弯抹角分值:10 来源: cwk32 难度:易 参与人数:5765人 Get Flag:2089人 答题人数:2143人 解题通过率:97% 如何欺骗服务...

423110
来自专栏企鹅号快讯

Scrapy爬虫教程二 浅析最烦人的反爬虫手段

最近一直在弄爬虫,也爬取了知名网站的一些数据(这里只是个人学习使用,不是商用!!!),大家都知道,爬虫和反爬虫一直以来都是相爱相杀的,爬虫程序员希望破解反爬虫手...

50600
来自专栏尚国

深入剖析最新IE0day漏洞

在2018年4月下旬,我们使用沙箱发现了IE0day漏洞;自从在野外发现上一个样本(CVE-2016-0189)已经有两年多了。从许多方面来看,这个特别的漏洞及...

16520
来自专栏FreeBuf

浅谈拒绝服务攻击的原理与防御(7):用Python和C实现syn flood攻击

? 01 前言 以前做DDOS的实验都是用python来编写工具的,开始不会编写结构不会算校验和的时候就用scapy写,后来学会了报文结构开始自己构造各种报文...

530110
来自专栏更流畅、简洁的软件开发方式

【自然框架】 页面里的父类—— (补充)

      没想到下午发的《【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。 》启发了热烈讨论,还以为又是一大堆的口水回复呢。看到大家的...

22950
来自专栏小樱的经验随笔

CTF---Web入门第二题 上传绕过

上传绕过分值:10 来源: Justatest 难度:易 参与人数:5847人 Get Flag:2272人 答题人数:2345人 解题通过率:97% by...

48680
来自专栏Play & Scala 技术分享

PlayScala 2.5.x - 实现完全异步非阻塞的流数据导出

29940
来自专栏云飞学编程

新手也能做爬虫!一起来爬电影信息吧

第二篇练手的东西来了,当然这里的电影信息并不是那些评论或者评分什么的,今天咱们来试试直接爬电影链接!

9630
来自专栏玄魂工作室

CTF实战32 综合实战和讲解二(讲解部分)

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

9340
来自专栏我的博客

学会编程更要学会找错误

一直想写点我在编程学习中遇到的问题以及我是如何解决的,我是一个PHPer,而且对计算机有着深厚的兴趣。今天闲着没事,就顺手整理一点,随后会相继会做更多总结,敬请...

41270

扫码关注云+社区

领取腾讯云代金券