8 पॉइंट द्वारा GN⁺ 2025-02-04 | 2 टिप्पणियां | WhatsApp पर शेयर करें
  • httptap एक ऐसा टूल है जो httptap -- <command> के रूप में Linux प्रोग्राम चलाकर उस प्रोग्राम द्वारा किए गए HTTP/HTTPS अनुरोधों और प्रतिक्रियाओं का सारांश terminal में दिखाता है
  • यह root permission, daemon, system-wide बदलाव, iptables rules, या routing table बदलावों के बिना काम करता है, और executable बिना dependencies वाला static Go binary है
  • फिलहाल यह केवल Linux के लिए है, और बताया गया है कि network namespace जैसी Linux-specific system calls का उपयोग करने के कारण इसे दूसरे operating systems पर port करना मुश्किल है
  • HTTPS traffic को runtime पर तुरंत बनाई गई certificate authority को subprocess environment में inject करके decrypt किया जाता है, और यह raw IP/TCP/UDP packets को process करने वाले transparent TCP proxy तरीके से काम करता है
  • Ubuntu 23.10 या उससे ऊपर, या उन distributions में जहाँ unprivileged user namespace default रूप से disabled है, sysctl setting की ज़रूरत हो सकती है; incoming connections सुनने और /dev/net/tun access जैसी सीमाएँ भी हैं

httptap क्या करता है

  • httptap किसी भी Linux command को wrap करके चलाता है और उस command द्वारा किए गए HTTP/HTTPS अनुरोध दिखाता है
  • Python requests.get('https://monasticacademy.org') उदाहरण में redirects follow होते हैं और दो requests दिखाई जाती हैं

Installation और run conditions

  • pre-built binaries latest release tarball डाउनलोड करके install किए जा सकते हैं
    • सभी versions और CPU architectures releases पर देखे जा सकते हैं
  • Go के जरिए installation भी उपलब्ध है
    • go install github.com/monasticacademy/httptap@latest
  • आम तौर पर चलाने के लिए root permission की ज़रूरत नहीं होती, और daemon या system-wide settings भी जरूरी नहीं हैं
    • iptables rules नहीं बनाता
    • routing table नहीं बदलता
    • उसी system के दूसरे processes पर आम तौर पर असर नहीं डालता
  • Ubuntu 23.10 या उससे ऊपर में नीचे की settings चाहिए
    • sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0
    • sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
  • यह setting हाल की kernel feature को disable करती है जो unprivileged user namespace को restrict करती है
    • जिन अन्य distributions में unprivileged user namespace default रूप से disabled है, वहाँ भी इसकी ज़रूरत हो सकती है
    • httptap के साथ AppArmor profile देकर इस आवश्यकता को हटाने का तरीका जांचा जा रहा है

Usage examples

  • curl -s https://buddhismforai.sutra.co -o /dev/null चलाने का उदाहरण दिखाता है कि server ने 302 redirect लौटाया
  • curl -sL की तरह redirects follow कराने पर अतिरिक्त requests भी दिखाई देती हैं
    • पहली request 302
    • दूसरी request redirect target URL के लिए 200
  • gcloud compute instances list उदाहरण में Google Cloud CLI द्वारा internally इस्तेमाल किए जाने वाले HTTP endpoints देखे जा सकते हैं
  • kubectl get all उदाहरण Kubernetes API server requests दिखाता है
    • --https 443 6443 443 और 6443 ports की TCP connections को HTTPS के रूप में treat कराता है
    • --insecure-skip-tls-verify इसलिए चाहिए क्योंकि kubectl httptap द्वारा बनाई गई certificate authority का उपयोग नहीं करता
  • curl --doh-url https://cloudflare-dns.com/dns-query उदाहरण DNS-over-HTTP flow दिखाता है
    • पहली दो requests DNS lookup हैं
    • अगली दो requests target site के लिए सामान्य HTTP requests हैं
  • --head और --body options साथ में इस्तेमाल करने पर HTTP headers और raw payload print होते हैं

