Strobesstrobes
Platform
Solutions
Resources
Customers
Company
Pricing
Book a Demo
Strobesstrobes

Strobes connects every exposure signal to autonomous action, so security teams fix what matters, prove what works, and stop chasing noise.

Book a DemoTalk to an expert
ISO 27001SOC 2CREST
  • Platform
  • Platform Overview
  • Agentic Exposure Management
  • AI Agents
  • Integrations
  • API & Developers
  • Workflows & Automation
  • Analytics & Reporting
  • Solutions
  • Exposure Assessment (EAP)
  • Attack Surface Management
  • Application Security Posture
  • Risk-Based Vulnerability Management
  • Adversarial Exposure Validation (AEV)
  • AI Pentesting
  • Pentesting as a Service
  • CTEM Framework
  • By Industry
  • Financial Institutions
  • Technology
  • Retail
  • Healthcare
  • Manufacturing
  • By Roles
  • CISOs
  • Security Directors
  • Cloud Security Leaders
  • App Sec Leaders
  • Resources
  • Quick Agentic Pentest
  • Blog
  • Customer Stories
  • eBooks
  • Datasheets
  • Videos & Demos
  • Exposure Management Academy
  • CTEM Maturity Assessment
  • Pentest Health Check
  • Security Tool ROI Calculator
  • Company
  • About Strobes
  • Meet the Team
  • Trust & Security
  • Contact Us
  • Careers
  • Become a Partner
  • Technology Partner
  • Partner Deal Registration
  • Press Release

Weekly insight for security leaders

CTEM research, agentic AI trends, and what's actually moving the needle.

© 2026 Strobes Security Inc. All rights reserved.

Privacy PolicyTerms of ServiceCookie PolicyAccessibilitySitemap
Back to Blog
How to Intercept Traffic from Proxy-Unaware Mobile Apps
Application Security

How to Intercept Traffic from Proxy-Unaware Mobile Apps

Shubham JhaJune 9, 20257 min read

Table of Contents

  • What makes an app proxy-unaware?
  • Forcing traffic with iptables NAT redirection
  • When do you reach for DNSChef or a VPN?
  • How do you bypass pinning after redirecting?
  • The hour I wasted blaming iptables
  • What if the app uses raw sockets or QUIC?
  • What does this teach you about defending an app?
  • Frequently asked questions
  • Sources and references

Authors

S
Shubham Jha

Share

Table of Contents

  • What makes an app proxy-unaware?
  • Forcing traffic with iptables NAT redirection
  • When do you reach for DNSChef or a VPN?
  • How do you bypass pinning after redirecting?
  • The hour I wasted blaming iptables
  • What if the app uses raw sockets or QUIC?
  • What does this teach you about defending an app?
  • Frequently asked questions
  • Sources and references

Authors

S
Shubham Jha

Share

TL;DR
  • ✓A proxy-unaware app ignores the OS HTTP proxy setting (or uses raw sockets or QUIC), so configuring Burp as a system proxy captures nothing.
  • ✓The fix is to force its traffic to your proxy at a lower layer: iptables NAT on a rooted Android device, DNSChef to spoof DNS, or a tun/VPN interface that routes every packet.
  • ✓Redirection and pinning are two independent problems. Getting packets to your proxy does not make the app trust your CA; you still defeat pinning with objection or a targeted Frida hook.
  • ✓mitmproxy in transparent mode and Burp's invisible proxy listener are built to receive forcibly redirected traffic.
  • ✓For raw sockets or QUIC, drop UDP/443 to force a TCP/TLS fallback, or hook the socket and TLS calls with Frida to read plaintext before encryption.

You set Burp as the device proxy, install the CA, open the app, and Burp's HTTP history stays empty. Nothing is broken. The app is proxy-unaware: it never reads the system HTTP proxy setting, or it talks over raw sockets or QUIC that an HTTP proxy does not handle. Asking the app politely to use your proxy will never work here.

So you stop asking and start forcing. This post walks transparent redirection with the exact commands (iptables NAT, DNSChef, a tun/VPN), getting that traffic into mitmproxy or Burp, and the pinning bypass you still need afterward to actually read it. The most common time sink is treating those as one problem when they are two. It all maps to MASVS-NETWORK and the MASTG network test cases.

