<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jude Hilgendorf</title>
    <description>The latest articles on DEV Community by Jude Hilgendorf (@tiltedlunar123).</description>
    <link>https://dev.to/tiltedlunar123</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847611%2F5372ff69-df32-4335-9ef6-65d8c9504ae5.jpeg</url>
      <title>DEV Community: Jude Hilgendorf</title>
      <link>https://dev.to/tiltedlunar123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tiltedlunar123"/>
    <language>en</language>
    <item>
      <title>I Built an Offline Log Triage CLI That Detects MITRE ATT&amp;CK Techniques in EVTX, Syslog, JSON, and CEF</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Mon, 20 Apr 2026 14:00:42 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-an-offline-log-triage-cli-that-detects-mitre-attck-techniques-in-evtx-syslog-json-and-2d9p</link>
      <guid>https://dev.to/tiltedlunar123/i-built-an-offline-log-triage-cli-that-detects-mitre-attck-techniques-in-evtx-syslog-json-and-2d9p</guid>
      <description>&lt;h1&gt;
  
  
  I Built an Offline Log Triage CLI That Detects MITRE ATT&amp;amp;CK Techniques
&lt;/h1&gt;

&lt;p&gt;SOC analysts routinely face thousands of daily events, and most of it is noise. If you're on an incident response engagement with no network access, or you're staring at a zip of EVTX files a client dropped in your lap, spinning up a full SIEM isn't realistic.&lt;/p&gt;

&lt;p&gt;That's the gap &lt;a href="https://github.com/TiltedLunar123/ThreatLens" rel="noopener noreferrer"&gt;ThreatLens&lt;/a&gt; is trying to fill. It's a single Python CLI that parses log formats SOC analysts actually encounter — JSON/NDJSON, EVTX, Syslog (RFC 3164 and 5424), and CEF — and runs a detection engine mapped to MITRE ATT&amp;amp;CK, entirely offline, with only PyYAML as a hard runtime dependency.&lt;/p&gt;

&lt;p&gt;This post walks through what it does, why I built it, and a code walkthrough of how the detection engine works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Actually Does
&lt;/h2&gt;

&lt;p&gt;Point it at a log file or a directory, and it runs 12 built-in detection modules covering tactics like brute force, lateral movement, privilege escalation, and persistence. Output is whatever you need for the workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Color-coded terminal output for quick triage&lt;/li&gt;
&lt;li&gt;Self-contained HTML reports with charts and interactive timelines&lt;/li&gt;
&lt;li&gt;JSON for piping into a SIEM&lt;/li&gt;
&lt;li&gt;CSV for handoffs to analysts who live in spreadsheets&lt;/li&gt;
&lt;li&gt;Elasticsearch bulk API format when you want to ingest the findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few representative commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic scan against a JSON log&lt;/span&gt;
threatlens scan logs/security.json

&lt;span class="c"&gt;# Native EVTX parsing — no conversion step&lt;/span&gt;
threatlens scan evidence/security.evtx

&lt;span class="c"&gt;# HTML report, filtered to high severity and above&lt;/span&gt;
threatlens scan logs/ &lt;span class="nt"&gt;-o&lt;/span&gt; report.html &lt;span class="nt"&gt;-f&lt;/span&gt; html &lt;span class="nt"&gt;--min-severity&lt;/span&gt; high

&lt;span class="c"&gt;# Real-time tailing for live triage&lt;/span&gt;
threatlens follow /var/log/events.json

&lt;span class="c"&gt;# Use community Sigma rules&lt;/span&gt;
threatlens scan logs/ &lt;span class="nt"&gt;--sigma-rules&lt;/span&gt; sigma/rules/windows/

&lt;span class="c"&gt;# CI/CD gate — exit non-zero on high-severity findings&lt;/span&gt;
threatlens scan logs/ &lt;span class="nt"&gt;--fail-on&lt;/span&gt; high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I'm a cybersecurity student, and the gap between "read a blog post about MITRE ATT&amp;amp;CK" and "actually recognize T1110 in a pile of Event ID 4625s" is large. The only way I found to close it was to write the detection logic myself.&lt;/p&gt;

&lt;p&gt;Existing tools kept tripping on the same pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chainsaw, EvtxHussar, hayabusa&lt;/strong&gt; are excellent but Windows-centric. I wanted one tool that chews through EVTX &lt;em&gt;and&lt;/em&gt; the Linux syslog a cloud workload dumped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full SIEM stacks&lt;/strong&gt; are overkill for a one-off engagement. I didn't want to stand up Elastic + Kibana + Filebeat to look at 200MB of logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom scripts&lt;/strong&gt; get rewritten every engagement. I wanted rule-based logic I could extend without touching parsing code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the design goal was: one binary, offline, format-agnostic, rule-driven, zero infra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Walkthrough: The Rule Engine
&lt;/h2&gt;

&lt;p&gt;The most interesting piece architecturally is the rule engine, because it has to be expressive enough to write real detections but simple enough that an analyst can author rules in YAML without writing Python.&lt;/p&gt;

&lt;p&gt;A rule looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;After-Hours&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Logon"&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;medium&lt;/span&gt;
    &lt;span class="na"&gt;conditions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;event_id&lt;/span&gt;
        &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;equals&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4624"&lt;/span&gt;
    &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a toy example. The real power shows up when you combine operators. The engine ships with 12: &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;not_equals&lt;/code&gt;, &lt;code&gt;contains&lt;/code&gt;, &lt;code&gt;not_contains&lt;/code&gt;, &lt;code&gt;startswith&lt;/code&gt;, &lt;code&gt;endswith&lt;/code&gt;, &lt;code&gt;regex&lt;/code&gt;, &lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;gte&lt;/code&gt;, &lt;code&gt;lte&lt;/code&gt;, and &lt;code&gt;in&lt;/code&gt;. Conditions AND together by default, and thresholds turn a single-event match into a frequency-based detection (5 failures in 60 seconds, etc.).&lt;/p&gt;

