<?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>Forem: Nmosi Chinecherem</title>
    <description>The latest articles on Forem by Nmosi Chinecherem (@nmosic).</description>
    <link>https://forem.com/nmosic</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%2F3895757%2F486b15f2-0220-4aae-8d85-e007c63e41d4.jpg</url>
      <title>Forem: Nmosi Chinecherem</title>
      <link>https://forem.com/nmosic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nmosic"/>
    <language>en</language>
    <item>
      <title># Supercharging My SOC Pipeline With VirusTotal Enrichment — Know Your Attacker Before You Block Them</title>
      <dc:creator>Nmosi Chinecherem</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:50:47 +0000</pubDate>
      <link>https://forem.com/nmosic/-supercharging-my-soc-pipeline-with-virustotal-enrichment-know-your-attacker-before-you-block-36on</link>
      <guid>https://forem.com/nmosic/-supercharging-my-soc-pipeline-with-virustotal-enrichment-know-your-attacker-before-you-block-36on</guid>
      <description>&lt;p&gt;&lt;em&gt;In my last article I built a SOC pipeline that caught real hackers in 3 minutes. This time I'm adding automated threat intelligence enrichment — so every alert now tells me exactly who the attacker is before a human even looks at it.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Raw Alerts
&lt;/h2&gt;

&lt;p&gt;After my first article, my pipeline was working well. Real attackers were hitting the honeypot, Wazuh was firing level 15 alerts, Shuffle was processing them, and TheHive was creating cases.&lt;/p&gt;

&lt;p&gt;But there was a gap.&lt;/p&gt;

&lt;p&gt;Every case in TheHive looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alert: SSH Brute Force on Honeypot
Attacker IP: 110.35.80.116
Agent: honeypot
Level: 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's useful. But it's not enough. An IP address alone doesn't tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this a known malicious actor?&lt;/li&gt;
&lt;li&gt;Is this a botnet, a VPN, or a targeted attacker?&lt;/li&gt;
&lt;li&gt;Has this IP been reported attacking other people?&lt;/li&gt;
&lt;li&gt;What country is it from?&lt;/li&gt;
&lt;li&gt;How dangerous is it — 1 engine flagged it or 80?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that context, every alert looks the same. You can't prioritise. You can't make intelligent decisions about how to respond.&lt;/p&gt;

&lt;p&gt;The solution is &lt;strong&gt;threat intelligence enrichment&lt;/strong&gt; — automatically looking up every attacker IP the moment an alert fires, and adding that intelligence to the case before an analyst even opens it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is VirusTotal?
&lt;/h2&gt;

&lt;p&gt;VirusTotal is a free threat intelligence platform owned by Google. It aggregates data from over 90 security vendors and lets you look up IPs, domains, URLs, and file hashes to check their reputation.&lt;/p&gt;

&lt;p&gt;When you query an IP address, VirusTotal returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Malicious votes&lt;/strong&gt; — how many of 90+ engines flagged it as malicious&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Country and ISP&lt;/strong&gt; — where the attacker is connecting from&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tags&lt;/strong&gt; — scanner, brute-force, malware, botnet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Last seen&lt;/strong&gt; — when this IP was last reported doing something malicious&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reputation score&lt;/strong&gt; — a number from -100 (very malicious) to +100 (trusted)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free API gives you 500 lookups per day — more than enough for a personal SOC pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Enriched Pipeline
&lt;/h2&gt;