Table of contents
  1. What makes an app proxy-unaware?
  2. Forcing traffic with iptables NAT redirection
  3. When do you reach for DNSChef or a VPN?
  4. How do you bypass pinning after redirecting?
  5. The hour I wasted blaming iptables
  6. What if the app uses raw sockets or QUIC?
  7. What does this teach you about defending an app?

What makes an app proxy-unaware?

An app is proxy-unaware when it does not honor the operating system's HTTP proxy configuration, so its traffic bypasses any proxy you set in Wi-Fi settings. There are a few distinct causes, and the cause determines the fix:

  • The HTTP client is configured to ignore system proxy settings (common with some OkHttp, Flutter, and React Native setups).
  • The app uses raw TCP/UDP sockets or a custom protocol rather than a standard HTTP stack.
  • It uses QUIC/HTTP3 over UDP, which a classic HTTP proxy does not intercept.
  • It pins certificates, so even captured traffic is encrypted to a cert you do not control.

The first three need forced redirection at the network layer. The last needs a pinning bypass. The two are independent, and on a stubborn app you usually solve both.

Proxy-aware vs proxy-unaware interception path
1
Proxy-aware
Set Burp/mitmproxy as the device HTTP proxy, install the CA, traffic flows. Done if no pinning.
2
Force redirect (rooted)
iptables NAT redirects 80/443 to a transparent mitmproxy. App proxy settings become irrelevant.
3
Force redirect (no root/iOS)
DNSChef spoofs DNS plus a tun/VPN interface routes every packet through your proxy.
4
Bypass pinning
objection or a Frida hook on TrustManager/OkHttp/NSURLSession so the app trusts your CA.
5
Non-HTTP fallback
Frida hooks on socket/TLS calls; or drop UDP/443 to force QUIC down to TCP.

Forcing traffic with iptables NAT redirection

On a rooted Android device, iptables NAT rewrites the packet path in the kernel, below the app, so its proxy settings become irrelevant. Start mitmproxy in transparent mode on your machine, then redirect ports 80 and 443 on the device:

# on your machine
$ mitmproxy --mode transparent --showhost
Proxy server listening at *:8080

# on the rooted device (adb shell, as root)
# iptables -t nat -A OUTPUT -p tcp --dport 80  -j DNAT --to-destination 192.168.1.50:8080
# iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 192.168.1.50:8080
# iptables -t nat -L OUTPUT -n
Chain OUTPUT (policy ACCEPT)
target  prot  opt source     destination
DNAT    tcp   --  anywhere   anywhere   tcp dpt:80  to:192.168.1.50:8080
DNAT    tcp   --  anywhere   anywhere   tcp dpt:443 to:192.168.1.50:8080

The two DNAT lines confirm the rules are live; from here every TCP connection on 80/443 lands in your transparent mitmproxy regardless of what the app's HTTP client thinks. Burp offers the same idea through its invisible proxy listener. When you finish, flush the chain with iptables -t nat -F OUTPUT so the device leaves the engagement clean.

When do you reach for DNSChef or a VPN?

Use DNS spoofing or a tun/VPN interface when iptables alone is not enough: a non-rooted device, an iOS device, or an app using non-HTTP protocols. DNSChef answers the app's DNS queries with your machine's IP, pulling its connections to a host where your proxy listens:

$ dnschef --fakeip 192.168.1.50 --fakedomains api.targetapp.com -i 0.0.0.0
          _
         | |
       __| |_ __  ___  ___| |__   ___ f
[*] DNSChef started on interface: 0.0.0.0
[*] Using the following nameservers: 8.8.8.8
[*] Cooking replies for domain api.targetapp.com with IP 192.168.1.50
[23:14:07] cooked A api.targetapp.com -> 192.168.1.50   <- app's lookup hijacked

The cooked line is the confirmation the app's resolver took your answer. The tun/VPN approach is the most general: a local VPN profile (or a tool that creates a tun interface) routes every packet through your machine, so it works on iOS and non-rooted Android because it operates at the OS VPN layer rather than needing iptables. Pair DNSChef (to control where the app connects) with a transparent mitmproxy (to terminate TLS) for full coverage of stubborn HTTP apps.

