<?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: Ashwin Belbase</title>
    <description>The latest articles on DEV Community by Ashwin Belbase (@shad0wcrawl3r).</description>
    <link>https://dev.to/shad0wcrawl3r</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%2F987806%2Fe63f63a1-bd4e-44ed-9cfe-82b50e8dcfe9.png</url>
      <title>DEV Community: Ashwin Belbase</title>
      <link>https://dev.to/shad0wcrawl3r</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shad0wcrawl3r"/>
    <language>en</language>
    <item>
      <title>12 Years Later, I Finally Own My Old WiFi CPE (With Some AI Help)</title>
      <dc:creator>Ashwin Belbase</dc:creator>
      <pubDate>Sun, 26 Jul 2026 05:22:38 +0000</pubDate>
      <link>https://dev.to/shad0wcrawl3r/12-years-later-i-finally-own-my-old-wifi-cpe-with-some-ai-help-377o</link>
      <guid>https://dev.to/shad0wcrawl3r/12-years-later-i-finally-own-my-old-wifi-cpe-with-some-ai-help-377o</guid>
      <description>&lt;p&gt;This weekend was supposed to be boring. The only thing on the list was deep-cleaning my room, which mostly meant clearing out the packaging that I've been hoarding for everything I've bought in the last two years.&lt;/p&gt;

&lt;p&gt;Then, in one of the drawers, I found it: an &lt;strong&gt;Altai C1AN Super WiFi CPE/AP&lt;/strong&gt;. This was the thing that gave me wireless internet from Broadlink about 12-15 years ago. I still remember climbing up to the terrace with the installation guys to mount it, and being endlessly curious how this little device pushed such fast internet at the time. It was I think 2 Mbps when the ADSL guys would be pushing speeds in the Kbps range. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F614szhgn6r38qkthvt6e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F614szhgn6r38qkthvt6e.jpg" alt="The Altai C1AN, dug out of a drawer after 12+ years" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd always wanted to get inside it and see what made it tick. Over the years I had tried a few times, digging through forums for a way in, but never had the skills or tools to pull it off.&lt;/p&gt;

&lt;p&gt;This time was different. This time I had AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round one: just plug it in
&lt;/h2&gt;

&lt;p&gt;I started the way I always had: power the device with a PoE injector, connect it to my PC over Ethernet.&lt;/p&gt;

&lt;p&gt;Then came the actual hard part: figuring out the device's self-assigned IP.&lt;/p&gt;

&lt;p&gt;I asked ChatGPT. It said &lt;code&gt;192.168.1.20&lt;/code&gt;. Didn't work.&lt;br&gt;
I asked Claude. Same answer. Also didn't work.&lt;/p&gt;

&lt;p&gt;I burned over an hour on finding its IP.&lt;/p&gt;

&lt;p&gt;Eventually, out of curiosity more than strategy, I fired up Wireshark, pointed it at the USB Ethernet interface connected to the C1AN, and power-cycled the device. A few seconds in, this showed up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Who has 192.168.1.1? Tell 192.168.1.222
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78zyi8ugjmslp1f3jfvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78zyi8ugjmslp1f3jfvi.png" alt="Wireshark capture of the ARP request revealing the device's real IP" width="800" height="30"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was it. Real IP, no guessing required. Sometimes the answer isn't in a chatbot's training data, it's sitting right there in the traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Poking at the open ports
&lt;/h2&gt;

