<?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: Udhay Bhat</title>
    <description>The latest articles on DEV Community by Udhay Bhat (@udhaybhat00).</description>
    <link>https://dev.to/udhaybhat00</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%2F4144850%2F7c1aa1ba-e5c1-4542-9941-9b014c816e7c.jpg</url>
      <title>DEV Community: Udhay Bhat</title>
      <link>https://dev.to/udhaybhat00</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/udhaybhat00"/>
    <language>en</language>
    <item>
      <title>How I built a cross-platform Wi-Fi auditor in Python with no monitor-mode setup</title>
      <dc:creator>Udhay Bhat</dc:creator>
      <pubDate>Sat, 26 Sep 2026 21:09:07 +0000</pubDate>
      <link>https://dev.to/udhaybhat00/how-i-built-a-cross-platform-wi-fi-auditor-in-python-with-no-monitor-mode-setup-5847</link>
      <guid>https://dev.to/udhaybhat00/how-i-built-a-cross-platform-wi-fi-auditor-in-python-with-no-monitor-mode-setup-5847</guid>
      <description>&lt;p&gt;Skip to "Try it without hardware" to try it in your browser in 60 seconds — no adapter needed.&lt;/p&gt;

&lt;p&gt;The problem&lt;br&gt;
Every Wi-Fi security tool I used required Linux. wifite2, aircrack-ng, reaver — all depend on kernel monitor-mode drivers that don't exist on Windows or macOS. If you wanted to audit a network on macOS you needed a Linux VM, a compatible adapter, and hours of driver setup.&lt;/p&gt;

&lt;p&gt;I wanted to fix that.&lt;/p&gt;

&lt;p&gt;The solution — userland USB drivers&lt;br&gt;
Instead of relying on the OS wifi stack, airscope ships its own lightweight USB drivers written in Python. These are ports of the Linux kernel wifi drivers that talk directly to USB hardware via PyUSB bulk and control transfers.&lt;/p&gt;

&lt;p&gt;The result: the entire 802.11 MAC layer runs in Python userspace. Monitor mode, packet injection, beacon parsing, the 4-way handshake state machine, WPS protocol, SAE commit/confirm frames — all in Python, no kernel involvement whatsoever.&lt;/p&gt;

&lt;p&gt;This means it runs identically on Linux, macOS, and Windows. No kernel modules. No NDIS wall on Windows. One-time USB permission prompt and you're scanning.&lt;/p&gt;

&lt;p&gt;Tech stack&lt;br&gt;
Python 3.11+ with asyncio throughout&lt;br&gt;
PyUSB for direct USB bulk/control transfers to wifi chipsets&lt;br&gt;
Textual for the terminal UI&lt;br&gt;
FastAPI + uvicorn + WebSockets for the local web backend&lt;br&gt;
Svelte + Vite for the web frontend&lt;br&gt;
PyInstaller for cross-platform binaries (macOS universal2, Linux x64/arm64, Windows x64)&lt;br&gt;
Features&lt;br&gt;
Reconnaissance:&lt;/p&gt;

&lt;p&gt;Real-time scanner with 2.4GHz + 5GHz channel hopping&lt;br&gt;
AP vendor fingerprinting and router model detection from WPS beacons&lt;br&gt;
Hidden network decloaking via BSSID correlation&lt;br&gt;
Multi-adapter aggregation&lt;br&gt;
Attacks:&lt;/p&gt;

&lt;p&gt;WPA/WPA2 handshake capture + PMKID harvesting&lt;br&gt;
WPS PixieDust (offline PIN recovery), PIN brute-force, PBC capture&lt;br&gt;
WPA3 SAE handshake capture&lt;br&gt;
EvilTwin downgrade attack with real-time MIC verification — when someone types their password into the fake network, it validates against the captured handshake in real time and recovers the plaintext PSK directly&lt;br&gt;
WEP ARP replay, ChopChop, fake auth, PTW recovery&lt;br&gt;
Post-capture:&lt;/p&gt;

