<?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: unit life</title>
    <description>The latest articles on DEV Community by unit life (@unit_500_c36d1b1011fdf39c).</description>
    <link>https://dev.to/unit_500_c36d1b1011fdf39c</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%2F4022725%2Febb5eed8-3e1e-4707-b48c-122104782b4b.jpeg</url>
      <title>DEV Community: unit life</title>
      <link>https://dev.to/unit_500_c36d1b1011fdf39c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/unit_500_c36d1b1011fdf39c"/>
    <language>en</language>
    <item>
      <title>Fingerprinting Network Honeypots with Weighted Behavioral Scoring Engine</title>
      <dc:creator>unit life</dc:creator>
      <pubDate>Thu, 03 Sep 2026 11:30:33 +0000</pubDate>
      <link>https://dev.to/unit_500_c36d1b1011fdf39c/fingerprinting-network-honeypots-with-weighted-behavioral-scoring-engine-2d9k</link>
      <guid>https://dev.to/unit_500_c36d1b1011fdf39c/fingerprinting-network-honeypots-with-weighted-behavioral-scoring-engine-2d9k</guid>
      <description>&lt;p&gt;Deception technology has evolved past static string matches. &lt;br&gt;
Modern decoys try to mimic production environments, &lt;br&gt;
making binary "is it a honeypot?" checks unreliable. &lt;br&gt;
Single indicators—like a missing Date header or an unusual SSH banner—frequently trigger false positives on enterprise middleboxes and legacy servers.&lt;/p&gt;

&lt;p&gt;To solve this, we built Honeypot-Auditor around a dual-dimensional Honeyscore &amp;amp; Confidence engine. Here is a breakdown of how the scoring mechanics work under the hood.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faijhqz9t0qbk03l062dv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faijhqz9t0qbk03l062dv.gif" alt="In action" width="720" height="484"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Github: &lt;a href="https://github.com/mziqudhd92/honeypot-auditor" rel="noopener noreferrer"&gt;https://github.com/mziqudhd92/honeypot-auditor&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Math Behind the Honeyscore (0–100%)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rather than assigning flat point values, Honeypot-Auditor treats each protocol anomaly as a weighted indicator with strict corroboration rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolated Indicator Penalty: Standard L4/TLS stack tells (e.g., JA3S signatures or header ordering) carry low independent weight (~10–15%).&lt;/li&gt;
&lt;li&gt;Corroboration Multiplier: Weak tells require corroboration across independent categories (e.g., combining a TLS cipher mismatch with a state-machine failure). When two distinct categories hit, a corroboration gate unlocks the full indicator weight.&lt;/li&gt;
&lt;li&gt;Hard Tells: High-interaction leaks (such as arbitrary auth acceptance or shell execution latency anomalies) act as high-confidence anchors that push the score above 80%.&lt;/li&gt;
&lt;/ul&gt;



&lt;ol&gt;
&lt;li&gt;Under the Hood: Corroboration Gating&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a simplified look at how the analyzer evaluates indicator weights and suppresses weak signals unless corroborated by an independent category:&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;calculate_honeyscore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indicators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Indicator&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;proxy_detected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="n"&gt;categories_hit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ind&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;indicators&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;triggered&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;ind&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;indicators&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;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;triggered&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="c1"&gt;# Proxy Guard: Suppress L4/TLS stack tells if an edge proxy is active
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;proxy_detected&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fingerprint_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROXY_SUPPRESSED_TYPES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suppressed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="c1"&gt;# Corroboration Gate: Weak tells require at least 2 distinct categories
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requires_corroboration&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;categories_hit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suppressed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Cool Web Page: &lt;a href="https://mziqudhd92.github.io/honeypot-auditor/" rel="noopener noreferrer"&gt;https://mziqudhd92.github.io/honeypot-auditor/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;ol&gt;
&lt;li&gt;Dual-Dimensional Output: Score vs. Confidence&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A high score alone isn't enough for automated decision-making. We pair the Honeyscore with a separate Confidence metric:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LOW Confidence: Triggered when &amp;lt; 3 protocols are audited or &amp;gt; 50% of probes fail/timeout.&lt;/li&gt;
&lt;li&gt;MEDIUM Confidence: Reached when 3+ protocols respond and at least 2 distinct category hits occur.&lt;/li&gt;
&lt;li&gt;HIGH Confidence: Achieved when deep behavioral mode confirms corroborating tells across multiple independent layers.&lt;/li&gt;
&lt;/ul&gt;



&lt;ol&gt;
&lt;li&gt;Real-World Scenario: The Banner Spoofing Trap&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consider a modern SSH decoy (like Cowrie,dd-honeypot and others) configured to mimic a standard production Linux server:&lt;/p&gt;

