Threat Hunting ist die Kunst, im eigenen Netzwerk nach dem zu suchen, was man nicht sehen möchte. Nicht weil man Misstrauen mag, sondern weil Angreifer weder Bürozeiten noch Marketing-Folien respektieren.


We found something weird: „PDF Editor.exe“ als „Update“

Ein echter Fund wirkt selten wie ein Hollywood-Hack. Eher wie ein „Update“. Genau so begann es hier:

  • PDF Editor.exe verbindet sich zu https://appsuites.ai/api/update
  • Ein svchost.exe Prozess startet PDF Editor.exe und lässt über cmd.exe / powershell.exe WMI-Abfragen laufen
  • Danach folgen taskkill-Kommandos gegen Browser (Chrome/Edge)
  • Später verbindet sich „PDF Editor“ erneut zu https://appsuites.ai:443 mit Parametern wie --cms --partialupdate

Kernsignal: „Legitim“ wirkende App + Netzwerk-Update-Pattern + Prozesskette, die nicht zum Produkt passt.

GIF: Szene aus „Key and Peele“. Eingebettet via GIPHY

Threat Hunting ist nicht Incident Response

Threat Hunting ≠ Incident Response
Threat Hunting ≠ Alert-Triage
Threat Hunting ≠ „Threat Intel Feed consumption“

Threat Hunting passiert vor dem Ticket-Sturm. Und wenn es gut läuft, reduziert es genau diesen Ticket-Sturm.


IOCs sind schnell, TTPs sind nachhaltig

IOC-Hunting bringt schnelle Wins, aber geringen „Pain“. Das Ziel ist höher in der Pyramid of Pain zu jagen:

Pyramid of Pain
  • Hashes, Domains, IPs: leicht austauschbar, viel Noise
  • Toolmarks und Tradecraft: mittlerer Aufwand, mehr Wert
  • TTPs: teuer für Angreifer, nachhaltig für Verteidiger

Merksatz: Je weiter oben gejagt wird, desto mehr schmerzt es dem Angreifer.

Meme erstellt mit imgflip.com

Coverage Gap: Frameworks sind Landkarten, keine Sensoren

Frameworks helfen beim Denken. Sie erzeugen keine Telemetrie.

Praktischer Ansatz:

  • MITRE ATT&CK als TTP-Katalog und Mapping-Sprache
  • Hypothesen ableiten und gegen echte Events testen
  • Logging-Gaps als Output behandeln, nicht als Ausrede
Quelle: MITRE ATT&CK® Framework (MITRE Corporation)

Methodik: SEARCH Framework in der Praxis

Minimaler, wiederholbarer Ablauf:

  1. Scope: Was wird gejagt (TTP, Toolmark, Asset-Cluster)
  2. Enumerate: Welche Datenquellen existieren (EDR, Logs, Proxy, DNS, IAM)
  3. Assemble: Query-Set bauen, Baseline ziehen
  4. Reduce: Noise reduzieren (Allowlists, Parent/Child, Pfade, Signaturen)
  5. Confirm: Pivoten, Kontext aufbauen, Hypothese falsifizieren oder bestätigen
  6. Harden: Output in Detection/Telemetry/Control Improvements übersetzen
Quelle: SEARCH™ Methodology, CrowdStrike

„Hunting endet nicht mit wir haben etwas gefunden.“


Output: Was nach einem Fund passieren muss

Hunting-Resultate gehören in drei Schubladen:

  • New Detection
    • TTP → Query → Signal → Rule/Use Case
  • Telemetry Fix
    • Missing Logs, falsche Audit Policy, EDR-Gaps
  • Control Improvement
    • Hardening, Access-Controls, Segmentierung, App-Control, Egress-Policy

Wenn nur ein PDF mit Findings entsteht, aber keine Regel, kein Fix, kein Control-Change, war es Beschäftigungstherapie.


Fallstudie: Hypothesen für „PDF Editor.exe“

Beobachtete Anomalien werden Hypothesen:

  • Masquerading / Fake-Updater
    • „Update“-Traffic zu ungewöhnlicher Domain
    • App läuft aus untypischem Pfad
  • Defense Evasion
    • Browser-Kill, um Sessions/Artefakte zu beeinflussen
  • Discovery
    • WMI-Abfragen nach laufenden Prozessen (Chrome/Edge)
  • Persistence
    • Scheduled Tasks, Run-Keys, Startup-Links (klassische Autostarts)

Diese Hypothesen sind robust, auch wenn die Datei morgen anders heisst.


High-Priority Hunts

