日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【安全研究】从mimikatz学习万能密码——上

發(fā)布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【安全研究】从mimikatz学习万能密码——上 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.背景介紹

2015年1月2日,Dell Secureworks共享了一份關(guān)于利用專用域控制器(DC)惡意軟件(名為“SkeletonKey”惡意軟件)進行高級攻擊活動的報告,SkeletonKey惡意軟件修改了DC的身份驗證流程,域用戶仍然可以使用其用戶名和密碼登錄,攻擊者可以使用Skeleton Key密碼作為任何域用戶登錄

【資料查看】

(http://www.secureworks.com/cyber-threat-intelligence/threats/skeleton-key-malware-analysis/),2015 年 1 月 17 日Benjamin Delpy更新了Mimikatz使其也能進行Skeleton Key攻擊,我們今天分析的主要內(nèi)容也就是mimikatz的misc::skeleton功能。

2.模塊詳細分析

misc::skeleton功能模塊在kuhl_m_misc.c文件中,從該c文件開頭可以看到作者定義了一個結(jié)構(gòu)體數(shù)組用來存儲當前misc模塊中具體有哪些功能,該結(jié)構(gòu)體有3個成員第一個是功能函數(shù),第二個是啟動該功能的參數(shù),第三個是功能描述所以我們今天要分析的skeleton在這個kuhl_m_misc_skeleton函數(shù)中啟動命令為misc::skeleton暫無描述,可以看到其他該misc模塊是有很多功能是日常使用中也沒有用上后續(xù)可以挖掘功能

所以我們在這個kuhl_m_misc_skeleton函數(shù)下個斷點當我們執(zhí)行misc::skeleton時就可以執(zhí)行到這里開始調(diào)試,在該函數(shù)開始前還定義一個數(shù)組存儲了一個字符串Kerberos-Newer-Keys,這是個很重要的字符串后續(xù)用到的時候詳細解釋

可以看到函數(shù)開始定義了很多變量,可以看到extensions結(jié)構(gòu)體初始化了一些值,我們查看一下這個結(jié)構(gòu)體可以發(fā)現(xiàn)該結(jié)構(gòu)體成員有4個從名稱大概可以猜出來分別為模塊,功能,替換的值,指針,這樣我們大概就可以這個結(jié)構(gòu)體數(shù)組是什么了第一個結(jié)構(gòu)體就是模塊是kernel32.dll,localAlloc函數(shù),替換的值為0X4a4a4a4a4a,指針為NULL,從現(xiàn)在來看這個結(jié)構(gòu)體大部分內(nèi)容是沒意義的還有很多為NULL的

接下來又定義了一個結(jié)構(gòu)體exforcb來存儲extensions以及extensions的大小,判斷當前Mimikatz的版本號是否小于vista系統(tǒng)的版本號這里我們的軟件版本11是大于宏定義的visita系統(tǒng)5000的或者傳入命令參數(shù)是否有l(wèi)etaes我們這里傳入的是misc::skeleton所以兩個判斷都不為真onlyRC4Stuff為0 這樣也才能進入下面的功能操作。接著利用RtlZeroMemory函數(shù)初始化orig結(jié)構(gòu)體填充0

接下來用RtlInitUnicodeString函數(shù)計算出Kerberos-Newer-Keys字符串的長度并將該字符串以及長度保存在orig結(jié)構(gòu)體中

接下來傳入lsass.exe到kull_m_process_getProcessIdForName函數(shù)中用來獲取lsass進程的pid,該函數(shù)主要通過NtQuerySystemInformationAPI函數(shù)來獲取

接下來利用openprocess函數(shù)傳入開始lsass進程的pid來獲取lsass進程的句柄,然后將KULL_M_MEMORY_TYPE_PROCESS,lsass進程的句柄,&alsass.hmemory傳入kull_m_memory_open函數(shù)中,alsass也是kuhl_m_misc_skeleton函數(shù)一開始定義的結(jié)構(gòu)體里面有2個成員一個存儲地址的指針,另一個成員又是一個結(jié)構(gòu)體主要表示當前句柄的類型或者內(nèi)存的屬性

跟進這個函發(fā)現(xiàn)會根據(jù)傳入的參數(shù)走KULL_M_MEMORY_TYPE_PROCESScase該函數(shù)主要就是給alsass.hmemory結(jié)構(gòu)體賦值

接下來由于onlyRC4Stuff為0所以可以進入里面的流程我們看到kull_m_process_getVeryBasicModuleInformationsForName傳入了3個參數(shù)開始的alsass.hmemory,kdscsvc.dll字符串,和另一個cryptinfos結(jié)構(gòu)體的引用這個結(jié)構(gòu)體主要是一個存儲模塊的基礎(chǔ)信息成員有模塊基地址,模塊大小,時間戳,沒有公開的函數(shù)

跟進函數(shù)其實該函數(shù)主要是通過kull_m_process_getVeryBasicModuleInformations函數(shù)獲取kdscsvc.dll的詳細信息,kull_m_process_callback_moduleForName是個回調(diào)函數(shù)主要是用結(jié)構(gòu)體賦值的


進入函數(shù)主要是跟內(nèi)存屬性走不同case通過peb和ldr遍歷進程的模塊來獲取kdscsvc.dll的詳細信息


跟進kull_m_process_peb函數(shù)可以看到根據(jù)不同內(nèi)存屬性來走對應(yīng)的case獲取peb信息,這里是通過NtQueryInformationProcessAPI獲取

由于VS是3環(huán)調(diào)試器無法讀取到內(nèi)核的信息,我們可以搭建雙機調(diào)試使用windbg讀取一下0x0000008f85514000PEB結(jié)構(gòu)體信息

函數(shù)最開始有定義一個結(jié)構(gòu)體來存儲peb相關(guān)信息,使用kull_m_memory_copy函數(shù)根據(jù)不同的內(nèi)存屬性調(diào)用不同的內(nèi)存拷貝函數(shù)這里調(diào)用的ReadProcessMemory函數(shù)

主要是利用PEB找到LDR以及雙向鏈表InLoadOrderModuleList來遍歷lsass進程模塊找到kdcsvc.dll


可以看到確實獲取到了kdcsvc.dll的模塊信息并把信息存儲在cryptInfos結(jié)構(gòu)體中


跟進這個函數(shù)首先定義了一個跟參數(shù)search一樣的結(jié)構(gòu)體并把屬性定義為了KULL_M_MEMORY_GLOBAL_OWN_HANDLE這個結(jié)構(gòu)體存的是KULL_M_MEMORY_TYPE_OWN屬性,這里因為下面流程根據(jù)參數(shù)里面的內(nèi)存屬性走了KULL_M_MEMORY_TYPE_PROCESScase然后作者就使用kull_m_memory_copy函數(shù)(里面跟進內(nèi)存屬性走對應(yīng)的case這里使用了ReadProcessMemory函數(shù)拷貝)將search結(jié)構(gòu)體內(nèi)容都拷貝自己定義的sbuffer結(jié)構(gòu)體中然后又再次調(diào)用kull_m_memory_search函數(shù)進入這個函數(shù)由于sbuffer結(jié)構(gòu)體成員屬性作者定義為了KULL_M_MEMORY_TYPE_OWN所以會走KULL_M_MEMORY_TYPE_OWN的case

進入KULL_M_MEMORY_TYPE_OWNcase后利用for循環(huán)從kdcsvc.dll的首地址2c28dde0080開始查找Kerberos-Newer-Keys字符串,由于最后匹配上之后繼續(xù)執(zhí)行了一次curentPtr++后續(xù)通過currentptr–調(diào)整回來指向kdcsvc.dll中Kerberos-Newer-Keys字符串的正確地址


由于search結(jié)構(gòu)體中存儲了kdcsvc.dll內(nèi)容但是沒辦法直接在其內(nèi)存中搜索字符串將其拷貝到sbuffer后然后在sbuffer中找到Kerberos-Newer-Keys字符串并計算其偏移再加上kdcsvc.dll真實的首地址就獲得了該字符串的真實偏移通過windbg中查詢數(shù)據(jù)可以看到

所以到這里kull_m_memory_search目的就是找Kerberos-Newer-Keys字符串在kdcsvc.dll中的位置。

kdcsvc.dll是windowsserver系統(tǒng)上才有的dll文件如果是域控服務(wù)器的話lsass進程會加載該dll作為kdc服務(wù)來頒發(fā)piao據(jù)

ntds.dit數(shù)據(jù)庫文件有個補充憑證(supplementalCredentials)屬性該屬性中又包含了Kerberos-Newer-Keys屬性存儲了明文密碼的加密hash,kerberos-Newer-Keys可以設(shè)置各種加密屬性比如AES加密的話會涉及salt參加加密,但是RC4-HMAC加密就不涉及salt了。Kerberos新的加密類型(如AES)會要求將salt字符串(通常是用戶名)添加到密鑰派生函數(shù)中,要使不同用戶的密碼相同,需要創(chuàng)建不相同的加密密鑰。如果攻擊者要支持AES加密的話需要離線計算并存儲所有域用戶的密鑰,這需要大量內(nèi)存;或?qū)崟r計算相關(guān)用戶的密鑰,這可能會導(dǎo)致DC的性能問題,但RC4-HMAC不涉及salt,所有用戶的骨架RC4-HMAC密鑰不變,所以攻擊者一般會采取RC4-HMAC加密。


