<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Corvus Blog</title><link>https://nicoleman0.github.io/blog-site/posts/</link><description>Recent content in Posts on Corvus Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 01 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://nicoleman0.github.io/blog-site/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Migrating Nextcloud from DigitalOcean to a Raspberry Pi 5</title><link>https://nicoleman0.github.io/blog-site/posts/nextcloud-migration/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/nextcloud-migration/</guid><description>&lt;h2 id="bye-bye-digital-ocean">Bye Bye Digital Ocean&lt;/h2>
&lt;p>I&amp;rsquo;ve been running Nextcloud on a DigitalOcean droplet for a while. It works fine, but it costs money every month for something that&amp;rsquo;s essentially sitting idle most of the time — a personal file sync server with one user doesn&amp;rsquo;t need a cloud VM. A Raspberry Pi 5 sitting on my desk does the same job for free.&lt;/p>
&lt;p>This post covers the full migration: tearing down the DO setup, getting Nextcloud running locally on the Pi 5, and setting up Tailscale so I can still reach it remotely without exposing anything to the public internet.&lt;/p></description></item><item><title>Building a Portable Kismet Device: Part 2 - Software Setup and First Wardrive</title><link>https://nicoleman0.github.io/blog-site/posts/portable-kismet-pt2/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/portable-kismet-pt2/</guid><description>&lt;p>Part 1 covered the hardware assembly. The Pi 5 was in its case, the Alfa AWUS036ACM had arrived, and I had a VK-172 GPS dongle ready to go. This part covers getting the software stack operational and taking the whole thing out for its first real session.&lt;/p>
&lt;h2 id="software-stack">Software Stack&lt;/h2>
&lt;p>The OS is Raspberry Pi OS Lite (64-bit, headless). No desktop — there&amp;rsquo;s no need for one, and it just adds overhead and attack surface. Kismet runs as a service and exposes a web UI on port 2501, which is enough.&lt;/p></description></item><item><title>Building a Portable Kismet Device: Part 1 - Hardware Assembly</title><link>https://nicoleman0.github.io/blog-site/posts/portable-kismet-pt1/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/portable-kismet-pt1/</guid><description>&lt;p>For a while now I&amp;rsquo;ve wanted a proper portable wardriving setup. Not just a laptop. I want a self-contained, pocketable device that I can throw in a bag and run headlessly in the field. After moving away from the Pwnagotchi approach (it is very neat but the features are not as extensive as Kismet), I decided to build something more capable around a Raspberry Pi 5.&lt;/p>
&lt;p>This is part one: getting the hardware assembled and ready. The full stack isn&amp;rsquo;t operational just yet. I&amp;rsquo;m still waiting on the Alfa AWUS036ACM WiFi adapter to ship, but the foundation is built.&lt;/p></description></item><item><title>Mr Robot - THM Walkthrough</title><link>https://nicoleman0.github.io/blog-site/posts/mr-robot-thm1/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/mr-robot-thm1/</guid><description>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Difficulty&lt;/strong>&lt;/td>
 &lt;td>Medium&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>OS&lt;/strong>&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Tools Used&lt;/strong>&lt;/td>
 &lt;td>nmap, gobuster, curl, netcat, john&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Platform&lt;/strong>&lt;/td>
 &lt;td>TryHackMe&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="recon">Recon&lt;/h2>
