8 puan yazan GN⁺ 2025-02-04 | 2 yorum | WhatsApp'ta paylaş
  • 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, iptables kuralı 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 sysctl ayarı gerekebilir; gelen bağlantıları dinleme ve /dev/net/tun erişimi gibi kısıtlar bulunur

httptap ne yapar

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
    • iptables kuralı 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=0
    • sudo 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, sunucunun 302 yönlendirmesi döndürdüğünü gösterir
  • curl -sL gibi yönlendirmeleri takip ettirirseniz ek istekler de gösterilir
    • İlk istek 302
    • İkinci istek, yönlendirme hedefi URL için 200
  • gcloud compute instances list örneğinde Google Cloud CLI’ın içeride kullandığı HTTP endpoint’leri görülebilir
  • 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
  • --head ve --body seçenekleri birlikte kullanıldığında HTTP header’ları ve ham payload çıktılanır

HAR çıktısı

localhost erişimi

  • httptap içinde host’un localhost portlarına erişmek için localhost yerine host.httptap.local veya 169.254.77.65 kullanılır
  • Linux’ta her network namespace kendi loopback cihazı olan 127.0.0.1’e sahip olduğu için, httptap içindeki 127.0.0.1:1234, host’un aynı adres ve portu değildir
  • httptap, bu sorunu aşmak için 169.254.77.65 adresini 127.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-exit seç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+C ile httptap sonlandırılmalıdır
  • --no-exit olmadan önce httptap sonlanırsa network namespace kalsa bile TUN cihazındaki paketleri okuyan süreç olmadığından uygulamanın ağ bağlantısı kesilir
  • setsid setsid curl http://httpbin.org/get ve Python’daki fork, setsid, fork örneklerinde de --no-exit yoksa Could not resolve host hatası 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.com adresine 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/tun erişim izni gerekir
  • Tüm ICMP echo istekleri, gerçek ağa ICMP paketi göndermeden olduğu gibi echo edilir

2 yorum

 
halfenif 2025-02-06

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.

Test ederken GitHub’a baktım. Manastır eğitimi mi? Yapanların bunu ruhani bir kazanımın parçası olarak geliştirmiş olabileceğini düşündürüyor.

 
GN⁺ 2025-02-04
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.

    • “Soul of a New Machine”den bir pasaj akla geliyor.
      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.”
    • Açıkçası, Batı dünyasının çeşitli yerlerinde zaten var olan çok sayıdaki yoga/spiritüellik tarikatından biri gibi geliyor.
    • “Son birkaç yıldır Buddhism for AI adlı bir ders serisini kaydediyoruz. Bu, yapay zeka sistemlerinin doğrudan tüketebilmesi için Budizm temelli bir din, evet din, tasarlama çabasıyla ilgili. Dünyanın durumunu düşününce bunun çok önemli olduğunu hissediyoruz” kısmı, içinde yaşadığımız çağın ne kadar tuhaf olduğunun bir göstergesi gibi geliyor.
      Bunun iyi bir fikir olup olmadığı ya da hayal ettikleri sonuca götürüp götürmeyeceği ayrı mesele.
    • İlk kırsal fotoğrafın üretilmiş bir görsel olduğunu sanmıştım, ama şimdi gerçek bir fotoğraf gibi görünüyor.
      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; iptables kuralları yüklemiyor veya sistem genelinde değişiklik yapmıyor.

    • macOS’ta da çalıştırılabilir mi merak ediyorum. Bildiğim kadarıyla Tailscale, macOS’taki bazı işlevlerinde gVisor’ın TCP/IP kütüphanesini netstack kütüphanesi olarak kullanıyor.
    • İstekleri veya yanıtları değiştirmek mümkün mü merak ediyorum. Bugünkü web giderek kullanıcıya düşman hale geldikçe bu tür araçlara duyulan ihtiyaç her zamankinden daha fazla.
      Özellikle proxy ayarı gerekmiyorsa daha da kullanışlı olur.
    • Root olmadan da çalıştırılabilen Wireshark’ı herkes unuttu mu diye düşünüyorum.
      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_proxy tü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-certificates dizinini 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...

    • Rastgele bir sürece CA root belirtmenin üzerinde uzlaşılmış ya da sistemin zorunlu kıldığı bir yolu neredeyse hiç olmaması sinir bozucu; buna katılıyorum.
      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.conf oldukç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 resolver localhost: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.
    • HTTPS kısmı için her tür programı ve uzun kuyruktaki sertifika pinning uygulamalarını kapsayan genel bir çözüm olmadığını düşünüyorum.
      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, accept vb. 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österiyor

    httptap 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

    • Android’in VPN hizmetini kullanarak paket filtreleme yapan NetGuard aklıma geldi. Ham TUN yerine Android VPN hizmetini kullanıyor
      https://github.com/M66B/NetGuard
    • Yakalanan içeriği Chrome DevTools’a bağlamak da ilginç, eBPF kullanmak da ilginç. Geliştirici araçlarını bağımsız bir web uygulaması olarak çalışır hâle getirmesi de harika
      İnanması zor olabilir ama Firefox ağ sekmesi için aynı şeyi yapmaya yönelik yarım kalmış bir deneme de depodaki networktab dizininde var. Çok havalı bir proje; daha fazlasını öğrenmek isterim, daha fazla konuşabiliriz de
  • Yetkisiz bir kullanıcının ağ trafiğini analiz etmesi için başka bir araç olarak rootless Podman ve Pasta kullanılabilir
    podman run seçeneklerine şunu eklemek yeterli

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

    Böylece Pasta ağ trafiğini bir PCAP dosyasına kaydeder ve daha sonra analiz edilebilir. tshark ile kaydedilmiş PCAP dosyasını analiz eden basit bir örnek de yazdım
    https://github.com/eriksjolund/podman-networking-docs?tab=re...

    • Bilmek çok iyi, ama hâlâ TLS trafiğini şifre çözme sorunu kalıyor
  • 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 gibi

    • write(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ıyla write(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örebilir
      httptap’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
    • Ne yazık ki TLS çekirdekte değil, uygulamanın içinde gerçekleştiğinden eBPF ile write sistem çağrısına hook koymak TLS şifre çözme konusunda yardımcı olmaz
    • SSL kütüphanesine uprobe takılırsa, şifresi çözülmüş HTTP yanıtları gibi içerikleri inceleyip değiştirerek içerik filtrelemek mümkün olur mu merak ediyorum
    • eBPF muhtemelen root yetkisi gerektirmez mi diye düşünüyorum
    • Bu yöntem root gerektirmez mi? httptap’in büyük “satış noktası” tam olarak root yetkisi gerektirmemesi gibi görünüyor
      Her 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 -v kullanıp çıktıda neyin yanlış gittiğini elle taramam gerekiyor; bu araçla yönlendirme döngüsü gibi şeyler hemen ortaya çıkacak gibi

    • Gerçek kullanım bağlamında nasıl çalıştığını, özellikle hangi özelliklerin faydalı olacağını duymak isterim
  • Bir 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...

    • Bu başlığı görenler için söylemek gerekirse, bağlantı noktası basitçe httptap’in bir Monastic Academy projesi olması
      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...