my computer
my data
my code
liberating your data from user-hostile apps
Slides: captnemo.in/talks/
FOSSUnited BLR, Feb 2024
SSID: Smallcase_Guest passphrase: nofreewifi@sc
Please Connect
NEMO
@nemo@tatooine.club
captnemo.in/contact/
VIVEK
@ccrims0n
FOSS is Amazing
Anyone disagrees?
FOSS 💗
[Data Ownership]
Photoshop CS4
- Closed-Source
- PSD Files
- Data with you
Inkscape
- Open Source
- SVG Files
- Data with you
Modern Mobile Apps
- Light API Clients
- Local Cache Storage
- No Data Export
- No concept of "Files"
MY DATA
MY CONTROL
FOSS
⇏
Data Ownership
Pitch
This 2 hour workshop will guide users through analysing a real application,
and re-implementing it in just enough in code to get your own data out.
Workshop Agenda
Foundations
Why?
HTTP, Proxies, Apps
Tooling Intro
1.
Traffic Capture
Capture HTTPS traffic
Analyse APIs
Generate Code
2.
Write Code
Make API Calls
Extract your Data
Write a CSV
3.
AUDIENCE POLL
API
HTTP
TLS
TCP
wikipedia.org/wiki/Internet_Protocol_version_4
wikipedia.org/wiki/Transmission_Control_Protocol
tls12.xargs.org
QUIC/HTTP3
HTTPS/GraphQL
HTTPS/GraphQL
HTTP(s)/Websocket
- Client
- Server
- Proxy
- TLS Termination
Terminology
curl \
--verbose \
--head \
https://httpbin.org/ip
What does a HTTP Client Do?
[Browser] Web Inspector -> Network -> Play
hoppscotch.io -> Play
Read headers. See docs at httpbin.org, try different requests.
Copy as CURL from browser. Open in $TOOL.
- Bruno [P🔓]
- Insomnium [H🔓]
- Postman [H,P]
- firecamp.dev* [P]
- hoppscotch.io* [P🔓]
What does a HTTP Client Do?
[Browser] Web Inspector -> Network -> Play
hoppscotch.io -> Play
Read headers. See docs at httpbin.org, try different requests.
Copy as CURL from browser. Open in $TOOL.
Tool | Gotcha | Plus |
---|---|---|
Bruno | Needs install | FOSS, No Login |
Postman | Closed-Source. Needs install | |
Insomnium | Needs Install | FOSS |
Firecamp | Login to Import, No HAR support | Works in Browser, FOSS |
Hoppscotch | No HAR support | Works in Browser, FOSS |
1.
Resolve DNS
2.
TCP/UDP Connection
for HTTP/QUIC
3.
Negotiate TLS
5.
Receive and Parse Response
4.
Build and Send Request
6.
Render?
1.
Resolve DNS
2.
TCP/UDP Connection
for HTTP/QUIC
3.
Negotiate TLS
5.
Receive and Parse Response
4.
Build and Send Request
6.
Render?
; pause
Privacy Note
All traffic on your device might be visible to my laptop.
The proxy is running in "memory" mode, without any logs.
I do not want your data, this is for ease of use.
You can run your own.
$ python -m venv workshop
$ source workshop/bin/activate # in linux/macos/WSL
$ workshop\Scripts\activate.bat # in cmd.exe
$ workshop\Scripts\Activate.ps1 # In PowerShell
$ pip install mitmproxy
$ mitmweb
Check your Private Network IP Address. This is PROXYIP
PROXYPORT=8080
Open http://127.0.0.1:8081 in your laptop browser.
Running mitmweb
Proxy Configuration
8571 | U8571 | xcmgc |
---|---|---|
Port | USERNAME | PASSWORD |
Settings -> WiFi -> Select Network ->
(View More|Scroll Down) -> // maybe?
Proxy Configuration ->Manual
Hostname = mitm.captnemo.in
Port = 8571 (use your own)
On your DEVICE, On Chrome/Safari -> Browse to http://mitm.it
Follow instructions.
Now on your LAPTOP, open
https://mitm.captnemo.in:18571
Use your creds.
On your DEVICE, on Chrome/Safari
http://httpbin.org
Status
Proxy Configuration
Your mobile device should be using the proxy on the default browser, even with HTTPS.
1.
mitmweb access
You should be able to access your mitmweb instance in your laptop, and it should have some traffic from your browser.
2.
Android <7, iOS
Traffic for most apps should be visible in mitmweb.
3.
- By default, apps only honor the "system" CA store.
- The certificate you installed goes to your "user" store.
- On rooted devices, you can write to "system" store.
- Apps can opt-in to the "user-store".
- We will patch the apps with the "opt-in".
https://hub.docker.com/repository/docker/captn3m0/apk-mitm/general
Android >7
FOSS United Workshop - My Computer, My Data, My Code
By Nemo
FOSS United Workshop - My Computer, My Data, My Code
This 2 hour workshop will guide you through analysing a real application, and re-implementing it just enough in code to get your own data out.
- 339