
Your phone has two identifiers it whispers to every nearby cell tower: an IMSI (the SIM's identity) and an IMEI (the handset's identity). When a tower asks for them, the handshake assumes the tower is real. There is no certificate, no chain of trust, no "is this actually my carrier?" check — the protocol was designed in the 1980s and that lineage shows. An IMSI catcher exploits this by impersonating a tower, advertising a stronger signal than the real one, and accepting your phone's handshake. From that point on, it can log your IMSI, force you down to weaker encryption (or none at all), and forward your traffic to the real network while reading or mutating it in transit.
Three things changed quietly over the last decade. First, the hardware collapsed in price — a usable IMSI catcher in 2013 cost six figures and required a black-budget purchase; today a HackRF One ($300) or even an RTL-SDR ($35) with the right software does most of the job. Second, the tooling went open source — GR-GSM, YateBTS, srsRAN, OpenBTS — these now do in hours what used to take months of NDA-bound engineering. Third, 4G/5G stacks were supposed to fix this with mutual authentication, but every modern phone still falls back to 2G when no LTE tower answers — and an IMSI catcher's whole job is to be the only "tower" that answers.
Real towers leave a stable, public-record trail. Fake ones don't. The tells:
Before you build anything, see what your phone already knows.
All of these have the same limitation: they only see what the baseband chip is willing to expose, and the baseband is a closed firmware that often lies. They are useful but not sufficient.
The real game is passively listening to the air, decoding the broadcast control channels, and comparing what you hear to what you expect. An RTL-SDR dongle ($35) plus a quarter-wave antenna ($5) is enough for the GSM 900/1800 bands. A HackRF gives you LTE-band sniffing too. Software stack:
Let's Plug the dongle in. Pick a GSM 900 MHz ARFCN that's strong in your area. Run:
# Capture System Information broadcasts on ARFCN 65
grgsm_livemon_headless -f 947.4M &
# Pipe to the IMSI-Catcher detector
python3 IMSI-catcher.py
# Or watch raw packets in Wireshark
sudo wireshark -k -i lo -f "port 4729"A clean baseline looks like 3–7 stable cell IDs, all geolocating to mapped towers within a few hundred metres, all negotiating A5/3 encryption. A bad day looks like a brand-new cell ID at extraordinary signal strength, an empty neighbour list, and an A5/0 hand-off. Cross-reference the cell ID against opencellid.org — if it's not in the database and it's emitting at high power in a city, you have an interesting question to ask.
Drop a comment below - it'll show up here once I read it.