&lt;p&gt;a. Naive Banner Grabber:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connects to port 22 and reads the string: &lt;code&gt;SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Concludes: "Standard production server (0% Honeypot)."
b. Honeypot-Auditor:&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Banner Check: Sees OpenSSH claim. (Weight: 0%)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;KEXINIT Inspection: Extracts the raw &lt;a href="https://datatracker.ietf.org/doc/html/rfc4253#section-7.1" rel="noopener noreferrer"&gt;&lt;code&gt;SSH_MSG_KEXINIT&lt;/code&gt;&lt;/a&gt; byte sequence. &lt;br&gt;
It detects Paramiko/Twisted-specific key exchange algorithms and rigid cipher preferences that real OpenSSH binaries never advertise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stack Cross-Referencing: Checks the TCP SYN-ACK option ordering. The underlying kernel exhibits a generic container profile, contradicting the OS claimed by the banner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Corroboration Gate Unlocked: Combining the application-layer banner claim with the KEXINIT algorithm mismatch triggers a high-confidence indicator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Result: Honeyscore leaps to 85.0% [HIGH LIKELIHOOD DECOY] with Tactical Action &lt;code&gt;SKIP_TARGET&lt;/code&gt;.&lt;br&gt;
And this is by checking only port 22, usually we will ffind more open ports on honeypots and combining checks on them will increase the detection even further. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;ol&gt;
&lt;li&gt;Tactical Action Outcomes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of forcing engineers to interpret raw percentages, the scoring engine resolves into four tactical actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SKIP_TARGET&lt;/strong&gt;: Score &amp;gt;= 60% with HIGH/MEDIUM confidence (confirmed decoy).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PIVOT_POSSIBLE&lt;/strong&gt;: Score &amp;lt; 30% with HIGH confidence (verified production target).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROCEED_CAUTION&lt;/strong&gt;: Score between 30–59% or LOW confidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INCONCLUSIVE&lt;/strong&gt;: Edge proxy masking origin stack or insufficient probe responses.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;So what is different ? &lt;br&gt;
The main thing is that we are not only counting on signatures to detect a target, the engine using 16 protocols that are implementing more than 50 different strategies to evaluate if remote host is a decoy or not.&lt;/p&gt;

&lt;p&gt;You can try it out, Honeypot-Auditor is open-source (MIT licensed:&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;honeypot-auditor
honeypot-auditor &lt;span class="nt"&gt;--target&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/mziqudhd92" rel="noopener noreferrer"&gt;
        mziqudhd92
      &lt;/a&gt; / &lt;a href="https://github.com/mziqudhd92/honeypot-auditor" rel="noopener noreferrer"&gt;
        honeypot-auditor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Does This Look Like An Honeypot? (DTLLAH) Multi-protocol CLI that fingerprints whether a target IP behaves like a low-interaction honeypot — Shodan Honeyscore, active auth/state probes, and a weighted score.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;.______________________________________________________________________________
|  :: H-AUDITOR :: v0.7.3 :: "DIALING IN... CARRIER DETECTED" ::                |
|------------------------------------------------------------------------------|
|  "warez? nah. headers. we trade banners, not bins."                          |
|  "if it answers any password, it ain't production — it's a lure."            |
|  "respect the sysop. probe only what you own. leave no STOR behind."         |
|______________________________________________________________________________|
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="https://pypi.org/project/honeypot-auditor/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/397fdd7bff5993dc116156dde5056f79a555f5409682284f4f507eb25bf52ab4/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f686f6e6579706f742d61756469746f723f7374796c653d666c61742d737175617265" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/honeypot-auditor/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/62050bd68b60d4c7a002e1a7c121de1f66b996a48a9d7deeffb06fb60ba0317e/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f686f6e6579706f742d61756469746f723f7374796c653d666c61742d737175617265" alt="Python"&gt;&lt;/a&gt;
&lt;a href="https://github.com/mziqudhd92/honeypot-auditor/actions/workflows/test.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/mziqudhd92/honeypot-auditor/actions/workflows/test.yml/badge.svg" alt="tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/mziqudhd92/honeypot-auditor/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/422db9fd40f5831c765cf6530b6750c081b696bd18d904cf89554df98c676277/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e3f7374796c653d666c61742d737175617265" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://mziqudhd92.github.io/honeypot-auditor/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fc04974bb0759798f29df959fcb5188fcb58b55d4daeb63d512fd7005d4e388f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f736974652d42425325323050616765732d3333666636363f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d303530383035" alt="Pages"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site (BBS / NFO):&lt;/strong&gt; &lt;a href="https://mziqudhd92.github.io/honeypot-auditor/" rel="nofollow noopener noreferrer"&gt;https://mziqudhd92.github.io/honeypot-auditor/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Agents / AEO:&lt;/strong&gt; &lt;a href="https://mziqudhd92.github.io/honeypot-auditor/llms.txt" rel="nofollow noopener noreferrer"&gt;llms.txt&lt;/a&gt; · &lt;a href="https://mziqudhd92.github.io/honeypot-auditor/agents.md" rel="nofollow noopener noreferrer"&gt;agents.md&lt;/a&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;  ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  █  &amp;gt;&amp;gt;&amp;gt; LIVE DEMO · 3 HOST LAB TOUR · -v / --deep / SILENT-ACCEPT &amp;lt;&amp;lt;&amp;lt;     █
  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/mziqudhd92/honeypot-auditor/docs/demo/honeypot-auditor-lab-tour-demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmziqudhd92%2Fhoneypot-auditor%2FHEAD%2Fdocs%2Fdemo%2Fhoneypot-auditor-lab-tour-demo.gif" alt="Lab tour demo — Cowrie, dd-stack, tarpit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;  "three hosts, three lenses: KEX facade with -v, deep on the buffet,
   silent-accept on the tarpit. same fingerprinter — different tells."
                                              — lab tour · authorized only
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;.------------------------------------------------------------------------------
|  NFO · READ BEFORE YOU DIAL                                                  |
|------------------------------------------------------------------------------|
|  Authorized targets ONLY. Lab boxes. Decoys you own. Sensors you run.        |
|  Permission on paper (or in ticket).                                         |
|                                                                              |
|  Scanning random /16 because Shodan said&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mziqudhd92/honeypot-auditor" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Would love feedback!&lt;/p&gt;

</description>
      <category>python</category>
      <category>cybersecurity</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
