Gilles.is

/Today/20210414-Vandaag-14-april-2021

Toggle Light


By Gilles Trenson
this is a 2 minutes read
40 paragraphs

Vandaag 14 april 2021

#netwerken#vm#cloud#vpn#mitm

Transparent proxy using a VPN in the cloud

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.

Proxy server OR [[202104152035 Virtual Private Network|VPN]]?

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 update
sudo apt upgrade

Erna, enkele services opkuisen die toegevoegd zijn door Oracle.

sudo apt purge netfilter-persistent iptables-persistent
sudo 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\=1k
chmod 0600 /swap
mkswap /swap
swapon /swap
echo '/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-lvoor 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

Installeer [[wireguard]] en maak een privatekey en publickey aan.

sudo -s
cd /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 bewaar
sysctl -p

Zet nu wireguard aan

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0

Kijk als alles wel goed werkt en controleer je ip op het subnet van [[wireguard]]:

wg
ip -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@wg0
wg

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 toe
ListenPort = 52415 # Deze hebben we eerder open gezet
# Interface ens3 is de interface verbonden met de internet gateway - meestal heet deze eth0
PostUp = 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 service
PostDown = 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 Gilles
PublicKey = <public key van de client -> wg keygen | tee privatekey | wg pubkey > publickey>
AllowedIPs = 10.0.2.3/32

DNS Server

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 tcpen 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 wg0
iptables -A PREROUTING -d 10.0.2.1/32 -p tcp -m tcp --dport 53 -j DNAT --to-destination 1.1.1.1:53
iptables -A PREROUTING -d 10.0.2.1/32 -p udp -m udp --dport 53 -j DNAT --to-destination 1.1.1.1:53

Configureer de client

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 24
ListenPort = 52415 # Deze hebben we eerder open gezet
DNS = 10.0.2.1 # IP van de server
[Peer]
# Server
PublicKey = <public key van de client>
Endpoint 158.101.210.10:52415
AllowedIPs = 0.0.0.0/0, ::/0 # Alle IP4 en IP6 adressen zijn toegelaten

Configureren Mitmproxy

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.gz
tar -xvzf mitmproxy-6.0.2-linux.tar.gz
rm mitmproxy-6.0.2-linux.tar.gz
# Verplaats de binary naar /usr/bin
mv 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 voor
iptables -t nat -A PREROUTING -i wg0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -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/system
nano mitmproxy.service

De inhoud van de service ziet er als volgt uit

[Unit]
Description=Mitmproxy
After=network.target
[Service]
Type=simple
ExecStartPre=sudo -s
ExecStart=/usr/bin/mitmdump --mode transparent -s /home/ubuntu/exploits/patch.py -q
Restart=always
User=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 re
import os
def 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