&lt;p&gt;Before enrichment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Honeypot → Wazuh → Shuffle → TheHive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After enrichment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Honeypot → Wazuh → Shuffle → VirusTotal lookup → TheHive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference in the TheHive case:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attacker IP: 110.35.80.116
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&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;Attacker IP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;110.35.80.116&lt;/span&gt;
&lt;span class="na"&gt;VT Malicious&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;12/90 engines&lt;/span&gt;
&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;China&lt;/span&gt;
&lt;span class="na"&gt;ISP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Alibaba Cloud Computing&lt;/span&gt;
&lt;span class="na"&gt;Tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scanner, brute-force&lt;/span&gt;
&lt;span class="na"&gt;Reputation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-25&lt;/span&gt;
&lt;span class="na"&gt;Last reported&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-04-24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every case arrives pre-enriched with actionable intelligence. An analyst can immediately see whether this is a low-level scanner they can deprioritise or a high-confidence malicious actor that needs immediate attention.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Get a Free VirusTotal API Key
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;&lt;a href="https://www.virustotal.com" rel="noopener noreferrer"&gt;https://www.virustotal.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Sign In&lt;/strong&gt; → &lt;strong&gt;Join us today&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Create a free account&lt;/li&gt;
&lt;li&gt;Go to your profile (top right) → &lt;strong&gt;API Key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy your API key — it looks like a long string of letters and numbers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The free tier gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 lookups per day&lt;/li&gt;
&lt;li&gt;4 lookups per minute&lt;/li&gt;
&lt;li&gt;Full API access&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2 — Update the Shuffle Workflow
&lt;/h2&gt;

&lt;p&gt;Open your Shuffle instance and go to your &lt;strong&gt;Wazuh-TheHive&lt;/strong&gt; workflow.&lt;/p&gt;

&lt;p&gt;We need to add a new step between the Webhook trigger and the HTTP node that creates the TheHive alert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a new HTTP node&lt;/strong&gt; and connect it between Webhook 1 and Http 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Webhook 1 → VT Lookup (new) → Http 1 (TheHive)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configure the VT Lookup node:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method:&lt;/strong&gt; GET&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.virustotal.com/api/v3/ip_addresses/$exec.body.data.srcip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headers:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;x-apikey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_VIRUSTOTAL_API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sends the attacker's source IP from the Wazuh alert to VirusTotal and returns the full reputation report.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Update the TheHive Case With Enriched Data
&lt;/h2&gt;

&lt;p&gt;Now update your &lt;strong&gt;Http 1 (TheHive)&lt;/strong&gt; node body to include the VirusTotal data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[Wazuh] $exec.body.rule.description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"## Alert Details&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Rule ID: $exec.body.rule.id&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Agent: $exec.body.agent.name&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Level: $exec.body.rule.level&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Timestamp: $exec.body.timestamp&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;## Attacker Intelligence&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;IP: $exec.body.data.srcip&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;VT Malicious Votes: $VT_Lookup.body.data.attributes.last_analysis_stats.malicious&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;VT Harmless Votes: $VT_Lookup.body.data.attributes.last_analysis_stats.harmless&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Country: $VT_Lookup.body.data.attributes.country&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Reputation: $VT_Lookup.body.data.attributes.reputation&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;ASN: $VT_Lookup.body.data.attributes.asn&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;## Raw Alert&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;$exec.body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wazuh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wazuh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$exec.body.id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"wazuh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"honeypot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"enriched"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4 — Add Conditional Severity
&lt;/h2&gt;

&lt;p&gt;One of the most powerful things you can do with VirusTotal data is automatically adjust the severity of the TheHive case based on the malicious vote count.&lt;/p&gt;

&lt;p&gt;In Shuffle, add a &lt;strong&gt;Condition node&lt;/strong&gt; between VT Lookup and TheHive:&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="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;VT&lt;/span&gt; &lt;span class="n"&gt;malicious&lt;/span&gt; &lt;span class="n"&gt;votes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;High&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;VT&lt;/span&gt; &lt;span class="n"&gt;malicious&lt;/span&gt; &lt;span class="n"&gt;votes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&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;Medium&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;Else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Low&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now TheHive cases are automatically prioritised. A known malicious IP with 60 vendor detections creates a High severity case. An unknown scanner with 0 detections creates a Low severity case. Analysts can triage instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Example: What the Enriched Cases Look Like
&lt;/h2&gt;

