Communitygithub.com

Analyse von Certificate-Transparency-Logs zur Phishing-Erkennung

Überwachen Sie Certificate-Transparency-Logs mit crt.sh und Certstream, um Phishing-Domains frühzeitig zu erkennen, die sich als vertrauenswürdige Marken ausgeben.

Was ist Analyse von Certificate-Transparency-Logs zur Phishing-Erkennung?

Diese Fertigkeit befähigt Sicherheitsteams und SOC-Analysten, Certificate-Transparency-Logs (CT) systematisch zu überwachen und verdächtige Zertifikate zu identifizieren, die für Phishing-Kampagnen genutzt werden. CT ist ein offener, öffentlich einsehbarer Log aller ausgestellten SSL/TLS-Zertifikate. Angreifer registrieren oft täuschend ähnliche Domains (z. B. mycornpany.com statt mycompany.com) und nutzen kostenlose Zertifikate von Let's Encrypt, um ihre Phishing-Seiten mit HTTPS zu versehen. Da das Zertifikat bereits vor dem Start der Kampagne im Log auftaucht, ermöglicht die Überwachung eine proaktive Blockade. Die Fertigkeit unterstützt historische Abfragen über die crt.sh-API, Echtzeitüberwachung mittels Certstream, automatisierte Ähnlichkeitsanalyse mit Levenshtein-Distanz sowie die Erstellung strukturierter CT-Intelligence-Reports. Sie ist für alle gängigen CI-Plattformen (Claude Code, Cursor, Codex) geeignet und setzt Python 3.9+ sowie die Bibliotheken requests, certstream, tldextract und Levenshtein voraus. Durch integrierte Validierungskriterien und Handlungsempfehlungen (DNS-Sinkhole, CAA-Records, DMARC) wird die Effektivität der Erkennung sichergestellt.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mukul975/Anthropic-Cybersecurity-Skills/tree/main/skills/analyzing-certificate-transparency-for-phishing

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Analyse von Certificate-Transparency-Logs zur Phishing-Erkennung?

Überblick

Certificate Transparency (CT) ist ein Internetsicherheitsstandard, der ein öffentliches, nur-anhängbares Log aller ausgestellten SSL/TLS-Zertifikate erstellt. Die Überwachung von CT-Logs ermöglicht die frühzeitige Erkennung von Phishing-Domains, die Zertifikate registrieren, die legitime Marken nachahmen, unbefugten Zertifikatsausstellungen für eigene Domains sowie zertifikatsbasierter Angriffsinfrastruktur. Diese Fertigkeit umfasst das Abfragen von CT-Logs über crt.sh, die Echtzeitüberwachung mit Certstream, den Aufbau automatisierter Warnungen für verdächtige Zertifikate und die Integration der Ergebnisse in Threat-Intelligence-Workflows.

Verwendungszweck

  • Bei der Untersuchung von Sicherheitsvorfällen, die eine Analyse von Certificate Transparency auf Phishing erfordern
  • Beim Erstellen von Erkennungsregeln oder Threat-Hunting-Abfragen für diesen Bereich
  • Wenn SOC-Analysten strukturierte Verfahren für diesen Analysetyp benötigen
  • Beim Validieren der Sicherheitsüberwachungsabdeckung für verwandte Angriffstechniken

