Encoded powershell is a smell. It is also every management tool. Graph parent + encoded, then decide. A smell is no…
People paste tokens in command lines. I redacted known flags (--password, --token, AKIA...) at ingest. I still stor…
PID reused. The graph said WINWORD spawned cmd. It was a reused PID from a previous WINWORD. I now key on process G…
If your detection needs 10 days of baseline to fire, it is a report, not a detection. I want 10 minutes or I want a…
One counter, one sparkline, one threshold that pages a human. The rest is a weekly review. If your SOC graph has 40…
powershell.exe is not a detection. WINWORD → powershell is a detection. Named pipes and encoded commands are decora…
WINWORD → splwow64 is life. WINWORD → powershell is not. I keep a allow-tree, not an allow-list of images. Trees, n…
A burst in 1s is an exploit attempt. In 1h it is a backup job. I keep all three buckets for one rule and I am not s…
I dumped parquet 'for science'. I queried 3 columns. The other 40 were for a future that did not come. Store the 3.…
Which rule FP'd, with which parent, how often. Tune the rule. Do not tune the event. If you close FPs one-by-one yo…
Signed is not safe. Unsigned is not guilty. I graph both. I weight unsigned higher. I do not drop signed. Stolen ce…
Graphs: parent-child, and file-to-process when a canary file is touched. Counts: ImageLoad of unsigned into signed,…
We turn time sync off in the malware VM. Then ETW and host logs disagree by 8 seconds and a join misses. I join on …
Sysmon 1, 3, 7. If you cannot use those, you will not use 22 others. ETW for the things Sysmon will not give me wit…
reason=unsigned_child | canary_touch | sampled. If reason is empty, the collector has a bug. Provenance of telemetr…
Lab detonations in the prod store made a hunt that was 90% our own samples. Separate DBs. Separate dashboards. Same…
Host-level rare DNS is your DHCP talking. Process-level rare DNS is a story. I group by image path. Host is where t…
ASCII trees paste into tickets. GUI screenshots do not grep. I generate ASCII from the same sqlite. If your IR tick…
First-seen last Tuesday. Sensor was deployed Tuesday. The binary is six months old on disk. First-seen is first-see…
Neo4j for process graphs. Pretty. Slow. SQLite recursive CTE did the 6-hop path I actually needed. If your hunt is …
Hash reputation without parent is a weather report. With parent it is a detection. VT is a pivot. It is not a verdi…
I did it so you do not have to. It is a white blob. Filter or go home. ImageLoad is a privilege, not a right. Refs:…
The top 50 is your baseline. The 51st is a hunt. I do not alert on the top 50. I alert when a pair leaves the 50 or…
I map detections to a technique after they exist. I do not start from a matrix and invent detections to color cells…
Canary DNS is cute. Without a process GUID it is a story about a network, not a host. I join on the host that resol…
Command lines that are 200k of base64. I store a hash + the first 4k + a truncated flag. Full blob in cold storage …
One mail, 20 lines, new unsigned images that ran, with signer-or-not and parent. Not a SIEM link. If the mail is lo…
IP graphs are hairballs. Process→destination:port graphs are readable. I collapse CDN ranges. If you cannot collaps…
Rare-process hunts on a fleet that updates on Tuesday. Tuesday looks like an incident every week. Exclude the updat…
Our YARA+ETW pipeline had a hot rule. A flame graph of the engine, not the OS, found it. We split the rule. Profile…
process(guid, image, parent_guid, ts). net(guid, dst, ts). file(guid, path, ts). That is the schema. Postgres later…
Full ImageLoad on a busy box is a firehose. I sample by unsigned, by path prefix, by parent. Then I keep a 1% rando…
Dashboards that lead with SHA256. Humans cannot read hashes. Lead with image name, path, signer, then hash on click…
A canary file is an edge: process → file. Alerting on every touch is noise. Alerting on touch + network is a detect…
Lowercase, flag order, quoting, environment expansion. I normalize, then I match. Matching raw command lines is a b…
If you ingest every ProcessStart you will drown. Filter: parent in a denylist OR child unsigned OR spawned from Off…