<?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: qyleron-dev</title>
    <description>The latest articles on DEV Community by qyleron-dev (@qyleron-dev).</description>
    <link>https://dev.to/qyleron-dev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F684295%2Fd32f95e2-6d15-4a2c-b9ad-051bdad7c609.png</url>
      <title>DEV Community: qyleron-dev</title>
      <link>https://dev.to/qyleron-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qyleron-dev"/>
    <language>en</language>
    <item>
      <title>Echidra: I built a honeypot that tells you what kind of attacker you're looking at, not just what happened</title>
      <dc:creator>qyleron-dev</dc:creator>
      <pubDate>Wed, 12 Aug 2026 17:52:01 +0000</pubDate>
      <link>https://dev.to/qyleron-dev/echidra-i-built-a-honeypot-that-tells-you-what-kind-of-attacker-youre-looking-at-not-just-what-29if</link>
      <guid>https://dev.to/qyleron-dev/echidra-i-built-a-honeypot-that-tells-you-what-kind-of-attacker-youre-looking-at-not-just-what-29if</guid>
      <description>&lt;p&gt;Most honeypots log what happened. Echidra tells you what kind of attacker you're looking at.&lt;/p&gt;

&lt;p&gt;It simulates SSH, HTTP, FTP, and Telnet services with a believable Linux persona, then runs every session through a deterministic classifier — actor type, risk score, MITRE ATT&amp;amp;CK technique, intent — before it hits your dashboard. Nothing attackers type ever touches the real host.&lt;/p&gt;

&lt;p&gt;Here's the part that actually mattered, and why I made the calls I did.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The part that actually solved my original problem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every session gets run through a classifier when it ends. It's rule-based right now, not ML — a set of YAML rules that map session features to an actor type, a risk score, a MITRE ATT&amp;amp;CK technique, and a guess at intent. So instead of opening a log file, I open a dashboard and see which sessions were credential-stuffing bots, which were somebody manually poking around, and which looked like they were trying to establish persistence.&lt;/p&gt;

&lt;p&gt;A rule looks roughly like this — you're matching on session features (commands run, timing, protocol) and mapping them straight to a classification:&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;credential_stuffing_bot&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;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ssh&lt;/span&gt;
   &lt;span class="na"&gt;auth_attempts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;5"&lt;/span&gt;
   &lt;span class="na"&gt;session_duration_seconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;3"&lt;/span&gt;
   &lt;span class="na"&gt;commands_run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
 &lt;span class="na"&gt;classify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;actor_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;automated_bot&lt;/span&gt;
   &lt;span class="na"&gt;risk_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;
   &lt;span class="na"&gt;mitre_technique&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;T1110&amp;nbsp;&lt;/span&gt; &lt;span class="c1"&gt;# Brute Force&lt;/span&gt;
   &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;credential_access&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nothing fancy — no model, no training data. Just enough structure that when a session comes in with five failed logins in under three seconds and zero commands, I don't have to open a log file to know it's a script, not a person. The rules I've hand-tuned so far already sort out the obvious bots from sessions where someone is actually looking around, checking &lt;strong&gt;whoami&lt;/strong&gt;, poking at &lt;strong&gt;/etc/passwd&lt;/strong&gt; — the ones worth a closer look.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup
&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; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
echidra init
echidra start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it — runs the listeners and the dashboard together. If you don't have Postgres configured it just logs to&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logs/sessions.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and still works fine, Postgres just gets you the full dashboard history.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Things I'd still call rough&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The classifier rules are hand-tuned, not learned, so they're only as good as what I've seen hit my own honeypot so far. If you run one of your own I'd like to know what patterns you're seeing that this doesn't catch — new attacker behavior means new rules, and right now that loop is entirely manual.&lt;/p&gt;

&lt;p&gt;Repo's here if you want to look at the rule engine or just run it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Qyleron" rel="noopener noreferrer"&gt;
        Qyleron
      &lt;/a&gt; / &lt;a href="https://github.com/Qyleron/EchidraOSS" rel="noopener noreferrer"&gt;
        EchidraOSS
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open-source deceptive honeypot &amp;amp; attacker-behavior classifier — SSH/HTTP/FTP/Telnet decoys with MITRE ATT&amp;amp;CK-tagged threat intelligence and a live dashboard.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Echidra — Multi-Protocol Honeypot &amp;amp; Attacker Behavior Classifier&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Qyleron/EchidraOSS/assets/Qyleron_Banner_README.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FQyleron%2FEchidraOSS%2FHEAD%2Fassets%2FQyleron_Banner_README.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Qyleron/EchidraOSS/LICENSE.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c61341f63648cdd5aba4f7a073b513106a63778c27b15f96c56157642bc943b4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4147504c25323076332d626c75652e737667" alt="License: AGPL v3"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Qyleron/EchidraOSS/pyproject.toml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b53facf22983aa2d774dc86c7382e9d08096b26bd96bc2d83e6885a50bacea85/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31312532422d626c75652e737667" alt="Python 3.11+"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Echidra is an open-source deceptive honeypot and threat-intelligence platform
that simulates attacker-facing SSH, HTTP, FTP, and Telnet services, captures
real attacker behavior, classifies it against MITRE ATT&amp;amp;CK techniques, and
surfaces the result in a web dashboard — without ever executing real commands
or exposing real data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://qyleron.com/setup-and-onboarding/" rel="nofollow noopener noreferrer"&gt;Docs &amp;amp; full setup guide&lt;/a&gt; · &lt;a href="https://qyleron.com/console-guide/" rel="nofollow noopener noreferrer"&gt;Console guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What Is Echidra?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Echidra pretends to be a Linux server. Attackers connect over SSH-style TCP
HTTP, FTP, or Telnet and see a believable, persona-driven system: real-looking
banners, users, files, running processes, and (for the shell) an interactive
fake command set. Nothing they type touches the real host or filesystem.&lt;/p&gt;
&lt;p&gt;Every completed session is logged, classified (actor type, risk, MITRE ATT&amp;amp;CK
technique, intent), geolocated, and stored in PostgreSQL — or &lt;code&gt;logs/sessions.jsonl&lt;/code&gt;
if PostgreSQL isn't configured — for review in the dashboard.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Honeypot listeners&lt;/strong&gt; — SSH-style fake shell, HTTP…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Qyleron/EchidraOSS" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>opensource</category>
      <category>cybersecurity</category>
      <category>showdev</category>
      <category>security</category>
    </item>
  </channel>
</rss>