Voraussetzungen

  • Python 3.9+ mit den Bibliotheken requests, certstream, tldextract, Levenshtein
  • Zugriff auf crt.sh (https://crt.sh/) für historische CT-Log-Abfragen
  • Certstream (https://certstream.calidog.io/) für Echtzeitüberwachung
  • Liste der zu überwachenden Unternehmensdomains und Markenschlüsselwörter
  • Verständnis der SSL/TLS-Zertifikatstruktur und des Ausstellungsprozesses

Schlüsselkonzepte

Certificate-Transparency-Logs

CT-Logs sind kryptografisch gesicherte, öffentlich prüfbare, nur-anhängbare Aufzeichnungen der TLS-Zertifikatsausstellung. Große Zertifizierungsstellen (Let’s Encrypt, DigiCert, Sectigo, Google Trust Services) übermitteln alle ausgestellten Zertifikate an mehrere CT-Logs. Ab 2025 verlangen Chrome und Safari für alle öffentlich vertrauenswürdigen Zertifikate CT.

Phishing-Erkennung via CT

Angreifer registrieren täuschend ähnliche Domains und besorgen sich kostenlose Zertifikate (oft von Let’s Encrypt), um Phishing-Seiten mit HTTPS legitim erscheinen zu lassen. Die CT-Überwachung erkennt diese frühzeitig, da das Zertifikat bereits vor dem Start der Phishing-Kampagne in den Logs erscheint – ein Zeitfenster für proaktive Blockaden.

crt.sh-Datenbank

crt.sh ist eine kostenlose Weboberfläche und PostgreSQL-Datenbank, betrieben von Sectigo, die CT-Logs indiziert. Sie unterstützt Wildcard-Suchen (%.example.com), direkte SQL-Abfragen und JSON-API-Antworten. Sie erfasst die Zertifikatsausstellung, -ablauf und -widerruf über alle wichtigen CT-Logs hinweg.

Arbeitsablauf

Schritt 1: crt.sh nach Zertifikatshistorie abfragen

import requests
import json
from datetime import datetime
import tldextract

class CTLogMonitor:
    CRT_SH_URL = "https://crt.sh"

    def __init__(self, monitored_domains, brand_keywords):
        self.monitored_domains = monitored_domains
        self.brand_keywords = [k.lower() for k in brand_keywords]

    def query_crt_sh(self, domain, include_expired=False):
        """crt.sh nach Zertifikaten zu einer Domain abfragen."""
        params = {
            "q": f"%.{domain}",
            "output": "json",
        }
        if not include_expired:
            params["exclude"] = "expired"

        resp = requests.get(self.CRT_SH_URL, params=params, timeout=30)
        if resp.status_code == 200:
            certs = resp.json()
            print(f"[+] crt.sh: {len(certs)} Zertifikate für *.{domain}")
            return certs
        return []

    def find_suspicious_certs(self, domain):
        """Zertifikate finden, die möglicherweise Phishing-Versuche sind."""
        certs = self.query_crt_sh(domain)
        suspicious = []

        for cert in certs:
            common_name = cert.get("common_name", "").lower()
            name_value = cert.get("name_value", "").lower()
            issuer = cert.get("issuer_name", "")
            not_before = cert.get("not_before", "")
            not_after = cert.get("not_after", "")

            # Prüfen auf exakte Domain-Übereinstimmungen (legitim)
            extracted = tldextract.extract(common_name)
            cert_domain = f"{extracted.domain}.{extracted.suffix}"
            if cert_domain == domain:
                continue  # Legitimes Zertifikat

            # Verdächtige Muster markieren
            flags = []
            if domain.replace(".", "") in common_name.replace(".", ""):
                flags.append("enthält Ziel-Domain-String")
            if any(kw in common_name for kw in self.brand_keywords):
                flags.append("enthält Markenschlüsselwort")
            if "let's encrypt" in issuer.lower():
                flags.append("kostenlose CA (Let's Encrypt)")

            if flags:
                suspicious.append({
                    "common_name": cert.get("common_name", ""),
                    "name_value": cert.get("name_value", ""),
                    "issuer": issuer,
                    "not_before": not_before,
                    "not_after": not_after,
                    "serial": cert.get("serial_number", ""),
                    "flags": flags,
                    "crt_sh_id": cert.get("id", ""),
                    "crt_sh_url": f"https://crt.sh/?id={cert.get('id', '')}",
                })

        print(f"[+] {len(suspicious)} verdächtige Zertifikate gefunden")
        return suspicious

monitor = CTLogMonitor(
    monitored_domains=["mycompany.com", "mycompany.org"],
    brand_keywords=["mycompany", "mybrand", "myproduct"],
)
suspicious = monitor.find_suspicious_certs("mycompany.com")
for cert in suspicious[:5]:
    print(f"  [{cert['common_name']}] Flags: {cert['flags']}")

Schritt 2: Echtzeitüberwachung mit Certstream

import certstream
import Levenshtein
import re
from datetime import datetime

class CertstreamMonitor:
    def __init__(self, watched_domains, brand_keywords, similarity_threshold=0.8):
        self.watched_domains = [d.lower() for d in watched_domains]
        self.brand_keywords = [k.lower() for k in brand_keywords]
        self.threshold = similarity_threshold
        self.alerts = []

    def start_monitoring(self, max_alerts=100):
        """Echtzeit-CT-Log-Überwachung starten."""
        print("[*] Starte Certstream-Überwachung...")
        print(f"    Überwacht: {self.watched_domains}")
        print(f"    Schlüsselwörter: {self.brand_keywords}")

        def callback(message, context):
            if message["message_type"] == "certificate_update":
                data = message["data"]
                leaf = data.get("leaf_cert", {})
                all_domains = leaf.get("all_domains", [])

                for domain in all_domains:
                    domain_lower = domain.lower().strip("*.")
                    if self._is_suspicious(domain_lower):
                        alert = {
                            "domain": domain,
                            "all_domains": all_domains,
                            "issuer": leaf.get("issuer", {}).get("O", ""),
                            "fingerprint": leaf.get("fingerprint", ""),
                            "not_before": leaf.get("not_before", ""),
                            "detected_at": datetime.now().isoformat(),
                            "reason": self._get_reason(domain_lower),
                        }
                        self.alerts.append(alert)
                        print(f"  [ALARM] {domain} - {alert['reason']}")

                        if len(self.alerts) >= max_alerts:
                            raise KeyboardInterrupt

        try:
            certstream.listen_for_events(callback, url="wss://certstream.calidog.io/")
        except KeyboardInterrupt:
            print(f"\n[+] Überwachung gestoppt. {len(self.alerts)} Alarme gesammelt.")
        return self.alerts

    def _is_suspicious(self, domain):
        """Prüfen, ob eine Domain im Verhältnis zu überwachten Domains verdächtig ist."""
        for watched in self.watched_domains:
            # Exakte Schlüsselwortübereinstimmung
            watched_base = watched.split(".")[0]
            if watched_base in domain and domain != watched:
                return True

            # Levenshtein-Distanz (Typosquatting-Erkennung)
            domain_base = tldextract.extract(domain).domain
            similarity = Levenshtein.ratio(watched_base, domain_base)
            if similarity >= self.threshold and domain_base != watched_base:
                return True

        # Markenschlüsselwortübereinstimmung
        for keyword in self.brand_keywords:
            if keyword in domain:
                return True

        return False

    def _get_reason(self, domain):
        """Ermitteln, warum die Domain markiert wurde."""
        reasons = []
        for watched in self.watched_domains:
            watched_base = watched.split(".")[0]
            if watched_base in domain:
                reasons.append(f"enthält '{watched_base}'")
            domain_base = tldextract.extract(domain).domain
            similarity = Levenshtein.ratio(watched_base, domain_base)
            if similarity >= self.threshold and domain_base != watched_base:
                reasons.append(f"ähnlich zu '{watched}' ({similarity:.0%})")
        for kw in self.brand_keywords:
            if kw in domain:
                reasons.append(f"Markenschlüsselwort '{kw}'")
        return "; ".join(reasons) if reasons else "unbekannt"

cs_monitor = CertstreamMonitor(
    watched_domains=["mycompany.com"],
    brand_keywords=["mycompany", "mybrand"],
    similarity_threshold=0.75,
)
alerts = cs_monitor.start_monitoring(max_alerts=50)

Schritt 3: Subdomains aus CT-Logs aufzählen

def enumerate_subdomains_ct(domain):
    """Alle Subdomains aus Certificate-Transparency-Logs entdecken."""
    params = {"q": f"%.{domain}", "output": "json"}
    resp = requests.get("https://crt.sh", params=params, timeout=30)

    if resp.status_code != 200:
        return []

    certs = resp.json()
    subdomains = set()
    for cert in certs:
        name_value = cert.get("name_value", "")
        for name in name_value.split("\n"):
            name = name.strip().lower()
            if name.endswith(f".{domain}") or name == domain:
                name = name.lstrip("*.")
                subdomains.add(name)

    sorted_subs = sorted(subdomains)
    print(f"[+] CT-Subdomain-Aufzählung für {domain}: {len(sorted_subs)} Subdomains")
    return sorted_subs

subdomains = enumerate_subdomains_ct("example.com")
for sub in subdomains[:20]:
    print(f"  {sub}")

Schritt 4: CT-Intelligence-Report erstellen

def generate_ct_report(suspicious_certs, certstream_alerts, domain):
    report = f"""# Certificate-Transparency-Intelligence-Report
## Ziel-Domain: {domain}
## Erstellt: {datetime.now().isoformat()}

## Zusammenfassung
- Verdächtige Zertifikate gefunden: {len(suspicious_certs)}
- Echtzeit-Alarme ausgelöst: {len(certstream_alerts)}

## Verdächtige Zertifikate (crt.sh)
| Common Name | Aussteller | Flags | crt.sh-Link |
|------------|--------|-------|-------------|
"""
    for cert in suspicious_certs[:20]:
        flags = "; ".join(cert.get("flags", []))
        report += (f"| {cert['common_name']} | {cert['issuer'][:30]} "
                   f"| {flags} | [Ansehen]({cert['crt_sh_url']}) |\n")

    report += f"""
## Echtzeit-Certstream-Alarme
| Domain | Aussteller | Grund | Erkannt |
|--------|--------|--------|----------|
"""
    for alert in certstream_alerts[:20]:
        report += (f"| {alert['domain']} | {alert['issuer']} "
                   f"| {alert['reason']} | {alert['detected_at'][:19]} |\n")

    report += """
## Empfehlungen
1. Markierte Domains zur DNS-Sinkhole / Web-Proxy-Blockliste hinzufügen
2. Takedown-Anträge für bestätigte Phishing-Domains einreichen
3. CT-Logs kontinuierlich auf neue Zertifikatsregistrierungen überwachen
4. CAA-DNS-Einträge implementieren, um die Zertifikatsausstellung für Ihre Domains einzuschränken
5. DMARC bereitstellen, um E-Mail-Spoofing durch ähnliche Domains zu verhindern
"""
    with open(f"ct_report_{domain.replace('.','_')}.md", "w") as f:
        f.write(report)
    print(f"[+] CT-Report gespeichert")
    return report

generate_ct_report(suspicious, alerts if 'alerts' in dir() else [], "mycompany.com")

Validierungskriterien

  • crt.sh-Abfragen geben Zertifikatsdaten für Ziel-Domains zurück
  • Verdächtige Zertifikate werden anhand von Nachahmungsmustern identifiziert
  • Certstream-Echtzeitüberwachung erkennt neue Phishing-Zertifikate
  • Subdomain-Aufzählung liefert eine umfassende Liste aus CT-Logs
  • Alarme werden mit Grundklassifizierung generiert
  • CT-Intelligence-Report wird mit handlungsorientierten Empfehlungen erstellt

Referenzen

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

abusing-dpapi-for-credential-access

Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys) online or offline using SharpDPAPI, SharpChrome, Mimikatz, or Impacket

abusing-shadow-credentials-for-privesc

Take over Active Directory accounts by writing attacker-controlled public keys to msDS-KeyCredentialLink (Shadow Credentials) with pyWhisker, Whisker, or Certipy, then authenticate via PKINIT to recover the target

achieving-cmmc-level-2-compliance

>-

acquiring-disk-image-with-dd-and-dcfldd

Create forensically sound bit-for-bit disk images with dd or dcfldd on a Linux forensic workstation, preserving evidence integrity through hash verification (MD5/SHA) during acquisition. Use when imaging a suspect drive, USB device, or memory card for investigation, preserving volatile disk evidence during incident response, or producing a verified copy for legal or law-enforcement proceedings before any destructive analysis.

analyzing-active-directory-acl-abuse

Detect dangerous ACL misconfigurations in Active Directory using ldap3

analyzing-android-malware-with-apktool

Perform static analysis of Android APK malware using apktool for resource decompilation, jadx for Java source recovery, and androguard for manifest inspection, dangerous permission-combination detection, and identification of obfuscated code, dynamic code loading, and reflection-based API calls. Use to statically triage a suspicious APK without executing it or to build mobile malware detection rules.

analyzing-api-gateway-access-logs

Parses API Gateway access logs (AWS API Gateway, Kong, Nginx) to detect

analyzing-apt-group-with-mitre-navigator

Query ATT&CK data with attackcti, mitreattack-python, and stix2, then build MITRE ATT&CK Navigator layers and multi-layer heatmap overlays mapping one or more APT groups

analyzing-azure-activity-logs-for-threats

Queries Azure Monitor activity logs and sign-in logs via azure-monitor-query

analyzing-bootkit-and-rootkit-samples

Analyzes bootkit and advanced rootkit malware infecting the Master

analyzing-browser-forensics-with-hindsight

Parse Chromium-based browser databases with Hindsight to extract and correlate browsing history, downloads, cookies, cached content, autofill data, saved passwords, and extensions from Chrome, Edge, Brave, Opera, and Vivaldi into a unified timeline (XLSX, JSON, or SQLite output). Use during incident response, insider-threat investigations, or criminal cases when you need to reconstruct a user

analyzing-campaign-attribution-evidence

Systematically evaluate cyber-campaign evidence to attribute an operation to a threat actor, using the Diamond Model and Analysis of Competing Hypotheses (ACH) to weigh infrastructure overlaps, TTP consistency, malware code similarity, and timing/language artifacts into confidence-weighted attribution assessments. Use when an incident investigation needs a defensible attribution confidence level.

analyzing-cloud-storage-access-patterns

Detect abnormal access in AWS S3, GCS, and Azure Blob Storage by analyzing CloudTrail Data Events, GCS audit logs, and Azure Storage Analytics for after-hours bulk downloads, new-IP access, and API-call spikes (e.g. GetObject) via statistical baselines and time-series anomaly detection. Use when investigating suspected cloud data exfiltration or building related detection rules.

analyzing-cobalt-strike-beacon-configuration

Extract and analyze Cobalt Strike beacon configuration from PE files

analyzing-cobaltstrike-malleable-c2-profiles

Parse and analyze Cobalt Strike Malleable C2 profiles with dissect.cobaltstrike (profiles and beacon-payload configs) and pyMalleableC2 (AST parsing) to extract HTTP/DNS transforms, URIs, headers, sleep/jitter, and injection behavior, then generate network detection signatures. Use when reverse-engineering a captured malleable profile or building detections against Cobalt Strike Beacon traffic.

analyzing-command-and-control-communication

Analyzes malware C2 communication over HTTP, HTTPS, DNS, and custom

analyzing-cyber-kill-chain

Analyzes intrusion activity against the Lockheed Martin Cyber Kill Chain

analyzing-disk-image-with-autopsy

Perform comprehensive forensic analysis of raw (dd), E01, or AFF disk images with Autopsy and The Sleuth Kit, recovering deleted files, examining metadata and embedded artifacts, keyword searching, and building investigation timelines with visual reports. Use for structured analysis of a forensic disk image or when stakeholders need visual reports from evidence.

analyzing-dns-logs-for-exfiltration

Analyzes DNS query logs to detect data exfiltration via DNS tunneling,

analyzing-docker-container-forensics

Investigate compromised Docker containers by analyzing images, layers,

Verwandte Skills