&lt;p&gt;The evaluation loop is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;field_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;OPERATORS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;field_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;OPERATORS&lt;/code&gt; is a dict mapping operator names to small comparison lambdas. Adding a new operator is a one-line change — no parser work, no AST manipulation. This is deliberate. I wanted rule authoring to feel like writing a conditional, not configuring a parser.&lt;/p&gt;

&lt;p&gt;Thresholded rules layer on top. The engine keeps a sliding window per &lt;code&gt;(rule, grouping_key)&lt;/code&gt; — typically grouped by source IP or username — and fires the alert only when &lt;code&gt;count &amp;gt;= threshold&lt;/code&gt; within the window. Grouping keys are pulled from the event by name, which means a rule author can correlate on any field the parser exposes without modifying code.&lt;/p&gt;

&lt;p&gt;The parsing phase normalizes every format into a flat dict with a small set of canonical fields (&lt;code&gt;timestamp&lt;/code&gt;, &lt;code&gt;source_ip&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;event_id&lt;/code&gt;, &lt;code&gt;process&lt;/code&gt;, &lt;code&gt;command_line&lt;/code&gt;, etc.) plus the raw original. That normalization is what makes the rule engine format-agnostic — the same "Brute Force" rule works against Windows 4625 events, SSH auth.log failures, and a CEF feed from a firewall, because they all expose &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;source_ip&lt;/code&gt; after parsing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attack Chain Correlation
&lt;/h2&gt;

&lt;p&gt;The feature I'm most proud of is multi-stage correlation. A single brute-force alert is interesting. A brute-force alert followed 30 seconds later by a successful logon from the same IP, followed by a &lt;code&gt;net user /add&lt;/code&gt; execution, is an incident. The correlation engine takes a chain definition — an ordered list of rule names with time windows — and fires a higher-severity meta-alert when it sees the full kill chain in order.&lt;/p&gt;

&lt;p&gt;That's how low-severity events ladder up to high-severity incidents without drowning analysts in noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Allowlist Suppression
&lt;/h2&gt;

&lt;p&gt;Every detection tool dies on false positives. The allowlist layer suppresses known-good activity by rule name plus any combination of event fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;allowlist&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;rule_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Brute-Force"&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;svc_monitor"&lt;/span&gt;
    &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expected&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;service&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;account&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;failures"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;reason&lt;/code&gt; field is required. It forces the author to document &lt;em&gt;why&lt;/em&gt; this exception exists, which is the single most important thing about any suppression rule in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;Against the sample datasets in the repo, ThreatLens hit zero false positives on benign activity while detecting 100% of embedded attack techniques with correct MITRE ATT&amp;amp;CK classification. That's on curated data — real-world logs are messier — but it's a useful floor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;threatlens
threatlens scan /path/to/your/logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or clone it and poke at the rule engine: &lt;a href="https://github.com/TiltedLunar123/ThreatLens" rel="noopener noreferrer"&gt;github.com/TiltedLunar123/ThreatLens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful, a star helps the repo surface for other analysts. PRs for new detections or log formats are especially welcome — I'd love to see what rules other people write.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building SIEMForge: A Portable SIEM Detection Toolkit with Sigma, Sysmon, and MITRE ATT&amp;CK</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Mon, 20 Apr 2026 13:47:45 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/building-siemforge-a-portable-siem-detection-toolkit-with-sigma-sysmon-and-mitre-attck-59p2</link>
      <guid>https://dev.to/tiltedlunar123/building-siemforge-a-portable-siem-detection-toolkit-with-sigma-sysmon-and-mitre-attck-59p2</guid>
      <description>&lt;p&gt;If you've ever tried to stand up detection content across more than one SIEM, you already know the pain. Sigma rules live in one repo, Sysmon config lives in another, your Wazuh custom rules are scattered across three &lt;code&gt;local_rules.xml&lt;/code&gt; files, and MITRE mapping is an afterthought buried in a spreadsheet. I built &lt;strong&gt;SIEMForge&lt;/strong&gt; to fix that.&lt;/p&gt;

&lt;p&gt;SIEMForge is a single Python toolkit that bundles Sigma rules, a Sysmon configuration, and Wazuh custom rules — all mapped to MITRE ATT&amp;amp;CK — with an offline log scanner and a multi-backend rule converter. It runs from a home lab to a production SOC without changing the workflow.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/TiltedLunar123/SIEMForge" rel="noopener noreferrer"&gt;github.com/TiltedLunar123/SIEMForge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I'm a cybersecurity student, and when I started building detections for a home lab, the tooling gap became obvious fast. Every tutorial assumed you had a Splunk license or a full Elastic stack. The actual Sigma ecosystem is great, but turning a Sigma rule into something that runs against real logs without spinning up a SIEM is friction that kills learning momentum.&lt;/p&gt;

