导语:本文分析了ADAudit Plus数据加密的算法,区分域用户,编写实现代码,后续根据算法可以用来对用户口令进行暴破。
0x00 前言
在上篇文章《ADAudit Plus漏洞调试环境搭建》介绍了漏洞调试环境的搭建细节,经测试发现数据库的部分数据做了加密,本文将要介绍数据加密的相关算法。
0x01 简介
本文将要介绍以下内容:
数据加密的位置
算法分析
算法实现
0x02 数据加密的位置
测试环境同《ADAudit Plus漏洞调试环境搭建》保持一致
数据库连接的完整命令:"C:\Program Files\ManageEngine\ADAudit Plus\pgsql\bin\psql" "host=127.0.0.1 port=33307 dbname=adap user=postgres password=Stonebraker"
查询加密口令的命令示例:SELECT * FROM public.aaapassword ORDER BY password_id ASC;
返回结果示例:
经测试,对应Web管理页面的位置为Admin->Technicians,如下图
点击Add technicians可以添加用户,这里可以选择添加自定义用户或者域用户
添加自定义用户需要输入口令,如下图
添加域用户不需要输入域用户的口令,如下图
0x03 算法分析
1.加密算法细节
经分析,加密算法细节位于C:\Program Files\ManageEngine\ADAudit Plus\lib\AdvAuthentication.jar中的com.adventnet.authentication.util->AuthUtil.class
添加用户的实现代码:
得到加密生成Password的代码:
生成salt的代码:
经动态调试,发现workload默认为12,生成的salt格式示例:$2a$12$DVT1iwOoi3YwkHO6L6QSoe,如下图
具体加密算法getEncryptedPassword()的实现细节:
在此处下断点,经动态调试得出以下结论:
如果是域用户,会使用默认口令admin作为明文,随机生成salt,算法使用bcrypt,通过固定算法计算得出密文,密文前29字节对应加密使用的salt
如果不是域用户,会使用用户口令作为明文去计算,例如默认用户admin,会使用实际的口令作为明文去加密得到密文
也就是说,在查询表public.aaapassword时,我们只需要取出password项前29字节作为加密使用的salt,不需要关注表public.aaapassword中的salt项
2.区分是否为域用户
查询命令示例:SELECT * FROM public.aaalogin ORDER BY login_id ASC;
返回结果示例:
其中,domainname为ADAuditPlus Authentication代表自定义添加的用户
这里使用inner join查询自动筛选出非域用户和对应的hash,命令示例:SELECT aaalogin.login_id,aaalogin.name,aaalogin.domainname,aaapassword.password FROM public.aaalogin as aaalogin INNER JOIN public.aaapassword AS aaapassword on aaalogin.login_id=aaapassword.password_id WHERE aaalogin.domainname = 'ADAuditPlus Authentication';
返回结果示例:
0x04 算法实现
测试参数如下:
已知明文为123456
查询数据库得到的password项为$2a$12$1hKeH4aM2LY4BvYpKT9Z5.p9cD453FjBAPYjp0ek94n936WRRAYme
从中可知salt为password项的前29字节,即$2a$12$1hKeH4aM2LY4BvYpKT9Z5.
计算密文的测试代码如下:
计算结果为$2a$12$1hKeH4aM2LY4BvYpKT9Z5.p9cD453FjBAPYjp0ek94n936WRRAYme,同数据库得到的password项一致
综上,根据以上算法可以用来对用户口令进行暴破
0x05 小结
本文分析了ADAudit Plus数据加密的算法,区分域用户,编写实现代码,后续根据算法可以用来对用户口令进行暴破。
本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址