8 poin oleh GN⁺ 2025-02-04 | 2 komentar | Bagikan ke WhatsApp
  • httptap adalah alat untuk menjalankan program Linux dalam bentuk httptap -- <command> dan menampilkan ringkasan request serta response HTTP/HTTPS yang dibuat program tersebut di terminal
  • Berjalan tanpa hak root, daemon, perubahan global sistem, aturan iptables, atau perubahan tabel routing; executable-nya adalah binary Go statis tanpa dependensi
  • Saat ini hanya untuk Linux, dan disebut sulit di-port ke sistem operasi lain karena menggunakan system call khusus Linux seperti network namespace
  • Traffic HTTPS didekripsi dengan menyuntikkan certificate authority yang dibuat seketika saat eksekusi ke lingkungan subprocess, dan bekerja sebagai transparent TCP proxy yang memproses paket mentah IP/TCP/UDP
  • Pada Ubuntu 23.10 ke atas atau distribusi yang secara default menonaktifkan unprivileged user namespace, pengaturan sysctl mungkin diperlukan; ada batasan seperti menerima koneksi masuk dan akses ke /dev/net/tun

Apa yang dilakukan httptap

Instalasi dan syarat menjalankan

  • Binary pra-build dapat dipasang dengan mengunduh tarball rilis terbaru
    • Semua versi dan arsitektur CPU dapat dilihat di releases
  • Metode instalasi lewat Go juga tersedia
    • go install github.com/monasticacademy/httptap@latest
  • Untuk menjalankannya, umumnya tidak diperlukan hak root, daemon, maupun konfigurasi global sistem
    • Tidak membuat aturan iptables
    • Tidak mengubah tabel routing
    • Umumnya tidak memengaruhi proses lain di sistem yang sama
  • Pada Ubuntu 23.10 ke atas, pengaturan berikut diperlukan
    • sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0
    • sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
  • Pengaturan ini menonaktifkan fitur kernel terbaru yang membatasi user namespace tanpa hak istimewa
    • Ini juga mungkin diperlukan pada distribusi lain yang secara default menonaktifkan unprivileged user namespace
    • Mereka sedang meneliti cara menyertakan profil AppArmor bersama httptap untuk menghilangkan kebutuhan ini

Contoh penggunaan

  • Contoh menjalankan curl -s https://buddhismforai.sutra.co -o /dev/null menunjukkan bahwa server mengembalikan redirect 302
  • Jika dibuat mengikuti redirect seperti curl -sL, request tambahan juga ditampilkan
    • Request pertama adalah 302
    • Request kedua adalah 200 untuk URL tujuan redirect
  • Dalam contoh gcloud compute instances list, endpoint HTTP yang digunakan secara internal oleh Google Cloud CLI dapat diperiksa
  • Dalam contoh kubectl get all, request ke server API Kubernetes ditampilkan
    • --https 443 6443 membuat koneksi TCP pada port 443 dan 6443 diperlakukan sebagai HTTPS
    • --insecure-skip-tls-verify diperlukan karena kubectl tidak menggunakan certificate authority yang dibuat httptap
  • Contoh curl --doh-url https://cloudflare-dns.com/dns-query menunjukkan alur DNS-over-HTTP
    • Dua request pertama adalah lookup DNS
    • Dua request berikutnya adalah request HTTP biasa ke situs tujuan
  • Jika opsi --head dan --body digunakan bersama, header HTTP dan payload mentah akan dicetak

Output HAR

Akses localhost

  • Untuk mengakses port localhost milik host dari dalam httptap, gunakan host.httptap.local atau 169.254.77.65, bukan localhost
  • Setiap network namespace di Linux memiliki perangkat loopback sendiri, yaitu 127.0.0.1, sehingga 127.0.0.1:1234 di dalam httptap bukan alamat dan port yang sama pada host
  • httptap mengakali masalah ini dengan melakukan hardcode agar 169.254.77.65 dirutekan ke 127.0.0.1