&lt;p&gt;I wanted three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write detection logic &lt;strong&gt;once&lt;/strong&gt; in Sigma, deploy it anywhere&lt;/li&gt;
&lt;li&gt;Test rules &lt;strong&gt;offline&lt;/strong&gt; against sample logs before pushing anything to production&lt;/li&gt;
&lt;li&gt;See MITRE ATT&amp;amp;CK coverage at a glance so I knew where the gaps were&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SIEMForge is the tool I wished existed when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Log Scanner Engine.&lt;/strong&gt; Point it at a JSON, JSONL, syslog, or CSV log file and it runs your Sigma rules against it — no SIEM required. Human-readable alerts by default, JSON output if you want to pipe it somewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Backend Rule Conversion.&lt;/strong&gt; Convert one Sigma rule into Splunk SPL, Elasticsearch Lucene, or Kibana KQL. No vendor lock-in, no rewriting detections when you change platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MITRE ATT&amp;amp;CK Coverage Matrix.&lt;/strong&gt; Every bundled rule is tagged with techniques. Run one command and see exactly what you cover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule Validation.&lt;/strong&gt; Catches bad YAML, broken field-condition mappings, and malformed Sigma syntax before you deploy anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sysmon + Wazuh bundled.&lt;/strong&gt; A production-ready Sysmon config and Wazuh custom rules ship with the project, mapped to the same techniques as the Sigma rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code walkthrough: the log scanner
&lt;/h2&gt;

&lt;p&gt;The piece I'm proudest of is the offline log scanner. It lets you validate detection logic against raw logs without deploying anything. Here's how it works conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--scan&lt;/span&gt; /var/log/sysmon/events.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, the scanner:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loads every Sigma rule from &lt;code&gt;rules/sigma/&lt;/code&gt; and parses the YAML into a rule object&lt;/li&gt;
&lt;li&gt;Opens the log file and streams records (auto-detects JSON / JSONL / syslog / CSV)&lt;/li&gt;
&lt;li&gt;For each record, walks each rule's &lt;code&gt;detection&lt;/code&gt; block and evaluates the field-condition logic&lt;/li&gt;
&lt;li&gt;On a match, emits an alert with the rule name, MITRE technique, and the matching log line&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tricky part is Sigma's detection syntax — it supports wildcards, regex, contains-all, contains-any, logical AND/OR between selection groups, and negation. Getting the evaluator right is what the 138-test suite is mostly for. If you're building anything similar, test-drive it hard. Edge cases around &lt;code&gt;null&lt;/code&gt;, case sensitivity, and list vs scalar matching will eat you alive otherwise.&lt;/p&gt;

&lt;p&gt;Here's what a PowerShell detection rule looks like after conversion to Splunk SPL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=windows EventCode=1 CommandLine="*powershell*"
AND (CommandLine="*-ep bypass*" OR CommandLine="*DownloadString*")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That SPL query came from a Sigma YAML that looks roughly like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;detection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;EventID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="na"&gt;CommandLine|contains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;powershell'&lt;/span&gt;
  &lt;span class="na"&gt;suspicious&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;CommandLine|contains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-ep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;bypass'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;DownloadString'&lt;/span&gt;
  &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;selection and suspicious&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One source of truth, three SIEM backends. That's the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install and try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TiltedLunar123/SIEMForge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;SIEMForge
pip &lt;span class="nb"&gt;install &lt;/span&gt;pyyaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan a log file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--scan&lt;/span&gt; samples/suspicious_powershell.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert a rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--convert&lt;/span&gt; splunk rules/sigma/proc_creation_suspicious_powershell.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Print MITRE coverage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--mitre&lt;/span&gt; rules/sigma/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;v3.1 expanded the test suite, added Windows CI matrix testing, and fixed a Sigma spec edge case around SSH bruteforce detection. Next up: more rules covering cloud attack paths (T1078.004, T1580), a proper detection-as-code pipeline example, and maybe a web UI for the coverage matrix if there's demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Call to action
&lt;/h2&gt;

&lt;p&gt;If you're studying blue team, running a home lab, or just want a way to prototype detections without spinning up a full SIEM — clone it, break it, open an issue. Stars help the project surface to more people who'd benefit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TiltedLunar123/SIEMForge" rel="noopener noreferrer"&gt;&lt;strong&gt;Star SIEMForge on GitHub →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you'd build something with it, tell me what rule you'd write first.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I Built an Offline Threat-Hunting CLI in Python — Here's How ThreatLens Catches Real Attacks</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Fri, 17 Apr 2026 15:53:01 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-an-offline-threat-hunting-cli-in-python-heres-how-threatlens-catches-real-attacks-53jc</link>
      <guid>https://dev.to/tiltedlunar123/i-built-an-offline-threat-hunting-cli-in-python-heres-how-threatlens-catches-real-attacks-53jc</guid>
      <description>&lt;p&gt;If you've ever stared down thousands of EVTX, Syslog, or JSON log events after a suspected incident, you already know the pain: the signal-to-noise ratio is brutal, and most "SIEM-lite" tools either want a cloud subscription or a 20-step install.&lt;/p&gt;

&lt;p&gt;I wanted something different — a single CLI I could drop on an air-gapped workstation, point at a folder of logs, and get a ranked list of attack patterns mapped to MITRE ATT&amp;amp;CK within seconds.&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;&lt;a href="https://github.com/TiltedLunar123/ThreatLens" rel="noopener noreferrer"&gt;ThreatLens&lt;/a&gt;&lt;/strong&gt; — an offline log analysis and threat hunting CLI written in Python. No agents, no cloud, no license server. Just &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;scan&lt;/code&gt;, read the report.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;p&gt;ThreatLens parses security logs and runs them through a detection engine that covers &lt;strong&gt;12 attack categories mapped to MITRE ATT&amp;amp;CK tactics&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brute-force and password spray attacks (T1110)&lt;/li&gt;
&lt;li&gt;Lateral movement via rapid multi-host authentication (T1021)&lt;/li&gt;
&lt;li&gt;Privilege escalation through sensitive permission assignments (T1134)&lt;/li&gt;
&lt;li&gt;Suspicious process execution including LOLBins and encoded PowerShell (T1059)&lt;/li&gt;
&lt;li&gt;Defense evasion patterns like log clearing and audit policy changes (T1070, T1562)&lt;/li&gt;
&lt;li&gt;Persistence mechanisms via services, scheduled tasks, and registry modifications (T1543, T1053, T1547)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It ingests JSON/NDJSON, native EVTX, RFC 3164/5424 Syslog, and CEF — with auto-detection, so you don't have to flag formats manually.&lt;/p&gt;