其中在WIN2008及其更新的版本中必須創(chuàng)建一個KERB_STORED_CREDENTIAL_NEW結(jié)構(gòu)體。然后必須將此值 與屬性名稱“Primary:Kerberos-Newer-Keys”一起放置在USER_PROPERTY結(jié)構(gòu)中才能放在補充憑據(jù)中使用,USER_PROPERTY如下圖


由于USER_PROPERTY結(jié)構(gòu)體中包含了Kerberos-Newer-Keys字符串所以接下來又通過kull_m_memory_search函數(shù)從kdcsvc.dll中搜索該結(jié)構(gòu)體的位置

0x7ffa33072b60就存儲了該USER_PROPERTY結(jié)構(gòu)體,其中屬性名稱是7ffa33066a8指向Kerberos-Newer-Keys字符串

接下來通過rtlzeromemory函數(shù)將orig結(jié)構(gòu)體置0然后通過kull_m_memory_copy函數(shù)將kdcsvc.dll中的USER_PROPERTY結(jié)構(gòu)體也置0了


調(diào)用writeprocessmemory函數(shù)將7ffa33072b60地址處16字節(jié)的數(shù)據(jù)置0

數(shù)據(jù)拷貝后內(nèi)存值可以看到Kerberos-Newer-Keys包沒有了這樣就可以保證沒辦法使用帶salt的AES加密方法了

