Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

proxy-level adblocker

Sejauh ini dalam ber-internet ada 3 lapisan yang harus dilewati sebelum some random server berkomunikasi dengan komputer gue:

Ketika mengakses github.com, komputer gue akan bertanya:

  1. ini ada outbound traffic dari port 60554 ke 128.199.89.41:53, boleh ga? (local firewall untuk dns)
  2. ini ada dns query ke github.com nih, boleh ga? (dns sinkhole)
  3. ini si firefox mau ngakses 13.250.177.223:443 dari port 696969 (and back) nih, boleh ga? (local firewall untuk firefox)
  4. ini si firefox ada dns query ke collector.githubapp.com karena bagian dari halaman github.com nih, boleh ga? (dns sinkhole)
  5. ini ada element dengan id job-ads, tampilin jangan? (ad content blocker)

Komputer (dan sistem operasi) pada dasarnya membutuhkan izin terlebih dahulu sebelum melakukan sesuatu, seperti, komputer membutuhkan izin dari penggunanya untuk menyalakan tombol power untuk dapat beroperasi.

Namun izin disini terkesan ambigu. Di beberapa "versi" misal untuk seperti versi Supervised/"Enterprise" biasanya pengguna komputer tersebut dibatasi boleh mengakses aplikasi apa saja. Di versi biasa? Tentu tidak ada batasan, karena Personal Computer berarti komputer yang dimiliki oleh pribadi, benar?

Banyak yang bisa dilakukan di komputer, namun aktivitas yang paling favorit adalah mengakses internet.

Pada dasarnya sistem operasi membutuhkan izin terlebih dahulu untuk dapat mengakses internet, misal, jika koneksi Wi-Fi, pengguna harus secara eksplisit menyambung ke jaringan Wi-Fi yang ada terlebih dahulu.

Tapi sekali lagi, izin disini terkesan ambigu.

Bagaimana bila gue hanya ingin membolehkan Firefox mengakses internet dan tidak untuk Safari? Bagaimana bila gue hanya berkomunikasi dengan server melalui 1 port statis dan bukan dinamis? Bagaimana bila gue hanya mengizinkan komputer gue mengakses github.com dan tidak untuk collector.githubapp.com? Bagaimana bila gue tidak ingin melihat tombol hijau bertuliskan Skip Ads di situs github.com misalnya.

Komputer yang gue gunakan adalah milik gue, berarti gue punya kontrol penuh terkait apa yang bisa dan tidak bisa dilakukan oleh komputer gue, salah satunya. Oke gue pakai macOS, tapi gue gak mau komputer gue nelfon cupertino hanya untuk memastikan gue tersambung ke internet dan tidak dihalangi oleh portal captive karena alasan sesederhana gak mau aja. komputer aing kumaha aing lah anying.

Anyway, untuk kembali mendapatkan hak-hak yang dirampas tersebut, kita harus menjadi "super user" karena pengguna biasa mungkin kurang sadar (atau peduli) terkait hal ini. Yang mana 1) dengan cara menggunakan firewall untuk membatasi inbound/outbound traffic baik per hostname & port ataupun per aplikasi, 2) dengan menggunakan DNS Sinkhole untuk membatasi DNS Query sehingga browser tidak perlu melakukan permintaan lebih lanjut, 3) dengan cara menggunakan (ad) content blocker untuk membatasi element apa saja yang boleh tampil di browser.

Alias, 3 hal yang sudah gue sebutkan di paragraf awal.

Setup lebih spesifiknya dari komputer gue adalah:

  • Tersambung ke VPN (dan Exit Node jika di jaringan publik) dan plain DNS Query melalui IP private untuk menghindari leak jika sedang tidak menggunakan exit node
  • Jika sedang tidak tersambung ke VPN, DNS query melalui loopback yang mana port 53 gue menjalankan dnsproxy yang nembak ke dns sinkhole gue via DoH/DoT/DoQ
  • Tripmode selalu berjalan, dan default nya adalah block. Tripmode ini bisa membatasi aplikasi mana aja yang boleh mengakses internet, yang salah satunya cocok ketika sedang menggunakan tethering agar syncthing tidak sedang sinting lalu melakukan sync. juga tripmode ini harganya cuma $15 (one time purchase), lebih murah dari harga open bo di gateway pasteur
  • Semua browser yang gue gunakan pasti terpasang (ad) content blocker, yakni ada uBlock Origin dan 1BlockerX