&lt;p&gt;Built-in hashcat/aircrack-ng cracking path from the vault UI&lt;br&gt;
Batch multi-target automation with smart attack chain ordering&lt;br&gt;
Export to CSV, Kismet netXML, HTML audit report&lt;br&gt;
The web dashboard&lt;br&gt;
Alongside the Textual terminal UI, there's a local web dashboard built with Svelte + FastAPI + WebSockets. It mirrors every feature of the TUI and has a full demo mode for trying it without hardware.&lt;/p&gt;

&lt;p&gt;It runs locally on your machine at localhost:8765 — the wifi hardware still needs to be physically attached, but the interface is a proper web app with live-updating tables, sparkline charts, and a command palette.&lt;/p&gt;

&lt;p&gt;Try it without hardware&lt;br&gt;
The demo mode lets you explore every screen with no adapter:&lt;/p&gt;

&lt;p&gt;macOS:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
xattr -d com.apple.quarantine ~/Downloads/airscope-macos-universal2&lt;br&gt;
chmod +x ~/Downloads/airscope-macos-universal2&lt;br&gt;
~/Downloads/airscope-macos-universal2 --web --demo&lt;br&gt;
Linux:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
chmod +x ./airscope-linux-x64&lt;br&gt;
./airscope-linux-x64 --web --demo&lt;br&gt;
Windows:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
airscope-windows-x64.exe --web --demo&lt;br&gt;
A browser tab opens automatically showing a simulated live scan. Every screen works — scanner, attacks, vault, cracking, reports. Nothing touches your actual network.&lt;/p&gt;

&lt;p&gt;The EvilTwin implementation&lt;br&gt;
The most technically interesting part was implementing a proper EvilTwin attack. Most tools that claim "EvilTwin" just deauth clients and capture whatever handshake they send back to the real AP — which is just a regular handshake capture with extra steps.&lt;/p&gt;

&lt;p&gt;The real attack works differently:&lt;/p&gt;

&lt;p&gt;Capture the real WPA2 handshake first (mandatory prerequisite)&lt;br&gt;
Stand up a fake AP broadcasting the same SSID with WPA2-only (dropping the SAE AKM for transition-mode targets)&lt;br&gt;
Simultaneously deauth clients from the real AP every 0.5s&lt;br&gt;
When a client connects to the fake AP and types their password, run the AP-side 4-way handshake and validate the MIC against the reference handshake captured in step 1&lt;br&gt;
MIC matches = correct password, saved to vault as plaintext PSK&lt;br&gt;
MIC mismatch = send disconnect, device shows "Incorrect password", user tries again&lt;br&gt;
This is the documented WPA3-transition downgrade — transition-mode APs use the identical password for both SAE and WPA2-PSK, so the downgrade directly recovers the real network password.&lt;/p&gt;

&lt;p&gt;Hardware requirement&lt;br&gt;
At least one supported USB wifi adapter is required for live use. About 20 chipsets are currently supported including Realtek RTL8812AU, MediaTek MT7921AU, Atheros AR9271, and others. Full list in the docs.&lt;/p&gt;

&lt;p&gt;This is the honest trade-off vs aircrack-ng: aircrack-ng works with any monitor-mode card, airscope works with ~20 specific USB chipsets but runs on any OS.&lt;/p&gt;