Subprocess yang menjadi daemon

  • Di Linux, subprocess dapat dibuat tetap berjalan setelah proses asalnya berakhir
    • Ini adalah pola umum pada daemon dan aplikasi GUI yang dijalankan dari command line
  • Jika proses seperti ini dijalankan di bawah httptap, proses yang menjadi daemon akan tetap berada di dalam network namespace milik httptap
  • Opsi --no-exit membuat httptap terus menjalankan proxy dan logging meski subprocess yang langsung dieksekusi sudah berakhir
    • Dalam contoh Visual Studio Code, bentuk yang digunakan adalah httptap --no-exit -- code --ignore-certificate-errors .
    • Untuk keluar, tutup VS Code lalu akhiri httptap dengan Ctrl+C
  • Jika httptap berakhir lebih dulu tanpa --no-exit, network namespace tetap ada, tetapi tidak ada proses yang membaca paket dari perangkat TUN sehingga koneksi jaringan aplikasi terputus
  • Pada contoh setsid setsid curl http://httpbin.org/get serta contoh Python dengan fork, setsid, fork, error Could not resolve host terjadi jika tidak ada --no-exit

Cara kerja

  • httptap -- <command> menjalankan <command> di dalam network namespace terisolasi dan mendekripsi traffic HTTPS dengan menyuntikkan certificate authority yang dibuat seketika
  • Alat ini membuat perangkat TUN Linux dan mengonfigurasi lingkungan subprocess agar semua traffic jaringan melewati perangkat tersebut
    • Traffic yang ditulis ke perangkat TUN diteruskan ke file descriptor milik proses yang membuat perangkat tersebut
  • Mengubah root network namespace akan memengaruhi traffic seluruh sistem, sehingga httptap membuat network namespace terpisah
    • Di namespace tersebut hanya ada perangkat loopback dan perangkat TUN
    • Subprocess dijalankan di dalam namespace ini
  • Traffic yang diterima dari perangkat TUN adalah paket IP mentah
    • httptap mem-parse paket IP dan paket TCP/UDP di dalamnya
    • Paket IP mentah juga harus ditulis kembali ke subprocess
    • Implementasi TCP/IP miliknya sendiri tidak mencakup banyak bagian dari keseluruhan protokol TCP, tetapi bekerja cukup masuk akal untuk tujuannya
  • Saat subprocess membuat request ke www.example.com, httptap menerima TCP SYN yang menuju IP tujuan dan membalas dengan SYN+ACK
    • Secara terpisah, httptap membuat koneksi TCP ke IP tujuan sebenarnya menggunakan API socket normal kernel Linux
    • Setelah itu, data diteruskan dua arah
    • Struktur ini adalah transparent TCP proxy tradisional
  • Dekripsi HTTPS ditangani lewat penyuntikan certificate authority
    • Saat startup, httptap membuat certificate authority berupa private key dan x509 certificate
    • Certificate ditulis ke filesystem yang hanya terlihat oleh subprocess
    • Environment variable yang hanya terlihat oleh subprocess disetel agar certificate authority tersebut ditambahkan ke daftar tepercaya
    • Karena httptap memiliki private key certificate authority, ia dapat membuktikan diri seolah-olah menjadi server yang ingin dihubungi subprocess dan membaca request HTTP dalam plaintext

Batasan

  • Saat ini hanya untuk Linux dan bergantung pada system call khusus Linux seperti network namespace
  • Proses tidak dapat menerima koneksi jaringan masuk
  • Diperlukan izin akses ke /dev/net/tun
  • Semua ICMP echo request langsung di-echo tanpa mengirim paket ICMP ke jaringan sebenarnya

2 komentar

 
halfenif 2025-02-06

it was developed at the Monastic Academy in Vermont in the US. We believe that a monastic schedule, and the practice of the Buddhist spiritual path more generally, provide ideal conditions for technological development.

