- 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
sysctlmungkin diperlukan; ada batasan seperti menerima koneksi masuk dan akses ke/dev/net/tun
Apa yang dilakukan httptap
- httptap menjalankan sembarang perintah Linux dengan membungkusnya, lalu menampilkan request HTTP/HTTPS yang dibuat perintah tersebut
- Bentuk penggunaan dasarnya adalah
httptap -- <command> - Contohnya, saat menjalankan
curl https://monasticacademy.org, alat ini menampilkan requestGET https://monasticacademy.org/dan response308
- Bentuk penggunaan dasarnya adalah
- Dalam contoh Python
requests.get('https://monasticacademy.org'), alat ini mengikuti redirect dan menampilkan dua request- Request pertama adalah
308untukhttps://monasticacademy.org/ - Request berikutnya adalah
200untukhttps://www.monasticacademy.org/
- Request pertama adalah
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
- Tidak membuat aturan
- Pada Ubuntu 23.10 ke atas, pengaturan berikut diperlukan
sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0sudo 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/nullmenunjukkan bahwa server mengembalikan redirect302 - Jika dibuat mengikuti redirect seperti
curl -sL, request tambahan juga ditampilkan- Request pertama adalah
302 - Request kedua adalah
200untuk URL tujuan redirect
- Request pertama adalah
- Dalam contoh
gcloud compute instances list, endpoint HTTP yang digunakan secara internal oleh Google Cloud CLI dapat diperiksaPOST https://oauth2.googleapis.com/tokenGET https://compute.googleapis.com/compute/v1/.../aggregated/instances?...- Output
gcloudbiasa dan log request httptap muncul bersama
- Dalam contoh
kubectl get all, request ke server API Kubernetes ditampilkan--https 443 6443membuat koneksi TCP pada port 443 dan 6443 diperlakukan sebagai HTTPS--insecure-skip-tls-verifydiperlukan karena kubectl tidak menggunakan certificate authority yang dibuat httptap
- Contoh
curl --doh-url https://cloudflare-dns.com/dns-querymenunjukkan alur DNS-over-HTTP- Dua request pertama adalah lookup DNS
- Dua request berikutnya adalah request HTTP biasa ke situs tujuan
- Jika opsi
--headdan--bodydigunakan bersama, header HTTP dan payload mentah akan dicetak
Output HAR
- Dengan opsi
--dump-har out.har, request dan response HTTP dapat di-dump sebagai file HAR - File HAR yang dibuat dapat divisualisasikan di berbagai HAR viewer
- Sebagai contoh, Google HAR Analyzer disebutkan
- Contoh HAR berisi request
308 Redirectkehttps://monasticacademy.orgdan request200 OKkehttps://www.monasticacademy.org
Akses localhost
- Untuk mengakses port localhost milik host dari dalam httptap, gunakan
host.httptap.localatau169.254.77.65, bukanlocalhost - Setiap network namespace di Linux memiliki perangkat loopback sendiri, yaitu
127.0.0.1, sehingga127.0.0.1:1234di dalam httptap bukan alamat dan port yang sama pada host - httptap mengakali masalah ini dengan melakukan hardcode agar
169.254.77.65dirutekan ke127.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-exitmembuat 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
- Dalam contoh Visual Studio Code, bentuk yang digunakan adalah
- 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/getserta contoh Python denganfork,setsid,fork, errorCould not resolve hostterjadi 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
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.
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
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”
Apakah itu ide yang baik, atau apakah akan mengarah ke hasil yang mereka bayangkan, adalah persoalan lain
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 outputhttptap -- 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
iptablesatau melakukan perubahan sistem secara globalnetstackuntuk sebagian fiturnya di macOSTerutama jika tidak perlu konfigurasi proxy, itu akan lebih berguna
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 sajaTerlihat juga mereka me-mount overlay filesystem pada
/etc/resolv.conf[2]. Saya penasaran apakah akan membantu jika httptap me-mount direktori/etc/ca-certificatessebagai bundel CA sementara[1] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
[2] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
httptap me-mount overlay pada
/etc/resolv.confkarena, 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.confadalah opsi yang cukup dapat diandalkan. Begitu proses dimasukkan ke network namespace, ia tidak lagi bisa mengakses resolver systemdlocalhost:53, konfigurasi paling umum di Linux desktop, sehingga resolusi DNS harus disediakanMe-mount
/etc/ca-certificatessebagai 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 mendengarnyaSebagai 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 penggunaSaya 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
https://github.com/M66B/NetGuard
Sulit dipercaya, tetapi ada upaya setengah jadi untuk melakukan hal yang sama pada tab jaringan Firefox di direktori
networktabdalam repositori. Ini proyek yang sangat keren, saya ingin belajar lebih banyak, dan senang juga kalau bisa berdiskusi lebih lanjutSebagai 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.pcapMaka 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
tsharkhttps://github.com/eriksjolund/podman-networking-docs?tab=re...
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)write(2)menyelesaikan TLS. Anda mungkin bisa membaca dan memodifikasi ciphertext, tetapi karena proses tidak memanggilwrite(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 NSADibutuhkan 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
writedengan eBPF tidak membantu untuk dekripsi TLSBagaimanapun, makin banyak opsi makin baik
Keren. Sepertinya saya akan langsung mencobanya untuk debugging konfigurasi nginx
Saat ini saya memakai
curl -vlalu harus menelusuri output secara manual untuk mencari apa yang salah, tetapi dengan alat ini, hal seperti loop redirect tampaknya akan langsung terlihatKelihatannya 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...
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...