&lt;p&gt;GitHub&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/udhaybhat00" rel="noopener noreferrer"&gt;
        udhaybhat00
      &lt;/a&gt; / &lt;a href="https://github.com/udhaybhat00/airscope" rel="noopener noreferrer"&gt;
        airscope
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Cross-platform USB Wi-Fi security auditor: WPA/WPA2 handshake + PMKID capture, WPS PixieDust, WPA3 SAE, EvilTwin, hashcat cracking — terminal UI + web dashboard
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/udhaybhat00/airscope/assets/demo-tour.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fudhaybhat00%2Fairscope%2FHEAD%2Fassets%2Fdemo-tour.gif" alt="airscope demo" width="800"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;airscope&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;The only Wi-Fi security auditor that runs natively on Windows, macOS, and Linux — no monitor-mode setup, no kernel drivers, no aircrack-ng dependency.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/udhaybhat00/airscope/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1cdd36e7766aae67347405e8fd80ab609e2edce611cf987af991adce976d7ddb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d47504c2d2d322e302d626c7565" alt="License"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/be5343e13c9c6830a354d2a47bc4230a59200c0fcd82b9c17cb33daba1e55f4d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d253345253344332e31312d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/be5343e13c9c6830a354d2a47bc4230a59200c0fcd82b9c17cb33daba1e55f4d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d253345253344332e31312d626c7565" alt="Python 3.11+"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/20945068eb49d26fe375cef808d1fb674e5b72f79d434308b27a0e05f5bb3ad1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d4c696e757825323025374325323057696e646f77732532302537432532306d61634f532d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/20945068eb49d26fe375cef808d1fb674e5b72f79d434308b27a0e05f5bb3ad1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d4c696e757825323025374325323057696e646f77732532302537432532306d61634f532d627269676874677265656e" alt="Platform"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/udhaybhat00/airscope/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/udhaybhat00/airscope/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3ff4408b6d091eaa4d5c3b803927c6f1a7ca09217cdd6554596ff630ac451607/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d333030382532422d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/3ff4408b6d091eaa4d5c3b803927c6f1a7ca09217cdd6554596ff630ac451607/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d333030382532422d626c7565" alt="Tests"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9f921ed492a870a06ceefb3d85e904a21687995ba47a84dddc641cf506f950a5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f63686970736574732d32302d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/9f921ed492a870a06ceefb3d85e904a21687995ba47a84dddc641cf506f950a5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f63686970736574732d32302d627269676874677265656e" alt="Chipsets"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/670c3ff88221b984439ef6014b9f3c1c3828967105e98cb05637be78fc4425eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707572652d507974686f6e2d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/670c3ff88221b984439ef6014b9f3c1c3828967105e98cb05637be78fc4425eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707572652d507974686f6e2d6f72616e6765" alt="Pure Python"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#what-is-airscope" rel="noopener noreferrer"&gt;What is airscope?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#why-airscope-exists" rel="noopener noreferrer"&gt;Why airscope exists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#quick-start-3-minutes" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#how-airscope-works-on-each-os" rel="noopener noreferrer"&gt;How airscope works on each OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#full-architecture" rel="noopener noreferrer"&gt;Full architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#supported-hardware" rel="noopener noreferrer"&gt;Supported Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#first-time-walkthrough" rel="noopener noreferrer"&gt;First-time walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#usage-examples" rel="noopener noreferrer"&gt;Usage examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#comparison-with-other-tools" rel="noopener noreferrer"&gt;Comparison with other tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#skills--engineering-highlights" rel="noopener noreferrer"&gt;Skills &amp;amp; engineering highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#development" rel="noopener noreferrer"&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/udhaybhat00/airscope#license--legal" rel="noopener noreferrer"&gt;License &amp;amp; Legal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is airscope?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;airscope is a &lt;strong&gt;Wi-Fi security auditing tool&lt;/strong&gt; that runs on your laptop. It connects to a USB Wi-Fi adapter and helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;See&lt;/strong&gt; all nearby Wi-Fi networks in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; the cryptographic "handshake" that proves a password was used&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test&lt;/strong&gt; whether your network is vulnerable to real-world attacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report&lt;/strong&gt; everything in formats your team can use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as &lt;strong&gt;a stethoscope for your Wi-Fi network&lt;/strong&gt;: it listens, analyzes, and tells you what is wrong, in plain English.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Who is this&lt;/h3&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/udhaybhat00/airscope" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Binaries for all platforms: &lt;a href="https://github.com/udhaybhat00/airscope/releases/latest" rel="noopener noreferrer"&gt;https://github.com/udhaybhat00/airscope/releases/latest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ For authorized use only — networks you own or have explicit permission to test.&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