&lt;p&gt;Exports: color-coded terminal, JSON, CSV, self-contained HTML reports with SVG charts and an interactive attack timeline, or direct Elasticsearch ingestion if you already have a stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I'm a cybersecurity student who spends a lot of lab time on blue-team exercises. Every time I finished a scenario, I'd end up with a mountain of Windows Event Logs and no fast way to confirm what actually happened. Commercial tools were overkill for a lab, and open-source options usually needed a full ELK stack before they'd tell me anything useful.&lt;/p&gt;

&lt;p&gt;I wanted a tool that answered one question fast: &lt;em&gt;"Is there anything interesting in this pile of logs?"&lt;/em&gt; — without spinning up infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code walkthrough: the detection engine
&lt;/h2&gt;

&lt;p&gt;The core idea is a three-layer detection model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Built-in detections&lt;/strong&gt; tuned via &lt;code&gt;rules/default_rules.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom YAML rules&lt;/strong&gt; — 12 operators (equals, contains, regex, gt/lt, etc.) with grouping and time windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sigma rules&lt;/strong&gt; — natively compatible with community Sigma repos, with field modifiers and compound conditions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a custom rule that detects 5+ failed logons from the same source in under 60 seconds — classic brute-force:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;brute_force_failed_logons&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Multiple failed logon attempts from single source&lt;/span&gt;
&lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;high&lt;/span&gt;
&lt;span class="na"&gt;mitre&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;T1110&lt;/span&gt;
&lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;event_id&lt;/span&gt;
      &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;equals&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4625&lt;/span&gt;
  &lt;span class="na"&gt;group_by&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;source_ip&lt;/span&gt;
  &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;60s&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gt&lt;/span&gt;
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule engine normalizes incoming events (EVTX → dict, Syslog → dict, etc.), pipes them through each loaded rule, and any match pushes an alert into a correlation stage that links multi-stage kill chains. So a brute-force hit followed by a privileged logon from the same IP a minute later gets stitched into one chain, not two disconnected alerts.&lt;/p&gt;

&lt;p&gt;That correlation step is what makes the output usable — instead of 400 alerts you get 8 attack chains ranked by severity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;p&gt;Quick install from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TiltedLunar123/ThreatLens.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ThreatLens
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or Docker if you want zero local install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; threatlens &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/logs:/data threatlens scan /data/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens scan sample_data/sample_security_log.json
threatlens scan logs/ &lt;span class="nt"&gt;--min-severity&lt;/span&gt; high &lt;span class="nt"&gt;-o&lt;/span&gt; report.json &lt;span class="nt"&gt;-f&lt;/span&gt; json
threatlens scan logs/ &lt;span class="nt"&gt;--custom-rules&lt;/span&gt; my_rules/ &lt;span class="nt"&gt;--sigma-rules&lt;/span&gt; sigma/rules/
threatlens follow /var/log/events.json &lt;span class="nt"&gt;--buffer-size&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last one is a &lt;code&gt;tail -f&lt;/code&gt;-style live monitor with a ring buffer for in-memory correlation — handy if you're hunting during an active incident instead of after the fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results so far
&lt;/h2&gt;

&lt;p&gt;Against sample datasets I baked in: zero false positives on benign activity and 100% detection across the embedded techniques. Worth the asterisk that this is my test corpus — I'd love more folks running it against real logs and opening issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;On the roadmap: a built-in rule marketplace, richer EVTX field extraction, and a lightweight Windows service wrapper for continuous monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you're a SOC analyst, student, or homelabber who wants a dead-simple offline triage tool, give it a run. If it helps, a ⭐ on the repo means a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/TiltedLunar123/ThreatLens" rel="noopener noreferrer"&gt;github.com/TiltedLunar123/ThreatLens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PRs, issues, and detection rule contributions welcome.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>opensource</category>
      <category>infosec</category>
    </item>
    <item>
      <title>I Built an Offline Threat Hunting CLI That Parses EVTX, JSON, Syslog &amp; CEF Logs</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Thu, 16 Apr 2026 14:37:48 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-an-offline-threat-hunting-cli-that-parses-evtx-json-syslog-cef-logs-p6f</link>
      <guid>https://dev.to/tiltedlunar123/i-built-an-offline-threat-hunting-cli-that-parses-evtx-json-syslog-cef-logs-p6f</guid>
      <description>&lt;p&gt;If you've ever worked in a SOC or done any incident response, you know the pain: you've got a pile of log files from a compromised host, and you need answers fast. Maybe you don't have Splunk access. Maybe the SIEM is down. Maybe you're on a plane with a laptop full of EVTX files and zero internet.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;ThreatLens&lt;/strong&gt; — a Python CLI that does offline log analysis and threat hunting without requiring any infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ThreatLens Does
&lt;/h2&gt;

