渗透测试中如何破解非常见hash算法?
Posted 乌托邦安全技术社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渗透测试中如何破解非常见hash算法?相关的知识,希望对你有一定的参考价值。
0x00 引子
但是毕竟hashcat能支持的算法数量有限,如果我们碰到一个md5(sha1(sha512($pass).$salt1)).salt2)这样的变态算法,hashcat就没辙了。或许你可以说自己写脚本来跑,反正算法是已知的。但这样一来,无论是写代码还是代码运行的效率都不高。下面介绍今天的主角——hashmanager.
0x01 hashmanager
Hashmanager是一款和hashcat类型差不多的hash破解工具,同样支持字典、掩码等破解方式。官网http://www.insidepro.team/(目前已经打不开了)。它也内置了一批常见的hash算法。
点开Examples目录中的样例hash算法文档,里面就是该算法所需的hash格式。
使用时,直接指定算法为文件名即可。
除了这些标准hash算法,hashmanager还支持任意已知hash算法的组合使用。具体的规则文件在路径HMHelpEnComplex.txt。
规则 |
p |
复制密码 |
s |
复制盐值 |
|
u |
复制用户名 |
|
bXX |
复制16进制字节一位,适用于公共盐值,若复制多位需要使用bXXbXX |
|
mN |
从内存中复制第N个临时变量 |
|
eXXYY |
||
HK |
使用hash算法K |
|
XK |
使用hash算法K,并使用16进制表示 |
|
MN |
将当前值作为临时变量保存进内存 |
|
FN |
使用php函数N |
Hash算法K和PHP函数N如上图中所示。
官方给出了部分样例hash算法对应的算法表达式如下:
0x02 实例
最近在渗透测试中遇到一个EmpireCMS,在拿到shell后,看了下源码中的加密算法如下:
function DoEmpireCMSAdminPassword($password,$salt,$salt2){
$pw=md5($salt2.'E!m^p-i(r#e.C:M?S'.md5(md5($password).$salt).'d)i.g^o-d'.$salt);
return $pw;
}
从数据库中取出来的$password, $salt, $salt2如下表
$password |
$salt |
$salt2 |
c3fe71d97456ed65682491a388b69d94 |
MMj5z1tR |
rUPKqT9CQPRzTTm5KLcz |
a018c862fb8b1a7e4ac7f27cac4979f0 |
Qi2G0RJE |
fNoJjrqvc3DXjvUQvRhq |
注意到hashmanager仅支持一个salt, 而此处有两个salt值,但是算法中没有涉及到$username, 我们把函数中的$salt2可以视为$username, 就能解决salt个数大于1的问题。函数中实际所用到的算法相当于:
md5($username.'E!m^p-i(r#e.C:M?S'.md5(md5($pass).$salt).'d)i.g^o-d'.$salt)
我们根据上述算法构造其在hashmanager中对应的算法表达式。
首先md5(md5($pass).$salt)部分,先复制$pass, 然后使用算法MD5, 由于直接是用的16进制输出,所以是X1, 然后复制$salt, 再次使用算法MD5, 得到算法表达式pX1sX1, 在这一步骤后,该值没有继续进行运算,我们把它保存到临时变量M1,得到pX1sX1M1.
然后复制$username, 再复制字符串E!m^p-i(r#e.C:M?S,这里将E!m^p-i(r#e.C:M?S转成ASCII格式得到0x45216D5E702D69287223652E433A4D3F53, 每次复制一字节,以此得到ub45b21b6Db5Eb70b2Db69b28b72b23b65b2Eb43b3Ab4Db3Fb53,接下来取出临时变量M1, 拼接得到ub45b21b6Db5Eb70b2Db69b28b72b23b65b2Eb43b3Ab4Db3Fb53m1, 然后复制字符串d)i.g^o-d,同理得到b64b29b69b2Eb67b5Eb6Fb2Db64,这样算法表达式变成了pX1sX1M1ub45b21b6Db5Eb70b2Db69b28b72b23b65b2Eb43b3Ab4Db3Fb53m1b64b29b69b2Eb67b5Eb6Fb2Db64
最后复制$salt,再MD5一次,从而整个算法表达式为*pX1sX1M1ub45b21b6Db5Eb70b2Db69b28b72b23b65b2Eb43b3Ab4Db3Fb53m1b64b29b69b2Eb67b5Eb6Fb2Db64sH1.(用颜色区分各个部分)
保存在文本中的hash格式如图,依次是$username($salt2):$pass:$salt.
最后来验证一下所构造的算法表达式是否正确:
很完美,破解出了其中一个hash,另一个由于明文不在字典中,没有破解成功,但这已经足够了,说明我们构造的算法表达式非常正确。
0x03 获取hashmanager
Hash Manager-1.3.0.zip
SHA-1 |
bb4e77a236028e632c3aad2a3afdc6df5d4bf3fc |
SHA-256 |
008deed75b1c2083ccd6ff749aa990cffbdd87e930495d2cd2c4e8b3024cee39 |
以上是关于渗透测试中如何破解非常见hash算法?的主要内容,如果未能解决你的问题,请参考以下文章
网络安全干货知识分享 - Kali Linux渗透测试 106 离线密码破解
渗透测试密码暴力破解工具——九头蛇(hydra)使用详解及实战