-
Notifications
You must be signed in to change notification settings - Fork 166
Fibratus Setup
Full walkthrough for kind: fibratus profiles. Pull-from-event-log model, no remote backend needed β Fibratus runs locally on the EDR VM, writes alerts to the Windows Application event log, and Whiskers wevtutil-queries them on demand.
This is the same shape DetonatorAgent's FibratusEdrPlugin.cs uses. If you don't want to stand up an Elastic stack, this is the lighter-weight option.
Fibratus is an open-source ETW-based behavioral detection engine for Windows. Think Sysmon + Sigma rules + a YARA pipeline in one Go binary. Free, no vendor backend, runs entirely on the host.
LitterBox uses Fibratus's eventlog alert sender β rule matches land in the Windows Application event log under Provider=Fibratus, and Whiskers reads them via wevtutil. Fibratus does the ETW collection and rule matching; LitterBox does the dispatch and correlation.
Download the latest installer from github.com/rabbitstack/fibratus/releases and run it on the EDR VM. Default install path: C:\Program Files\Fibratus\.
Whiskers detects Fibratus's presence by checking for C:\Program Files\Fibratus\Bin\fibratus.exe. After install, verify:
curl http://<vm>:8080/api/info
# {
# "hostname": "...",
# "telemetry_sources": ["fibratus"] β this confirms Whiskers found it
# }If telemetry_sources doesn't include "fibratus", the binary isn't where Whiskers expects it. Reinstall to the default path.
This is the critical step. The default Fibratus config writes alerts in a human-readable "pretty" format that LitterBox can't parse β you need to flip it to JSON.
Edit %PROGRAMFILES%\Fibratus\Config\fibratus.yml:
alertsenders:
eventlog:
enabled: true
format: json # β CRITICAL β analyzer parses the <Data> field as JSONMake sure the rule engine is enabled and points at the rule pack you want active:
filters:
rules:
enabled: true
from-paths:
- C:\Program Files\Fibratus\Rules\*.ymlFibratus ships a useful default rule pack. If you want to start with everything Fibratus's authors enable, the default fibratus.yml is fine to leave untouched apart from the alertsenders.eventlog block above.
Restart the Fibratus service:
net stop fibratus
net start fibratusTrigger a benign-but-flagged behavior to confirm the wire. Mshta-launching-a-URL is a common rule:
mshta.exe "javascript:close()"Then check Event Viewer β Windows Logs β Application β filter Source = Fibratus. You should see a record with a JSON <Data> blob.
From LitterBox you can query the same path through Whiskers without dispatching a payload:
python GrumpyCats/grumpycat.py fibratus-alerts \
--profile fibratus \
--from 2026-04-30T00:00:00ZIf this returns alerts with parseable JSON data strings, the wire is good. If it returns prose strings instead, your format: pretty config didn't take effect β re-check step 2.
Copy the example and fill in the agent URL:
cp Config/edr_profiles/fibratus.yml.example Config/edr_profiles/fibratus.ymlEdit fibratus.yml:
name: "fibratus"
display_name: "Fibratus"
kind: "fibratus"
agent_url: "http://<edr-vm-ip>:8080"
wait_seconds_for_alerts: 30 # Fibratus pushes in real-time β shorter than Elastic's 90s
av_block_wait_seconds: 30 # Fibratus is detect-only; this is for parity, rarely fires
exec_timeout_seconds: 60 # hard cap on payload runtimeNo Elastic fields β there's no remote backend. Restart LitterBox; the upload page gains a Fibratus button.
FibratusEdrAnalyzer._poll_alerts calls AgentClient.get_fibratus_alerts(since, until). Whiskers shells out to:
wevtutil qe Application "/q:*[System[Provider[@Name='Fibratus'] and TimeCreated[@SystemTime >= '<from>' and @SystemTime <= '<until>']]]" /f:xml /e:Events
(matches DetonatorAgent's exact XPath shape, including the rounded-down from timestamp). Whiskers parses the XML out of band and returns the raw JSON <Data> strings; LitterBox parses them and filters by filename match against:
events[].proc.nameevents[].proc.exeevents[].proc.cmdlineevents[].proc.parent_nameevents[].proc.parent_cmdline
Same idea as the Elastic filename match β only alerts that mention the payload's filename are counted toward the run.
Fibratus profiles are intentionally minimal:
name: "fibratus" # used in URLs
display_name: "Fibratus" # shown on the button
kind: "fibratus" # required β discriminates from kind: elastic
agent_url: "http://<vm>:8080"
wait_seconds_for_alerts: 30
av_block_wait_seconds: 30
exec_timeout_seconds: 60
# drop_path: "C:\\Users\\Public\\sample.exe" # optional overrideNo elastic_url, no elastic_apikey, no index pattern. The Whiskers agent + a properly-configured Fibratus on the same VM is everything you need.
killed_by_edr requires alert evidence to fire β Fibratus is detect-only and can never legitimately kill a process, so a non-zero exit alone (e.g. payload crashed on its own) won't cause LitterBox to claim the EDR killed it. The DETECTED badge on the EDR row is gated on total_alerts > 0 after the run reaches a terminal status.
/api/info doesn't list fibratus in telemetry_sources
Whiskers checks C:\Program Files\Fibratus\Bin\fibratus.exe. Reinstall Fibratus to the default path.
fibratus-alerts returns supported: false
Same as above β Fibratus isn't installed or isn't at the default path.
fibratus-alerts returns events but data is plain prose, not JSON
You're still in format: pretty. Re-edit fibratus.yml, set format: json, restart the Fibratus service.
Dispatch finishes but total_alerts: 0
- Was Fibratus actually running during the dispatch window?
Get-Service fibratus. - Did the rule pack include something that should have fired for your payload? Try a known-flagged sample first (
mimikatz.exetriggers a dozen rules out of the box). - Hostname mismatch β Fibratus emits
host.name; LitterBox filters case-insensitively. Runcurl <vm>:8080/api/infoandwevtutil qe Application /q:*[System[Provider[@Name='Fibratus']]]/c:1and confirm the host strings match.
format: json is set but events still parse as prose
Restart of the Fibratus service didn't take effect. Get-Service fibratus | Restart-Service. Confirm via Get-WinEvent -ProviderName Fibratus -MaxEvents 1 β the message should look like JSON.
Performance β Fibratus eating CPU
Tune eventsource.blacklist.events in fibratus.yml to drop noisy event types your rules don't need. The default blacklist already excludes CloseFile and RegCloseKey (very high-volume, low-detection-value).
If you want every detection vector enabled (CPU cost is acceptable in a sandbox VM), see the operator-friendly config in the LitterBox README "Max-detection Fibratus config" section. Highlights:
-
filters.match-all: trueβ one event can fire multiple rules -
evasion.enabled: true+ both syscall detectors -
event.serialize-pe: true+event.serialize-modules: trueβ richer alert context -
pe.enabled: true+read-resources / read-symbols / read-sections: trueβ full PE metadata in alerts -
symbolize-kernel-addresses: true+symbol-pathspointing at MS symbol server β readable kernel call stacks -
yara.enabled: true(with rules underRules\Yara\) β third detection vector on top of rules + evasion
- EDR Integration β overview of both kinds
- Whiskers Agent β agent install / endpoints
-
Elastic Defend Setup β
kind: elasticwalkthrough - Fibratus docs β full configuration reference
- π Home
- π§ Application Architecture
- π Dashboard
- π All in One Pipeline
- π― Detection Score Explained
- 𧬠Blender Scanner
- π FuzzyHash Scanner
- π‘οΈ HolyGrail BYOVD Scanner
- π YARA Rules Management