&lt;p&gt;ThreatLens ingests logs in multiple formats (EVTX, JSON, NDJSON, Syslog RFC 3164/5424, and CEF), runs them through 12 built-in detection modules, and outputs color-coded alerts mapped to the MITRE ATT&amp;amp;CK framework.&lt;/p&gt;

&lt;p&gt;No Elasticsearch cluster. No cloud account. Just &lt;code&gt;pip install threatlens&lt;/code&gt; and point it at your logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I'm a cybersecurity student, and every time I practiced incident response scenarios, I hit the same wall: the tools that do log analysis well are either expensive, require complex deployment, or need network access. I wanted something I could run anywhere — on an air-gapped forensics workstation, in a Docker container during a CTF, or in a CI/CD pipeline for automated security checks.&lt;/p&gt;

&lt;p&gt;So I started building ThreatLens as a learning project, and it grew into something I actually use regularly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Detection Engine: A Code Walkthrough
&lt;/h2&gt;

&lt;p&gt;The part I'm most proud of is the multi-stage attack chain correlation. Most log analysis tools look at events individually. ThreatLens connects the dots.&lt;/p&gt;

&lt;p&gt;Each detection module registers itself with a tactic and technique mapping. When ThreatLens processes a log file, it doesn't just flag individual events — it builds a timeline. If it sees a brute-force login (Initial Access), followed by a suspicious PowerShell execution (Execution), followed by a new scheduled task (Persistence), it correlates those into a potential attack chain and raises the severity.&lt;/p&gt;

&lt;p&gt;The detection modules cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brute-force &amp;amp; password spray&lt;/strong&gt; detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lateral movement&lt;/strong&gt; (RDP, PsExec, WMI patterns)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privilege escalation&lt;/strong&gt; monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOLBin abuse&lt;/strong&gt; (living-off-the-land binary execution)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encoded PowerShell&lt;/strong&gt; commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defense evasion&lt;/strong&gt; (log clearing, AV tampering)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence mechanisms&lt;/strong&gt; (scheduled tasks, services, registry run keys)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kerberos attacks&lt;/strong&gt; (Kerberoasting, Golden Ticket indicators)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data exfiltration&lt;/strong&gt; patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-stage attack chain correlation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each module uses a YAML-configurable rule format with 12 operators, so you can write custom rules without touching Python code. And if you already have Sigma rules from your team, ThreatLens supports those natively too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Install from PyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;threatlens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan a single log file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens scan /path/to/security.evtx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan a directory recursively with HTML report output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens scan /var/log/ &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run with custom Sigma rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens scan logs/ &lt;span class="nt"&gt;--sigma-rules&lt;/span&gt; ./my-rules/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tail logs in real-time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens &lt;span class="nb"&gt;tail&lt;/span&gt; /var/log/syslog &lt;span class="nt"&gt;--severity&lt;/span&gt; high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push alerts to Elasticsearch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens scan logs/ &lt;span class="nt"&gt;--es-host&lt;/span&gt; https://elastic:9200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output Formats
&lt;/h2&gt;

&lt;p&gt;ThreatLens gives you flexibility in how you consume results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt;: Color-coded severity with MITRE technique IDs inline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON/CSV&lt;/strong&gt;: For piping into other tools or importing to spreadsheets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt;: Self-contained reports with charts and timelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elasticsearch&lt;/strong&gt;: Push alerts directly for dashboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;One underrated use case: drop ThreatLens into your pipeline to scan application logs for security events. It returns proper exit codes, so you can fail a build if high-severity detections fire.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitHub Actions example&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Security log check&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;threatlens scan ./logs/ --severity high --exit-code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm working on expanding the detection library, improving the EVTX parser performance, and adding a plugin marketplace where the community can share detection modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;The repo is at &lt;a href="https://github.com/TiltedLunar123/ThreatLens" rel="noopener noreferrer"&gt;github.com/TiltedLunar123/ThreatLens&lt;/a&gt;. If it's useful to you, a star helps a lot with visibility. Issues and PRs are welcome — especially new detection rules.&lt;/p&gt;

&lt;p&gt;If you're a SOC analyst, threat hunter, or IR responder, I'd love to hear what detections you'd want added. Drop a comment below.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Portable SIEM Toolkit That Runs Sigma Rules Without Deploying a Full SIEM</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Mon, 13 Apr 2026 16:59:44 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-a-portable-siem-toolkit-that-runs-sigma-rules-without-deploying-a-full-siem-5276</link>
      <guid>https://dev.to/tiltedlunar123/i-built-a-portable-siem-toolkit-that-runs-sigma-rules-without-deploying-a-full-siem-5276</guid>
      <description>&lt;p&gt;You don't always have a full SIEM stack at your fingertips. Maybe you're a student spinning up a home lab, a junior SOC analyst triaging logs on a budget, or a pentester who just needs to check some Sysmon logs against known attack patterns. Standing up Splunk or Elastic just to run a few detection rules feels like overkill.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;SIEMForge&lt;/strong&gt; — a portable detection toolkit that lets you scan logs against Sigma rules, convert detections to Splunk/Elastic/Kibana queries, validate rule syntax, and map your coverage to the MITRE ATT&amp;amp;CK framework. All from the command line. No SIEM required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SIEMForge Actually Does
&lt;/h2&gt;