&lt;p&gt;A quick nmap scan showed SSH, HTTP, and HTTPS all open. The HTTP service turned out to be a LuCI interface, the standard OpenWRT-based web admin UI, which meant it was at least theoretically brute-forceable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Starting Nmap 7.99 ( https://nmap.org ) at 2026-07-26 11:00 +0545
Warning: 192.168.1.222 giving up on port because retransmission cap hit (2).
Nmap scan report for 192.168.1.222
Host is up (0.00026s latency).
Not shown: 756 closed tcp ports (conn-refused), 240 filtered tcp ports (no-response)
PORT    STATE SERVICE
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 32.97 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I asked ChatGPT and Claude for credentials first, on the off chance either one just knew them. A few guesses, no luck.&lt;/p&gt;

&lt;p&gt;So, brute force. Both models declined to write me an actual brute-force script, fair enough, but Claude was willing to generate a &lt;code&gt;username:password&lt;/code&gt; combination list. I wrote a bash script around it that curled the login endpoint until something stuck. No luck.&lt;/p&gt;

&lt;p&gt;It was 7pm. I'd started around 2-3pm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking it apart
&lt;/h2&gt;

&lt;p&gt;Ethernet wasn't getting me in, so I went for the UART pins I knew were inside. Took the device apart, found the pins, and then realized I had nothing to actually connect my PC to UART with. Almost gave up right there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1uhqzdsjv1aeecbtjwvh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1uhqzdsjv1aeecbtjwvh.jpg" alt="C1AN opened up, UART pins visible on the board" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I remembered I still had a Raspberry Pi sitting around, and hoped that its GPIO pins could talk UART. Back to ChatGPT: apparently it did talk UART, installed minicom, tried to connect. No device found.&lt;/p&gt;

&lt;p&gt;Claude's turn: apparently you need to disable Bluetooth on the Pi for the serial UART to work properly (the Pi shares its good UART between Bluetooth and GPIO by default). Disabled Bluetooth, rebooted the Pi, ran minicom again, and got dropped into a console. Booted the C1AN and started seeing its boot log for the very first time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zoqn2ysrz9t4pry9a2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zoqn2ysrz9t4pry9a2d.png" alt="minicom session showing the C1AN's boot log over UART" width="765" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it hung, right after the DDR/relocation step. &lt;/p&gt;

&lt;p&gt;Asked Claude again, got told to disable hardware flow control. Disabled it, retried, still hung in the same place. Tried a handful of other things. Nothing worked.&lt;/p&gt;

&lt;p&gt;It was 11pm now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to the old ways.
&lt;/h2&gt;

&lt;p&gt;Still not ready to quit, I went back to scouring old forums, the way I had years ago. About 30 minutes in, buried in page 2 of google, I found an OpenWRT forum thread for this exact device and firmware combination, with a default credential pair: &lt;code&gt;root:superwifi123&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At this point I'd already sunk hours in, so what's one more login attempt. I rebooted the device with one of the UART pins pulled and tried logging in. Instead of an "unauthorized" message, the whole thing just power-cycled.&lt;/p&gt;

&lt;p&gt;Assuming I'd shorted something in the excitement, I rebooted again, this time pulling off all the pins and keeping the board clear of every stray screw and wire on my desk. Then, instead of the LuCI interface, I ran the curl script Claude had written earlier, now with the real credentials.&lt;/p&gt;

&lt;p&gt;It worked. The credentials were good.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4p2zpfdkhiydx5ctxv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4p2zpfdkhiydx5ctxv6.png" alt="Successful root login over UART with the forum-sourced credentials" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One more power cycle, and I tried the same credentials on the LuCI web interface.&lt;/p&gt;

&lt;p&gt;Success.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwmo8a0ls9ii0fshxjqj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwmo8a0ls9ii0fshxjqj0.png" alt="Logged into the LuCI admin interface for the first time" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twelve years after that box first went up on my terrace, I finally actually own it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;A few things stood out from an otherwise chaotic seven-hour detour:&lt;/p&gt;

&lt;p&gt;AI was consistently better at &lt;em&gt;helping me debug&lt;/em&gt; than at &lt;em&gt;giving me the answer&lt;/em&gt;. Both ChatGPT and Claude were flat wrong about the device's default IP, and neither had the actual login credentials sitting around. What they were genuinely useful for was the iterative stuff: figuring out why minicom couldn't see the Pi's UART, why the boot log was hanging, and turning a wordlist into a working script once I had real credentials to test.&lt;/p&gt;

&lt;p&gt;The models also drew a clear line on the brute-force request: neither would hand me a ready-to-run brute-force script, but both were fine helping with adjacent pieces, like a credential wordlist I could wire up myself. Not a workaround so much as a reasonable place to draw the line.&lt;/p&gt;

&lt;p&gt;And, as usual with hardware, the actual breakthrough came from decidedly non-AI sources: a Wireshark capture and a forum post from someone who'd cracked this exact device years ago.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>ai</category>
      <category>raspberrypi</category>
      <category>security</category>
    </item>
    <item>
      <title>Setting up a Homelab: Part 1 Proxmox and LetsEncrypt</title>
      <dc:creator>Ashwin Belbase</dc:creator>
      <pubDate>Fri, 26 Apr 2024 13:51:40 +0000</pubDate>
      <link>https://dev.to/shad0wcrawl3r/setting-up-a-homelab-part-1-proxmox-and-letsencrypt-3jn8</link>
      <guid>https://dev.to/shad0wcrawl3r/setting-up-a-homelab-part-1-proxmox-and-letsencrypt-3jn8</guid>
      <description>&lt;p&gt;As someone who likes to tinker around with stuff, I tend to break my system quite often. For a long time, I have wanted to allow myself to test applications and operating systems without breaking my ongoing OS install.&lt;br&gt;&lt;br&gt;
One way to test application is by using virtual machines or docker. While I use docker quite a lot for testing and for production workloads, testing an entire operating system on docker is not feasible. For this reason, I wanted to use virtual machines. But I also did not want to run Virtual Machines on my laptop, as I do not like my laptop getting hot everytime I want to test something new. Recently, I got my hands on a used desktop, a decent machine on which I could start building my home lab.&lt;br&gt;&lt;br&gt;
As I wanted to run a bunch of Virtual Machines and containers on the server, Proxmox seemed to be a good fit as it supports both VMs and Containers using KVM and LXC.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;P.S. This is not supposed to be a tutorial. I only wrote this piece so that I can look back on it after a year and hopefully remember how I did stuff.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;To install Proxmox VE, I just followed the documentation on the Proxmox website and completed a standard installation. As the installer is straightforward, the installation itself was quite easy. &lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;Right after I installed Proxmox, I tried logging into the web console, and I saw this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo74vy7ec6dgj805niah5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo74vy7ec6dgj805niah5.png" alt="Insecure Connection: Invalid Common Name Warning" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A self-signed certificate was generated and used by Proxmox which will always generate a warning on the browser. I did not like seeing this when trying to work on my home lab. So, I started looking for ways to put a valid SSL certificate in Proxmox.&lt;br&gt;&lt;br&gt;
During my research, I found that Proxmox could be made to integrate with &lt;a href="https://github.com/acmesh-official/acme.sh" rel="noopener noreferrer"&gt;acme.sh&lt;/a&gt;; a free SSL certificate generator powered by ACME(Let's Encrypt).&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate and Apply SSL Certificate
&lt;/h3&gt;

&lt;p&gt;Docs: &lt;a href="https://pve.proxmox.com/wiki/Certificate_Management" rel="noopener noreferrer"&gt;https://pve.proxmox.com/wiki/Certificate_Management&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After skimming through the documentation, I thought that the integration would be quite easy, and indeed it was, after a couple of failed attempts.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can register and deactivate ACME accounts over the web interface Datacenter -&amp;gt; ACME or using the pvenode command-line tool.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Following this excerpt from the documentation, I went to &lt;code&gt;Datacenter -&amp;gt; ACME -&amp;gt; Accounts -&amp;gt; Add&lt;/code&gt;, and registered an account with Lets Encrypt V2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1e7ghuhztbw1i0promb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1e7ghuhztbw1i0promb.png" alt="Add ACME Account" width="459" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Since The Proxmox instance was not accessible directly from the public internet, I proceeded to add the plugin for DNS challenge based verification.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To add a Challenge Plugin:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the challenge plugins section, click on Add.
&lt;/li&gt;
&lt;li&gt;In the popup that appears, give a name to the plugin that you will create in the Plugin ID section. Remember this value as the PLUGIN_NAME.
&lt;/li&gt;
&lt;li&gt;Set the &lt;code&gt;DNS API&lt;/code&gt; option to DNS provider, and fill in the generated form as required. Then clock on save. &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;In my case, I am using Cloudflare, so I filled in the CF_Account_ID, CF_Email, CF_Token and CF_Zone_ID fields.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt0qewqxi4vtxjbh46q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt0qewqxi4vtxjbh46q7.png" alt="Challenge Plugin" width="554" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You might only need the CF_TOKEN but the process failed due to some reason when only the CF_TOKEN was used. So I filled in all the applicable fields. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, to generate the certificated for a node, you need to go to the &lt;code&gt;Datacenter -&amp;gt; NODE_NAME -&amp;gt; System -&amp;gt; Certificates&lt;/code&gt; to generate/setup the certificate. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the ACME Section, Click on Add. &lt;/li&gt;
&lt;li&gt;In the popup that appears, select challenge type as DNS, and the Plugin type as the name that you used when creating the DNS plugin (PLUGIN_NAME). &lt;/li&gt;
&lt;li&gt;In the domain field, fill in the domain name that you want to generate the SSL certificate for. Now click on apply. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftw5dcs6r3qgq8yhkn1q2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftw5dcs6r3qgq8yhkn1q2.png" alt="SSL Certificate Creation" width="455" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The certificate should be generated and applied. Proxmox will restart the webproxy to apply the new certificate.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lvi6nk1hs0qpyajnmuc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lvi6nk1hs0qpyajnmuc.png" alt="SSL Certificate Description" width="550" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>homelab</category>
      <category>proxmox</category>
      <category>letsencrypt</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