&lt;p&gt;Here are three real attackers that hit my honeypot, enriched with VirusTotal data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attacker 1 — High Severity&lt;/strong&gt;&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;IP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;110.35.80.116&lt;/span&gt;
&lt;span class="na"&gt;VT Malicious&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;23/90&lt;/span&gt;
&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;China&lt;/span&gt;
&lt;span class="na"&gt;ISP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Alibaba Cloud&lt;/span&gt;
&lt;span class="na"&gt;Tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scanner, brute-force&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 → Immediate investigation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Attacker 2 — Medium Severity&lt;/strong&gt;&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;IP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;165.22.54.16&lt;/span&gt;
&lt;span class="na"&gt;VT Malicious&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;8/90&lt;/span&gt;
&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Netherlands&lt;/span&gt;  
&lt;span class="na"&gt;ISP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DigitalOcean&lt;/span&gt;
&lt;span class="na"&gt;Tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scanner&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 → Monitor and log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Attacker 3 — Low Severity&lt;/strong&gt;&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;IP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;193.32.162.145&lt;/span&gt;
&lt;span class="na"&gt;VT Malicious&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1/90&lt;/span&gt;
&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Russia&lt;/span&gt;
&lt;span class="na"&gt;ISP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Unknown hosting&lt;/span&gt;
&lt;span class="na"&gt;Tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&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;LOW → Auto-close after logging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without enrichment, all three look identical. With enrichment, you know exactly how to respond to each one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Taking It Further — Automatic IP Blocking
&lt;/h2&gt;

&lt;p&gt;Once you have VirusTotal enrichment, you can add an automatic blocking step:&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="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;VT&lt;/span&gt; &lt;span class="n"&gt;malicious&lt;/span&gt; &lt;span class="n"&gt;votes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;Wazuh&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;
    &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ufw&lt;/span&gt; &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ATTACKER_IP&lt;/span&gt;
    &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt; &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="n"&gt;TheHive&lt;/span&gt; &lt;span class="n"&gt;case&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Known bad actors get blocked automatically. Unknown scanners get logged and monitored. The whole process takes milliseconds and requires no human intervention.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Adds to Your SOC
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alert context&lt;/td&gt;
&lt;td&gt;IP only&lt;/td&gt;
&lt;td&gt;IP + reputation + country + ISP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Case prioritisation&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automatic based on VT score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analyst workload&lt;/td&gt;
&lt;td&gt;Every alert equal&lt;/td&gt;
&lt;td&gt;High confidence threats flagged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response speed&lt;/td&gt;
&lt;td&gt;Human triage required&lt;/td&gt;
&lt;td&gt;Auto-block for known bad actors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;Threat intelligence enrichment is what separates a basic monitoring setup from a professional SOC pipeline. Raw alerts are noise. Enriched alerts are intelligence.&lt;/p&gt;

&lt;p&gt;By adding VirusTotal to the pipeline, every alert that reaches an analyst already contains the context they need to make a decision. No manual lookups. No context switching. Just actionable intelligence, automatically delivered.&lt;/p&gt;

&lt;p&gt;The full updated pipeline — with VirusTotal enrichment — is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;github.com/agunna99/soc-honeypot-pipeline&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;In the next article I'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding &lt;strong&gt;AbuseIPDB&lt;/strong&gt; as a second enrichment source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic IP blocking&lt;/strong&gt; using Wazuh active response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email/Slack notifications&lt;/strong&gt; for high severity cases&lt;/li&gt;
&lt;li&gt;Protecting a &lt;strong&gt;real web application&lt;/strong&gt; with the same pipeline&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Favour Nmosi is a cybersecurity engineer building open-source security automation tools.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;GitHub: github.com/agunna99 | Medium: medium.com/@chrisnmosi&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #cybersecurity #virustotal #threatintelligence #soc #wazuh #shuffle #thehive #infosec #blueteam #securityautomation&lt;/p&gt;

</description>
      <category>automation</category>
      <category>cybersecurity</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Production SOC Pipeline That Caught Real Hackers in 3 Minutes</title>
      <dc:creator>Nmosi Chinecherem</dc:creator>
      <pubDate>Fri, 24 Apr 2026 09:53:25 +0000</pubDate>
      <link>https://forem.com/nmosic/i-built-a-production-soc-pipeline-that-caught-real-hackers-in-3-minutes-1a17</link>
      <guid>https://forem.com/nmosic/i-built-a-production-soc-pipeline-that-caught-real-hackers-in-3-minutes-1a17</guid>
      <description>&lt;p&gt;How I went from zero to a full threat detection and response system using OpenCanary, Wazuh, Shuffle, and TheHive — and what happened when I turned it on.&lt;/p&gt;

