Programmgesteuertes Abrufen der Zertifikatdetails einer ausführbaren Datei

Programmgesteuertes Abrufen der Zertifikatdetails einer ausführbaren Datei

Ist es möglich, den Betreff des digitalen Zertifikats einer Datei irgendwie programmgesteuert zu exportieren, wenn das Zertifikat selbst nicht auf der Arbeitsstation installiert ist, sondern nur zum Signieren dieser bestimmten Datei verwendet wird?

Ich muss diese Informationen irgendwie aus einer Datei extrahieren und prüfen, ob sie korrekt sind. Am besten mit Python/CMD/PowerShell

Was ich brauche

BEARBEITEN:

Entschuldigen Sie den Mangel an Einzelheiten.

Ich verwende derzeit dieses Python-Skript (das ich für die Ausführung unter Python 3.6 geändert habe):http://www.zedwood.com/article/python-openssl-x509-parse-certificateum eine .cer-Datei zu analysieren, die ich mit diesem kleinen Tool, das ich gefunden habe (und das ich auch für die Verwendung mit Python 3 geändert habe), aus der ursprünglichen ausführbaren Datei extrahiert habe:https://blog.didierstevens.com/programs/disitool/aber erst, nachdem ich es mit dem Windows Certutil von einer DER-codierten Binärdatei in eine Base-64-Datei konvertiere.

Das Problem mit dem Disitool-Skript besteht jedoch darin, dass es mithilfe des Python-Moduls „pefile“ buchstäblich ein „Signatur“-Bytearray aus der ausführbaren Datei selbst AUSSCHNEIDET, wodurch die extrahierte CER-Datei ungültig wird, entsprechend dem Python-Fehler, den ich immer erhalte, wenn ich versuche, das Zertifikat mit dem Modul OpenSSL.crypto zu laden:

 [('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')] 

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

Das Parsen funktioniert einwandfrei]

Ich brauche also wohl nur eine Möglichkeit, das Zertifikat aus einer ausführbaren Datei zu extrahieren. Oder, falls Sie meine Lösung zu kompliziert finden: Wenn Sie eine Idee haben, wie ich den Text „Redmond“ aus dem Betrefffeld des Zertifikats herausbekomme, bin ich sehr offen für Ideen :)

Antwort1

In Powershell:

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

Wenn wir also Ihr Beispiel von explorer.exe verwenden, käme Redmond zu folgendem Ergebnis:

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

Da Sie um eine genauere Erläuterung gebeten haben, Get-AuthenticodeSignaturegibt es ein System.Management.Automation.Signature-Objekt zurück. Sie können dies auf verschiedene Weise herausfinden. Persönlich ziehe ich es vor, es einer Variablen zuzuweisen, damit ich mit dem zurückgegebenen Objekt weiter herumspielen kann. Sobald Sie es einer Variablen zugewiesen haben, können Sie etwas darüber lernen. Get-Membersollte eines Ihrer bevorzugten 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 {get;}
Path                   Property   string Path {get;}
SignatureType          Property   System.Management.Automation.SignatureType SignatureType {get;}
SignerCertificate      Property   System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {...
Status                 Property   System.Management.Automation.SignatureStatus Status {get;}
StatusMessage          Property   string StatusMessage {get;}
TimeStamperCertificate Property   System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific...

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

$foo.SignerCertificate


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

Der Daumenabdruck ist offensichtlich wichtig, da er das Zertifikat identifiziert, aber Sie hatten nach dem Redmond gefragt, der im Betreff steht. Jetzt wissen wir also, wie wir ihn als Zeichenfolge erhalten:

$foo.SignerCertificate.Subject

Von hier an handelt es sich also nur noch um eine direkte Zeichenfolgenanalyse.

Noch ein kleiner Tipp, den ich einwerfen möchte, da Sie anscheinend 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 existiert, bevor Sie die Frage gestellt haben. Also habe ich Folgendes 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

Antwort2

in Powershell: Sie können in CN ein Komma verwenden, dann hat das bei mir funktioniert:

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

verwandte Informationen