HAR output

  • --dump-har out.har option से HTTP requests और responses को HAR file में dump किया जा सकता है
  • बनी हुई HAR file को कई HAR viewers में visualize किया जा सकता है
  • example HAR में https://monasticacademy.org के लिए 308 Redirect request और https://www.monasticacademy.org के लिए 200 OK request शामिल होती है

localhost access

  • httptap के अंदर से host के localhost port तक access करने के लिए localhost की जगह host.httptap.local या 169.254.77.65 इस्तेमाल करें
  • Linux में हर network namespace का अपना loopback device, 127.0.0.1, होता है, इसलिए httptap के अंदर 127.0.0.1:1234 host के उसी address और port जैसा नहीं होता
  • httptap इस समस्या को bypass करने के लिए 169.254.77.65 को 127.0.0.1 पर route करने के लिए hardcode करता है

Daemonize होने वाले subprocesses

  • Linux में ऐसे subprocesses बनाए जा सकते हैं जो original process के खत्म होने के बाद भी बने रहते हैं
    • यह daemons और command line से चलाए गए GUI apps में आम तरीका है
  • ऐसे process को httptap के तहत चलाने पर daemonized process httptap के network namespace के अंदर ही बना रहता है
  • --no-exit option तुरंत चलाए गए subprocess के खत्म होने के बाद भी httptap को proxy और logging जारी रखने देता है
    • Visual Studio Code उदाहरण में httptap --no-exit -- code --ignore-certificate-errors . रूप इस्तेमाल किया जाता है
    • बंद करने के लिए VS Code बंद करने के बाद Ctrl+C से httptap बंद करना होगा
  • अगर --no-exit के बिना httptap पहले बंद हो जाए, तो network namespace बचा रह सकता है, लेकिन TUN device के packets पढ़ने वाला process न होने से app का network connection कट जाता है
  • setsid setsid curl http://httpbin.org/get और Python के fork, setsid, fork उदाहरणों में भी --no-exit न हो तो Could not resolve host error आता है

यह कैसे काम करता है

  • httptap -- <command> <command> को isolated network namespace में चलाता है और runtime पर बनाई गई certificate authority inject करके HTTPS traffic decrypt करता है
  • यह Linux का TUN device बनाता है और subprocess environment को इस तरह configure करता है कि पूरा network traffic उसी device से होकर गुजरे
    • TUN device पर लिखा गया traffic उस device को बनाने वाले process के file descriptor तक पहुंचता है
  • root network namespace बदलने से system के पूरे traffic पर असर पड़ेगा, इसलिए httptap अलग network namespace बनाता है
    • उस namespace में केवल loopback device और TUN device होते हैं
    • subprocess इसी namespace के अंदर चलता है
  • TUN device से मिला traffic raw IP packets होता है
    • httptap IP packets और अंदर के TCP/UDP packets parse करता है
    • उसे subprocess की ओर फिर से raw IP packets लिखने पड़ते हैं
    • इसकी अपनी TCP/IP implementation में पूरे TCP protocol के कई हिस्से नहीं हैं, लेकिन उद्देश्य के लिए यह ठीक-ठाक काम करती है
  • जब subprocess www.example.com पर request करता है, तो httptap target IP की ओर जाने वाला TCP SYN प्राप्त करता है और SYN+ACK से response देता है
    • अलग से Linux kernel की normal socket API का उपयोग करके actual target IP से TCP connection बनाता है
    • इसके बाद दोनों दिशाओं में data relay करता है
    • यह structure traditional transparent TCP proxy है
  • HTTPS decryption certificate authority injection से की जाती है
    • start होने पर private key और x509 certificate से संबंधित certificate authority बनाता है
    • certificate को ऐसे filesystem में लिखता है जो सिर्फ subprocess को दिखता है
    • environment variables set करता है जो सिर्फ subprocess को दिखते हैं ताकि उस certificate authority को trust list में जोड़ा जा सके
    • httptap के पास certificate authority की private key होती है, इसलिए वह खुद को उस server की तरह prove कर सकता है जिससे subprocess communicate करना चाहता है, और plaintext HTTP requests पढ़ सकता है