Fokus auf TTPs, die häufig sind und viel Schaden ermöglichen:

  • Persistence
    • Scheduled Tasks (Logon/Start/Repeat)
    • Run-Keys / Startup Folder
  • Discovery
    • Native Recon Commands (systeminfo, whoami, net, ipconfig, netstat)
  • Execution Frequency
    • „Neue App“ auf wenig Hosts

CrowdStrike Falcon Event Search Queries

1) Scheduled Task Persistence (MITRE T1053.005)

#event_simpleName = ProcessRollup2
| ImageFileName = /\\schtasks\.exe$/i
| CommandLine = /\/create/i
| CommandLine = /\/sc\s+(onlogon|onstart|minute|hourly|daily)/i
| CommandLine = /\/ru\s+("?(SYSTEM|LOCAL SERVICE|NETWORK SERVICE)"?)/i
  OR CommandLine = /\/rl\s+highest/i
  OR CommandLine = /\/it\b/i
| regex(field=CommandLine, regex="(?i)\\/TR\\s+.*?\\\\(Users\\\\[^\\\\]+\\\\(Downloads|Desktop|AppData|Temp)|Windows\\\\Temp|ProgramData|Public)\\\\")
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine])

2) Run-Keys via reg.exe (MITRE T1547.001)

#event_simpleName = ProcessRollup2
| ImageFileName = /\\reg\.exe$/i
| CommandLine = /\b(add|delete)\b/i
| CommandLine = /HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run(Once)?/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine])

3) Startup Folder .lnk (MITRE T1547.001)

#event_simpleName = /File(Create|Write|Rename|Close)/i
| TargetFileName = /\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\.*\.lnk$/i
| table([@timestamp, ComputerName, TargetFileName])

4) Native Recon Commands (MITRE TA0007)

#event_simpleName = ProcessRollup2
| ImageFileName = /\\(systeminfo|whoami|net|ipconfig|netstat)\.exe$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine])

5) App Execution Frequency (global)

#event_simpleName = ProcessRollup2
| ImageFileName = /PDFConverter\.exe$/i
| groupBy(field=ImageFileName, function=[
  count(as=ExecCount),
  count(field=aid, distinct=true, as=Hosts),
  count(field=UserName, distinct=true, as=Users),
  min(@timestamp, as=FirstSeen),
  max(@timestamp, as=LastSeen)
])
| table([ImageFileName, ExecCount, Hosts, Users, FirstSeen, LastSeen], limit=max)

Microsoft Defender for Endpoint Advanced Hunting (KQL)

1) Scheduled Tasks mit verdächtigen Triggers/Targets (T1053.005)

DeviceProcessEvents
| where FileName =~ "schtasks.exe"
| where ProcessCommandLine has "/Create"
| where ProcessCommandLine has_any ("/SC ONLOGON", "/SC ONSTART", "/SC MINUTE", "/SC HOURLY", "/SC DAILY")
| where ProcessCommandLine has_any ("/RU SYSTEM", "/RU \"SYSTEM\"", "/RU \"LOCAL SERVICE\"", "/RU \"NETWORK SERVICE\"", "/RL HIGHEST", "/IT")
| where ProcessCommandLine matches regex @"(?i)/TR\s+.*\\(Users\\[^\\]+\\(Downloads|Desktop|AppData|Temp)|Windows\\Temp|ProgramData|Public)\\"
| project Timestamp, DeviceName, AccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, ProcessCommandLine
| order by Timestamp desc

2) Run-Keys Manipulation (T1547.001)

DeviceRegistryEvents
| where RegistryKey has @"\Software\Microsoft\Windows\CurrentVersion\Run"
  or RegistryKey has @"\Software\Microsoft\Windows\CurrentVersion\RunOnce"
| where ActionType in ("RegistryValueSet", "RegistryKeyCreated")
| project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RegistryKey, RegistryValueName, RegistryValueData
| order by Timestamp desc

3) Startup Folder LNK Drops (T1547.001)

DeviceFileEvents
| where FolderPath has @"\Microsoft\Windows\Start Menu\Programs\Startup"
| where FileName endswith ".lnk"
| where ActionType in ("FileCreated", "FileModified", "FileRenamed")
| project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FolderPath, FileName
| order by Timestamp desc

4) Native Recon Commands (TA0007)

DeviceProcessEvents
| where FileName in~ ("systeminfo.exe","whoami.exe","net.exe","ipconfig.exe","netstat.exe")
| project Timestamp, DeviceName, AccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine
| order by Timestamp desc

5) Global App Execution Frequency / „First Seen“ Hunting

