【安全研究】从mimikatz学习万能密码——上
1.背景介紹
2015年1月2日,Dell Secureworks共享了一份關于利用專用域控制器(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攻擊,我們今天分析的主要內容也就是mimikatz的misc::skeleton功能。
2.模塊詳細分析
misc::skeleton功能模塊在kuhl_m_misc.c文件中,從該c文件開頭可以看到作者定義了一個結構體數組用來存儲當前misc模塊中具體有哪些功能,該結構體有3個成員第一個是功能函數,第二個是啟動該功能的參數,第三個是功能描述所以我們今天要分析的skeleton在這個kuhl_m_misc_skeleton函數中啟動命令為misc::skeleton暫無描述,可以看到其他該misc模塊是有很多功能是日常使用中也沒有用上后續可以挖掘功能
所以我們在這個kuhl_m_misc_skeleton函數下個斷點當我們執行misc::skeleton時就可以執行到這里開始調試,在該函數開始前還定義一個數組存儲了一個字符串Kerberos-Newer-Keys,這是個很重要的字符串后續用到的時候詳細解釋
可以看到函數開始定義了很多變量,可以看到extensions結構體初始化了一些值,我們查看一下這個結構體可以發現該結構體成員有4個從名稱大概可以猜出來分別為模塊,功能,替換的值,指針,這樣我們大概就可以這個結構體數組是什么了第一個結構體就是模塊是kernel32.dll,localAlloc函數,替換的值為0X4a4a4a4a4a,指針為NULL,從現在來看這個結構體大部分內容是沒意義的還有很多為NULL的
接下來又定義了一個結構體exforcb來存儲extensions以及extensions的大小,判斷當前Mimikatz的版本號是否小于vista系統的版本號這里我們的軟件版本11是大于宏定義的visita系統5000的或者傳入命令參數是否有letaes我們這里傳入的是misc::skeleton所以兩個判斷都不為真onlyRC4Stuff為0 這樣也才能進入下面的功能操作。接著利用RtlZeroMemory函數初始化orig結構體填充0
接下來用RtlInitUnicodeString函數計算出Kerberos-Newer-Keys字符串的長度并將該字符串以及長度保存在orig結構體中
接下來傳入lsass.exe到kull_m_process_getProcessIdForName函數中用來獲取lsass進程的pid,該函數主要通過NtQuerySystemInformationAPI函數來獲取
接下來利用openprocess函數傳入開始lsass進程的pid來獲取lsass進程的句柄,然后將KULL_M_MEMORY_TYPE_PROCESS,lsass進程的句柄,&alsass.hmemory傳入kull_m_memory_open函數中,alsass也是kuhl_m_misc_skeleton函數一開始定義的結構體里面有2個成員一個存儲地址的指針,另一個成員又是一個結構體主要表示當前句柄的類型或者內存的屬性
跟進這個函發現會根據傳入的參數走KULL_M_MEMORY_TYPE_PROCESScase該函數主要就是給alsass.hmemory結構體賦值
接下來由于onlyRC4Stuff為0所以可以進入里面的流程我們看到kull_m_process_getVeryBasicModuleInformationsForName傳入了3個參數開始的alsass.hmemory,kdscsvc.dll字符串,和另一個cryptinfos結構體的引用這個結構體主要是一個存儲模塊的基礎信息成員有模塊基地址,模塊大小,時間戳,沒有公開的函數
跟進函數其實該函數主要是通過kull_m_process_getVeryBasicModuleInformations函數獲取kdscsvc.dll的詳細信息,kull_m_process_callback_moduleForName是個回調函數主要是用結構體賦值的
進入函數主要是跟內存屬性走不同case通過peb和ldr遍歷進程的模塊來獲取kdscsvc.dll的詳細信息
跟進kull_m_process_peb函數可以看到根據不同內存屬性來走對應的case獲取peb信息,這里是通過NtQueryInformationProcessAPI獲取
由于VS是3環調試器無法讀取到內核的信息,我們可以搭建雙機調試使用windbg讀取一下0x0000008f85514000PEB結構體信息
函數最開始有定義一個結構體來存儲peb相關信息,使用kull_m_memory_copy函數根據不同的內存屬性調用不同的內存拷貝函數這里調用的ReadProcessMemory函數
主要是利用PEB找到LDR以及雙向鏈表InLoadOrderModuleList來遍歷lsass進程模塊找到kdcsvc.dll
可以看到確實獲取到了kdcsvc.dll的模塊信息并把信息存儲在cryptInfos結構體中
跟進這個函數首先定義了一個跟參數search一樣的結構體并把屬性定義為了KULL_M_MEMORY_GLOBAL_OWN_HANDLE這個結構體存的是KULL_M_MEMORY_TYPE_OWN屬性,這里因為下面流程根據參數里面的內存屬性走了KULL_M_MEMORY_TYPE_PROCESScase然后作者就使用kull_m_memory_copy函數(里面跟進內存屬性走對應的case這里使用了ReadProcessMemory函數拷貝)將search結構體內容都拷貝自己定義的sbuffer結構體中然后又再次調用kull_m_memory_search函數進入這個函數由于sbuffer結構體成員屬性作者定義為了KULL_M_MEMORY_TYPE_OWN所以會走KULL_M_MEMORY_TYPE_OWN的case
進入KULL_M_MEMORY_TYPE_OWNcase后利用for循環從kdcsvc.dll的首地址2c28dde0080開始查找Kerberos-Newer-Keys字符串,由于最后匹配上之后繼續執行了一次curentPtr++后續通過currentptr–調整回來指向kdcsvc.dll中Kerberos-Newer-Keys字符串的正確地址
由于search結構體中存儲了kdcsvc.dll內容但是沒辦法直接在其內存中搜索字符串將其拷貝到sbuffer后然后在sbuffer中找到Kerberos-Newer-Keys字符串并計算其偏移再加上kdcsvc.dll真實的首地址就獲得了該字符串的真實偏移通過windbg中查詢數據可以看到
所以到這里kull_m_memory_search目的就是找Kerberos-Newer-Keys字符串在kdcsvc.dll中的位置。
kdcsvc.dll是windowsserver系統上才有的dll文件如果是域控服務器的話lsass進程會加載該dll作為kdc服務來頒發piao據
ntds.dit數據庫文件有個補充憑證(supplementalCredentials)屬性該屬性中又包含了Kerberos-Newer-Keys屬性存儲了明文密碼的加密hash,kerberos-Newer-Keys可以設置各種加密屬性比如AES加密的話會涉及salt參加加密,但是RC4-HMAC加密就不涉及salt了。Kerberos新的加密類型(如AES)會要求將salt字符串(通常是用戶名)添加到密鑰派生函數中,要使不同用戶的密碼相同,需要創建不相同的加密密鑰。如果攻擊者要支持AES加密的話需要離線計算并存儲所有域用戶的密鑰,這需要大量內存;或實時計算相關用戶的密鑰,這可能會導致DC的性能問題,但RC4-HMAC不涉及salt,所有用戶的骨架RC4-HMAC密鑰不變,所以攻擊者一般會采取RC4-HMAC加密。
其中在WIN2008及其更新的版本中必須創建一個KERB_STORED_CREDENTIAL_NEW結構體。然后必須將此值 與屬性名稱“Primary:Kerberos-Newer-Keys”一起放置在USER_PROPERTY結構中才能放在補充憑據中使用,USER_PROPERTY如下圖
由于USER_PROPERTY結構體中包含了Kerberos-Newer-Keys字符串所以接下來又通過kull_m_memory_search函數從kdcsvc.dll中搜索該結構體的位置
0x7ffa33072b60就存儲了該USER_PROPERTY結構體,其中屬性名稱是7ffa33066a8指向Kerberos-Newer-Keys字符串
接下來通過rtlzeromemory函數將orig結構體置0然后通過kull_m_memory_copy函數將kdcsvc.dll中的USER_PROPERTY結構體也置0了
調用writeprocessmemory函數將7ffa33072b60地址處16字節的數據置0
數據拷貝后內存值可以看到Kerberos-Newer-Keys包沒有了這樣就可以保證沒辦法使用帶salt的AES加密方法了
我們可以通過ida打開kdcsvc.dll查看具體的Kerberos-Newer-Keys包的使用細節發現是SamIRetrieveMultiplePrimaryCredentials函數調用的
由于SamIRetrieveMultiplePrimaryCredentials函數是samsrv.dll的導出函數所以想知道具體的返回值我在samsrv.dll中進行了分析SampExtRetrieveMultiplePrimaryCredentialsDs是其主要實現
我們跟進函數然后發現SampLoadDsExtensionDll函數繼續跟進分析
發現該函數會查詢注冊表是否有DirectoryServiceExtPt值我的域控是2016的看了一下沒有這個值
接下來會繼續嘗試加載該文件由于沒有所以走下面的else返回0xc00000BB
通過微軟官方文檔查詢報錯值發現是不支持該請求類型的錯誤STATUS_NOT_SUPPORTED,keberos認證流程中客戶端會在AS-REQ中聲明自己支持的所有加密類型etype,域控會并檢查客戶端是否支持AES如果客戶端支持則域控會在AS-REP的PA-ETYPE-INFO2中響應對應的加密方式。但如果客戶端支持的加密類型中有AES,但DC并沒有回應對應的AES加密類型,并且報錯類型是STATUS_NOT_SUPPORTED很大可能受到了skeleton攻擊
本篇文章將持續更新,關注我精彩內容!!!
查看【網絡安全學習資料·攻略】
總結
以上是生活随笔為你收集整理的【安全研究】从mimikatz学习万能密码——上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Web安全】内网渗透研究之利用MSF和
- 下一篇: 【Web安全】一款功能强大的Web身份认