Programmgesteuertes Abrufen der Zertifikatdetails einer ausführbaren Datei

874
Claudiu Dragan

Es ist möglich, den Betreff einer Datei digital zu exportieren, wenn das Zertifikat selbst nicht auf der Workstation installiert ist, sondern nur zum Signieren dieser bestimmten Datei verwendet wird.

Ich muss diese Informationen irgendwie aus einer Datei extrahieren und überprüfen, ob sie richtig ist. Vorzugsweise mit Python / CMD / PowerShell

Was ich brauche

BEARBEITEN:

Entschuldigung für den Mangel an Details.

Derzeit verwende ich dieses Python-Skript (das ich für die Ausführung auf Python 3.6 geändert habe): http://www.zedwood.com/article/python-openssl-x509-parse-certificate, um eine .cer-Datei zu analysieren, aus der ich extrahiert habe Die ursprüngliche ausführbare Datei mit diesem kleinen Werkzeug, das ich gefunden habe (das ich auch geändert habe, um mit Python 3 zu arbeiten): https://blog.didierstevens.com/programs/disitool/, aber erst nachdem ich es aus einer DER-codierten Binärdatei konvertiert habe zu einer Basis-64 mit dem Windows-Zertifikat.

Das Problem mit dem disitool-Skript besteht jedoch darin, dass es buchstäblich eine Signatur von der ausführbaren Datei selbst mit dem pefile-Python-Modul erstellt, wodurch die extrahierte .cer-Datei aufgrund des Python-Fehlers, den ich beim Versuch bekomme, ungültig wird Laden Sie das Zertifikat mit dem OpenSSL.crypto-Modul:

 [('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error'), ('asn1 encoding routines', 'asn1_template_noexp_d2i', 'nested asn1 error'), ('PEM routines', 'PEM_ASN1_read_bio', 'ASN1 lib')] 

Das Parsen eines guten extrahierten Zertifikats (mit dem ersten Skript, das ich oben veröffentlicht habe) funktioniert jedoch, wie Sie hier sehen können:

Parsen funktioniert prima

Ich brauche also nur eine Möglichkeit, das Zertifikat aus einer ausführbaren Datei zu extrahieren, schätze ich. Oder, wenn Sie meine Lösung als zu kompliziert empfanden, wenn Sie eine Idee haben, wie ich den "Redmond" -Text aus dem Feld "Subject" des Zertifikats erhalten kann, bin ich sehr offen für Ideen :)

0
Da wir kein Skriptschreibservice sind. Wir würden uns freuen, wenn Sie das, was Sie versucht haben, mit angeben. Ramhound vor 6 Jahren 0
@ Ramhound Ich weiß, ich bin eine schreckliche Person ... EBGreen vor 6 Jahren 0
@ EBGreen - Alle Probleme, die ich mit dieser Frage habe, beziehen sich auf den Forschungsaufwand des Autors. Sie sind meiner Meinung nach gut zu beantworten. Ramhound vor 6 Jahren 0
Der Kommentar war ein Witz. :) EBGreen vor 6 Jahren 0
@ EBGreen - Humor entgeht mir manchmal total. Ramhound vor 6 Jahren 0
@Ramhound gut in aller Ehrlichkeit, mein Humor entgeht oft den meisten Menschen. EBGreen vor 6 Jahren 0
Entschuldigung für den Mangel an Details. Claudiu Dragan vor 6 Jahren 0
Ich habe den Hauptposten zur Klarstellung bearbeitet Claudiu Dragan vor 6 Jahren 0
Wenn Sie dieses Detail in die Frage zu stackoverflow gestellt hätten, wäre es wahrscheinlich nicht dort geschlossen worden. EBGreen vor 6 Jahren 0

1 Antwort auf die Frage

2
EBGreen

In Powershell:

Get-AuthenticodeSignature C:\Path\TO\File.exe 

Am Beispiel von explorer.exe würde dies Redmond erhalten:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split(',')[2].split('=')[1] 

Get-AuthenticodeSignatureGibt Sie ein Objekt von System.Management.Automation.Signature zurück, da Sie nach Ausarbeitung gefragt haben. Sie können dies auf ein paar Arten herausfinden. Ich persönlich bevorzuge es, es einer Variablen zuzuweisen, damit ich mit dem zurückgegebenen Objekt weiter spielen kann. Sobald Sie es einer Variablen zugewiesen haben, können Sie etwas darüber lernen. Get-Membersollte einer Ihrer Favoriten zu Cmdlets in Powershell sein. In diesem Fall:

$foo = Get-AuthenticodeSignature C:\Windows\explorer.exe Get-Member -InputObject $foo TypeName: System.Management.Automation.Signature  Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() IsOSBinary Property bool IsOSBinary  Path Property string Path  SignatureType Property System.Management.Automation.SignatureType SignatureType  SignerCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {... Status Property System.Management.Automation.SignatureStatus Status  StatusMessage Property string StatusMessage  TimeStamperCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific... 

Sie können also sehen, dass das Objekt einige Methoden und Eigenschaften hat (ich weiß, alle Objekte tun es). In diesem Fall handelt es sich bei den Methoden um alle Standardmethoden, die von System.Object geerbt werden. Die Eigenschaften sind jedoch interessant. Das SignerCertificate sieht so aus, wie Sie es wollten, also lassen Sie uns sehen, wie das aussieht:

$foo.SignerCertificate   Thumbprint Subject ---------- ------- 419E77AED546A1A6CF4DC23C1F977542FE289CF7 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US 

Der Fingerabdruck ist offensichtlich wichtig, weil er das Zertifikat identifiziert, aber Sie hatten nach dem Redmond gefragt, der in dem Betreff steht. Jetzt wissen wir, wie man als String dazu kommt:

$foo.SignerCertificate.Subject 

Es ist also nur gerade String-Parsing von hier aus.

Noch ein Leckerbissen, das ich einwerfen werde, da Sie Powershell lernen. Ein weiteres Cmdlet, das Sie regelmäßig ausprobieren sollten, ist Get-Command. In diesem Fall wusste ich nicht einmal, dass das Cmdlet Get-AuthenticodeSignature vorhanden war, bevor Sie die Frage stellten. Also habe ich das gemacht:

Get-Command *signature*  CommandType Name Version Source ----------- ---- ------- ------ Function Update-MpSignature 1.0 Defender Cmdlet Get-AuthenticodeSignature 3.0.0.0 Microsoft.PowerShell.Security Cmdlet Save-VolumeSignatureCatalog 1.0.0.0 ShieldedVMDataFile Cmdlet Set-AuthenticodeSignature 3.0.0.0 Microsoft.PowerShell.Security 
Was übrigens dasselbe ist, was ich dir zu der Frage gesagt habe, die du gelöscht hast ... EBGreen vor 6 Jahren 1
Ich habe den anderen gelöscht, weil er als "Off-Topic" markiert war und vorgeschlagen wurde, meine Frage bei Superuser zu posten. Vielen Dank für Ihren Kommentar! Ich habe Ihren Powershell-Befehl ausprobiert, weiß jedoch nicht, wie ich dieses "Redmond"-Bit aus dem Fingerabdruck des Zertifikats extrahieren kann, den der Befehl zurückgibt. Kannst du bitte etwas näher erläutern? Claudiu Dragan vor 6 Jahren 0
Wenn Sie dieses Detail in das andere eingefügt hätten, wäre es nicht geschlossen worden. EBGreen vor 6 Jahren 0
Danke für deine Antwort! Ich habe Ihre Antwort als die richtige Antwort markiert, aber ich habe mich gefragt: Wenn eine Datei mit zwei verschiedenen Zertifikaten signiert ist, wie lautet dann die PS-Syntax, um das Thema der zweiten Signatur zu erhalten? Ich habe versucht "(Get-AuthenticodeSignature" Pfad-zu-Datei "). SignerCertificate [0] .subject und gibt das erste, aber" (Get-AuthenticodeSignature "Pfad-zu-Datei"). SignerCertificate [1] .subject zurück scheint nicht das zweite zurückzugeben Claudiu Dragan vor 6 Jahren 0
https://i.stack.imgur.com/nciTM.png Claudiu Dragan vor 6 Jahren 0
@ClaudiuDragan Nicht sicher, ehrlich zu sein. Ich arbeite nicht viel mit Zertifikaten. Das sieht für mich nach zwei verschiedenen Hashmethoden aus. Wenn tatsächlich zwei Zertifikate vorhanden sind, würde ich davon ausgehen, dass das zweite (Get-AuthenticodeSignature "Pfad-zu-Datei") [1] .SignerCertificate.subject "erhalten wird EBGreen vor 6 Jahren 0
Das klappt nicht, aber danke für den Vorschlag :) Claudiu Dragan vor 6 Jahren 0
Nun, wenn Sie eine Systemdatei kennen, die ich auf einer Windows-Maschine haben sollte, die dieses Verhalten aufweist, könnte ich es wahrscheinlich herausfinden, aber davon abgesehen habe ich wahrscheinlich keine Ideen. EBGreen vor 6 Jahren 0
@ClaudiuDragan - Ich habe keine Zeit, es durchzugehen, aber dieser Artikel sieht so aus, als müssten Sie Folgendes tun: https://www.sysadmins.lv/blog-de/reading-multiple-signatures-from-signed- Datei-mit-Powershell.aspx EBGreen vor 6 Jahren 0
Ja, jetzt geht es durch die Stufen. Vielen Dank! Claudiu Dragan vor 6 Jahren 0