DeviceProcessEvents
| where FileName =~ "PDFConverter.exe"
| summarize
    ExecCount = count(),
    Hosts = dcount(DeviceId),
    Users = dcount(AccountName),
    FirstSeen = min(Timestamp),
    LastSeen = max(Timestamp)
  by FileName
| order by LastSeen desc

6) Demo-Pattern: „PDF Editor.exe“ + Update-Domain + Browser-Kill

let SuspiciousDomain = "appsuites.ai";
let SuspiciousProc = "PDF Editor.exe";
DeviceNetworkEvents
| where RemoteUrl has SuspiciousDomain
| project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, RemotePort
| join kind=leftouter (
DeviceProcessEvents
| where FileName in~ ("cmd.exe","powershell.exe","taskkill.exe")
| where InitiatingProcessFileName =~ SuspiciousProc or ProcessCommandLine has SuspiciousProc
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine
) on DeviceName
| order by Timestamp desc

Bonus Hunting Query

Code-Signing-Zertifikate als Pivot.
Wer solche Signer-Treffer findet, hat oft keinen „harmlosen False Positive“, sondern ein sehr realistisches Signal für verdächtige Software in der Umgebung.

Meme erstellt mit imgflip.com

CrowdStrike

SubjectCN = /BLUE TAKIN LTD|TAU CENTAURI LTD|SPARROW TIDE LTD|TECHNODENIS LTD|AMARYLLIS SIGNAL LTD|BLACK INDIGO LTD|LONG SOUND LTD|OR KAHOL LTD|ASTRO BRIGHT LTD|MAINSTAY CRYPTO LLC|GRASSROOTS CONSULTING GROUP LLC|CROWD SYNC LLC|WORK PRODUCT INC|PIXEL CATALYST MEDIA LLC|BYTE MEDIA SDN BHD|ECHO INFINI SDN. BHD.|GLINT SOFTWARE SDN. BHD.|GLOBAL TECH ALLIES LTD|SIRIUS ONE LTD|SELA LINES LTD|MY TECH MEDIA LTD|BONY INNOVATION LTD/i
OR SubjectCN = /BLUE TAKIN LTD|TAU CENTAURI LTD|SPARROW TIDE LTD|TECHNODENIS LTD|AMARYLLIS SIGNAL LTD|BLACK INDIGO LTD|LONG SOUND LTD|OR KAHOL LTD|ASTRO BRIGHT LTD|MAINSTAY CRYPTO LLC|GRASSROOTS CONSULTING GROUP LLC|CROWD SYNC LLC|WORK PRODUCT INC|PIXEL CATALYST MEDIA LLC|BYTE MEDIA SDN BHD|ECHO INFINI SDN. BHD.|GLINT SOFTWARE SDN. BHD.|GLOBAL TECH ALLIES LTD|SIRIUS ONE LTD|SELA LINES LTD|MY TECH MEDIA LTD|BONY INNOVATION LTD/i

Microsoft Defender for Endpoint

DeviceFileCertificateInfo
| where Signer has_any (
  "BLUE TAKIN LTD",
  "TAU CENTAURI LTD",
  "SPARROW TIDE LTD",
  "TECHNODENIS LTD",
  "AMARYLLIS SIGNAL LTD",
  "BLACK INDIGO LTD",
  "LONG SOUND LTD",
  "OR KAHOL LTD",
  "ASTRO BRIGHT LTD",
  "MAINSTAY CRYPTO LLC",
  "GRASSROOTS CONSULTING GROUP LLC",
  "CROWD SYNC LLC",
  "WORK PRODUCT INC",
  "PIXEL CATALYST MEDIA LLC",
  "BYTE MEDIA SDN BHD",
  "ECHO INFINI SDN. BHD.",
  "GLINT SOFTWARE SDN. BHD.",
  "GLOBAL TECH ALLIES LTD",
  "SIRIUS ONE LTD",
  "SELA LINES LTD",
  "MY TECH MEDIA LTD",
  "BONY INNOVATION LTD"
)
| project Timestamp, DeviceName, SHA1, Signer, Issuer, IsTrusted, IsRootSignerMicrosoft

Fazit

Hunting ist kein Feature. Hunting ist ein Habit.


Weiterführende Links



TrustInVeritas

TrustInVeritas ist Cyber Security Specialist bei AVANTEC. Er fokussiert sich auf die Identifizierung, Analyse und Abwehr moderner Cyberbedrohungen. Ein besonderer Schwerpunkt liegt auf proaktivem Threat Hunting und der Aufdeckung von Angreifern, bevor sie Schaden verursachen. In seiner Freizeit ist er gerne in der Natur, treibt Sport und begeistert sich für Rennsport sowie schnelle Autos.

Privacy Preference Center