我們可以通過ida打開kdcsvc.dll查看具體的Kerberos-Newer-Keys包的使用細節(jié)發(fā)現(xiàn)是SamIRetrieveMultiplePrimaryCredentials函數(shù)調(diào)用的


由于SamIRetrieveMultiplePrimaryCredentials函數(shù)是samsrv.dll的導(dǎo)出函數(shù)所以想知道具體的返回值我在samsrv.dll中進行了分析SampExtRetrieveMultiplePrimaryCredentialsDs是其主要實現(xiàn)

我們跟進函數(shù)然后發(fā)現(xiàn)SampLoadDsExtensionDll函數(shù)繼續(xù)跟進分析

發(fā)現(xiàn)該函數(shù)會查詢注冊表是否有DirectoryServiceExtPt值我的域控是2016的看了一下沒有這個值

接下來會繼續(xù)嘗試加載該文件由于沒有所以走下面的else返回0xc00000BB

通過微軟官方文檔查詢報錯值發(fā)現(xiàn)是不支持該請求類型的錯誤STATUS_NOT_SUPPORTED,keberos認證流程中客戶端會在AS-REQ中聲明自己支持的所有加密類型etype,域控會并檢查客戶端是否支持AES如果客戶端支持則域控會在AS-REP的PA-ETYPE-INFO2中響應(yīng)對應(yīng)的加密方式。但如果客戶端支持的加密類型中有AES,但DC并沒有回應(yīng)對應(yīng)的AES加密類型,并且報錯類型是STATUS_NOT_SUPPORTED很大可能受到了skeleton攻擊

本篇文章將持續(xù)更新,關(guān)注我精彩內(nèi)容!!!

查看【網(wǎng)絡(luò)安全學(xué)習(xí)資料·攻略

總結(jié)

以上是生活随笔為你收集整理的【安全研究】从mimikatz学习万能密码——上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。