Recently I expierenced some problems while trying to capture the https
trafic from my iPhone. Luckely, no certificate pinning was enabled, but the app wouldn't allow me to access webviews behind a proxy
.
The https
traffic can easily be captured by using apps like Charles, Surge, Proxyman or any other webdebugging app available on the AppStore. These apps usually work with a [[202104152035 Virtual Private Network|VPN]] that captures the traffic between the client
and the server
, which is the definition of a proxy server
.
![[
However, those apps are not cheap at all. In addition, Charles doesn't support local mapping, in which the response to a specified server is changed by a local file, or any other fancy stuff. Surge and Proxyman do support (at the time of writing, it's not yet available for Proxyman) local mapping, breakpoints and scripting.
No idea if it's just me, but in what I have encountered and the apps I tried to inspect, proxy servers
are often blocked. To avoid this, you might be able to configure a proxy server
on all connections (not only the one WiFi) by supervising your iOS device and installing a custom configuration profile. However, I haven't tried this. However, a [[202104152035 Virtual Private Network|VPN]] seems to work all the time, unless [[202104152101 Certificate Pinning|certificate pinning]] is enabled in the app.
![[
]]Why, because a root certificate
needs to be configured on your device in order to enable the proxy server
to decrypt the https
traffic. If [[202104152101 Certificate Pinning|certificate pinning]] was enabled by the app,
sudo apt updatesudo apt upgrade
Erna, enkele services opkuisen die toegevoegd zijn door Oracle.
sudo apt purge netfilter-persistent iptables-persistentsudo apt purge snapd open-iscsi lxd lxcfs
Activeer de root user
sudo -s
Omdat de hoeveelheid RAM maar beperkt is, wordt voorgesteld om swapping te activeren
dd if\=/dev/zero of\=/swap bs\=1M count\=1kchmod 0600 /swapmkswap /swapswapon /swapecho '/swap none swap sw 0 0' \>> /etc/fstab
Poort open zetten op de server
iptables -R INPUT -p udp -m udp --dport 52415 -j ACCEPT
Je kan de connectie testen door een basic chat functie op te zetten. Doe het volgende: Op de server:
nc -l -u 54215
Hierbij staat-l
voor listen
en -u
voor udp
. Aan de gebruikerszijde doe je:
nc -u <ip-adress-server> <port>
Typ er wat tekst en controleer of het aan de server zijde verschijnt.
Installeer [[wireguard]] en maak een privatekey en publickey aan.
sudo -scd /etc/wireguard/umask 077; wg genkey | tee privatekey | wg pubkey > publickey
Zet ip-forwarding aan:
sysctl net.ipv4.ip_forward=1
Zorg er voor dat ook na een reboot de juiste instellingen worden toegepast:
nano /etc/sysctl.conf# Zet er ip_forwarding op 1 en bewaarsysctl -p
Zet nu wireguard aan
systemctl enable wg-quick@wg0systemctl start wg-quick@wg0systemctl status wg-quick@wg0
Kijk als alles wel goed werkt en controleer je ip op het subnet van [[wireguard]]:
wgip -c a show wg0
Nadat de gebruiker is ingesteld, moet deze woden toegevoegd aan de configuratie. Stop eerst de service:
systemctl stop wg-quick@wg0
Pas nadien de wg0.conf
aan en start de service opnieuw en controleer of alles werkt:
systemctl start wg-quick@wg0wg
Mijn configuratiefile ziet er als volgt uit
[Interface]PrivateKey = <private key van de server -> wg genkey>Address = 10.0.2.1/24 # Subnet mask 24 laat dus 10.0.2.1 tot 10.0.2.255 toeListenPort = 52415 # Deze hebben we eerder open gezet# Interface ens3 is de interface verbonden met de internet gateway - meestal heet deze eth0PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE # de %i wordt vervangen door wg0 bij het starten van de servicePostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE # de %i wordt vervangen door wg0 bij het starten van de service[Peer]# MacBook Pro van GillesPublicKey = <public key van de client -> wg keygen | tee privatekey | wg pubkey > publickey>AllowedIPs = 10.0.2.3/32
Om het verkeer door de server te loodsen moet ook de DNS van de configuratie op de client verwijzen naar het interne ip-adres van de server op het WireGuard netwerk, namelijk 10.0.2.1
.
Op de server zelf moet het verkeer over tcp
en udp
geloodst worden naar een werkelijke DNS server, bijvoorbeeld deze van Cloudflare.
Netwerk verkeer naar poort 53
wordt via iptables omgeleid naar 1.1.1.1:53
.
# IP adres 10.0.2.1 is het adres van de server op interface wg0iptables -A PREROUTING -d 10.0.2.1/32 -p tcp -m tcp --dport 53 -j DNAT --to-destination 1.1.1.1:53iptables -A PREROUTING -d 10.0.2.1/32 -p udp -m udp --dport 53 -j DNAT --to-destination 1.1.1.1:53
Gebruik de WireGuard app voor Andoid of iOS. Je maakt er een nieuwe WireGuard tunnel aan met volgende configuratie.
[Interface]PrivateKey = <private key van de client>Address = 10.0.2.2/24 # Subnet mask 24ListenPort = 52415 # Deze hebben we eerder open gezetDNS = 10.0.2.1 # IP van de server[Peer]# ServerPublicKey = <public key van de client>Endpoint 158.101.210.10:52415AllowedIPs = 0.0.0.0/0, ::/0 # Alle IP4 en IP6 adressen zijn toegelaten
Mitmproxy wordt gebruikt om het internetverkeer over de interface wg0
te onderscheppen. Installeren doen we door de binary rechstreeks te downloaden.
wget https://snapshots.mitmproxy.org/6.0.2/mitmproxy-6.0.2-linux.tar.gztar -xvzf mitmproxy-6.0.2-linux.tar.gzrm mitmproxy-6.0.2-linux.tar.gz# Verplaats de binary naar /usr/binmv mitm* /usr/bin/
Test of je mitmproxy kan opstarten: type mitmproxy
Om mitmproxy te gaan gebruiken dien je het verkeer naar poort 80
en poort 443
om te leiden naar de proxy die standaard draait op poort 8080
indien je ze niet definieert bij de opstart van de proxy.
# Interface wg0 stelt het WireGuard netwerk vooriptables -t nat -A PREROUTING -i wg0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080iptables -t nat -A PREROUTING -i wg0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
Om het opstarten na elke herstart te automatiseren maken we een service aan:
cd /etc/systemd/systemnano mitmproxy.service
De inhoud van de service ziet er als volgt uit
[Unit]Description=MitmproxyAfter=network.target[Service]Type=simpleExecStartPre=sudo -sExecStart=/usr/bin/mitmdump --mode transparent -s /home/ubuntu/exploits/patch.py -qRestart=alwaysUser=root[Install]WantedBy=multi-user.target
In de service verwijs ik naar een python script
/home/ubuntu/exploits/patch.py
, hierin worden bepaalde requests onderschept een aangepast. Het script ziet er als volgt uit
import reimport osdef response(flow):if 'example.com' in flow.request.pretty_url:with open('/home/ubuntu/index.html', 'r') as f:content = f.read()flow.response.content = content.encode()
In het python script passen we in het desbetreffende geval de inhoud van de response van example.com
aan naar een voorgeprepareerde .html