&lt;p>Starting with a full port scan:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nmap -sV -p- 10.82.169.159
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PORT STATE SERVICE VERSION
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>22/tcp closed ssh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>80/tcp open http
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>443/tcp open https
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The ports initially showed as closed because the machine was still booting. Worth remembering if results look wrong early on. Just wait and re-scan.&lt;/p></description></item><item><title>Building a Pwnagotchi Stats Dashboard</title><link>https://nicoleman0.github.io/blog-site/posts/pwnagotchi-stats-dashboard/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/pwnagotchi-stats-dashboard/</guid><description>&lt;p>I&amp;rsquo;ve been warwalking around London with my Pwnagotchi (named Bootsy) and ended up with a directory full of &lt;code>.pcap&lt;/code> files and no clean way to visualise what I&amp;rsquo;d actually captured. This post documents how I built a single-script tool to parse those captures and generate a self-contained HTML dashboard.&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Pwnagotchi stores captured handshakes as individual &lt;code>.pcap&lt;/code> files, named in a loosely consistent format:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>SSID_aabbccddeeff.pcap
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>HASH_SSID_aabbccddeeff.pcap
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>HASH_aabbccddeeff.pcap
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The BSSID is always the last underscore-separated segment — a 12-character hex string without colons. SSIDs appear before it, sometimes prefixed with what looks like a session hash. There&amp;rsquo;s no single canonical format, which meant any parsing logic had to handle all three variants.&lt;/p></description></item><item><title>Diagnosing and Hardening a Flaky Pi-hole on a Pi Zero 2W</title><link>https://nicoleman0.github.io/blog-site/posts/pihole-reliability/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/pihole-reliability/</guid><description>&lt;p>My Pi-hole had developed an annoying habit as of the last couple of weeks. The web UI would go unreachable, FTL would silently die, and DHCP would stop assigning addresses. The only fix I had was unplugging and replugging the device. Not ideal for something that sits in the middle of your network, especially when you live with other people.&lt;/p>
&lt;p>This post covers how I diagnosed the issue and hardened the setup so that transient failures recover automatically rather than taking down the network.&lt;/p></description></item><item><title>Fixing Bluetooth Dual Boot on EndeavourOS and Windows</title><link>https://nicoleman0.github.io/blog-site/posts/bluetooth-dualboot/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/bluetooth-dualboot/</guid><description>&lt;p>If you dual boot Linux and Windows and share Bluetooth devices between them, you&amp;rsquo;ve probably hit this annoying issue: the speakers connect fine on one OS, and then after switching, they refuse to pair on the other.&lt;/p>
&lt;p>When you pair a Bluetooth device, a link key is generated and stored on both the host and the device. The problem is that both Windows and Linux see the same physical Bluetooth adapter — same MAC address — but they don&amp;rsquo;t share their key stores. So when you pair on Linux, it writes a new key to the device. Boot into Windows, and Windows has a stale key that no longer matches. Pair on Windows, and now Linux is the one with the stale key.&lt;/p></description></item><item><title>Setting Up My Meshtastic Node</title><link>https://nicoleman0.github.io/blog-site/posts/meshtastic-node/</link><pubDate>Sat, 21 Feb 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/meshtastic-node/</guid><description>&lt;p>This weekend I set up a permanent LoRa mesh network node on my windowsill overlooking Chelsea. Here&amp;rsquo;s what I learned, what worked, and what didn&amp;rsquo;t&amp;hellip;&lt;/p>
&lt;p>I decided to do this because of the increase in privacy concerns regarding messaging apps like Discord, etc. It seemed like as good a time as any to set this up, and I had been considering this for a long time.&lt;/p>
&lt;h2 id="meshtastic">Meshtastic?&lt;/h2>
&lt;p>Meshtastic is an open-source project that runs on cheap LoRa radio hardware and lets devices form a decentralised mesh network. That means no internet, no cellular, and no central infrastructure. :p&lt;/p></description></item><item><title>Thompson - THM</title><link>https://nicoleman0.github.io/blog-site/posts/thompson/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/thompson/</guid><description>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Difficulty&lt;/strong>&lt;/td>
 &lt;td>Easy&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>OS&lt;/strong>&lt;/td>
 &lt;td>Linux&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Tools Used&lt;/strong>&lt;/td>
 &lt;td>nmap, msfvenom, netcat&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Platform&lt;/strong>&lt;/td>
 &lt;td>TryHackMe&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="recon">Recon&lt;/h2>
&lt;p>Starting with an nmap scan:&lt;/p>



&lt;div class="goat svg-container ">
 
 &lt;svg
 xmlns="http://www.w3.org/2000/svg"
 font-family="Menlo,Lucida Console,monospace"
 
 viewBox="0 0 672 73"
 >
 &lt;g transform='translate(8,16)'>
