SOC Prime Bias: Mittel

06 Jan. 2026 18:50

Von Code zur Abdeckung (Teil 2): Der Whitespace-Albtraum

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Folgen
Von Code zur Abdeckung (Teil 2): Der Whitespace-Albtraum
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Zusammenfassung

Der Artikel erklärt, wie LDAP-Filter, die von Impacket-Tools erzeugt werden, von Active Directory normalisiert werden, auf eine Weise, die inkonsistente Leerzeichen einführt Ereignis-ID 1644 Protokollen. Diese Formatverschiebungen können Erkennungen brechen, die sich auf exakte Zeichenfolgenabgleiche verlassen, selbst wenn die zugrundeliegende Filterlogik identisch ist. Der Autor zeigt, warum grundlegende „Enthält“-Logik fragil ist, und erläutert den Aufbau robuster Sigma-Erkennungen mit regulären Ausdrücken, die Platzierungsunterschiede, Groß-/Kleinschreibung und Operatorvariationen tolerieren.

Untersuchung

Um das Problem zu validieren, überprüfte der Autor reale Event-1644-Datensätze aus der Produktion und dokumentierte mehrere Leerzeichen-Permutationen desselben bitweisen LDAP-Filters (z.B. Varianten von userAccountControl&524288 mit unterschiedlicher Platzierung, Klammerung und Formatierung). Mehrere Erkennungsansätze wurden ausprobiert – beginnend mit statischen Zeichenfolgenprüfungen und zunehmend flexiblen Regex-Mustern, bis die Regel zuverlässig alle beobachteten Darstellungen erfasste, ohne Überwarnungen auszulösen.

Minderung

Übernehmen Sie Regex-basierte Erkennungen, die optionale Leerzeichen zulassen, eine Groß-/Kleinschreibung-unabhängige Übereinstimmung unterstützen und sowohl UND/ODER Operator-Stile berücksichtigen. Um die Leistung angemessen zu halten, filtern Sie vor dem Anwenden der teureren Regex-Logik nach dem Zielattributnamen vor. Schließlich validieren Sie kontinuierlich Erkennungen gegen ein kuratiertes „Wall of Shame“-Korpus, das jede Leerzeichen- und Formatierungsvariante im Feld einfängt.

Reaktion

Wenn eine verdächtige Übereinstimmung eines LDAP-Filters ausgelöst wird, benachrichtigen Sie das SOC, um potenzielle Rechteentdeckungs- oder Eskalationsaktivitätsumstände zu bewerten. Korrelieren Sie das Ereignis mit der Quellhost/IP-Adresse, dem anfordernden Benutzer und anderen LDAP-Attributen, um Absicht und Umfang zu bestimmen. Wenn Fehlalarme auftreten, passen Sie Schwellenwerte und Regelbedingungen an, während Sie die Abdeckung für bekannte Formatierungsvarianten beibehalten.

Attack Flow

Wir aktualisieren diesen Teil noch. Melden Sie sich an, um benachrichtigt zu werden

Benachrichtige mich

Simulation Ausführung

Voraussetzung: Der Telemetrie- und Basis-Pre-Flight-Check muss bestanden haben.

Begründung: Dieser Abschnitt beschreibt die genaue Ausführung der Angreifertechnik (TTP), die darauf ausgelegt ist, die Erkennungsregel auszulösen. Die Befehle und die Erzählung MÜSSEN direkt die identifizierten TTPs widerspiegeln und darauf abzielen, genau die Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird.

  • Angriffserzählung und Befehle:
    Ein Angreifer mit gering privilegierten Domänenanmeldeinformationen möchte privilegierte Konten zur lateralen Bewegung lokalisieren. Sie erstellen einen LDAP-Filter, der ein bitweises UND auf userAccountControl ausführt um Konten mit dem ADMINISTRATOR ADMINISTRATOR Flagge (Wert 524288) zu isolieren. Um einfaches Zeichenfolgen-Matching zu umgehen, fügen sie zusätzliche Leerzeichen und Klammern genau so hinzu, wie es die Sigma-Regel erwartet.

    1. Erstellen Sie die LDAP-Filterzeichenfolge mit Leerzeichenvariationen.
    2. Führen Sie die LDAP-Suche mit ldapsearch (via PowerShell) gegen den Domänencontroller aus.
    3. Stellen Sie sicher, dass das Sicherheitsereignisprotokoll Event 1644 mit dem erstellten Filter aufzeichnet.
  • Regressionstestskript:

    # --------------------------------------------------------------
    # Simulieren Sie einen LDAP-Bitweise-Filter, der die Sigma-Regel auslösen sollte
    # --------------------------------------------------------------
    
    # Parameter
    $DomainController = "dc01.example.com"
    $BaseDN = "DC=example,DC=com"
    $Filter = "(   userAccountControl   &   524288   )"
    $Attributes = "distinguishedName,samAccountName,userAccountControl"
    
    # LDAP-Abfrage ausführen
    try {
        $result = [ADSI]"LDAP://$DomainController/$BaseDN"
        $searcher = New-Object System.DirectoryServices.DirectorySearcher($result)
        $searcher.Filter = $Filter
        $searcher.PropertiesToLoad.AddRange($Attributes.Split(','))
        $searcher.PageSize = 1000
    
        $entries = $searcher.FindAll()
        foreach ($entry in $entries) {
            $dn = $entry.Properties["distinguishedname"][0]
            $sam = $entry.Properties["samaccountname"][0]
            $uac = $entry.Properties["useraccountcontrol"][0]
            Write-Output "Gefunden: $sam ($dn) – UAC=$uac"
        }
    } catch {
        Write-Error "LDAP-Abfrage fehlgeschlagen: $_"
    }
  • Bereinigungsbefehle:

    # Es wurden keine dauerhaften Änderungen vorgenommen; schließen Sie einfach die ADSI-Verbindung.
    Write-Output "Bereinigung abgeschlossen."