看我如何破解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中,如下所示:
userinfo xmlns="http://xmlns.opennms.org/xsd/users">
header>
rev>.9rev>
created>Wednesday, February 6, 2002 10:10:00 AM ESTcreated>
mstation>master.nmanage.commstation>
header>
users>
user>
user-id>ropnopuser-id>
full-name>Rop Nopfull-name>
user-comments>user-comments>
password salt="true">L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcnpassword>
role>ROLE_RTCrole>
user>
...(more users)...
users>
userinfo>
以上XML中被加盐的这串字符引起了我的注意:
L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
我首先想到了john和hashcat并查看了它们的帮助页面,看是否有OpenNMS哈希模式,但可惜的是并没有发现任何有用的信息。然后我又使用Google进行了查询,仍然没有找到任何有关OpenNMS哈希是如何盐化和/或计算的解释。因此我决定自己来分析和破解它。
散列识别
大多数密码破解程序都会使用十六进制来表示哈希,因此我将XML中的base64值转换为十六进制:
>>> "L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn".decode('base64').encode('hex')
'2f98f6862557e01f8b4c79d8dccc2ae66e5d059ccd747862069bc18f209eac1b01aaa25cc5152c440c5a0d0b63464727'
接着,我使用了一个基于Python的HASH加密方式识别工具hashID来帮助我进行初步的hash判断:
从以上结果可以看到这可能是SHA-384加密,但这种加密是非常罕见的,因此我对其准确性持怀疑态度。
明文识别
即便我知道了它正确的哈希算法,但我仍然不知道它是如何加的盐,更不用说它加的盐是什么。我首先想到的是,盐可能被存储在OpenNMS使用的PostgresQL数据库中。由于我当前的权限为root,因此我可以连接数据库并查看表数据。经过一番查找并没有发现任何与密码或盐有关的数据。据此我断定,它一定被存储在应用程序的某个位置。
OpenNMS是一个开源的系统,因此我来到了它的Github页面并搜索了关键字“salt”。我获取到了一些用于测试的users.xml文件示例。
通过对源代码的检索,我发现了一处哈希密码加盐的断言测试:
@Test
public void testAuthenticateRtc() {
org.springframework.security.core.Authentication authentication = new UsernamePasswordAuthenticationToken("rtc", "rtc");
org.springframework.security.core.Authentication authenticated = m_provider.authenticate(authentication);
assertNotNull("authenticated Authentication object not null", authenticated);
Collection authorities = authenticated.getAuthorities();
assertNotNull("GrantedAuthorities should not be null", authorities);
assertEquals("GrantedAuthorities size", 1, authorities.size());
assertContainsAuthority(Authentication.ROLE_RTC, authorities);
}
经过对上述测试代码中的“rtc”用户哈希加盐计算后我们发现,其结果与我们之前发现的users.xml中的加盐密码哈希值相同。这意味着我们成功获取到了一个本地用户的明文密码。
明文:rtc
加盐哈希:L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
在最近的一次渗透测试中,我拿下了一台运行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中,如下所示:
userinfo xmlns="http://xmlns.opennms.org/xsd/users">
header>
rev>.9rev>
created>Wednesday, February 6, 2002 10:10:00 AM ESTcreated>
mstation>master.nmanage.commstation>
header>
users>
user>
user-id>ropnopuser-id>
full-name>Rop Nopfull-name>
user-comments>user-comments>
password salt="true">L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcnpassword>
role>ROLE_RTCrole>
user>
...(more users)...
users>
userinfo>
以上XML中被加盐的这串字符引起了我的注意:
L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
我首先想到了john和hashcat并查看了它们的帮助页面,看是否有OpenNMS哈希模式,但可惜的是并没有发现任何有用的信息。然后我又使用Google进行了查询,仍然没有找到任何有关OpenNMS哈希是如何盐化和/或计算的解释。因此我决定自己来分析和破解它。
散列识别
大多数密码破解程序都会使用十六进制来表示哈希,因此我将XML中的base64值转换为十六进制:
>>> "L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn".decode('base64').encode('hex')
'2f98f6862557e01f8b4c79d8dccc2ae66e5d059ccd747862069bc18f209eac1b01aaa25cc5152c440c5a0d0b63464727'
接着,我使用了一个基于Python的HASH加密方式识别工具hashID来帮助我进行初步的hash判断:
www.wnhack.com
从以上结果可以看到这可能是SHA-384加密,但这种加密是非常罕见的,因此我对其准确性持怀疑态度。
明文识别
即便我知道了它正确的哈希算法,但我仍然不知道它是如何加的盐,更不用说它加的盐是什么。我首先想到的是,盐可能被存储在OpenNMS使用的PostgresQL数据库中。由于我当前的权限为root,因此我可以连接数据库并查看表数据。经过一番查找并没有发现任何与密码或盐有关的数据。据此我断定,它一定被存储在应用程序的某个位置。
OpenNMS是一个开源的系统,因此我来到了它的Github页面并搜索了关键字“salt”。我获取到了一些用于测试的users.xml文件示例。
通过对源代码的检索,我发现了一处哈希密码加盐的断言测试:
@Test
public void testAuthenticateRtc() {
org.springframework.security.core.Authentication authentication = new UsernamePasswordAuthenticationToken("rtc", "rtc");
org.springframework.security.core.Authentication authenticated = m_provider.authenticate(authentication); copyright 无奈人生
assertNotNull("authenticated Authentication object not null", authenticated);
Collection authorities = authenticated.getAuthorities();
assertNotNull("GrantedAuthorities should not be null", authorities);
assertEquals("GrantedAuthorities size", 1, authorities.size());
assertContainsAuthority(Authentication.ROLE_RTC, authorities);
}
经过对上述测试代码中的“rtc”用户哈希加盐计算后我们发现,其结果与我们之前发现的users.xml中的加盐密码哈希值相同。这意味着我们成功获取到了一个本地用户的明文密码。
明文:rtc
加盐哈希:L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
本文来自无奈人生安全网
无奈人生安全网