&lt;text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>P&lt;/text>
&lt;text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>2&lt;/text>
&lt;text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>8&lt;/text>
&lt;text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>8&lt;/text>
&lt;text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>O&lt;/text>
&lt;text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>2&lt;/text>
&lt;text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>0&lt;/text>
&lt;text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>0&lt;/text>
&lt;text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>R&lt;/text>
&lt;text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>/&lt;/text>
&lt;text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>0&lt;/text>
&lt;text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>8&lt;/text>
&lt;text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>T&lt;/text>
&lt;text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>9&lt;/text>
&lt;text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>0&lt;/text>
&lt;text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>/&lt;/text>
&lt;text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>/&lt;/text>
&lt;text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>S&lt;/text>
&lt;text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>T&lt;/text>
&lt;text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>A&lt;/text>
&lt;text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>T&lt;/text>
&lt;text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>E&lt;/text>
&lt;text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>S&lt;/text>
&lt;text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>E&lt;/text>
&lt;text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>j&lt;/text>
&lt;text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>R&lt;/text>
&lt;text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>V&lt;/text>
&lt;text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>1&lt;/text>
&lt;text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>I&lt;/text>
&lt;text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>3&lt;/text>
&lt;text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>C&lt;/text>
&lt;text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>E&lt;/text>
&lt;text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>V&lt;/text>
&lt;text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>O&lt;/text>
&lt;text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>A&lt;/text>
&lt;text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>A&lt;/text>
&lt;text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>E&lt;/text>
&lt;text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='192' y='36' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>R&lt;/text>
&lt;text text-anchor='middle' x='200' y='20' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='200' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>S&lt;/text>
&lt;text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>I&lt;/text>
&lt;text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>S&lt;/text>
&lt;text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>O&lt;/text>
&lt;text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>S&lt;/text>
&lt;text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>N&lt;/text>
&lt;text text-anchor='middle' x='232' y='20' fill='currentColor' style='font-size:1em'>H&lt;/text>
&lt;text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>J&lt;/text>
&lt;text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>T&lt;/text>
&lt;text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>7&lt;/text>
&lt;text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>m&lt;/text>
&lt;text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>2&lt;/text>
&lt;text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>v&lt;/text>
&lt;text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>2&lt;/text>
&lt;text text-anchor='middle' x='280' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>(&lt;/text>
&lt;text text-anchor='middle' x='296' y='20' fill='currentColor' style='font-size:1em'>U&lt;/text>
&lt;text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>P&lt;/text>
&lt;text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>8&lt;/text>
&lt;text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>b&lt;/text>
&lt;text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='312' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>5&lt;/text>
&lt;text text-anchor='middle' x='320' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='328' y='20' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>5&lt;/text>
&lt;text text-anchor='middle' x='336' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='352' y='20' fill='currentColor' style='font-size:1em'>4&lt;/text>
&lt;text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='360' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='368' y='20' fill='currentColor' style='font-size:1em'>b&lt;/text>
&lt;text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>v&lt;/text>
&lt;text text-anchor='middle' x='376' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>1&lt;/text>
&lt;text text-anchor='middle' x='384' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='384' y='36' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='392' y='20' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='392' y='36' fill='currentColor' style='font-size:1em'>3&lt;/text>
&lt;text text-anchor='middle' x='400' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>)&lt;/text>
&lt;text text-anchor='middle' x='408' y='20' fill='currentColor' style='font-size:1em'>2&lt;/text>
&lt;text text-anchor='middle' x='416' y='20' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='424' y='20' fill='currentColor' style='font-size:1em'>8&lt;/text>
&lt;text text-anchor='middle' x='440' y='20' fill='currentColor' style='font-size:1em'>(&lt;/text>
&lt;text text-anchor='middle' x='448' y='20' fill='currentColor' style='font-size:1em'>U&lt;/text>
&lt;text text-anchor='middle' x='456' y='20' fill='currentColor' style='font-size:1em'>b&lt;/text>
&lt;text text-anchor='middle' x='464' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='472' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='480' y='20' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='488' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='504' y='20' fill='currentColor' style='font-size:1em'>L&lt;/text>
&lt;text text-anchor='middle' x='512' y='20' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='520' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='528' y='20' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='536' y='20' fill='currentColor' style='font-size:1em'>x&lt;/text>
&lt;text text-anchor='middle' x='544' y='20' fill='currentColor' style='font-size:1em'>;&lt;/text>
&lt;text text-anchor='middle' x='560' y='20' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='568' y='20' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='576' y='20' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='584' y='20' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='592' y='20' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='600' y='20' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='608' y='20' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='616' y='20' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='632' y='20' fill='currentColor' style='font-size:1em'>2&lt;/text>
&lt;text text-anchor='middle' x='640' y='20' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='648' y='20' fill='currentColor' style='font-size:1em'>0&lt;/text>
&lt;text text-anchor='middle' x='656' y='20' fill='currentColor' style='font-size:1em'>)&lt;/text>
&lt;/g>

 &lt;/svg>
 