Masalahnya, perangkat yang gue gunakan tidak hanya satu. Ada iPad, iPhone, Raspberry Pi dan Android yang harus menggunakan setup yang sama juga. Bagian yang paling sulit hanyalah di content blocker khususnya di lingkungan Apple yang tertutup, tidak ada content blocker yang benar-benar sesuai dengan kebutuhan gue.

Meskipun gue sudah relatif nyaman dengan setup seperti ini, namun pikiran iblis gue penasaran: gimana kalau kita outsource 3 hal tersebut ke cloud. Hahaha bercanda, ke komputer orang.

proxy-level adblocker

Ada 3 jenis proxy sejauh yang gue tau:

  • HTTP Proxy (Explicit Proxy)
  • Transparent Proxy
  • Reverse Proxy
  • SOCKS Proxy

Setiap proxy memiliki perbedaan fitur & kapabilitas masing-masing, namun yang sama dari semuanya adalah satu: bertindak sebagai middleman.

Proxy yang paling umum digunakan adalah Transparent (oleh ISP) dan Reverse (oleh sysadmin). Gue gak bisa menjamin kalau semua ISP menggunakan transparent proxy, tapi kalau lo buka situs random melalui HTTP (port 80) dan terdapat iklan yang seharusnya tidak ada di halaman tersebut, besar kemungkinan ISP yang lo gunakan meneruskan koneksi lo via transparent proxy.

Gue akan bahas tentang itu secara detailnya di tulisan selanjutnya tentang NAT (Network Address Translation).

Lanjut, halaman web pada dasarnya hanyalah sebuah halaman yang terdiri dari HTML, CSS, dan JavaScript. Dan tugas peramban adalah membuat dokumen tersebut menjadi sedikit berguna, seperti, drop shadow hasil nyontek dari halaman random di dribbble lu tidak akan terlihat a e s t h e t i c nya kalau peramban yang digunakan oleh klien adalah w3m.

Nah, karena dokumen web pada dasarnya hanya sebuah halaman, bagaimana bila kita melakukan "pre-processing" terlebih dahulu sebelum si peramban utama yang kita gunakan tersebut melakukan pekerjaannya? Yakni dengan menggunakan MITM Proxy

(POC) MITM Proxy

Sebagai percobaan gue menonaktifkan uBlock Origin, ETP nya Firefox, dan menggunakan DNS server dari Quad9 yang tidak bertindak sebagai DNS Sinkhole. Sebagai target, gue mengakses youtube.com karena youtube adalah sarangnya iklan.

Berikut tampilan halaman beranda nya:

https://i.evilfactory.id/f91ug9pi.png

Dan tampilan halaman video nya:

https://i.evilfactory.id/dh6z4k7x.png

Udah lama banget gak liat iklan :))

Lalu untuk PoC gue menggunakan Privoxy sebagai MITM Proxy yang memang salah satu tujuannya untuk melakukan apa yang content blocker biasa lakukan. Sayangnya privoxy ini terlalu kompleks, tapi gue tetap menggunakannya untuk PoC. Berikut tampilan YouTube ketika mengaksesnya via Privoxy:

https://i.evilfactory.id/fbhtsbgh.png

Terlihat seperti menggunakan adblock, kan?

Filter yang gue gunakan untuk youtube itu adalah seperti ini:

FILTER: youtube
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?feedmodule-PRO["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?homepage-chrome-side-promo["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?premium-yva["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?search-pva["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?shelf-pyv-container["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?video-masthead["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?watch-branded-actions["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?watch-buy-urls["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bid=["']?watch-channel-brand-div["'\s>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bclass=["']?([^"'\>]+\s+)?carousel-offer-url-container[\s"'\>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bstyle=["']?margin:\ 7px\ 0pt;["']?[^\>]*\bclass=["']?([^"'\>]+\s+)?list-view[\s"'\>])|(\bclass=["']?([^"'\>]+\s+)?list-view[\s"'\>][^\>]*\bstyle=["']?margin:\ 7px\ 0pt;["']?)(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bclass=["']?([^"'\>]+\s+)?promoted-videos[\s"'\>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bclass=["']?([^"'\>]+\s+)?searchView\.list-view[\s"'\>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bclass=["']?([^"'\>]+\s+)?watch-extra-info-column[\s"'\>])(/\>|\>.*?\<\/\1\>)@@igs
s@\<([a-zA-Z0-9]+)\s+[^\>]*(\bclass=["']?([^"'\>]+\s+)?watch-extra-info-right[\s"'\>])(/\>|\>.*?\<\/\1\>)@@igs

Dan action nya adalah seperti ini:

{ -block }
.youtube.com/iframe_api
.youtube.com/player_api
.youtube.com/yt/css/www-advertise\.css
.youtube.com/.*_adsense_
.youtube.com/yt/advertise/medias/images/

{ +filter{youtube} }
youtube.com

Gue dapet itu dari random article di internet, but it works anyway.

MITM+SOCKS Proxy?

Gue ada ide lagi gimana kalau gue pakai SOCKS5 Proxy?

Sebelumnya, in high-level ketika kita mengakses https://1.1.1.1 via firefox misalnya, yang terjadi adalah:

  • firefox buka port random dan mengarah ke port mitm proxy kita (8118/tcp)
  • mitm proxy buka port random dan mengarah ke one.one.one.one:443 via router
  • kembalian yang didapat dari router dibalikan ke mitm proxy dan dibalikan lagi ke firefox

Yang berarti, DNS lookup; tcp connection, dsb masih terjadi di komputer gue. Gimana kalau gue pindahin juga ke devbox gue?

https://i.evilfactory.id/aew6fit2.png

Menggunakan SOCKS5 Proxy relatif gampang, cara yang paling sederhana dengan SOCKS5 via SSH. Tinggal SSH ke remote server dengan dynamic port forward:

ssh -D 1337 user@host

Semua koneksi yang menggunakan protokol SOCKS4/SOCKS5 dari port 1337 akan diteruskan ke random port yang ada di server gue.

Privoxy mendukung SOCKS5 Forward juga, tinggal tambahkan baris ini ke config and we're done!

forward-socks5 / 127.0.0.1:1337 .

Konfigurasi diatas diasumsikan kalau menggunakan port 1337 untuk SOCKS5 nya, ya. Sekarang mari kita cek

https://i.evilfactory.id/w2oe5iht.png

Disitu terlihat bahwa tidak ada sama sekali komunikasi dengan one.one.one.one:443, hanya antara random port :60000-62000, :8118 dan :1337

Also, DNS Query terjadi di devbox gue juga. Highly profit.

Penutup

Gue penasaran kenapa proxy-level adblocker kurang populer yang padahal kalau dilihat sekilas harusnya ini lebih efisien.

Mungkin alasan pertama karena masalah security (privoxy gue berjalan di local) dan gue gue coba kalau ini berjalan di server yang mungkin butuh custom sertifikat CA yang harus dipasang

Kedua, ini gue rasa gak beda jauh sama AdGuardHome ataupun NextDNS yang sering disebut sebagai "Pi-Hole but in the cloud". Setup seperti ini juga malah bisa disebut sebagai "Pi-hole & uBlock Origin but in the cloud" yang karena technically kan adblocker itu cuma kumpulan filter entah terkait DOM atau URL.

Ketiga, tentu saja ada biaya di penerusan & enkripsi paket. Tapi gue rasa tidak terlalu berdampak besar. Gue coba speedtest via speedtest dot net tidak terlihat perbedaan yang jauh antara download/upload speed nya dengan tanpa mitm proxy.

Gue tertarik untuk mengulik tentang ini lebih dalam lagi. Privproxy gue rasa pilihan yang sangat tepat namun konfigurasinya yang sangat memusingkan dan tidak kompatibel dengan format yang digunakan oleh uBlock Origin, AdGuardDNS ataupun /etc/hosts.

Stay tune!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment