使用SetTrustedCredmanAccessPrivilege获取已保存的凭据
程序员文章站
2022-06-17 19:53:42
windows系统中有一个名为SeTrustedCredmanAccessPrivilege的权限,使拥有该特权的进程可作为受信任的调用者访问凭据管理器。 凭据管理器可以从控制面板 → 凭据管理器进入。凭据管理器允许用户存储凭据,比如域账户、Web、普通账户凭据等。管理器使用了DPAPI(Data ......
windows系统中有一个名为setrustedcredmanaccessprivilege的权限,使拥有该特权的进程可作为受信任的调用者访问凭据管理器。
凭据管理器可以从控制面板 -> 凭据管理器进入。凭据管理器允许用户存储凭据,比如域账户、web、普通账户凭据等。管理器使用了dpapi(data protect)进行保护,所以只有经过认证的账户可访问关联的存储数据。程序使用credread
或credenumerate
可以访问当前用户存储的凭据,但是读取域账户凭据时,即设置读取类型为cred_type_domain_password
,返回密码将为空。这是由于lsass对该行为进行了限制。只有诸如ntlm、kerberos 和 negotiate等microsoft身份验证包在连接到指定目标时可不受限制地自动使用此凭据。
除了注入lsass、读取lsass或是手动实现dpapi的方式(mimikatz),作者提到了另一个名为credbackupcredentials的系统api(lsasrv.dll),该api被credwiz.exe用于备份用户凭据,作为恢复使用。该备份包含所有凭据,包括域凭据。
bool winapi credbackupcredentials(handle token, lpcwstr path, pvoid password, dword passwordsize, dword flags);
如果成功的话,调用api解密文件内容即可获取所有凭据。
调用credbackupcredentials的要求就是需要调用者具有setrustedcredmanaccessprivilege权限。winlogon中即含有这么个权限,也存在其他具有该权限的进程,比如lsass。我们需要做的就是从具有该权限的一个进程中借用其令牌,作为调用凭据备份api使用,因此需要执行时具有管理员权限。
作者给出了实现步骤:
- 使用process_query_limited_information访问方式打开winlogon进程(也可以选择其他符合条件的进程),然后以token_duplicate打开其令牌;
- 将打开的令牌复制为一个模拟令牌,之后启用模拟令牌中的settrustedcredmanaccessprivilege权限,模拟令牌类型需要为tokenprimary,经过测试tokenimpersonation将失败(无法启用权限);
- 打开备份凭据目标用户的令牌,该用户需要已经过身份验证;
- 调用credbackupcredentials,传入参数指定备份后数据的写入路径;
- 从凭据备份文件中读取加密后数据,调用api cryptunprotectdata解密出被备份的凭据;
- 结束令牌模拟,reverttoself。
参考:
推荐阅读
-
Python爬虫之cookie的获取、保存和使用【新手必学】
-
通过 JQuery 的 each方法 获取Div下所有的P标签的内容并使用 push方法保存为数组
-
Android 使用 Retrofit 保存 高德 静态地图API 获取的地图图片
-
使用SetTrustedCredmanAccessPrivilege获取已保存的凭据
-
Python爬虫之cookie的获取、保存和使用【新手必学】
-
Android 使用 Retrofit 保存 高德 静态地图API 获取的地图图片
-
使用SetTrustedCredmanAccessPrivilege获取已保存的凭据
-
通过 JQuery 的 each方法 获取Div下所有的P标签的内容并使用 push方法保存为数组