&lt;/div>
&lt;p>Three ports exposed. SSH on 22, and more interestingly, Apache Tomcat 8.5.5 on 8080 with the AJP connector exposed on 8009. AJP was new to me, so I looked into it.&lt;/p></description></item><item><title>Building Custom Evil Portal ESP32 Firmware</title><link>https://nicoleman0.github.io/blog-site/posts/esp32-evilportal/</link><pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/esp32-evilportal/</guid><description>&lt;p>Last night I developed some custom firmware for the ESP32 WROOM-32 that demonstrates captive portal attacks. This serves as both an educational tool and a practical demonstration of why users should be cautious when connecting to public WiFi networks.&lt;/p>
&lt;p>&lt;strong>Disclaimer:&lt;/strong> This tool is designed exclusively for authorized security testing and educational purposes. All testing was conducted on equipment I own in controlled environments.&lt;/p>
&lt;h2 id="what-is-a-captive-portal-attack">What Is a Captive Portal Attack?&lt;/h2>
&lt;p>Captive portals are the login pages you see when connecting to public WiFi at coffee shops, hotels, or airports. An evil portal attack exploits this familiar user experience by:&lt;/p></description></item><item><title>Building a Segmented Office Network with VLANs and Router-on-a-Stick</title><link>https://nicoleman0.github.io/blog-site/posts/office_setup/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/office_setup/</guid><description>&lt;p>&lt;strong>Project Date:&lt;/strong> February 8, 2026&lt;br>
&lt;strong>Tools Used:&lt;/strong> Cisco Packet Tracer&lt;br>
&lt;strong>Difficulty:&lt;/strong> Intermediate&lt;/p>
&lt;p>I designed and configured a small office network for a fictional company using enterprise networking concepts. The network implements VLAN segmentation to separate different departments, with centralized routing to enable controlled communication between them.&lt;/p>
&lt;h2 id="the-challenge">The Challenge&lt;/h2>
&lt;p>Modern networks need to balance two competing requirements:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Security&lt;/strong>: Different departments shouldn&amp;rsquo;t all share the same broadcast domain&lt;/li>
&lt;li>&lt;strong>Connectivity&lt;/strong>: Users still need to communicate across departments when necessary&lt;/li>
&lt;/ul>
&lt;p>The solution are VLANs (Virtual Local Area Networks) combined with inter-VLAN routing.&lt;/p></description></item><item><title>RedTail 2026 Cryptomining Botnet Campaign</title><link>https://nicoleman0.github.io/blog-site/posts/campaign_1/</link><pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/campaign_1/</guid><description>&lt;h2 id="background">Background&lt;/h2>
&lt;p>I set my ICS/SCADA honeypot (Conpot) up mainly to try and analyze/monitor attacks on industrial systems (this one poses as a PLC for an HVAC system), however the majority of the attempts I&amp;rsquo;ve noticed have been opportunistic web-based attacks targeting the associated page on port 80.&lt;/p>
&lt;p>Recently, I&amp;rsquo;ve noticed some similar looking attacks coming from Asia, both trying to connect to a C2 server.&lt;/p>
&lt;h2 id="log-analysis">Log Analysis&lt;/h2>
&lt;p>Here is an example of one of the logs I captured:&lt;/p></description></item><item><title>CVE-2017-17215</title><link>https://nicoleman0.github.io/blog-site/posts/iot_exploit_blog_post/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/iot_exploit_blog_post/</guid><description>&lt;h2 id="attack-summary">Attack Summary&lt;/h2>
&lt;p>On January 28, 2026 at 21:01:11 UTC, IP address 60[.]19[.]220[.]0 attempted to exploit my ICS honeypot with CVE-2017-17215, a remote code execution vulnerability in Huawei HG532 routers. The attack targeted &lt;code>/boaform/admin/formLogin&lt;/code> with default credentials (&lt;code>username=user&amp;amp;psd=user&lt;/code>) via HTTP/1.0.&lt;/p>
&lt;p>The IP has two recent reports on AbuseIPDB, indicating active malicious scanning.&lt;/p>
&lt;h2 id="cve-2017-17215">CVE-2017-17215&lt;/h2>
&lt;p>CVE-2017-17215 is a remote code execution flaw in Huawei HG532 home gateways discovered in November 2017. The vulnerability exists in the router&amp;rsquo;s UPnP implementation, where the TR-064 protocol (designed for local network configuration) was exposed to the WAN through port 37215&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.&lt;/p></description></item><item><title>Conpot Honeypot: First Day Attack Analysis</title><link>https://nicoleman0.github.io/blog-site/posts/conpot-first-day-report/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/conpot-first-day-report/</guid><description>&lt;h1 id="conpot-honeypot-first-day-attack-analysis">Conpot Honeypot: First Day Attack Analysis&lt;/h1>
&lt;p>Within the first 6 hours of operation, my Conpot ICS honeypot (emulating a Siemens S7-1200 PLC) attracted &lt;strong>40+ distinct attack sessions&lt;/strong> from &lt;strong>30+ unique IP addresses&lt;/strong> across multiple continents. The attacks ranged from automated scanning to targeted industrial protocol exploitation, including the first documented &lt;strong>S7comm diagnostic probe&lt;/strong> and a sustained &lt;strong>Next.js remote code execution campaign&lt;/strong>.&lt;/p>
&lt;p>This post analyzes the attack patterns observed, identifies gaps in the honeypot configuration, and extracts actionable threat intelligence for ICS security research.&lt;/p></description></item><item><title>Customizing Conpot for Realistic ICS Emulation</title><link>https://nicoleman0.github.io/blog-site/posts/conpot-customization-blog-post/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/conpot-customization-blog-post/</guid><description>&lt;h2 id="the-problem-with-default-templates">The Problem with Default Templates&lt;/h2>
&lt;p>Conpot&amp;rsquo;s default template emulates an S7-200 PLC with whimsical configuration values clearly designed for demonstration purposes rather than realism. Examining the default &lt;code>template.xml&lt;/code> reveals:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;entity&lt;/span> &lt;span style="color:#a6e22e">name=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;unit&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>S7-200&lt;span style="color:#f92672">&amp;lt;/entity&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;key&lt;/span> &lt;span style="color:#a6e22e">name=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;FacilityName&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;value&lt;/span> &lt;span style="color:#a6e22e">type=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;value&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>&amp;#34;Mouser Factory&amp;#34;&lt;span style="color:#f92672">&amp;lt;/value&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;key&lt;/span> &lt;span style="color:#a6e22e">name=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;SystemName&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;value&lt;/span> &lt;span style="color:#a6e22e">type=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;value&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>&amp;#34;Technodrome&amp;#34;&lt;span style="color:#f92672">&amp;lt;/value&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;key&lt;/span> &lt;span style="color:#a6e22e">name=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;sysLocation&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;value&lt;/span> &lt;span style="color:#a6e22e">type=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;value&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>&amp;#34;Venus&amp;#34;&lt;span style="color:#f92672">&amp;lt;/value&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>While functional for basic honeypot deployment, these values present several issues for research purposes:&lt;/p></description></item><item><title>Deploying an ICS Honeypot</title><link>https://nicoleman0.github.io/blog-site/posts/conpot-deployment-blogpost/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/conpot-deployment-blogpost/</guid><description>&lt;p>As part of my MSc research in Information Security at Royal Holloway, University of London, I&amp;rsquo;ve been investigating the threat landscape facing industrial control systems (ICS) and SCADA infrastructure. One of the most effective ways to understand attacker behavior in this space is through honeypot deployment; specifically, using Conpot to emulate vulnerable industrial systems.&lt;/p>
&lt;p>This post documents my process of deploying a production ICS honeypot on DigitalOcean, the technical considerations involved, and some initial observations from the deployment.&lt;/p></description></item><item><title>Telnet, Shodan, and Claude</title><link>https://nicoleman0.github.io/blog-site/posts/claude-hacking/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://nicoleman0.github.io/blog-site/posts/claude-hacking/</guid><description>&lt;h2 id="telnet-shodan-and-claude">Telnet, Shodan, and Claude&lt;/h2>
&lt;p>With the advent of these extremely powerful CLI coding agents, I decided to test out and see how well something like Claude performs. To do so, I used a fake Telnet server.&lt;/p>
&lt;p>When trying it out, the first issue I ran into was that the connection immediately dropped. Claude was able to connect without issue, but since telnet expects continuous real-time reponses from the client, it drops the connection due to Claude not being able to do that.&lt;/p></description></item></channel></rss>