&lt;p&gt;The Problem I Was Trying to Solve&lt;br&gt;
I've been studying cybersecurity for years, reading about SOC pipelines, SIEM platforms, and incident response workflows. But there's a massive gap between reading about something and actually building it.&lt;br&gt;
I wanted to build a real Security Operations Centre pipeline — not a lab with simulated attacks, but something that would face the actual internet and catch real threats. Something I could point to and say: "I built this, it works, and here's the proof."&lt;br&gt;
So I built one.&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
A complete, end-to-end SOC pipeline consisting of four components working together:&lt;br&gt;
Internet → OpenCanary Honeypot → Wazuh SIEM → Shuffle SOAR → TheHive IR&lt;br&gt;
OpenCanary — A honeypot that pretends to be a vulnerable server, running fake SSH, FTP, HTTP, and Telnet services. Attackers think they've found a real target.&lt;br&gt;
Wazuh — A SIEM that collects logs from the honeypot, applies custom detection rules, and fires high-priority alerts when attackers interact with the honeypot.&lt;br&gt;
Shuffle — A SOAR platform that receives Wazuh alerts via webhook and automatically routes them to TheHive for case management.&lt;br&gt;
TheHive — An incident response platform that creates structured cases from every alert, ready for analyst investigation.&lt;/p&gt;

&lt;p&gt;The Architecture&lt;br&gt;
Each component runs on its own server:&lt;br&gt;
ComponentRoleOpenCanary 0.9.7HoneypotWazuh 4.9.2SIEM + DetectionShuffleSOAR AutomationTheHive 5.5.14Incident Response&lt;br&gt;
The data flow is fully automated. When an attacker hits the honeypot, within seconds a structured incident case is created in TheHive — no human intervention required.&lt;/p&gt;

&lt;p&gt;What Happened When I Turned It On&lt;br&gt;
This is the part that surprised me.&lt;br&gt;
Within 3 minutes of deploying the honeypot, a real attacker from IP 105.127.14.91 connected to the fake SSH service and attempted to log in with:&lt;br&gt;
json{&lt;br&gt;
  "USERNAME": "root",&lt;br&gt;
  "PASSWORD": "ella1Mootie",&lt;br&gt;
  "src_host": "105.127.14.91",&lt;br&gt;
  "logtype": 4002&lt;br&gt;
}&lt;br&gt;
Within hours, dozens of attackers from across the world were hitting the honeypot. I captured credentials like 888888, 87654321, wsx33, and Abc123... — real passwords people use in brute force attacks.&lt;br&gt;
The Wazuh rule I wrote fired at level 15 (the highest priority) for every SSH brute force attempt, and Shuffle automatically processed each alert.&lt;br&gt;
This wasn't a simulation. These were real attackers, real credentials, real threat intelligence.&lt;/p&gt;