How do you bypass pinning after redirecting?

Redirection only gets packets to your proxy. If the app pins, it still refuses to trust your interception CA, and every connection dies at the TLS handshake. The fastest fix is objection's one-liner; when it misses a custom implementation, attach a targeted Frida script and watch it land:

$ frida -U -f com.target.app -l unpin.js --no-pause
     ____
    / _  |   Frida 16.2.1 - dynamic instrumentation toolkit
   | (_| |
    > _  |   Spawning com.target.app...
[Pixel::com.target.app ]-> [+] TrustManagerImpl.verifyChain() hooked
[+] OkHttp CertificatePinner.check() neutralized
[+] Handshake to api.targetapp.com now succeeds -> visible in mitmproxy

Once those hooks land, the redirected traffic decrypts and appears in your proxy. On iOS, hook NSURLSession and the lower-level SecTrust APIs; for deeper pinning, patch the smali after apktool d and repackage. We cover where pinning sits in the mobile pentest checklist and the broader workflow in what mobile app penetration testing is.

Strobes insight
Redirection and pinning are two separate problems. iptables or a VPN gets the packets to you; a Frida hook makes the app trust your CA. Confirm each independently or you will capture encrypted noise and blame the wrong layer.

The hour I wasted blaming iptables

On a recent assessment of a logistics app, I spent close to an hour convinced an iptables rule was wrong. The redirect was fine and mitmproxy was logging inbound connections the whole time, but every one died at the TLS handshake because the app pinned. I kept rewriting NAT rules that were already correct. The moment the Frida unpin script landed, the traffic appeared instantly, fully decrypted. The fix was never in the redirection layer.

That is the trap with proxy-unaware apps: testers see no readable traffic, assume the proxy is broken, and burn time on Burp settings when the real issue is pinning, or the reverse. Confirm each layer independently. Watch mitmproxy for an inbound connection first to prove redirection works, then worry about the handshake. The decision table below maps each symptom to the right tool so you do not chase the wrong layer.

Symptom to tool: what to reach for
SymptomLikely causeFixConfirm with
Burp HTTP history emptyApp ignores system proxyiptables NAT or tun/VPN redirectInbound connection appears in mitmproxy
Connections reach proxy then die at handshakeCertificate pinningobjection sslpinning disable or Frida unpinDecrypted requests appear in proxy
No traffic, no proxy hits at all on iOSiptables unavailable on iOStun/VPN profile + DNSChefDNSChef 'cooked' line for the domain
UDP traffic, nothing on TCPQUIC/HTTP3 over UDPDrop UDP/443 to force TCP/TLS fallbackApp reconnects over TCP, then intercept

What if the app uses raw sockets or QUIC?

For raw sockets, custom binary protocols, or QUIC, an HTTP proxy cannot parse the wire format, so you intercept at the boundary where the app hands data to the OS. For QUIC the cheapest move is to drop UDP/443 so the app falls back to TCP/TLS, which you already know how to intercept:

# force QUIC apps down to TCP/TLS, then intercept normally
# iptables -A OUTPUT -p udp --dport 443 -j DROP

For raw sockets or custom protocols, hook the app's socket write/read functions or its TLS library with Frida and log the plaintext buffers before encryption and after decryption, which sidesteps both pinning and the unusual format at once. Remember that an app's SDKs can use their own networking and pin separately from the host, covered in our mobile SDK security testing methodology. This same forced-interception capability is part of the runtime testing that agentic pentesting automates.

What does this teach you about defending an app?

Everything above is also a remediation checklist read backwards. The point of pinning is not to stop a rooted attacker (it cannot) but to force them to patch the binary rather than run a stock script. Configure it so a one-liner does not win:

  • Network security config: declare a <pin-set> in res/xml/network_security_config.xml with backup pins, and set cleartextTrafficPermitted="false" so a DNSChef redirect to plain HTTP fails.
  • Pin in code too: add an OkHttp CertificatePinner so the pin is not solely in config that a smali patch can strip.
  • Do not rely on the client: keep tokens short-lived and scoped server-side, so traffic captured through forced redirection is useless minutes later.

None of this stops a determined tester, and it should not pretend to. It raises the cost from a ten-second objection command to a binary patch, which is exactly the friction MASVS-RESILIENCE asks for on apps that need it.

Frequently asked questions

What does proxy-unaware mean for a mobile app?
It means the app ignores the operating system's HTTP proxy setting, so configuring Burp as the device proxy captures none of its traffic. This happens when the app's HTTP client is set to ignore system proxies, or when it uses raw sockets, a custom protocol, or QUIC/HTTP3 over UDP instead of a standard HTTP stack.
How do you intercept traffic that ignores the proxy?
Force redirection below the app. On rooted Android, use iptables NAT to redirect ports 80 and 443 to a transparent mitmproxy. On iOS or non-rooted devices, use DNSChef to spoof DNS plus a tun/VPN interface that routes every packet through your machine. The app cannot opt out of kernel-level or VPN-level redirection.
Do I still need to bypass SSL pinning after redirecting?
Yes, if the app pins. Redirection only delivers packets to your proxy; pinning means the app still refuses to trust your interception CA and the handshake fails. Use objection's android sslpinning disable, or a Frida hook on TrustManagerImpl, OkHttp CertificatePinner, or NSURLSession, to force validation to succeed.
What is the difference between iptables redirect and a VPN capture?
iptables NAT works in the kernel on a rooted Android device and is ideal for TCP-based HTTPS. A tun/VPN capture works at the OS VPN layer, so it functions on iOS and non-rooted Android and handles non-HTTP protocols. Use iptables when you have root and standard HTTPS; use a VPN/tun for broader coverage.
How do you intercept an app that uses QUIC or raw sockets?
For QUIC, drop UDP port 443 with iptables so the app falls back to TCP/TLS, then intercept normally. For raw sockets or custom binary protocols, use a tun/VPN capture combined with Frida hooks on the app's socket read/write or TLS functions to log plaintext buffers before encryption and after decryption.
What is DNSChef used for in interception?
DNSChef is a DNS proxy that answers the app's DNS queries with an IP you control, pulling its connections to your interception host. It is useful on non-rooted or iOS devices where iptables is unavailable, and it pairs well with a transparent mitmproxy that terminates TLS for the redirected connections. Watch for its 'cooked' log line to confirm the hijack landed.
How can a developer make this interception harder?
Declare a pin-set in network_security_config.xml with backup pins, set cleartextTrafficPermitted to false, and add an OkHttp CertificatePinner in code so a smali patch alone cannot strip it. None of this stops a determined tester, but it raises the cost from a ten-second objection command to a full binary patch, which is the friction MASVS-RESILIENCE asks for.

Sources and references

  • OWASP MASTG: Network Testing
  • mitmproxy: Transparent Proxying
  • Frida
S
Shubham Jha
Security Researcher, Strobes
Shubham Jha leads offensive security research at Strobes, focused on web and API exploitation and red team tradecraft.
Tags
Mobile SecurityPenetration TestingNetwork

Stop chasing vulnerabilities Start reducing exposure

See how Strobes AI agents validate and fix your most critical exposures automatically.

Book a Demo
Continue Reading

Related Posts

Vulnerability validation: why most of your scanner backlog is noise - Strobes
Exposure ValidationApplication Security

Vulnerability Validation: Why Most of Your Scanner Backlog Is Noise

Vulnerability validation proves which scanner findings are real, reachable, and exploitable. Why manual triage fails and how agentic validation scales.

Jun 9, 202619 min
How to pentest single-page applications - React, Angular and Vue SPA security testing guide
Penetration TestingApplication Security

How to Pentest Single-Page Applications (React, Angular, Vue)

Learn how to pentest React, Angular, and Vue SPAs. Covers DOM XSS, client-side routing bypass, JS bundle secrets, and why traditional DAST scanners fail.

Jun 4, 202623 min
Bug bounty vs pentesting vs AI pentesting comparison featured image
Penetration TestingApplication Security

Bug Bounty vs. Pentesting vs. AI Pentesting: Which Model Fits Your AppSec Program?

Bug bounty vs pentesting vs AI pentesting: compare costs, coverage, compliance, and when to use each model. Build a layered AppSec testing strategy.

Jun 4, 202621 min