Saat mengujinya lalu melihat GitHub-nya, saya sempat berpikir ini mungkin dibuat oleh orang-orang yang menjalani latihan di biara? sebagai bagian dari pencapaian spiritual mereka.

 
GN⁺ 2025-02-04
Komentar Hacker News
  • Bagian “How it was made” di README sama menariknya dengan tool itu sendiri
    Disebutkan bahwa mereka tinggal dan berlatih bersama di lahan yang luasnya sedikit lebih dari 100 acre, melantunkan doa dan bermeditasi bersama setiap pagi dan malam, serta menjalankan dan mengikuti retreat meditasi sekitar satu minggu setiap bulan. Di sisa waktu, mereka bersama-sama mengurus lahan, memelihara bangunan, memasak, membersihkan, merencanakan, menggalang dana, dan dalam beberapa tahun terakhir juga mengembangkan software

    • Teringat satu kutipan dari “Soul of a new machine”
      Pada masa ketika microcode dan logika menimbulkan masalah dalam satuan nanodetik, seorang engineer yang kelelahan berhenti kerja dan meninggalkan catatan ini sebagai surat pengunduran diri di terminal: “Aku akan pergi ke sebuah komune di Vermont dan tidak akan berurusan dengan satuan waktu yang lebih pendek daripada musim”
    • Terus terang, ini terdengar seperti salah satu dari sekian banyak kultus yoga/spiritualitas yang sudah ada di berbagai tempat di Barat
    • Bagian yang berbunyi “Selama beberapa tahun terakhir kami telah merekam seri kuliah bernama Buddhism for AI. Ini tentang upaya merancang agama berbasis Buddhisme—ya, agama—agar dapat dikonsumsi langsung oleh sistem AI. Melihat keadaan dunia, kami merasa pekerjaan ini sangat penting” terasa seperti indikator betapa anehnya zaman yang kita hidupi sekarang
      Apakah itu ide yang baik, atau apakah akan mengarah ke hasil yang mereka bayangkan, adalah persoalan lain
    • Awalnya saya mengira foto pedesaan pertama itu gambar hasil generasi, tetapi sekarang sepertinya foto asli
      Kombinasi teknologi dan meditasi terasa menarik. Idenya sendiri memikat, tetapi melakukannya dalam praktik mungkin sulit. Kelihatannya seperti semacam Recurse bergaya Buddhis
  • httptap adalah pelacak HTTP dalam cakupan proses yang bisa dijalankan tanpa hak root
    Jika menjalankan program Linux seperti httptap <program>, jejak request dan response HTTP/HTTPS bisa dilihat di standard output

    httptap -- python -c "import requests; requests.get('https://monasticacademy.org')"
    ---> GET https://monasticacademy.org/
    <--- 308 https://monasticacademy.org/ (15 bytes)
    ---> GET https://www.monasticacademy.org/
    <--- 200 https://www.monasticacademy.org/ (5796 bytes)

    Caranya adalah menjalankan program di dalam network namespace yang terisolasi, dan menggunakan gVisor sebagai stack TCP/IP sendiri. Karena ini bukan proxy HTTP, ia tidak bergantung pada konfigurasi proxy. Traffic TLS didekripsi dengan membuat CA secara langsung saat berjalan, dan tidak memasang aturan iptables atau melakukan perubahan sistem secara global

    • Penasaran apakah ini bisa dibuat berjalan di macOS. Setahu saya Tailscale memakai library TCP/IP gVisor sebagai library netstack untuk sebagian fiturnya di macOS
    • Penasaran apakah request atau response bisa dimodifikasi. Karena web saat ini makin lama makin tidak ramah bagi pengguna, kebutuhan akan tool seperti ini lebih besar daripada sebelumnya
      Terutama jika tidak perlu konfigurasi proxy, itu akan lebih berguna
    • Rasanya semua orang lupa bahwa ada Wireshark yang juga bisa dijalankan tanpa root
      https://blog.wireshark.org/2010/02/running-wireshark-as-you/
  • Ide menjalankan proses di network namespace yang terisolasi itu brilian
    Bagian HTTPS lebih menarik. Sepertinya mereka menyetel environment variable umum[1] pada program agar memakai bundel CA di direktori sementara, tetapi seperti varian http_proxy, masalahnya program bisa saja mengabaikan variabel itu begitu saja

    Terlihat juga mereka me-mount overlay filesystem pada /etc/resolv.conf[2]. Saya penasaran apakah akan membantu jika httptap me-mount direktori /etc/ca-certificates sebagai bundel CA sementara

    [1] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
    [2] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...

    • Saya setuju bahwa menyebalkan karena praktis tidak ada cara yang disepakati bersama, atau cara yang dipaksakan oleh sistem, untuk menentukan CA root bagi proses arbitrer
      httptap me-mount overlay pada /etc/resolv.conf karena, mirip dengan CA root, untuk resolusi DNS juga tidak ada cara pasti untuk memberi tahu proses arbitrer server DNS mana yang harus dipakai. Meski begitu, /etc/resolv.conf adalah opsi yang cukup dapat diandalkan. Begitu proses dimasukkan ke network namespace, ia tidak lagi bisa mengakses resolver systemd localhost:53, konfigurasi paling umum di Linux desktop, sehingga resolusi DNS harus disediakan
      Me-mount /etc/ca-certificates sebagai overlay juga mungkin membantu. Namun setelah melihat struktur direktori itu, saya cukup terkejut karena sangat tidak konsisten antar-distro. Tetap saja, itu mungkin dilakukan. Kalau ada pengetahuan tentang cara menambahkan sertifikat ke direktori itu dengan cara yang akan dikenali setidaknya oleh sebagian implementasi TLS, saya ingin mendengarnya
    • Untuk bagian HTTPS, menurut saya tidak ada solusi umum yang mencakup segala jenis program dan long tail implementasi certificate pinning
      Sebagai contoh tandingan, bayangkan malware yang berkomunikasi lewat TLS dan kode terkompilasinya sangat diobfuscate. Program itu bisa menyertakan kumpulan sertifikat CA yang dipin di dalam binary dan sama sekali tidak membuka filesystem. Meski begitu, sampai sebagian besar sertifikat root CA kedaluwarsa, ia tetap bisa membuat koneksi TLS yang valid dan aman selama kira-kira 10 tahun. TLS seluruhnya diproses di user space, dan tidak ada jaminan ia memakai OpenSSL atau library umum lain, sehingga kita juga tidak bisa berharap pada pendekatan hooking fungsi OpenSSL tertentu. Akan lebih buruk lagi jika server memakai sertifikat self-signed dan klien menerimanya karena alasan apa pun
      Namun dengan sedikit pekerjaan, jelas mungkin menangani 99% kasus secara andal. Itu lebih baik daripada tidak ada sama sekali
  • Menggunakan perangkat TUN di sini benar-benar ide yang keren. Bagian “How it was made” di README juga termasuk salah satu yang terbaik yang pernah saya baca di README GitHub
    Saya sedang membuat sesuatu bernama Subtrace[1], yang bisa secara otomatis mencegat request masuk maupun keluar. Lucu juga karena antarmuka untuk menjalankan program tampaknya mengerucut ke bentuk yang sama[2]. Namun tujuan Subtrace sedikit berbeda dari httptap, lebih dekat ke observabilitas/monitoring layanan backend cloud, jadi kami menekankan request dua arah. Pendekatannya juga berbeda. Dengan Seccomp BPF, kami mencegat sekitar 10 system call seperti socket, connect, listen, accept, dan lain-lain, lalu mem-proxy semua koneksi TCP melalui Subtrace. Setelah itu kami mem-parse request HTTP dari stream TCP, dan memanfaatkan kembali tab Network di Chrome DevTools agar berjalan di browser seperti aplikasi web biasa untuk ditampilkan kepada pengguna

    Saya penasaran apakah ada anekdot menarik yang muncul saat menjalankan program di bawah httptap. Saya juga penasaran program mana yang paling sering “menelepon pulang”

    [1] https://github.com/subtrace/subtrace
    [2] https://docs.subtrace.dev/quickstart

    • Ini mengingatkan saya pada NetGuard, yang melakukan pemfilteran paket menggunakan layanan VPN Android. Ia memakai layanan VPN Android, bukan TUN mentah
      https://github.com/M66B/NetGuard
    • Menghubungkan hasil tangkapan ke Chrome DevTools juga menarik, dan penggunaan eBPF juga menarik. Menjadikan developer tools berjalan sebagai aplikasi web mandiri juga bagus
      Sulit dipercaya, tetapi ada upaya setengah jadi untuk melakukan hal yang sama pada tab jaringan Firefox di direktori networktab dalam repositori. Ini proyek yang sangat keren, saya ingin belajar lebih banyak, dan senang juga kalau bisa berdiskusi lebih lanjut
  • Sebagai alat lain bagi pengguna tanpa privilese untuk menganalisis traffic jaringan, rootless Podman dan Pasta bisa digunakan
    Cukup tambahkan opsi berikut ke podman run

    --network=pasta:--pcap,myfile.pcap

    Maka Pasta akan merekam traffic jaringan ke file PCAP, yang bisa dianalisis nanti. Saya juga sudah menulis contoh sederhana untuk menganalisis file PCAP yang direkam dengan tshark
    https://github.com/eriksjolund/podman-networking-docs?tab=re...

    • Sangat bagus untuk diketahui, tetapi masalah dekripsi traffic TLS tetap masih ada
  • Cukup menarik. Saya pernah menulis library yang melakukan fungsi “tap” serupa untuk aplikasi Go: https://github.com/henvic/httpretty
    https://asciinema.org/a/297429

    Saya juga pernah terpikir untuk melakukan hal seperti ini pada program sembarang, tetapi tidak benar-benar menggali cara implementasinya secara mendalam. Senang melihat ada yang berhasil membuatnya

  • Saya penasaran kenapa tidak memakai eBPF. Dengan begitu, seharusnya bisa melihat request HTTP dari semua proses sekaligus, termasuk yang sudah berjalan. Selain itu, mungkin tidak perlu memikirkan TLS; misalnya cukup hook ke write(2)

    • Saya tidak paham bagaimana hook ke write(2) menyelesaikan TLS. Anda mungkin bisa membaca dan memodifikasi ciphertext, tetapi karena proses tidak memanggil write(2) dengan byte plaintext, request HTTP sebenarnya tidak bisa dibaca. Pada akhirnya yang terlihat hanya byte terenkripsi yang naik ke jaringan, dan itu pun bisa dilihat NSA
      Dibutuhkan trik sertifikat CA seperti yang dipakai httptap. Tentu ada catatan seperti certificate pinning, tetapi dalam sebagian besar skenario praktis, ini bisa dibuat bekerja dengan andal
      Saat membuat Subtrace[1], saya memikirkan masalah spesifik ini sampai tingkat yang tidak masuk akal, jadi kalau ada pendekatan yang lebih sederhana atau elegan, saya benar-benar tertarik
      [1] https://github.com/subtrace/subtrace
    • Sayangnya TLS terjadi di dalam aplikasi, bukan di kernel, jadi hook system call write dengan eBPF tidak membantu untuk dekripsi TLS
    • Saya penasaran apakah dengan memasang uprobe pada library SSL, kita bisa memeriksa dan memodifikasi hal seperti respons HTTP yang sudah didekripsi untuk memfilter konten
    • Sepertinya eBPF mungkin membutuhkan hak root
    • Bukankah cara ini membutuhkan root? “Nilai jual” besar httptap tampaknya justru tidak membutuhkan hak root
      Bagaimanapun, makin banyak opsi makin baik
  • Keren. Sepertinya saya akan langsung mencobanya untuk debugging konfigurasi nginx
    Saat ini saya memakai curl -v lalu harus menelusuri output secara manual untuk mencari apa yang salah, tetapi dengan alat ini, hal seperti loop redirect tampaknya akan langsung terlihat

    • Saya ingin mendengar bagaimana cara kerjanya dalam konteks penggunaan nyata, terutama fitur apa yang berguna
  • Kelihatannya sangat bagus saat perlu melihat cepat dan kasar stack panggilan HTTP/S sebuah aplikasi
    Secara pribadi saya lebih suka eBPF untuk melihat semuanya, tetapi utilitas ini bisa membantu mempersempit bagian penting dalam tracing eBPF

  • Kelihatannya bagus
    Profil GitHub-nya mengarah ke https://www.monasticacademy.org/about; saya tidak punya komentar khusus tentang itu, tetapi saya penasaran bagaimana retreat pelatihan bergaya biara mereka terhubung dengan proyek GitHub ini
    Setelah melihat bagian paling bawah README, koneksinya dijelaskan di sana: https://github.com/monasticacademy/httptap?tab=readme-ov-fil...

    • Untuk orang-orang yang membaca thread ini, titik hubungnya sederhana: httptap adalah proyek Monastic Academy
      Artinya, di lahan seluas 123 acre di Vermont, orang-orang hidup bersama mengikuti struktur biara Buddha yang relatif tradisional. Hanya saja mereka bukan biksu yang ditahbiskan secara resmi. Pada siang hari, mereka mengerjakan berbagai proyek teknis/nonteknis bersama. Tautan README di atas memberikan gambaran yang bagus
      https://github.com/monasticacademy/httptap?tab=readme-ov-fil...