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數據加密的算法,區分域用戶,編寫實現代碼,後續根據算法可以用來對用戶口令進行暴破。