&lt;p&gt;At its core, SIEMForge is a Python CLI tool with four main capabilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Log Scanning Without a SIEM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feed it a JSON, JSONL, syslog, or CSV log file and it executes Sigma detection rules against it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--scan&lt;/span&gt; /var/log/sysmon/events.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It ships with 10 pre-built Sigma rules covering techniques like suspicious PowerShell downloads (T1059.001), LSASS memory dumps (T1003.001), CertUtil abuse (T1105), and scheduled task persistence (T1053.005).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Multi-Backend Rule Conversion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Need to move a Sigma rule into your production SIEM? SIEMForge converts to Splunk SPL, Elasticsearch Lucene, and Kibana KQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--convert&lt;/span&gt; splunk rules/sigma/proc_creation_suspicious_powershell.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This spits out ready-to-paste queries. No manual translation, no syntax guessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Rule Validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before deploying rules to production, validate them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--validate&lt;/span&gt; rules/sigma/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches YAML formatting issues, missing required fields, and structural problems before they break your detection pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. MITRE ATT&amp;amp;CK Coverage Mapping&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visualize which techniques your rule set covers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--mitre&lt;/span&gt; rules/sigma/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is huge for gap analysis — you can immediately see where your detection coverage is thin.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Closer Look: The Converter Architecture
&lt;/h2&gt;

&lt;p&gt;The part I'm most proud of is the converter module. Each SIEM backend has its own translation layer under &lt;code&gt;siemforge/converters/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;siemforge/converters/
    ├── splunk.py
    ├── elastic.py
    └── kibana.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each converter takes a parsed Sigma rule (field mappings, detection logic, conditions) and outputs the target query language. The tricky part was handling Sigma's conditional logic — things like &lt;code&gt;selection AND NOT filter&lt;/code&gt; with nested field conditions need to be properly parenthesized for each backend's syntax.&lt;/p&gt;

&lt;p&gt;For example, a Sigma rule detecting suspicious PowerShell downloads becomes Splunk SPL like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index=windows source="WinEventLog:Microsoft-Windows-Sysmon/Operational"
EventCode=1
CommandLine="*powershell*" AND (CommandLine="*-ep bypass*" OR CommandLine="*DownloadString*")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the same rule in Elasticsearch Lucene looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;event.code:1 AND process.command_line:(*powershell* AND (*-ep bypass* OR *DownloadString*))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Field names change, quoting rules change, wildcard syntax changes. The converter handles all of this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I'm a cybersecurity student, and I kept running into the same problem: I wanted to practice threat detection and log analysis, but every tutorial assumed you had a full Splunk or Elastic deployment. Setting up those stacks takes hours and eats resources on a student laptop.&lt;/p&gt;

&lt;p&gt;SIEMForge lets me (and anyone else) practice detection engineering with just Python and a log file. It's the tool I wished existed when I started learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TiltedLunar123/SIEMForge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;SIEMForge
pip &lt;span class="nb"&gt;install &lt;/span&gt;pyyaml
python &lt;span class="nt"&gt;-m&lt;/span&gt; siemforge &lt;span class="nt"&gt;--scan&lt;/span&gt; samples/test_logs.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test suite has 138 tests if you want to poke around the internals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements-dev.txt
pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm planning to add more Sigma rules, support additional log formats, and potentially add a web UI for the MITRE coverage matrix. If you're into detection engineering or just want a lightweight way to work with Sigma rules, give it a try and let me know what you think.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/TiltedLunar123/SIEMForge" rel="noopener noreferrer"&gt;https://github.com/TiltedLunar123/SIEMForge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this is useful, drop a star — it helps more than you think.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built an Offline Threat Hunting CLI That Runs Sigma Rules and Maps Everything to MITRE ATT&amp;CK</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Sat, 11 Apr 2026 12:26:31 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-an-offline-threat-hunting-cli-that-runs-sigma-rules-and-maps-everything-to-mitre-attck-5dco</link>
      <guid>https://dev.to/tiltedlunar123/i-built-an-offline-threat-hunting-cli-that-runs-sigma-rules-and-maps-everything-to-mitre-attck-5dco</guid>
      <description>&lt;p&gt;Most log analysis workflows assume you have a full SIEM stack running. Splunk, Elastic, Sentinel — they're powerful, but they're also heavy. When I needed to triage Windows security logs during a lab exercise, I didn't want to spin up infrastructure. I wanted to point a tool at a folder of logs and get answers.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;ThreatLens&lt;/strong&gt; — a Python CLI that parses EVTX, JSON, Syslog, and CEF logs offline, runs detection rules (including native Sigma support), correlates multi-stage attacks, and outputs structured alerts mapped to MITRE ATT&amp;amp;CK. No agents, no cloud, no dependencies beyond PyYAML.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Actually Does
&lt;/h2&gt;

&lt;p&gt;ThreatLens automates the first pass of triage. You feed it log files and it catches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brute-force attacks and password spray patterns&lt;/li&gt;
&lt;li&gt;Lateral movement (single account hopping across hosts)&lt;/li&gt;
&lt;li&gt;Privilege escalation (SeDebugPrivilege, SeTcbPrivilege assigned to non-system accounts)&lt;/li&gt;
&lt;li&gt;Suspicious process execution (LOLBins, encoded PowerShell, certutil download cradles)&lt;/li&gt;
&lt;li&gt;Defense evasion (log clearing, Defender disabled, audit policy changes)&lt;/li&gt;
&lt;li&gt;Persistence mechanisms (new services, scheduled tasks, registry Run keys)&lt;/li&gt;
&lt;li&gt;Credential access (LSASS dumps, SAM hive access, DCSync)&lt;/li&gt;
&lt;li&gt;Multi-stage attack chain correlation that links activity across the entire kill chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every alert maps to a specific MITRE ATT&amp;amp;CK technique with an actionable recommendation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Feature I'm Most Proud Of: Attack Chain Correlation
&lt;/h2&gt;

