记一次逆向还原AES加密的DB-PASSWORD

背景

在某次已授权的渗透行动中,拿到了某机器的IIS权限。翻看进程的过程中发现了某Agent在以高权限运行,遂对其进行分析,发现配置文件中包含AES加密的SQL Server数据库密码,遂试图对其进行解密。

Alt text

分析

此Agent应用由Java编写,将其Jar包逆向后可看到其AES密钥的生成过程,即:取各种目录、版本、系统信息拼接后进行SHA-256加密,取其前16位作为密钥。

Alt text

Alt text

原计划是打算提取系统信息自行拼接并还原出密钥,但中间可能由于字符编码或各种其他的原因未能实现,遂作罢。

继续分析Java代码,发现代码中存在直接获取数据库密码的函数:

Alt text

那么,只需要分析此方法的调用链,编写对应的Java应用并在应用目录下执行,理论上即可获得明文的数据库密码。

此方法所在的类为AgntConfig,通过搜索找到此类在class CfgMngrloadConfig()方法中生成了实例,并赋值给成员变量config

Alt text

至此,调用链分析完成。

PWN

编写Payload,这部分不会的可以问ChatGPT:

import agnt.cfg.*;

public class pp {
    public static void main(String[] args) {
        CfgMngr cm = CfgMngr.getInstance();
        cm.loadConfig();
        String dbPassword = cm.getConfig().getDbPasswd();
        System.out.println("Database Password: " + dbPassword);
    }
}

编译,这里需要注意编译时的Java版本要和目标机器的Java版本兼容:

javac -cp ".;./lib/mcsm.jar" pp.java

应用的目录下有现成的bat批处理脚本,稍加修改执行我们的代码:

Alt text

pp.batpp.class上传到应用程序的目录下,执行pp.bat,成功获得明文的数据库密码:

pwn