Pixel 9 โ Mobile Security Research Setup
๐ฑ Pixel 9 โ Mobile Security Research Setup
This guide is for authorized red team engagements and security research only. Unlocking bootloaders and rooting voids warranty. NAS/protocol testing must be performed within engagement scope and applicable law. Never test against live networks without explicit written authorization.
Hardware Reality Check โ Tensor G4 vs Qualcomm
This changes your toolchain significantly. Many telecom research tools (SCAT, QXDM) target Qualcomm modems only.
graph LR
subgraph "Pixel 9 โ Tensor G4"
T1["Google Tensor G4 SoC"]
T2["Samsung Exynos\nModem 5400"]
T3["Diagnostic: Samsung\nDiag protocol โ partial\nSCAT support (limited)"]
end
subgraph "Qualcomm Devices (Better for NAS Research)"
Q1["Snapdragon 8 Gen 3"]
Q2["Qualcomm X75 Modem"]
Q3["SCAT full support\nQXDM ยท QPST ยท full\nNAS decode"]
end
subgraph "Pixel 9 Capabilities"
C1["โ
Bootloader unlock\nsupported"]
C2["โ
Magisk root\nfull support"]
C3["โ
ADB modem\ndiagnostic access"]
C4["โ
NAS state\nmanipulation via\ncustom RIL/AT cmds"]
C5["โ ๏ธ Full NAS decode\nlimited vs Qualcomm"]
C6["โ
UERANSIM\nclient mode\nvia Termux + USB"]
end
style T2 fill:#E36209,color:#fff
style Q3 fill:#1F3864,color:#fff
style C1 fill:#2E75B6,color:#fff
style C5 fill:#E36209,color:#fffBottom line: Pixel 9 is excellent for app-layer, API, and subscriber-identity testing. For deep NAS packet capture, pair it with a Qualcomm-based second device or use UERANSIM on a laptop connected via the Pixel 9's hotspot.
Setup Flow
flowchart TD
A["๐ Start: Pixel 9\nAndroid 15"] --> B["โ๏ธ Phase 1\nDeveloper Mode &\nADB Setup"]
B --> C{"Device Type?"}
C -->|"Telecom-Joined\n(MDM enrolled โ this setup)"| D1["๐ Phase 3\nNo-Root Path\nNetHunter Rootless"]
C -->|"Clean Device\n(unlocked from Google Store)"| E["๐ Phase 2\nBootloader Unlock"]
E --> F["๐ช Phase 3A/B\nMagisk Root\nor GrapheneOS"]
D1 --> G["๐ฆ Phase 4\nCore Tool Install\nTermux ยท Frida Rootless ยท HTTP Toolkit"]
F --> G
G --> H["๐ก Phase 5\nModem Diagnostic\nSetup"]
H --> I["๐งช Phase 6\nTesting Validation\n& Capability Check"]
style A fill:#1F3864,color:#fff
style C fill:#E36209,color:#fff
style D1 fill:#2E75B6,color:#fff
style F fill:#C00000,color:#fff
style I fill:#2E75B6,color:#fffThis guide is written for a telecom-joined Pixel 9 (carrier MDM enrolled). The primary path skips bootloader unlock entirely. The Magisk and GrapheneOS paths are documented for reference โ they apply to a second, clean unlocked device. See Device Strategy at the end.
Do you need Phase 3 and 3A?
No. Treat them as alternative paths, not sequential required steps.
| Situation | Necessary path |
|---|---|
| This current telecom-joined Pixel 9 | Phase 3 |
| Second clean unlocked Pixel for root-only testing | Phase 3A |
| You only need app testing, ADB telecom inspection, cell info, and non-destructive workflow | Phase 3 only |
You need system cert injection, full Frida, full tcpdump, or deeper modem access |
Add Phase 3A on a separate device |
Phase 1 โ Developer Mode & ADB
# On Pixel 9:
# Settings โ About Phone โ Build Number (tap 7x) โ Developer Options enabled
# Enable in Developer Options:
# โ
USB Debugging
# โ
OEM Unlocking โ required before bootloader unlock
# โ
Wireless Debugging (for wireless ADB)
# On your workstation:
adb devices # verify device recognized
adb shell getprop ro.product.model # should return "Pixel 9"
adb shell getprop ro.build.version.release # Android version
adb shell getprop gsm.version.baseband # modem firmware version
Phase 2 โ Bootloader Unlock
# Reboot to bootloader
adb reboot bootloader
# Verify fastboot sees device
fastboot devices
# Unlock bootloader (requires OEM unlock enabled in Developer Options)
fastboot flashing unlock
# Device will show warning โ use volume keys to confirm โ power to accept
# Device wipes and reboots โ re-enable Developer Options + USB debugging
If purchased from a carrier (Verizon, AT&T, T-Mobile), OEM unlock may be grayed out for 60-180 days or permanently disabled. Always buy unlocked directly from Google Store for research devices.
Phase 3 โ No-Root Path (Telecom-Joined Device โ This Setup)
This Pixel 9 is carrier MDM-enrolled. Bootloader unlock triggers Play Integrity failure โ MDM detects it and may wipe/lock the device. You also lose the carrier SIM binding that makes this device valuable. Verify MDM status first.
Phase 3 is the necessary path for the current telecom-joined device. If this is the handset you are actually carrying into an engagement, stop here and build your workflow around the no-root path.
# Check if OEM unlock is available:
# Settings โ Developer Options โ OEM Unlocking
# If GREYED OUT โ MDM is active. Stop here. Use the no-root path.
# Verify MDM enrollment:
adb shell dumpsys device_policy | grep -i "admin\|mdm\|enrolled"
adb shell pm list packages | grep -i "mdm\|dpc\|enterprise"
NetHunter Rootless โ Kali Tools Without Any OS Change
# NetHunter Rootless runs a full Kali chroot inside Termux โ no root needed.
# Official guide: https://www.kali.org/docs/nethunter/nethunter-rootless/
# Step 1: Install Termux from F-Droid (NOT Google Play)
# Step 2: Install NetHunter Store APK from:
# https://store.nethunter.com/
# Step 3: From NetHunter Store โ install:
# โข Kali NetHunter App
# โข KeX (Kali desktop if needed)
# Step 4: Open NetHunter app โ install Kali chroot (rootfs download ~1GB)
# You now have a full Kali CLI:
# kali โ launches Kali shell in NetHunter app
# Inside Kali: apt install <any-kali-tool>
Capability map โ no-root Pixel 9:
| Capability | Available | Method |
|---|---|---|
| Kali toolchain | โ | NetHunter Rootless chroot |
| ADB modem diagnostics | โ | dumpsys telephony, dumpsys phone |
| Cell info harvesting | โ | NetMonster, dumpsys telephony.registry |
| App-layer MITM | โ (non-pinned apps) | HTTP Toolkit or Packet Capture VPN app |
| Frida hooks | โ ๏ธ Limited | Rootless attach (user procs) or frida-gadget APK repack |
| Burp CA injection | โ ๏ธ User cert only | Works for non-pinned apps; not system store |
| Network scanning | โ | Termux nmap, tshark |
| AT command access | โ ๏ธ Partial | ADB shell debug paths |
| Burp CA โ system store | โ | Needs root |
| Frida on system/carrier apps | โ | Needs root |
| tcpdump all interfaces | โ | Needs root |
| Full modem diag port | โ | Needs root |
If this is your only device, what do you lose?
If you stay on the safe Phase 3-only path, you do not lose the core value of the phone for telecom research. You still keep:
- real carrier / MDM context
- genuine SIM and subscriber identity testing
- ADB-based telephony inspection
- cell information harvesting
- non-destructive app-layer interception against easier targets
What you do lose is the deeper root-only layer:
- full MITM against pinned or system-trust-only apps
- Frida against carrier apps, privileged apps, and system processes without repackaging
- full-device packet capture with
tcpdump -i any - cleaner modem / diag / AT access
- system trust-store injection
- easier LSPosed/Xposed-style hooking
Since you only have one device, the practical tradeoff is simple: you keep the authentic carrier handset use case, but give up the destructive or root-heavy research use case unless you later add a second clean unlocked device.
Phase 3A โ Magisk Root on Stock Android (Clean Device Only)
Do NOT attempt this on the telecom-joined Pixel 9. This path is for a second device purchased unlocked directly from the Google Store and never enrolled in a carrier/corporate MDM.
Phase 3A is optional. Use it only when you have a separate clean unlocked device and you specifically need root-only capabilities such as system trust-store injection, full Frida coverage, full-interface packet capture, or deeper modem access.
Where patched_init_boot.img comes from
You do not download patched_init_boot.img directly.
Use this flow:
- Download the official Google Pixel 9 factory image or full OTA for the exact build currently on the phone
- Extract the stock
init_boot.imgfrom the matching factory image - Copy
init_boot.imgto the Pixel - Patch it in Magisk
- Copy the resulting
patched_init_boot.imgback to your laptop - Flash that patched image with
fastboot
Match the image to your exact current build number from:
adb shell getprop ro.build.fingerprint
or
adb shell getprop ro.build.id
Do not patch a random Pixel 9 image from a different monthly build.
Official sources
- Factory images:
https://developers.google.com/android/images - Full OTA packages:
https://developers.google.com/android/ota
Practical guidance
- Easiest path for Magisk boot patching: use the factory image for your exact build, because it gives you a direct route to
init_boot.img - OTA path: works too, but often requires extracting from
payload.bin, which is more annoying - On modern Pixels such as the Pixel 9 (
tokay), Magisk root is obtained by patchinginit_boot.img, notboot.img
flowchart LR
A["Download stock\nPixel 9 factory image\nfrom Google"] --> B["Extract init_boot.img\nfrom factory zip"]
B --> C["Copy init_boot.img\nto Pixel 9 storage"]
C --> D["Install Magisk APK\non device"]
D --> E["Magisk โ Install\nโ Select init_boot.img\nโ Patch"]
E --> F["Copy patched_init_boot.img\nback to workstation"]
F --> G["fastboot flash init_boot_\npatched_init_boot.img"]
G --> H["โ
Rooted Pixel 9\nStock Android preserved"]
style H fill:#2E75B6,color:#fff # On laptop: identify current build first
adb shell getprop ro.build.id
adb shell getprop ro.build.fingerprint
adb shell getprop ro.boot.slot_suffix
# Download the matching official Pixel 9 image from Google
# Then extract init_boot.img from the factory image package
# Copy stock init_boot.img to the phone
adb push init_boot.img /sdcard/Download/
# On the phone:
# Open Magisk โ Install โ Select and Patch a File โ choose /sdcard/Download/init_boot.img
# Magisk writes a patched image, typically under /sdcard/Download/
# List the patched file first; quote the remote wildcard so your local shell does not expand it
adb shell 'ls -lt /sdcard/Download/magisk_patched*.img'
# Pull the exact patched image back to the laptop
adb pull /sdcard/Download/magisk_patched-<id>.img patched_init_boot.img
# Reboot from Android into the bootloader
adb reboot bootloader
fastboot devices
# Flash patched init_boot to the active slot
# Example: if ro.boot.slot_suffix returned _b, flash init_boot_b
fastboot flash init_boot_<slot> patched_init_boot.img
fastboot reboot
# Verify root
adb shell su -c "id" # should return uid=0(root)
# Recommended Magisk modules for research:
# โข MagiskHide / Shamiko โ hide root from banking/telco apps
# โข LSPosed โ Xposed framework for app hooking
# โข MoveCA / TrustMeAlready โ inject Burp CA into system store
Unlocks on a rooted clean device:
- Full Frida server (persistent, all processes)
- Burp CA in system trust store (works against all apps)
tcpdump -i any(capture all interfaces)- Full AT command access to modem (
/dev/ttyACM0) - LSPosed hooks on carrier/system apps
Phase 3B โ GrapheneOS (Clean Device, OPSEC Focus)
GrapheneOS is the right call when OPSEC matters more than deep carrier API compatibility โ e.g., you're researching what a privacy-hardened device leaks to carrier infrastructure, or you need near-zero telemetry during a physical red team where device seizure is possible. Trade-off: some carrier apps lose deep OS integration (VoLTE auto-config, RCS).
# Install via web installer at grapheneos.org/install/web
# Requires Chrome/Edge with WebUSB support โ Pixel 9 is fully supported
# Post-install:
# Settings โ System โ Developer Options โ enable ADB
# Install sandboxed Google Play for carrier app compatibility
# Note: some carrier provisioning flows need native Google Services โ
# test per-carrier before using this as primary research platform
GrapheneOS vs Magisk for telecom research:
| Factor | Magisk (Stock) | GrapheneOS |
|---|---|---|
| RIL / AT command access | โ Native | โ Works |
| Carrier app deep integration | โ Full | โ ๏ธ Sandboxed |
| VoLTE / RCS provisioning | โ | โ ๏ธ May require workaround |
| Telemetry to Google | โ ๏ธ Present | โ Near-zero |
| Device seizure OPSEC | โ ๏ธ | โ Strong |
| Network fingerprint | Standard Pixel | Slightly hardened |
| Root access | โ Magisk | โ ๏ธ Root via ADB only |
Phase 4 โ Core Tool Installation
Where Phase 4 actually happens
Phase 4 is split between your laptop and the Pixel, not done in only one place.
| Component | Where you do it |
|---|---|
Install desktop tooling like adb, frida-tools, Burp, HTTP Toolkit, jadx, MobSF helpers |
Laptop |
| Install Termux / NetHunter Rootless / target apps | Pixel 9 |
| Push, pull, inspect packages, and launch workflows | From laptop over ADB |
Run on-device CLI tools such as pkg, pip, termux-setup-storage |
Inside Termux on the Pixel |
Practical answer
Yes โ you start Phase 4 from your laptop, but some steps finish on the phone itself.
Use this order:
- Laptop: connect ADB and verify the phone.
- Pixel: install Termux and any Android-side apps.
- Pixel / Termux: install the on-device packages.
- Laptop: use ADB, Frida, Burp, or HTTP Toolkit to drive the workflow.
# Laptop side
adb devices
adb shell getprop ro.product.model
# Install APKs from the laptop when needed
adb install termux.apk
adb install httptoolkit.apk
# Open a shell from the laptop
adb shell
# Then, inside Termux on the Pixel, run:
# pkg update && pkg upgrade
# pkg install python3 git curl wget nmap tcpdump openssl tshark netcat-openbsd dnsutils
# pip install scapy requests frida-tools impacket
# termux-setup-storage
Think of Phase 4 as laptop-orchestrated, phone-executed. Your laptop is the control station; the Pixel is where the Android and Termux-side tooling actually lives.
In this setup, keep the persistent Frida tooling on the laptop under ~/Documents/mobility/frida/:
- Server binary:
~/Documents/mobility/frida/frida-server - Client CLI:
~/Documents/mobility/frida/venv/bin/frida-ps - Interactive CLI:
~/Documents/mobility/frida/venv/bin/frida
4.1 Termux (Linux Environment on Device)
# Install from F-Droid (NOT Google Play โ Play version is outdated)
# https://f-droid.org/packages/com.termux/
# In Termux:
pkg update && pkg upgrade
pkg install python3 git curl wget nmap tcpdump openssl \
tshark netcat-openbsd dnsutils
# Install Python security libs
pip install scapy requests frida-tools impacket
# Enable Termux storage access
termux-setup-storage
4.2 Frida (Dynamic Instrumentation)
Rootless Mode (Telecom-Joined Device โ this setup)
# On workstation:
pip install frida-tools
# Option A: Frida via Termux (rootless โ attaches to user processes)
# In Termux:
pkg install python
pip install frida-tools
# Run frida directly in Termux โ can attach to own Termux processes
# Cannot attach to system/carrier processes without root
# Option B: Frida Gadget (repackage target APK)
# 1. Pull APK from device:
adb shell pm path com.carrier.app
adb pull /data/app/.../base.apk carrier.apk
# 2. Inject frida-gadget with apk-mitm or objection patcher:
pip install objection
objection patchapk --source carrier.apk
# 3. Install patched APK โ Frida connects automatically on launch
# Works without root. Best for targeting specific carrier app.
# Verify (rootless attach):
frida-ps -U # lists user-accessible processes
frida -U -l bypass-ssl-pinning.js -f com.carrier.app --no-pause
Rooted Mode (Clean Device Only)
# Download frida-server for arm64:
# https://github.com/frida/frida/releases โ frida-server-<version>-android-arm64.xz
# Persistent laptop-side paths used in this workflow:
# ~/Documents/mobility/frida/frida-server
# ~/Documents/mobility/frida/venv/bin/frida-ps
adb push frida-server /data/local/tmp/
adb shell su -c 'chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &'
~/Documents/mobility/frida/venv/bin/frida-ps -U # all processes visible
# Full access: carrier apps, system processes, modem RIL
4.3 SSL Interception โ Burp Suite / HTTP Toolkit
Rootless โ User Certificate (Telecom-Joined Device โ this setup)
# โโ Option A: HTTP Toolkit (easiest, no root) โโโโโโโโโโโโโโโโโโโโโโโโโ
# https://httptoolkit.com/android/
# Install HTTP Toolkit app โ one-click HTTPS interception
# Auto-injects CA for its own VPN session โ works on non-pinned apps
# Best for: REST APIs, non-hardened carrier web views
# โโ Option B: Burp as user cert โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Export Burp CA cert (.der): Proxy โ Options โ CA Certificate
openssl x509 -inform DER -in cacert.der -out burp-ca.pem
# Install via Settings โ Security โ Encryption & Credentials โ Install cert
# Installs as USER cert โ trusted by apps that respect user cert store
# NOT trusted by apps with network_security_config pinning
# Which apps trust user certs?
# Pull app's network security config:
adb shell run-as com.carrier.app cat /data/data/com.carrier.app/... # varies per app
# Or: jadx decompile and search for network_security_config.xml
User certs do NOT intercept apps that pin certificates or set cleartextTrafficPermitted=false with a custom network security config. For full MITM against hardened carrier apps, you need root (system cert store) or Frida gadget to bypass pinning.
Rooted Path โ System Certificate Store (Clean Device Only)
# Export and convert Burp CA:
openssl x509 -inform DER -in cacert.der -out cacert.pem
cert_hash=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1)
cp cacert.pem ${cert_hash}.0
adb push ${cert_hash}.0 /sdcard/
# Inject into system store (root required):
adb shell su -c "mount -o remount,rw /system"
adb shell su -c "cp /sdcard/${cert_hash}.0 /system/etc/security/cacerts/"
adb shell su -c "chmod 644 /system/etc/security/cacerts/${cert_hash}.0"
adb shell su -c "mount -o remount,ro /system"
adb reboot
# Android 14+: use Magisk module "MoveCA" or "TrustMeAlready" instead
# โ avoids remount (bypasses dm-verity issues)
Phase 5 โ Modem Diagnostic Setup (Tensor G4)
5.1 Built-in Diagnostic Access
# Engineering menu โ field test mode
# Dial on Pixel 9: *#*#4636#*#*
# โ Phone Information โ Run Ping / Network type override
# ADB modem info dump
adb shell dumpsys telephony.registry
adb shell dumpsys phone
adb shell dumpsys connectivity | grep -i "5G\|NR\|LTE"
# Current cell info
adb shell dumpsys telephony.registry | grep -iE "mcc|mnc|cid|signal|band"
# Force network type (for downgrade testing)
adb shell settings put global preferred_network_mode 0 # GSM only
adb shell settings put global preferred_network_mode 9 # LTE only
adb shell settings put global preferred_network_mode 20 # NR/5G preferred
5.2 Modem Logging โ Tensor (Samsung Diag)
# Enable modem logging via hidden menu
# Dial: *#9900# โ Sysdump โ modem logging
# Or via ADB:
adb shell su -c "setprop persist.vendor.ril.log.diag 1"
adb reboot
# Pull modem logs
adb bugreport /tmp/pixel9_bugreport.zip
unzip /tmp/pixel9_bugreport.zip -d /tmp/bugreport/
# Look in: FS/data/vendor/radio/ for modem logs
# Parse with:
# โข Wireshark (with NAS dissector) for protocol analysis
# โข Samsung Modem Log Analyzer (limited public availability)
5.3 SCAT on Tensor (Limited Support)
SCAT (Smartphone Communication Analysis Tool from Seoul National University) has partial Tensor/Samsung modem support. Full NAS decode works better on Qualcomm devices.
# SCAT repo: https://github.com/fgsect/scat
pip3 install scat
# Try Samsung diag mode
scat -t samsung -a /dev/ttyUSB0 -D samsung -F output_dir/
# If modem exposes serial diag interface:
adb shell ls /dev/ttyUSB* /dev/smd* # look for diag port
5.4 Better NAS Capture โ Laptop + Pixel 9 Hotspot
flowchart LR
PIX["๐ฑ Pixel 9\n(Subscriber UE)\nReal SIM"] -->|"Mobile Hotspot"| LAP["๐ป Laptop\nUERANSIM client\nor packet capture"]
LAP -->|"Wireshark capture\non hotspot interface"| CAP["NAS/GTP\nprotocol analysis"]
PIX -->|"ADB bridge"| LAP
style PIX fill:#2E75B6,color:#fff
style CAP fill:#1F3864,color:#fff# On laptop โ capture Pixel 9 hotspot traffic
# Find hotspot interface
ip link show | grep -i usb # USB tethering interface
# Wireshark with NAS dissector
tshark -i <hotspot_if> -f "not port 22" -w pixel9_capture.pcapng
# For NAS decode โ filter in Wireshark:
# nas-5gs (5G NAS messages)
# nas-eps (4G/LTE NAS messages)
# gtpv2 (GTP-C control plane)
Phase 6 โ Testing Capabilities Matrix
graph TD
subgraph "โ
Pixel 9 Can Do Well"
G1["App-layer MITM\nBurp + cert pinning bypass"]
G2["Subscriber identity\ntesting (IMSI/IMEI)\nvia AT commands"]
G3["Network type forcing\n5G SA / NSA / LTE / 3G"]
G4["Cell info harvesting\nMCC/MNC/CID/Band/RSRP"]
G5["VoLTE/IMS testing\nSIP stack probing"]
G6["API testing\nNEF/BSS via apps"]
G7["Carrier app reversing\nFrida hooks"]
G8["eSIM RSP probing\nSM-DP+ requests"]
end
subgraph "โ ๏ธ Pixel 9 โ Limited / Workaround Needed"
W1["Full NAS decode\nUse Qualcomm device\nor UERANSIM on laptop"]
W2["Deep modem logging\nSCAT partial only"]
W3["Rogue gNB simulation\nNeed srsRAN on laptop\n+ RF hardware"]
end
subgraph "โ Pixel 9 Cannot Do"
B1["QXDM / QPST logging\nQualcomm-only"]
B2["Run srsRAN gNB\nneeds RF hardware"]
end
style G1 fill:#2E75B6,color:#fff
style G2 fill:#2E75B6,color:#fff
style G3 fill:#2E75B6,color:#fff
style W1 fill:#E36209,color:#fff
style B1 fill:#C00000,color:#fffAT Command Access โ Modem Control
# Find modem AT port
adb shell su -c "ls /dev/ttyACM* /dev/ttyUSB* /dev/smd*"
# Connect to modem AT interface (via Termux with root)
# In Termux:
su
cat /dev/ttyACM0 &
echo "AT" > /dev/ttyACM0 # basic test
echo "AT+CIMI" > /dev/ttyACM0 # read IMSI
echo "AT+CGSN" > /dev/ttyACM0 # read IMEI
echo "AT+COPS?" > /dev/ttyACM0 # current operator
echo "AT+CEREG?" > /dev/ttyACM0 # LTE/NR registration status
# Force RAT (Radio Access Technology)
echo "AT+CNMP=38" > /dev/ttyACM0 # LTE only
echo "AT+CNMP=109" > /dev/ttyACM0 # 5G NR preferred
echo "AT+CNMP=2" > /dev/ttyACM0 # automatic
# Supplementary services (for testing SS registration)
echo "AT+CCFC=0,2" > /dev/ttyACM0 # query call forwarding
Key Apps for Mobile Security Research
| App | Source | Purpose |
|---|---|---|
| CellMapper | Play Store / cellmapper.net | Live tower map, PCI/eNB/gNB correlation, crowdsourced site lookup |
| NetMonster | Play Store | Detailed cell info: band, EARFCN, ARFCN, NR-ARFCN, CID |
| Network Cell Info | Play Store | Signal maps, neighboring cells |
| Network Survey | F-Droid / GitHub | Detailed LTE/NR logging, exports CSV/GeoPackage, good for field collection |
| Tower Collector | F-Droid / GitHub | Collect and export GSM/UMTS/LTE/NR cell observations for OpenCellID/BeaconDB |
| IMSI Tool | Termux/ADB | Read IMSI/ICCID from SIM |
| Packet Capture | Play Store | No-root traffic capture (VPN-based) |
| HTTP Toolkit | httptoolkit.com | HTTPS intercept, cert pinning bypass |
| jadx | GitHub | APK decompile (run on laptop, APKs from device) |
| Drozer | GitHub | Android app attack framework |
| MobSF | GitHub | Mobile Security Framework (static+dynamic) |
| Termux:API | F-Droid | Bridge Termux to Android APIs |
| RootBeer Sample | GitHub | Test root detection bypass |
For tower / 4G / 5G monitoring on this Pixel, the most useful app mix is:
- CellMapper for tower/site mapping and crowdsourced cell correlation
- NetMonster for quick on-device band, EARFCN, NR-ARFCN, PCI, and serving/neighbor cell inspection
- Network Survey for richer exportable logging
- Tower Collector for long-running collection and export to OpenCellID/BeaconDB
Downloaded APKs are stored on the laptop under ~/Documents/mobility/apks/:
network-survey_111.apktower-collector_2170120.apk
Operational Setup for an Engagement
flowchart TD
subgraph "Research Station"
LAP["๐ป Laptop\nWireshark ยท UERANSIM\nBurp Suite\nfrida-tools ยท SCAT"]
end
subgraph "Device Stack"
PIX["๐ฑ Pixel 9 (Rooted)\nPrimary UE\nReal carrier SIM"]
QC["๐ฑ Qualcomm Device\n(Pixel 6a / Samsung)\nDeep NAS logging\nSCAT/QXDM"]
ESIM["๐ณ Test SIMs\nMVNO SIMs for\nisolated testing"]
end
subgraph "Connectivity"
USB["USB-C โ Laptop\nADB + tethering"]
HOT["Mobile Hotspot\nโ Laptop NIC\nfor traffic capture"]
VPN["WireGuard VPN\nto lab C2\nfor result exfil"]
end
PIX --> USB
PIX --> HOT
QC --> USB
LAP --> VPN
style PIX fill:#2E75B6,color:#fff
style QC fill:#1F3864,color:#fffRecommended Companion Hardware
| Hardware | Purpose | Cost |
|---|---|---|
| Google Pixel 6a | Tensor G1 โ better SCAT support than G4; cheap secondary device | ~$200 used |
| Samsung Galaxy A series (Exynos) | Exynos modem SCAT, good for NAS research | ~$150-300 |
| USRP B205mini / HackRF One | SDR for passive monitoring, rogue cell simulation (with srsRAN on laptop) | $300-700 |
| Faraday bag / box | Isolate UE during testing โ prevent accidental live network interference | $30-80 |
| MVNO test SIMs | Multiple ISPs for roaming test scenarios | $10-20/mo each |
| USB-C hub with Ethernet | ADB + tethering + Ethernet to lab simultaneously | $40 |
Security Hardening for the Research Device
# Prevent telemetry leakage during ops
adb shell settings put global auto_time 0
adb shell settings put global send_usage_stats 0
adb shell settings put secure send_usage_stats 0
# Disable Google backup (keeps data off cloud)
adb shell bmgr enable false
# Airplane mode + Wifi only when doing passive recon
# SIM in when doing active UE testing only
# Use separate Google account (burner) for Play Store apps
# Use Shelter app (work profile) to sandbox carrier apps
Quick Command Reference
# โโ Device Info โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
adb shell getprop ro.product.model # device model
adb shell getprop gsm.version.baseband # modem firmware
adb shell getprop gsm.operator.numeric # MCC+MNC
# โโ Cell Info โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
adb shell dumpsys telephony.registry | grep -E "CellInfo|Signal|Band"
adb shell service call phone 39 # get neighboring cells
# โโ Network State โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
adb shell dumpsys connectivity | grep -i "5G\|NR\|LTE\|connected"
adb shell cat /proc/net/dev # interface stats
# โโ SIM Info โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
adb shell service call iphonesubinfo 1 # device IMEI
adb shell service call iphonesubinfo 7 # IMSI (may need root)
adb shell service call iphonesubinfo 12 # ICCID
# โโ Frida Quick Hooks โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
frida-ps -U | grep -i "carrier\|tel\|sim" # find carrier processes
frida -U -l bypass-ssl-pinning.js -f com.carrier.app --no-pause
# โโ Traffic Capture โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
adb shell su -c "tcpdump -i any -w /sdcard/capture.pcap"
adb pull /sdcard/capture.pcap ./
Cross-References
- Theory_Threat_Model โ Full threat model this device supports
- Research_NAS_Fuzzing โ Penn State NAS fuzzing (Tensor partial support)
- java_blackbox_pentest โ OSS/BSS API testing applies here via Burp on Pixel 9
Follow-Up Tasks
Device Strategy
Single Device โ Telecom-Joined Pixel 9 (Current Setup)
graph TD
subgraph "โ
Strengths"
S1["Authentic carrier enrollment\nโ real MDM/provisioning context"]
S2["Real SIM binding\nโ genuine subscriber identity tests"]
S3["Clean network fingerprint\nโ blends in during engagements"]
S4["Cell info, NAS state, AT cmds\nโ ADB access without root"]
end
subgraph "โ ๏ธ Constraints"
C1["No root\nโ no system cert store, limited Frida"]
C2["No bootloader unlock\nโ no Magisk, no GrapheneOS"]
C3["App MITM partial\nโ user cert only, pinning not bypassed"]
end
subgraph "๐ ๏ธ Best Tools for This Setup"
T1["NetHunter Rootless\nโ Kali chroot without any OS change"]
T2["HTTP Toolkit\nโ no-root HTTPS interception"]
T3["Frida Gadget\nโ repackage target APK for hooking"]
T4["Termux + nmap/tshark/scapy\nโ network tooling"]
T5["NetMonster / Cell Info\nโ cell data harvesting"]
end
style S1 fill:#2E75B6,color:#fff
style C1 fill:#E36209,color:#fff
style T1 fill:#1F3864,color:#fffBest used for:
- Carrier app analysis (traffic, identity, provisioning flows)
- Subscriber identity testing (IMSI/ICCID/IMEI via ADB)
- Cell info harvesting and network state manipulation
- App-layer testing against non-pinned targets
- Passive modem diagnostic logging
- Any test where an authentic carrier-enrolled device is the point
Workarounds for root-required capabilities:
| Need | Rootless Workaround |
|---|---|
| MITM against pinned apps | Frida gadget (repackage APK) |
| System-level packet capture | ADB + tcpdump via adb shell in debug mode |
| Kali toolchain | NetHunter Rootless chroot |
| Carrier app hooking | Objection patchapk + Frida gadget |
| Deep modem logging | ADB bugreport + *#9900# sysdump |
Two-Device โ Ideal Research Setup
graph LR
subgraph "Device 1 โ Telecom-Joined Pixel 9"
D1A["๐ฑ Stock Android\nCarrier MDM enrolled\nReal SIM / eSIM"]
D1B["โ Carrier research\nโ Subscriber identity\nโ Authentic UE context"]
end
subgraph "Device 2 โ Clean Unlocked Pixel 9 or 6a"
D2A["๐ฑ Magisk Rooted\nUnlocked, Google Store\nMVNO test SIM"]
D2B["โ Full Frida server\nโ Burp system cert\nโ Deep modem AT access\nโ LSPosed hooks"]
end
subgraph "Laptop"
LAP["๐ป Wireshark ยท UERANSIM\nBurp Suite ยท frida-tools\nSCAT ยท jadx ยท MobSF"]
end
D1A -->|"ADB + hotspot"| LAP
D2A -->|"ADB + tethering"| LAP
style D1A fill:#2E75B6,color:#fff
style D2A fill:#1F3864,color:#fff
style LAP fill:#E36209,color:#fff| Role | Device 1 (Telecom-Joined Pixel 9) | Device 2 (Clean Unlocked Pixel 9/6a) |
|---|---|---|
| OS | Stock Android, no unlock | Stock + Magisk root (or GrapheneOS) |
| SIM | Real carrier SIM | MVNO test SIM or secondary carrier |
| Root | โ None | โ Full via Magisk |
| Burp CA | User cert only | System store (all apps) |
| Frida | Gadget / rootless | Full server, all processes |
| Modem AT | Partial via ADB | Full /dev/ttyACM0 access |
| Best for | Authentic carrier context | Deep tool testing, app reversing |
| OPSEC profile | Clean โ blend in | Research/lab only |
| Cost to replace | High (carrier bond) | Low (~$200 used Pixel 6a) |
Recommended split:
- Run carrier app investigation, subscriber identity testing, and any test needing MDM context โ Device 1
- Run Burp full MITM, Frida system hooks, deep modem analysis, destructive tests โ Device 2
- Never cross-contaminate: keep Device 1 clean, use Device 2 for anything requiring bootloader unlock
Sources: Google Pixel 9 Documentation ยท Android Open Source Project ยท Magisk GitHub ยท SCAT (fgsect/scat) ยท GrapheneOS Project ยท Kali NetHunter Rootless Docs ยท 3GPP TS 24.501