सीमाएँ

  • फिलहाल यह केवल Linux है और network namespace जैसी Linux-specific system calls पर निर्भर करता है
  • process incoming network connections नहीं सुन सकता
  • /dev/net/tun access permission चाहिए
  • सभी ICMP echo requests को actual network पर ICMP packets भेजे बिना वैसा ही echo कर दिया जाता है

2 टिप्पणियां

 
halfenif 2025-02-06

इसे अमेरिका के Vermont स्थित Monastic Academy में विकसित किया गया था। हमारा मानना है कि मठ जैसा शेड्यूल, और व्यापक रूप से बौद्ध आध्यात्मिक मार्ग का अभ्यास, तकनीकी विकास के लिए आदर्श परिस्थितियाँ प्रदान करते हैं।

टेस्ट करते हुए GitHub देखा तो लगा, शायद मठ में साधना करने वाले लोगों ने इसे आध्यात्मिक उपलब्धि के हिस्से के रूप में बनाया है।

 
GN⁺ 2025-02-04
Hacker News की टिप्पणियाँ
  • README का “How it was made” सेक्शन टूल जितना ही दिलचस्प लगा
    वे 100 एकड़ से थोड़ी अधिक ज़मीन पर साथ रहते हैं और साधना करते हैं, सुबह-शाम साथ में जप और ध्यान करते हैं, और हर महीने लगभग 1 हफ्ते का meditation retreat आयोजित करते हैं और उसमें भाग लेते हैं। बाकी समय वे ज़मीन की देखभाल, इमारतों का maintenance, खाना बनाना, सफ़ाई, planning, fundraising, और पिछले कुछ वर्षों से software development भी साथ मिलकर करते हैं

    • इससे “Soul of a new machine” की एक पंक्ति याद आ गई
      बताया गया कि उस दौर में जब microcode और logic nanosecond स्तर पर समस्याएँ पैदा कर रहे थे, एक अत्यधिक थका हुआ engineer नौकरी छोड़ते समय terminal पर इस्तीफ़े के रूप में यह नोट छोड़ गया: “मैं Vermont के एक commune में जा रहा हूँ और मौसम से छोटे किसी भी समय-मानक से अब कोई लेना-देना नहीं रखूँगा”
    • सच कहूँ तो, यह पश्चिमी दुनिया में पहले से मौजूद कई yoga/आध्यात्मिक cults में से एक जैसा लगता है
    • “पिछले कुछ वर्षों में हम Buddhism for AI नाम की lecture series रिकॉर्ड कर रहे हैं। यह AI systems द्वारा सीधे consume किए जा सकने वाले बौद्ध-आधारित religion, हाँ religion, को design करने की कोशिश के बारे में है। दुनिया की हालत को देखते हुए हमें लगता है कि यह काम बहुत महत्वपूर्ण है” — यह हिस्सा इस बात का पैमाना जैसा लगता है कि हम कितने अजीब समय में जी रहे हैं
      यह अच्छा विचार है या नहीं, और क्या इससे वही नतीजे निकलेंगे जैसा वे सोचते हैं, यह अलग बात है
    • पहले ग्रामीण इलाके वाली तस्वीर मुझे generated image लगी थी, लेकिन अब लगता है कि वह असली फोटो है
      technology और meditation का मेल आकर्षक है। idea अपने आप में दिलचस्प है, लेकिन इसे वास्तव में करना शायद कठिन होगा। यह किसी तरह के Buddhist Recurse जैसा लगता है
  • httptap एक process-scoped HTTP tracer है जिसे root privileges के बिना चलाया जा सकता है
    httptap <프로그램> की तरह Linux program चलाने पर standard output में HTTP/HTTPS requests और responses का trace देखा जा सकता है

    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)

    यह isolated network namespace के अंदर चलने के तरीके पर आधारित है, और अपने TCP/IP stack के लिए gVisor का उपयोग करता है। यह HTTP proxy नहीं है, इसलिए proxy settings पर निर्भर नहीं करता। TLS traffic को on-the-fly CA generate करके decrypt करता है, और iptables rules install नहीं करता या global system changes नहीं करता

    • क्या इसे macOS पर भी चलाना संभव बनाया जा सकता है, यह जानने की जिज्ञासा है। मुझे पता है कि Tailscale macOS की कुछ functionality में gVisor की TCP/IP library को netstack library के रूप में इस्तेमाल करता है
    • क्या requests या responses को modify किया जा सकता है, यह जानना चाहता हूँ। आज की web उपयोगकर्ताओं के प्रति लगातार अधिक hostile होती जा रही है, इसलिए ऐसे tools की ज़रूरत पहले से ज़्यादा है
      खासकर अगर proxy settings की ज़रूरत न हो तो यह और उपयोगी होगा
    • क्या सब लोग root के बिना चलने वाले Wireshark को भूल गए हैं?
      https://blog.wireshark.org/2010/02/running-wireshark-as-you/
  • किसी process को isolated network namespace में चलाने का idea कमाल का है
    HTTPS वाला हिस्सा और भी दिलचस्प है। लगता है कि program पर temporary directory के CA bundle का उपयोग करने के लिए common environment variables[1] सेट किए जाते हैं, लेकिन http_proxy variations की तरह यहाँ भी समस्या है कि program उन variables को सीधे ignore कर सकता है

    /etc/resolv.conf पर overlay filesystem mount करना भी दिखाई देता है[2]। सोच रहा हूँ कि अगर httptap /etc/ca-certificates directory पर temporary CA bundle mount करे तो क्या उससे मदद मिलेगी

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

    • मैं इस बात से सहमत हूँ कि किसी arbitrary process के लिए CA root निर्दिष्ट करने का कोई सहमत या system-enforced तरीका लगभग नहीं है, जो काफ़ी निराशाजनक है
      httptap /etc/resolv.conf पर overlay mount इसलिए करता है क्योंकि DNS resolution भी CA root की तरह ही है: किसी arbitrary process को निश्चित रूप से यह बताने का कोई पक्का तरीका नहीं कि उसे कौन-सा DNS server इस्तेमाल करना चाहिए। फिर भी /etc/resolv.conf काफ़ी भरोसेमंद विकल्प है। जैसे ही आप process को network namespace में डालते हैं, desktop Linux की सबसे आम configuration, systemd resolver localhost:53, अब सुलभ नहीं रहता, इसलिए DNS resolution उपलब्ध कराना पड़ता है
      /etc/ca-certificates को overlay के रूप में mount करना भी मददगार हो सकता है। लेकिन जब मैंने उस directory structure को देखा तो यह देखकर हैरानी हुई कि अलग-अलग distributions में इसमें बहुत कम consistency है। फिर भी यह संभव है। कम-से-कम कुछ TLS implementations द्वारा पहचाने जाने वाले तरीके से उस directory में certificate जोड़ने का ज्ञान अगर किसी के पास हो, तो मैं सुनना चाहूँगा
    • मुझे नहीं लगता कि HTTPS हिस्से के लिए ऐसा कोई सामान्य समाधान है जो हर तरह के program और long-tail certificate pinning implementations तक को cover कर सके
      counterexample के रूप में, ऐसा malware सोचिए जो TLS पर communicate करता हो, compiled code को बहुत मज़बूती से obfuscate किया गया हो, binary में pinned CA certificates का bundle शामिल हो, और जो filesystem को बिल्कुल न खोलता हो। फिर भी, अधिकांश root CA certificates की expiry से पहले लगभग 10 साल तक वह valid और सुरक्षित TLS connections बना सकता है। TLS पूरी तरह user space में handle होता है, और यह भी तय नहीं कि वह OpenSSL या कोई और common library इस्तेमाल कर रहा हो, इसलिए किसी खास OpenSSL function पर hooking से भी कुछ पक्का नहीं होगा। अगर server self-signed certificate इस्तेमाल करे और client किसी वजह से उसे accept कर ले, तो स्थिति और खराब हो जाती है
      फिर भी, थोड़ा काम करके 99% मामलों को reliably संभालना निश्चित रूप से संभव है। कुछ भी न होने से यह बेहतर है
  • यहाँ TUN device का उपयोग करना वाकई शानदार आइडिया है। README का “How it was made” सेक्शन भी GitHub README में मैंने जो पढ़े हैं, उनमें सबसे बेहतरीन स्तर का है
    मैं Subtrace[1] नाम की एक चीज़ बना रहा हूँ, जो incoming और outgoing request दोनों को अपने-आप intercept कर सकती है। प्रोग्राम शुरू करने का interface भी लगता है कि काफ़ी हद तक उसी तरह converge हो गया है, जो मज़ेदार है[2]। लेकिन Subtrace का उद्देश्य httptap से थोड़ा अलग है, और यह cloud backend service की observability/monitoring दिशा के ज़्यादा करीब है, इसलिए यह bidirectional requests पर ज़ोर देता है। इसका approach भी अलग है। यह Seccomp BPF से socket, connect, listen, accept आदि लगभग 10 system call intercept करता है और सभी TCP connection को Subtrace के ज़रिए proxy करता है। उसके बाद TCP stream से HTTP request parse करता है, और Chrome DevTools के Network tab को reuse करके उसे browser में एक सामान्य web app की तरह चलाकर यूज़र को दिखाता है

    मैं जानना चाहता हूँ कि httptap के नीचे प्रोग्राम चलाते समय कोई मज़ेदार किस्सा सामने आया या नहीं। यह भी जानना चाहता हूँ कि कौन-सा प्रोग्राम सबसे ज़्यादा "घर फोन" करता है

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

    • इससे Android की VPN service का इस्तेमाल करके packet filtering करने वाला NetGuard याद आता है। यह raw TUN की जगह Android VPN service का इस्तेमाल करता है
      https://github.com/M66B/NetGuard
    • captured content को Chrome DevTools से जोड़ना भी दिलचस्प है, और eBPF का उपयोग करना भी दिलचस्प है। developer tools को standalone web app की तरह चलने लायक बनाना भी बेहतरीन है
      यक़ीन करना मुश्किल होगा, लेकिन Firefox network tab के लिए वही काम करने की एक अधूरी-सी कोशिश repository के networktab directory में मौजूद है। यह बहुत शानदार प्रोजेक्ट है, इसलिए मैं और सीखना चाहता हूँ, और इस पर और बात भी हो सकती है
  • बिना privileged access वाले यूज़र के लिए network traffic analyze करने का एक और टूल rootless Podman और Pasta हो सकता है
    बस podman run option में यह जोड़ना होगा

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

    फिर Pasta network traffic को PCAP file में record कर देगा, और बाद में उसका analysis किया जा सकता है। मैंने tshark से recorded PCAP file analyze करने का एक सरल उदाहरण भी लिखा है
    https://github.com/eriksjolund/podman-networking-docs?tab=re...

    • यह जानना बहुत अच्छा है, लेकिन TLS traffic decryption की समस्या फिर भी बनी रहती है
  • काफ़ी दिलचस्प है। मैंने Go application के लिए ऐसा ही “tap” functionality देने वाली एक library लिखी थी: https://github.com/henvic/httpretty
    https://asciinema.org/a/297429

    मैंने किसी arbitrary program के लिए भी इस तरह कुछ करने के बारे में सोचा था, लेकिन उसे वास्तव में कैसे implement किया जाए, इसमें गहराई से नहीं गया। किसी को यह बनाते देखना अच्छा लगा

  • मैं सोच रहा हूँ कि eBPF का इस्तेमाल क्यों नहीं किया गया। तब तो पहले से चल रही चीज़ों सहित सभी process के HTTP request एक साथ देखे जा सकते थे। और शायद TLS की भी चिंता न करनी पड़ती, क्योंकि उदाहरण के लिए write(2) पर hook किया जा सकता है

    • मुझे समझ नहीं आ रहा कि write(2) पर hook करना TLS को कैसे हल करेगा। आप ciphertext को पढ़ और बदल तो सकते हैं, लेकिन process write(2) को plaintext bytes के साथ call नहीं करता, इसलिए असली HTTP request पढ़ा नहीं जा सकता। आख़िर में आपको सिर्फ वही encrypted bytes दिखेंगे जो network पर जा रहे हैं, और वह तो NSA भी देख सकती है
      httptap जिस तरह का CA certificate trick इस्तेमाल करता है, वैसी किसी चीज़ की ज़रूरत होगी। बेशक certificate pinning जैसी सावधानियाँ हैं, लेकिन ज़्यादातर practical scenario में इसे भरोसेमंद तरीके से काम करने लायक बनाया जा सकता है
      Subtrace[1] बनाते समय मैंने इस खास समस्या पर हद से ज़्यादा सोचा है, इसलिए अगर कोई इससे सरल या ज़्यादा elegant approach हो तो उसमें मुझे सचमुच दिलचस्पी है
      [1] https://github.com/subtrace/subtrace
    • दुर्भाग्य से TLS kernel में नहीं बल्कि application के अंदर होता है, इसलिए eBPF से write system call hook करने पर भी TLS decryption में मदद नहीं मिलेगी
    • मैं सोच रहा हूँ कि अगर SSL library पर uprobe लगाया जाए, तो क्या decrypted HTTP response जैसी चीज़ों को inspect और modify करके content filter किया जा सकता है
    • शायद eBPF के लिए root privilege चाहिए होगा?
    • क्या इस तरीके में root की ज़रूरत नहीं पड़ेगी? httptap का बड़ा “selling point” तो यही लगता है कि इसे root privilege की ज़रूरत नहीं है
      वैसे भी, जितने ज़्यादा विकल्प हों उतना अच्छा है
  • शानदार। nginx configuration debugging में मैं इसे तुरंत आज़माना चाहूँगा
    अभी मुझे curl -v का इस्तेमाल करना पड़ता है और output में क्या गड़बड़ है यह हाथ से खोजना पड़ता है, लेकिन इस टूल से redirect loop जैसी चीज़ें तुरंत दिख सकती हैं

    • मैं यह सुनना चाहूँगा कि वास्तविक उपयोग के संदर्भ में यह कैसे काम करता है, खासकर कौन-सी functionality उपयोगी साबित होती है
  • जब ऐप के HTTP/S call stack को जल्दी और मोटे तौर पर देखना हो, तब यह बहुत उपयोगी लगता है
    व्यक्तिगत रूप से मैं सब कुछ देखने के लिए eBPF को प्राथमिकता देता हूँ, लेकिन यह utility eBPF tracing में महत्वपूर्ण हिस्सों को संकरा करके देखने में मदद कर सकती है

  • अच्छा लग रहा है
    GitHub प्रोफ़ाइल https://www.monasticacademy.org/about की ओर इशारा करती है; इस पर अपने-आप में मेरी कोई खास राय नहीं है, लेकिन यह ज़रूर जानने की जिज्ञासा हुई कि इनका मठ-शैली training retreat और GitHub project आपस में कैसे जुड़े हैं।
    README के सबसे नीचे देखा तो इसका संबंध समझाया गया था: https://github.com/monasticacademy/httptap?tab=readme-ov-fil...

    • इस थ्रेड को पढ़ने वालों के लिए कहूँ तो, संबंध बस इतना है कि httptap Monastic Academy का एक प्रोजेक्ट है।
      इसका मतलब यह है कि Vermont में 123-acre ज़मीन पर लोग अपेक्षाकृत पारंपरिक बौद्ध मठ संरचना के अनुसार साथ रहते हैं। हालांकि वे औपचारिक रूप से दीक्षित भिक्षु नहीं हैं। दिन में वे कई tech/non-tech projects पर साथ काम करते हैं। ऊपर दिया गया README लिंक इसका अच्छा overview है।
      https://github.com/monasticacademy/httptap?tab=readme-ov-fil...