Httptap - Tüm Linux programlarının HTTP/HTTPS isteklerini görmeyi sağlar
(github.com/monasticacademy)- httptap, bir Linux programını
httptap -- <command>biçiminde çalıştırarak, o programın yaptığı HTTP/HTTPS isteklerinin ve yanıtlarının özetini terminalde gösteren bir araçtır - Root yetkisi, daemon, sistem genelinde değişiklik,
iptableskuralı veya yönlendirme tablosu değişikliği olmadan çalışır; çalıştırılabilir dosya, bağımlılığı olmayan statik bir Go binary’sidir - Şimdilik yalnızca Linux’a özeldir; network namespace gibi Linux’a özgü sistem çağrılarını kullandığı için başka işletim sistemlerine taşınmasının zor olduğu belirtiliyor
- HTTPS trafiğini, çalışma sırasında anında oluşturulan bir sertifika otoritesini alt sürecin ortamına enjekte ederek çözer; ham IP/TCP/UDP paketlerini işleyen şeffaf TCP proxy yöntemiyle çalışır
- Ubuntu 23.10 ve üzeri ya da yetkisiz user namespace’i varsayılan olarak devre dışı bırakan dağıtımlarda
sysctlayarı gerekebilir; gelen bağlantıları dinleme ve/dev/net/tunerişimi gibi kısıtlar bulunur
httptap ne yapar
- httptap, herhangi bir Linux komutunu sarıp çalıştırırken, o komutun yaptığı HTTP/HTTPS isteklerini gösterir
- Temel kullanım biçimi
httptap -- <command>şeklindedir - Örnekte
curl https://monasticacademy.orgçalıştırıldığındaGET https://monasticacademy.org/isteği ve308yanıtı gösterilir
- Temel kullanım biçimi
- Python
requests.get('https://monasticacademy.org')örneğinde yönlendirmeleri takip ederek iki isteği gösterir- İlk istek
https://monasticacademy.org/için308 - Sonraki istek
https://www.monasticacademy.org/için200
- İlk istek
Kurulum ve çalıştırma koşulları
- Önceden derlenmiş binary, en güncel release tarball’ı indirilerek kurulabilir
- Tüm sürümler ve CPU mimarileri releases sayfasında görülebilir
- Go ile kurulum yöntemi de sağlanır
go install github.com/monasticacademy/httptap@latest
- Çalıştırmak için genellikle root yetkisi gerekmez; daemon veya sistem genelinde ayar da gerekmez
iptableskuralı oluşturmaz- Yönlendirme tablosunu değiştirmez
- Aynı sistemdeki diğer süreçleri genellikle etkilemez
- Ubuntu 23.10 ve üzeri için aşağıdaki ayarlar gerekir
sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
- Bu ayar, yetkisiz user namespace’leri kısıtlayan güncel kernel özelliğini devre dışı bırakır
- Yetkisiz user namespace’i varsayılan olarak devre dışı bırakan diğer dağıtımlarda da gerekebilir
- httptap ile birlikte bir AppArmor profili sağlayarak bu gereksinimi ortadan kaldırmanın yolu araştırılıyor
Kullanım örnekleri
curl -s https://buddhismforai.sutra.co -o /dev/nullçalıştırma örneği, sunucunun302yönlendirmesi döndürdüğünü gösterircurl -sLgibi yönlendirmeleri takip ettirirseniz ek istekler de gösterilir- İlk istek
302 - İkinci istek, yönlendirme hedefi URL için
200
- İlk istek
gcloud compute instances listörneğinde Google Cloud CLI’ın içeride kullandığı HTTP endpoint’leri görülebilirPOST https://oauth2.googleapis.com/tokenGET https://compute.googleapis.com/compute/v1/.../aggregated/instances?...- Normal
gcloudçıktısı ile httptap’in istek logları birlikte görünür
kubectl get allörneğinde Kubernetes API sunucusu isteklerini gösterir--https 443 6443, 443 ve 6443 portlarındaki TCP bağlantılarının HTTPS olarak ele alınmasını sağlar--insecure-skip-tls-verify, kubectl httptap’in oluşturduğu sertifika otoritesini kullanmadığı için gereklidir
curl --doh-url https://cloudflare-dns.com/dns-queryörneği DNS-over-HTTP akışını gösterir- İlk iki istek DNS sorgusudur
- Sonraki iki istek hedef siteye yönelik normal HTTP istekleridir
--headve--bodyseçenekleri birlikte kullanıldığında HTTP header’ları ve ham payload çıktılanır
HAR çıktısı
--dump-har out.harseçeneğiyle HTTP istek ve yanıtları bir HAR dosyasına dökülebilir- Oluşturulan HAR dosyası çeşitli HAR görüntüleyicilerde görselleştirilebilir
- Örnek olarak Google HAR Analyzer verilmiştir
- Örnek HAR’da
https://monasticacademy.orgiçin308 Redirectisteği vehttps://www.monasticacademy.orgiçin200 OKisteği yer alır
localhost erişimi
- httptap içinde host’un localhost portlarına erişmek için
localhostyerinehost.httptap.localveya169.254.77.65kullanılır - Linux’ta her network namespace kendi loopback cihazı olan
127.0.0.1’e sahip olduğu için, httptap içindeki127.0.0.1:1234, host’un aynı adres ve portu değildir - httptap, bu sorunu aşmak için
169.254.77.65adresini127.0.0.1’e yönlendirecek şekilde hardcode etmiştir
Daemon hâline gelen alt süreçler
- Linux’ta, özgün süreç sonlandıktan sonra da kalan alt süreçler oluşturulabilir
- Bu, daemon’larda ve komut satırından çalıştırılan GUI uygulamalarında yaygın bir yöntemdir
- Bu tür bir süreç httptap altında çalıştırılırsa daemon hâline gelen süreç httptap’in network namespace’i içinde kalmaya devam eder
--no-exitseçeneği, hemen çalıştırılan alt süreç sonlandıktan sonra da httptap’in proxy ve logging işlemlerini sürdürmesini sağlar- Visual Studio Code örneğinde
httptap --no-exit -- code --ignore-certificate-errors .biçimi kullanılır - Çıkmak için VS Code’u kapattıktan sonra
Ctrl+Cile httptap sonlandırılmalıdır
- Visual Studio Code örneğinde
--no-exitolmadan önce httptap sonlanırsa network namespace kalsa bile TUN cihazındaki paketleri okuyan süreç olmadığından uygulamanın ağ bağlantısı kesilirsetsid setsid curl http://httpbin.org/getve Python’dakifork,setsid,forkörneklerinde de--no-exityoksaCould not resolve hosthatası oluşur
Çalışma şekli
httptap -- <command>,<command>komutunu izole bir network namespace içinde çalıştırır ve anında oluşturduğu sertifika otoritesini enjekte ederek HTTPS trafiğini çözer- Linux’un TUN cihazını oluşturarak tüm ağ trafiğinin bu cihaz üzerinden geçeceği şekilde alt süreç ortamını yapılandırır
- TUN cihazına yazılan trafik, o cihazı oluşturan sürecin sahip olduğu file descriptor’a iletilir
- Root network namespace değiştirilirse sistem genelindeki trafiği etkilediğinden httptap ayrı bir network namespace oluşturur
- Bu namespace içinde yalnızca loopback cihazı ve TUN cihazı bulunur
- Alt süreç bu namespace içinde çalıştırılır
- TUN cihazından alınan trafik ham IP paketleridir
- httptap IP paketlerini ve içlerindeki TCP/UDP paketlerini parse eder
- Alt sürece yeniden ham IP paketleri yazması gerekir
- Kendi TCP/IP implementasyonu, tüm TCP protokolünün birçok bölümünden yoksun olsa da amaç için makul şekilde çalışır
- Alt süreç
www.example.comadresine istek yaptığında httptap, hedef IP’ye giden TCP SYN’i alır ve SYN+ACK ile yanıtlar- Ayrı olarak Linux kernel’inin normal socket API’sini kullanarak gerçek hedef IP ile TCP bağlantısı kurar
- Ardından verileri iki yönde aktarır
- Bu yapı geleneksel şeffaf TCP proxy’dir
- HTTPS şifre çözme, sertifika otoritesi enjeksiyonu ile yapılır
- Başlangıçta private key ve x509 certificate’e karşılık gelen bir sertifika otoritesi oluşturur
- Sertifikayı yalnızca alt sürece görünen dosya sistemine yazar
- Alt sürece özel ortam değişkenleri ayarlayarak bu sertifika otoritesini güven listesine ekler
- httptap sertifika otoritesinin private key’ine sahip olduğu için alt sürecin iletişim kurmak istediği sunucuymuş gibi kendini kanıtlayabilir ve düz metin HTTP isteklerini okuyabilir
Kısıtlar
- Şimdilik yalnızca Linux içindir ve network namespace gibi Linux’a özgü sistem çağrılarına dayanır
- Süreç gelen ağ bağlantılarını dinleyemez
/dev/net/tunerişim izni gerekir- Tüm ICMP echo istekleri, gerçek ağa ICMP paketi göndermeden olduğu gibi echo edilir
2 yorum
ABD’nin Vermont eyaletindeki Monastic Academy’de geliştirilmiş. Manastır programının ve daha genel olarak Budist ruhani yol pratiğinin, teknolojik geliştirme için ideal koşullar sağladığına inanıyoruz.
Hacker News yorumları
README’deki “How it was made” bölümü, aracın kendisi kadar ilginçti.
100 acre’dan biraz büyük bir arazide birlikte yaşayıp pratik yaptıklarını; sabah akşam birlikte ilahi okuyup meditasyon yaptıklarını; her ay yaklaşık 1 hafta meditasyon inzivası düzenleyip buna katıldıklarını söylüyorlar. Kalan zamanda arazi yönetimi, bina bakımı, yemek, temizlik, planlama, bağış toplama ve son birkaç yıldır yazılım geliştirmeyi de birlikte yaptıkları anlatılıyor.
Mikrokod ve mantığın nanosaniye ölçeğinde sorun çıkardığı bir dönemde, aşırı çalışmış bir mühendisin işten ayrılırken terminaline istifa notu olarak şunu bıraktığı söylenir: “Vermont’taki bir komüne gidiyorum ve mevsimlerden daha kısa zaman birimleriyle uğraşmayacağım.”
Bunun iyi bir fikir olup olmadığı ya da hayal ettikleri sonuca götürüp götürmeyeceği ayrı mesele.
Teknoloji ile meditasyonun birleşimi çekici. Fikrin kendisi cazip, ama bunu gerçekten yapmak muhtemelen zor olur. Bir tür Budist Recurse gibi görünüyor.
httptap, root yetkisi olmadan çalıştırılabilen süreç kapsamlı bir HTTP izleyici.
httptap <program>şeklinde bir Linux programı çalıştırdığınızda, standart çıktıda HTTP/HTTPS istek ve yanıt izlerini görebiliyorsunuz.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)İzole bir network namespace içinde çalıştırma yöntemi kullanıyor ve kendi TCP/IP yığını için gVisor’dan yararlanıyor. Bir HTTP proxy’si olmadığı için proxy ayarlarına bağlı değil. TLS trafiğini anında bir CA oluşturarak çözüyor;
iptableskuralları yüklemiyor veya sistem genelinde değişiklik yapmıyor.netstackkütüphanesi olarak kullanıyor.Özellikle proxy ayarı gerekmiyorsa daha da kullanışlı olur.
https://blog.wireshark.org/2010/02/running-wireshark-as-you/
Süreci izole bir network namespace içinde çalıştırma fikri dahice.
HTTPS kısmı daha da ilginç. Programın geçici dizindeki CA paketini kullanması için ortak ortam değişkenlerini[1] ayarlıyor gibi görünüyor; ancak
http_proxytürevlerine benzer şekilde, programın bu değişkenleri basitçe yok sayabilmesi sorunu var./etc/resolv.confüzerine overlay dosya sistemi bağladığını da görüyorum[2]. httptap’in/etc/ca-certificatesdizinini geçici CA paketi olarak mount etmesinin yardımcı olup olmayacağını merak ediyorum.[1] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
[2] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
httptap’in
/etc/resolv.confüzerine overlay mount etmesinin nedeni de, DNS çözümlemede de CA root’a benzer şekilde rastgele bir sürece hangi DNS sunucusunu kullanacağını kesin biçimde söylemenin bir yolu olmaması. Yine de/etc/resolv.confoldukça güvenilir bir seçenek. Bir süreci network namespace içine koyduğunuz anda, masaüstü Linux’ta en yaygın ayar olan systemd resolverlocalhost:53’e artık erişemezsiniz; bu yüzden DNS çözümleme sağlamak gerekir./etc/ca-certificates’ı overlay olarak mount etmek de yardımcı olabilir. Ancak o dizin yapısına baktığımda dağıtımdan dağıtıma fazlasıyla tutarsız olduğunu görüp şaşırdım. Yine de yapılabilir. En azından bazı TLS uygulamalarının tanıyacağı şekilde o dizine sertifika ekleme konusunda bilgisi olan varsa duymak isterim.Karşı örnek olarak, TLS ile iletişim kuran ve derlenmiş kodu güçlü biçimde obfuscate edilmiş bir zararlı yazılımı düşünebilirsiniz. Sabitlenmiş bir CA sertifika demetini ikili dosyaya gömmüş ve dosya sistemini hiç açmayan bir program olabilir. Yine de çoğu root CA sertifikası süresi dolmadan yaklaşık 10 yıl geçerli kalır ve güvenli TLS bağlantıları kurabilir. TLS tamamen kullanıcı alanında işlenir; OpenSSL ya da başka ortak bir kütüphane kullandığına dair garanti yoktur, bu yüzden belirli OpenSSL fonksiyonlarına hook uygulama yöntemine de güvenilemez. Sunucu self-signed sertifika kullanıyor ve istemci bunu herhangi bir nedenle kabul ediyorsa durum daha da kötüleşir.
Yine de biraz çalışmayla vakaların %99’unu güvenilir biçimde ele almak kesinlikle mümkün. Hiç olmamasından iyidir.
Burada TUN aygıtı kullanmak gerçekten harika bir fikir. README’deki “How it was made” bölümü de GitHub README’lerinde okuduklarım arasında en üst seviyede
Subtrace[1] diye bir şey geliştiriyorum; hem gelen hem de giden istekleri otomatik olarak yakalayabiliyor. Programı başlatma arayüzünün de aynı biçime yakınsamış olması komik[2]. Ancak Subtrace’in amacı httptap’ten biraz farklı; bulut backend servislerinin gözlemlenebilirlik/izleme tarafına daha yakın olduğu için çift yönlü istekleri vurguluyor. Yaklaşım da farklı. Seccomp BPF ile
socket,connect,listen,acceptvb. yaklaşık 10 sistem çağrısını yakalayıp tüm TCP bağlantılarını Subtrace üzerinden proxy’liyor. Ardından TCP akışından HTTP isteklerini ayrıştırıyor ve Chrome DevTools’un Network sekmesini, sıradan bir web uygulaması gibi tarayıcıda çalışacak şekilde yeniden kullanarak kullanıcıya gösteriyorhttptap altında program çalıştırırken ortaya çıkan ilginç anekdotlar var mı merak ediyorum. Hangi programın en çok eve telefon ettiğini de merak ediyorum
[1] https://github.com/subtrace/subtrace
[2] https://docs.subtrace.dev/quickstart
https://github.com/M66B/NetGuard
İnanması zor olabilir ama Firefox ağ sekmesi için aynı şeyi yapmaya yönelik yarım kalmış bir deneme de depodaki
networktabdizininde var. Çok havalı bir proje; daha fazlasını öğrenmek isterim, daha fazla konuşabiliriz deYetkisiz bir kullanıcının ağ trafiğini analiz etmesi için başka bir araç olarak rootless Podman ve Pasta kullanılabilir
podman runseçeneklerine şunu eklemek yeterli--network=pasta:--pcap,myfile.pcapBöylece Pasta ağ trafiğini bir PCAP dosyasına kaydeder ve daha sonra analiz edilebilir.
tsharkile kaydedilmiş PCAP dosyasını analiz eden basit bir örnek de yazdımhttps://github.com/eriksjolund/podman-networking-docs?tab=re...
Oldukça ilginç. Go uygulamalarında benzer bir “tap” işlevi gören bir kütüphane yazmıştım: https://github.com/henvic/httpretty
https://asciinema.org/a/297429
Rastgele bir program için bunu bu şekilde yapmayı da düşünmüştüm ama gerçekte nasıl uygulanacağını derinlemesine kurcalamamıştım. Birinin bunu yaptığını görmek sevindirici
Neden eBPF kullanmadığını merak ediyorum. Böylece hâlihazırda çalışanlar dahil tüm süreçlerin HTTP isteklerini tek seferde görebilirdi. Üstelik TLS ile uğraşmaya da gerek kalmadan, örneğin
write(2)’ye hook koymak yeterli olur gibiwrite(2)’ye hook koymanın TLS’i nasıl çözdüğünü anlamıyorum. Şifreli metni okuyup değiştirebilirsiniz, ama süreç düz metin baytlarıylawrite(2)çağırmadığı için gerçek HTTP isteğini okuyamazsınız. Sonuçta ağın üzerine çıkan şifreli baytları görürsünüz; onu NSA de görebilirhttptap’in kullandığı türden bir CA sertifikası hilesi gerekir. Elbette sertifika sabitleme gibi dikkat edilmesi gereken noktalar var, ama pratik senaryoların çoğunda güvenilir çalışacak hâle getirilebilir
Subtrace[1]’i geliştirirken bu belirli sorun üzerine saçma denecek kadar çok düşündüm; daha basit ya da daha zarif bir yaklaşım varsa gerçekten ilgilenirim
[1] https://github.com/subtrace/subtrace
writesistem çağrısına hook koymak TLS şifre çözme konusunda yardımcı olmazHer hâlükârda seçenek ne kadar çoksa o kadar iyi
Harika. nginx yapılandırma hata ayıklaması için hemen kullanacak gibiyim
Şu anda
curl -vkullanıp çıktıda neyin yanlış gittiğini elle taramam gerekiyor; bu araçla yönlendirme döngüsü gibi şeyler hemen ortaya çıkacak gibiBir uygulamanın HTTP/S çağrı yığınını hızlı ve kaba bir şekilde incelemek gerektiğinde çok iyi görünüyor
Kişisel olarak her şeyi görmek için eBPF’yi tercih ederim, ama bu yardımcı araç eBPF izlerinde önemli kısımlara odaklanmaya yardımcı olabilir
İyi görünüyor
GitHub profili https://www.monasticacademy.org/about adresini gösteriyor; bunun kendisi hakkında özel bir yorumum yok ama onların manastır tarzı eğitim inzivalarıyla GitHub projesinin nasıl bağlantılı olduğunu merak etmiştim
README’nin en altına bakınca bağlantının açıklandığını gördüm: https://github.com/monasticacademy/httptap?tab=readme-ov-fil...
Bunun anlamı, Vermont’taki 123 dönümlük arazide insanların nispeten geleneksel bir Budist manastır yapısına göre birlikte yaşaması. Ancak resmen rahiplik yemini etmiş keşişler değiller. Gündüzleri çeşitli teknik/teknik olmayan projeler üzerinde birlikte çalışıyorlar. Yukarıdaki README bağlantısı iyi bir genel bakış sunuyor
https://github.com/monasticacademy/httptap?tab=readme-ov-fil...