&lt;p&gt;Individual alerts are useful, but real attacks are sequences. ThreatLens has a correlation engine that links events across kill chain phases — if it sees credential access followed by privilege escalation followed by lateral movement followed by execution from the same source, it flags the entire chain as a single CRITICAL alert.&lt;/p&gt;

&lt;p&gt;Here's the logic in simplified form: the engine groups alerts by time windows, tracks source entities across detection modules, and looks for progressions through the MITRE ATT&amp;amp;CK lifecycle. When it finds a chain, it bundles all the evidence into one high-confidence alert instead of flooding you with disconnected findings.&lt;/p&gt;

&lt;p&gt;This is the kind of analysis that normally requires a SIEM correlation rule or a dedicated XDR platform. Having it in a standalone CLI means you can run it during incident response, in a lab, or in a CI/CD pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sigma Rule Support
&lt;/h2&gt;

&lt;p&gt;One of my goals was interoperability with the existing detection community. ThreatLens loads Sigma rules natively — selections, filters, field modifiers (&lt;code&gt;|contains&lt;/code&gt;, &lt;code&gt;|startswith&lt;/code&gt;, &lt;code&gt;|endswith&lt;/code&gt;, &lt;code&gt;|re&lt;/code&gt;, &lt;code&gt;|all&lt;/code&gt;), compound conditions with correct operator precedence, and logsource pre-filtering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/SigmaHQ/sigma.git
threatlens scan logs/ &lt;span class="nt"&gt;--sigma-rules&lt;/span&gt; sigma/rules/windows/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means you get access to thousands of community-maintained detection rules without writing anything custom.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;ThreatLens returns structured exit codes: 0 for clean, 2 for alerts above your threshold. Drop it into a pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;threatlens scan logs/ &lt;span class="nt"&gt;--fail-on&lt;/span&gt; high &lt;span class="nt"&gt;--summary-only&lt;/span&gt; &lt;span class="nt"&gt;--no-color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it to gate deployments or trigger incident workflows based on log findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;threatlens
threatlens scan your_logs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or clone it and run against the included sample data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TiltedLunar123/ThreatLens.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ThreatLens
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
threatlens scan sample_data/sample_security_log.json &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sample dataset includes a focused attack simulation (26 events) and a mixed enterprise log (52 events with benign noise plus embedded attacks). ThreatLens hit 100% detection with zero false positives on the benign traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm actively working on this project and planning to add more detection modules, improve the Sigma compatibility layer, and build out the plugin system so teams can drop in environment-specific detectors.&lt;/p&gt;

&lt;p&gt;If you work in security operations, do incident response, or just want a fast way to analyze Windows logs without infrastructure — give it a try and let me know what you think.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/TiltedLunar123/ThreatLens" rel="noopener noreferrer"&gt;https://github.com/TiltedLunar123/ThreatLens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this was useful, follow me for more security tooling and detection engineering content.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Chrome Extension That Auto-Saves Your Form Data Locally (Zero Network Requests)</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Sat, 04 Apr 2026 10:02:44 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-a-chrome-extension-that-auto-saves-your-form-data-locally-zero-network-requests-heh</link>
      <guid>https://dev.to/tiltedlunar123/i-built-a-chrome-extension-that-auto-saves-your-form-data-locally-zero-network-requests-heh</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You're halfway through a long form — maybe a job application, an insurance quote, or a school registration — and you accidentally close the tab. Or the page crashes. Or your session expires.&lt;/p&gt;

&lt;p&gt;Everything you typed is gone.&lt;/p&gt;

&lt;p&gt;Browser autofill only covers the basics (name, email, address). It doesn't save the custom fields, text areas, or dropdowns that make up 90% of real forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FormVault&lt;/strong&gt; is a Chrome extension that automatically saves everything you type into any web form — locally, on your machine. No accounts, no cloud sync, no network requests at all.&lt;/p&gt;

&lt;p&gt;When you come back to a form, FormVault lets you restore your previous inputs with one click.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Detects form fields on any page&lt;/li&gt;
&lt;li&gt;Saves inputs to Chrome's local storage as you type&lt;/li&gt;
&lt;li&gt;Restore button appears when you revisit a page with saved data&lt;/li&gt;
&lt;li&gt;All data stays on your device — zero network requests, ever&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it this way
&lt;/h2&gt;

&lt;p&gt;I wanted something I'd actually trust with sensitive form data. Most form-saving tools either sync to a cloud or require an account. FormVault does neither. You can read every line of the source code yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;The extension is free and open source. If you've ever lost form data and wanted to throw your laptop, this might save you some frustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/TiltedLunar123/FormVault" rel="noopener noreferrer"&gt;https://github.com/TiltedLunar123/FormVault&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm a cybersecurity student building tools in my spare time, so feedback is genuinely welcome — especially on the privacy/security side. What would you improve?&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>chrome</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a portable SIEM detection toolkit that converts Sigma rules to Splunk, Elastic, and Kibana queries</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Wed, 01 Apr 2026 13:15:34 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-a-portable-siem-detection-toolkit-that-converts-sigma-rules-to-splunk-elastic-and-kibana-412o</link>
      <guid>https://dev.to/tiltedlunar123/i-built-a-portable-siem-detection-toolkit-that-converts-sigma-rules-to-splunk-elastic-and-kibana-412o</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you've ever tried to manage detection content across different SIEMs, you know the pain. Sigma rules live in one folder, your Sysmon config is somewhere else, Wazuh custom rules are in yet another directory, and none of it maps cleanly back to MITRE ATT&amp;amp;CK. Converting rules between SIEM formats usually means installing sigmac or setting up a whole pipeline just to get a Splunk query out of a YAML file.&lt;/p&gt;

