
A standalone SIGMA-based detection tool for EVTX, Auditd and Sysmon for Linux logs


Zircolite is a standalone tool written in Python 3 that allows you to use SIGMA rules on:
--archive-password for encrypted ZIP/7z.You can use Zircolite directly with Python.
Documentation is available here (dedicated site) or here (repository directory).
The project has been tested with Python 3.10 and above. Install dependencies with: pip3 install -r requirements.txt.
orjson, xxhash, rich, rich-argparse, RestrictedPython, requests, urllib3, pySigma, evtx (pyevtx-rs), jinja2, lxml, chardet, psutil, pyyaml, py7zrpy7zr is imported only when a input is opened; ZIP, gzip and bzip2 use the standard library.⚠️ On some systems (Mac, ARM, etc.), the evtx Python library may require Rust and Cargo to be installed.
Check out (old) tutorials made by others (EN, ES, and FR) here.
Help is available with:
python3 zircolite.py -h
If your EVTX files have the extension ".evtx":
# python3 zircolite.py --evtx <EVTX FOLDER or EVTX FILE> --ruleset <SIGMA RULESET> [--ruleset <OTHER RULESET>]
python3 zircolite.py --evtx sysmon.evtx --ruleset rules/rules_windows_merged.json
You can use native Sigma rules (YAML) directly:
# Single YAML rule
python3 zircolite.py --evtx sample.evtx --ruleset path/to/rule.yml
# Directory of Sigma rules
python3 zircolite.py --evtx sample.evtx --ruleset ./sigma/rules/windows/process_creation
# With pySigma pipelines
python3 zircolite.py --evtx sample.evtx --ruleset rule.yml --pipeline sysmon --pipeline windows-logsources
Zircolite auto-detects the log format in most cases, so explicit format flags are optional:
# Auto-detection (recommended) - Zircolite identifies the format automatically
python3 zircolite.py --events auditd.log --ruleset rules/rules_linux.json
python3 zircolite.py --events sysmon.log --ruleset rules/rules_linux.json
python3 zircolite.py --events <JSON_FOLDER_OR_FILE> --ruleset rules/rules_windows_merged.json
# Explicit format flags (override auto-detection)
python3 zircolite.py --events auditd.log --ruleset rules/rules_linux.json --auditd
python3 zircolite.py --events sysmon.log --ruleset rules/rules_linux.json --sysmon4linux
python3 zircolite.py --events <JSON_FOLDER_OR_FILE> --ruleset rules/rules_windows_merged.json --jsononly
python3 zircolite.py --events <JSON_FOLDER_OR_FILE> --ruleset rules/rules_windows_merged.json --json-array
python3 zircolite.py --events <CSV_FOLDER_OR_FILE> --ruleset rules/rules_windows_merged.json --csv-input
python3 zircolite.py --events <XML_FOLDER_OR_FILE> --ruleset rules/rules_windows_merged.json --xml-input
--events argument can be a file or a folder. If it is a folder, all log files in the current folder and subfolders will be selected (use --no-recursion to disable).--file-pattern to specify a custom glob pattern for file selection.--no-auto-detect to disable automatic format detection.[!TIP] If you want to try the tool, you can test with EVTX-ATTACK-SAMPLES (EVTX files).
# Pull the Docker image
docker pull wagga40/zircolite:latest
# If your logs and rules are in a specific directory
docker run --rm --tty \
-v $PWD:/case/input:ro \
-v $PWD:/case/output \
wagga40/zircolite:latest \
-e /case/input \
-o /case/output/detected_events.json \
-r /case/input/a_sigma_rule.yml
$PWD with the directory (absolute path only) where your logs and rules/rulesets are stored.Given several files, Zircolite measures them against available RAM and CPU, picks a database mode (one shared database, or one per file) and decides whether processing them in parallel is worth it — then adapts the worker count to memory pressure as it runs.
python3 zircolite.py --evtx ./logs/ --ruleset rules/rules_windows_merged.json
Override any of it with --no-auto-mode, --unified-db (one database for all files, which is what cross-file correlation rules need), --no-parallel or --parallel-workers N. See Automatic Processing Optimization for how the choice is made.
For complex or repeated analysis workflows, use a YAML configuration file:
# Generate a fully commented configuration file
python3 zircolite.py --generate-config my_config.yaml
# Run with it
python3 zircolite.py --yaml-config my_config.yaml
# CLI arguments override the file
python3 zircolite.py --yaml-config my_config.yaml --evtx ./other_logs/
The generated file documents every supported key; config/zircolite_example.yaml is a
worked example. See YAML configuration for the merge
rules and the options that have no YAML equivalent.
python3 zircolite.py -U
Alternatively, if you use Task (go-task), run task update-rules from the project root to update rules from Zircolite-Rules-v2. See docs for other tasks (Docker build, clean, etc.).
[!IMPORTANT]
Please note that these rulesets are provided to use Zircolite out of the box, but you should generate your own rulesets as they can be noisy or slow. These auto-updated rulesets are available in the dedicated repository: Zircolite-Rules-v2.
Two configuration features shape events as they are ingested, both in config/config.yaml:
Hashes field (SHA1=abc123,MD5=def456,SHA256=789xyz) becomes separate SHA1, MD5 and SHA256 fields, so rules can match a hash directly.split:
Hashes:
separator: ","
equal: "="
See Field Splitting and Field Transforms for the full configuration, the transforms Zircolite ships, and how to test your own.
Complete documentation is available here.
The Mini-GUI can be used completely offline. It allows you to display and search results. You can automatically generate a Mini-GUI "package" with the --package option. Use --package-dir to specify the output directory. To learn how to use the Mini-GUI, check the documentation here.



English: Russ McRee has published a detailed tutorial on SIGMA and Zircolite on his blog.
Spanish: César Marín has published a tutorial in Spanish here.
French: IT-connect.fr has published an extensive tutorial on Zircolite in French.
French: IT-connect.fr has also published a Hack the Box challenge write-up using Zircolite.
evtx_dump is under the MIT license..7z