&lt;p&gt;How I Built It&lt;br&gt;
Step 1: The Honeypot (OpenCanary)&lt;br&gt;
OpenCanary is lightweight, runs on Python, and supports over a dozen fake services. I installed it on Ubuntu 22.04 and configured it to listen on ports 22 (SSH), 21 (FTP), 80 (HTTP), and 23 (Telnet).&lt;br&gt;
The key insight: move the real SSH service to port 2222, and put the honeypot on port 22. Any attacker scanning the internet will hit the honeypot first.&lt;br&gt;
json{&lt;br&gt;
  "ssh.enabled": true,&lt;br&gt;
  "ssh.port": 22,&lt;br&gt;
  "ftp.enabled": true,&lt;br&gt;
  "http.enabled": true,&lt;br&gt;
  "telnet.enabled": true,&lt;br&gt;
  "logger": {&lt;br&gt;
    "class": "PyLogger",&lt;br&gt;
    "kwargs": {&lt;br&gt;
      "handlers": {&lt;br&gt;
        "file": {&lt;br&gt;
          "class": "logging.FileHandler",&lt;br&gt;
          "filename": "/var/log/opencanary/opencanary.log"&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
Step 2: Custom Wazuh Detection Rules&lt;br&gt;
I wrote four custom rules to detect and classify honeypot interactions:&lt;br&gt;
xml&lt;br&gt;
  &lt;br&gt;
    json&lt;br&gt;
    opencanary&lt;br&gt;
    OpenCanary: Honeypot interaction detected&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    100200&lt;br&gt;
    ^4002$&lt;br&gt;
    OpenCanary: SSH brute force login attempt on honeypot&lt;br&gt;
  &lt;br&gt;
&lt;br&gt;
Rule 100201 fires at level 15 — the maximum — because any login attempt on a honeypot is by definition malicious. There are no false positives.&lt;br&gt;
Step 3: Automated Alert Routing with Shuffle&lt;br&gt;
I configured Wazuh to send all level 7+ alerts to a Shuffle webhook. Shuffle then processes each alert and forwards it to TheHive's API as a structured alert.&lt;br&gt;
The Wazuh integration block:&lt;br&gt;
xml&lt;br&gt;
  shuffle&lt;br&gt;
  &lt;a href="http://YOUR_SHUFFLE_IP:3001/api/v1/hooks/YOUR_WEBHOOK_ID" rel="noopener noreferrer"&gt;http://YOUR_SHUFFLE_IP:3001/api/v1/hooks/YOUR_WEBHOOK_ID&lt;/a&gt;&lt;br&gt;
  7&lt;br&gt;
  json&lt;br&gt;
&lt;br&gt;
Step 4: TheHive for Incident Response&lt;br&gt;
TheHive receives structured alerts with full context — attacker IP, username attempted, password used, timestamp, and the originating agent. Each alert becomes a case that analysts can investigate, assign, and close.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The internet is hostile by default.
Within minutes of exposing any service to the internet, automated scanners find it. The speed and scale of internet-wide scanning is remarkable.&lt;/li&gt;
&lt;li&gt;Honeypots generate high-fidelity intelligence.
Unlike SIEM alerts that often have false positives, honeypot alerts are almost always genuine. Nobody has a legitimate reason to connect to a honeypot.&lt;/li&gt;
&lt;li&gt;Automation is not optional in a modern SOC.
When you're receiving hundreds of alerts per day, manual triage is impossible. The Wazuh → Shuffle → TheHive pipeline processes every alert automatically, ensuring nothing is missed.&lt;/li&gt;
&lt;li&gt;Building is better than reading.
I learned more about SOC architecture in the process of building this pipeline than I did in months of studying. There is no substitute for hands-on experience.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Full Stack&lt;br&gt;
All configuration files, custom rules, and integration scripts are available on GitHub:&lt;br&gt;
github.com/agunna99/soc-honeypot-pipeline&lt;br&gt;
The repository includes:&lt;/p&gt;

&lt;p&gt;OpenCanary configuration&lt;br&gt;
Custom Wazuh detection rules&lt;br&gt;
TheHive integration script&lt;br&gt;
Shuffle workflow setup guide&lt;/p&gt;

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

&lt;p&gt;Adding IP enrichment using threat intelligence feeds (VirusTotal, AbuseIPDB)&lt;br&gt;
Implementing automated IP blocking when attackers are detected&lt;br&gt;
Adding email/Slack notifications for critical alerts&lt;br&gt;
Publishing threat intelligence reports from captured attack data&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
Building a production SOC pipeline from scratch taught me that security is not just about tools — it's about architecture, data flow, and automation. Every component in this pipeline serves a specific purpose, and together they create something more powerful than any individual tool.&lt;br&gt;
If you're learning cybersecurity, build things. Deploy them. See what happens. The internet will teach you things no course or textbook can.&lt;br&gt;
The code is open source. Use it, improve it, and share what you build.&lt;/p&gt;

&lt;p&gt;Favour Nmosi is a cybersecurity engineer building open-source security tools.&lt;br&gt;
GitHub: github.com/agunna99&lt;/p&gt;

&lt;p&gt;Tags: #cybersecurity #soc #honeypot #wazuh #thehive #shuffle #siem #soar #opencanary #infosec #security&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