&lt;p&gt;I'm a cybersecurity student and I got tired of this workflow in my home lab, so I built &lt;strong&gt;SIEMForge&lt;/strong&gt; — a single Python CLI that keeps all your detection content in one place and converts it natively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;SIEMForge is a portable toolkit that handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sigma rule conversion&lt;/strong&gt; — translates detection rules to Splunk SPL, Elasticsearch Lucene, or Kibana KQL without any external dependencies (no sigmac needed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10 pre-built detection rules&lt;/strong&gt; covering credential dumping (T1003.001), process injection (T1055.003), lateral movement via PsExec (T1021.002), suspicious PowerShell (T1059.001), SSH brute-force (T1110.001), and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuned Sysmon configuration&lt;/strong&gt; for Windows event monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wazuh custom rules&lt;/strong&gt; with agent config snippets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MITRE ATT&amp;amp;CK mapping&lt;/strong&gt; across all rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-command export&lt;/strong&gt; of the complete detection package&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TiltedLunar123/SIEMForge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;SIEMForge
pip &lt;span class="nb"&gt;install &lt;/span&gt;pyyaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only dependency is PyYAML. Runs on Python 3.8+.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# See what's in the toolkit&lt;/span&gt;
python siemforge.py

&lt;span class="c"&gt;# Convert all rules to Splunk SPL&lt;/span&gt;
python siemforge.py &lt;span class="nt"&gt;--convert&lt;/span&gt; splunk

&lt;span class="c"&gt;# Convert a single rule to Kibana KQL&lt;/span&gt;
python siemforge.py &lt;span class="nt"&gt;--convert&lt;/span&gt; kibana &lt;span class="nt"&gt;--convert-rule&lt;/span&gt; lsass_credential_dump.yml

&lt;span class="c"&gt;# View MITRE ATT&amp;amp;CK coverage&lt;/span&gt;
python siemforge.py &lt;span class="nt"&gt;--mitre&lt;/span&gt;

&lt;span class="c"&gt;# Export everything as a packaged bundle&lt;/span&gt;
python siemforge.py &lt;span class="nt"&gt;--export-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--export-all&lt;/code&gt; flag generates an organized directory with Sigma YAML rules, Sysmon XML config, and Wazuh rules ready to drop into your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Mostly for my own learning. I wanted to understand how Sigma rules actually translate to different query languages under the hood, and I wanted a single tool I could carry between lab environments without installing a bunch of dependencies. Figured other students or home lab folks might find it useful too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I'm planning to add more detection rules and possibly support for more output formats. If you work in blue team or run a home lab, I'd love to know: &lt;strong&gt;what detection rules or SIEM formats would be most useful to add?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check it out here: &lt;a href="https://github.com/TiltedLunar123/SIEMForge" rel="noopener noreferrer"&gt;github.com/TiltedLunar123/SIEMForge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed, contributions welcome.&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>opensource</category>
      <category>linux</category>
    </item>
    <item>
      <title>I Built a Chrome Extension That Auto-Saves Your Form Data Locally (Zero Network Requests)</title>
      <dc:creator>Jude Hilgendorf</dc:creator>
      <pubDate>Sun, 29 Mar 2026 13:15:24 +0000</pubDate>
      <link>https://dev.to/tiltedlunar123/i-built-a-chrome-extension-that-auto-saves-your-form-data-locally-zero-network-requests-b94</link>
      <guid>https://dev.to/tiltedlunar123/i-built-a-chrome-extension-that-auto-saves-your-form-data-locally-zero-network-requests-b94</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Ever spent 20 minutes filling out a long form — job application, insurance quote, registration — and then the page crashes, your session expires, or you accidentally hit the back button?&lt;/p&gt;

&lt;p&gt;All that data, gone. Browser autofill doesn't help because it only remembers basic fields like name and address, not the custom stuff you actually typed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FormVault&lt;/strong&gt; is a Chrome extension that automatically saves everything you type into web forms, locally on your machine. If the page crashes or you navigate away, your data is still there when you come back.&lt;/p&gt;

&lt;p&gt;Key details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero network requests&lt;/strong&gt; — your form data never leaves your browser&lt;/li&gt;
&lt;li&gt;Auto-saves as you type, restores when you revisit the page&lt;/li&gt;
&lt;li&gt;Works on any form on any site&lt;/li&gt;
&lt;li&gt;One-click clear if you want to wipe saved data for a page&lt;/li&gt;
&lt;li&gt;Lightweight, no account needed, no permissions beyond the active tab&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Made It Privacy-First
&lt;/h2&gt;

&lt;p&gt;Most form-saving tools sync your data to a cloud server. That means your half-finished job applications, medical forms, and financial info sits on someone else's infrastructure. I didn't want that.&lt;/p&gt;

&lt;p&gt;FormVault uses &lt;code&gt;chrome.storage.local&lt;/code&gt; exclusively. Nothing is transmitted. Nothing is stored externally. You own your data, period.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It / Give Feedback
&lt;/h2&gt;

&lt;p&gt;I'm a cybersecurity student and this is one of my side projects. I'd genuinely appreciate feedback — especially on edge cases where form detection might break, or ideas for features that would make this more useful for your workflow.&lt;/p&gt;

&lt;p&gt;Check it out here: &lt;a href="https://github.com/TiltedLunar123/FormVault" rel="noopener noreferrer"&gt;FormVault on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What form-saving solutions do you currently use? Or do you just accept the risk and re-type everything?&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>chromeextension</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
