Httptap - किसी भी Linux प्रोग्राम के HTTP/HTTPS अनुरोध देख सकता है
(github.com/monasticacademy)- httptap एक ऐसा टूल है जो
httptap -- <command>के रूप में Linux प्रोग्राम चलाकर उस प्रोग्राम द्वारा किए गए HTTP/HTTPS अनुरोधों और प्रतिक्रियाओं का सारांश terminal में दिखाता है - यह root permission, daemon, system-wide बदलाव,
iptablesrules, या 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 है,
sysctlsetting की ज़रूरत हो सकती है; incoming connections सुनने और/dev/net/tunaccess जैसी सीमाएँ भी हैं
httptap क्या करता है
- httptap किसी भी Linux command को wrap करके चलाता है और उस command द्वारा किए गए HTTP/HTTPS अनुरोध दिखाता है
- basic usage
httptap -- <command>है - उदाहरण में
curl https://monasticacademy.orgचलाने परGET https://monasticacademy.org/request और308response दिखता है
- basic usage
- Python
requests.get('https://monasticacademy.org')उदाहरण में redirects follow होते हैं और दो requests दिखाई जाती हैं- पहली request
https://monasticacademy.org/के लिए308 - अगली request
https://www.monasticacademy.org/के लिए200
- पहली request
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 भी जरूरी नहीं हैं
iptablesrules नहीं बनाता- routing table नहीं बदलता
- उसी system के दूसरे processes पर आम तौर पर असर नहीं डालता
- Ubuntu 23.10 या उससे ऊपर में नीचे की settings चाहिए
sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0sudo 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 ने302redirect लौटायाcurl -sLकी तरह redirects follow कराने पर अतिरिक्त requests भी दिखाई देती हैं- पहली request
302 - दूसरी request redirect target URL के लिए
200
- पहली request
gcloud compute instances listउदाहरण में Google Cloud CLI द्वारा internally इस्तेमाल किए जाने वाले HTTP endpoints देखे जा सकते हैंPOST https://oauth2.googleapis.com/tokenGET https://compute.googleapis.com/compute/v1/.../aggregated/instances?...- सामान्य
gcloudoutput और httptap के request logs साथ-साथ दिखाई देते हैं
kubectl get allउदाहरण Kubernetes API server requests दिखाता है--https 443 6443443 और 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और--bodyoptions साथ में इस्तेमाल करने पर HTTP headers और raw payload print होते हैं
HAR output
--dump-har out.haroption से HTTP requests और responses को HAR file में dump किया जा सकता है- बनी हुई HAR file को कई HAR viewers में visualize किया जा सकता है
- उदाहरण के तौर पर Google HAR Analyzer दिया गया है
- example HAR में
https://monasticacademy.orgके लिए308 Redirectrequest औरhttps://www.monasticacademy.orgके लिए200 OKrequest शामिल होती है
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:1234host के उसी 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-exitoption तुरंत चलाए गए subprocess के खत्म होने के बाद भी httptap को proxy और logging जारी रखने देता है- Visual Studio Code उदाहरण में
httptap --no-exit -- code --ignore-certificate-errors .रूप इस्तेमाल किया जाता है - बंद करने के लिए VS Code बंद करने के बाद
Ctrl+Cसे httptap बंद करना होगा
- Visual Studio Code उदाहरण में
- अगर
--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 hosterror आता है
यह कैसे काम करता है
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/tunaccess permission चाहिए- सभी ICMP echo requests को actual network पर ICMP packets भेजे बिना वैसा ही echo कर दिया जाता है
2 टिप्पणियां
इसे अमेरिका के Vermont स्थित Monastic Academy में विकसित किया गया था। हमारा मानना है कि मठ जैसा शेड्यूल, और व्यापक रूप से बौद्ध आध्यात्मिक मार्ग का अभ्यास, तकनीकी विकास के लिए आदर्श परिस्थितियाँ प्रदान करते हैं।
Hacker News की टिप्पणियाँ
README का “How it was made” सेक्शन टूल जितना ही दिलचस्प लगा
वे 100 एकड़ से थोड़ी अधिक ज़मीन पर साथ रहते हैं और साधना करते हैं, सुबह-शाम साथ में जप और ध्यान करते हैं, और हर महीने लगभग 1 हफ्ते का meditation retreat आयोजित करते हैं और उसमें भाग लेते हैं। बाकी समय वे ज़मीन की देखभाल, इमारतों का maintenance, खाना बनाना, सफ़ाई, planning, fundraising, और पिछले कुछ वर्षों से software development भी साथ मिलकर करते हैं
बताया गया कि उस दौर में जब microcode और logic nanosecond स्तर पर समस्याएँ पैदा कर रहे थे, एक अत्यधिक थका हुआ engineer नौकरी छोड़ते समय terminal पर इस्तीफ़े के रूप में यह नोट छोड़ गया: “मैं Vermont के एक commune में जा रहा हूँ और मौसम से छोटे किसी भी समय-मानक से अब कोई लेना-देना नहीं रखूँगा”
यह अच्छा विचार है या नहीं, और क्या इससे वही नतीजे निकलेंगे जैसा वे सोचते हैं, यह अलग बात है
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 करता है, और
iptablesrules install नहीं करता या global system changes नहीं करताnetstacklibrary के रूप में इस्तेमाल करता हैखासकर अगर proxy settings की ज़रूरत न हो तो यह और उपयोगी होगा
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_proxyvariations की तरह यहाँ भी समस्या है कि program उन variables को सीधे ignore कर सकता है/etc/resolv.confपर overlay filesystem mount करना भी दिखाई देता है[2]। सोच रहा हूँ कि अगर httptap/etc/ca-certificatesdirectory पर temporary CA bundle mount करे तो क्या उससे मदद मिलेगी[1] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
[2] https://github.com/monasticacademy/httptap/blob/cb92ee3acfb2...
httptap
/etc/resolv.confपर overlay mount इसलिए करता है क्योंकि DNS resolution भी CA root की तरह ही है: किसी arbitrary process को निश्चित रूप से यह बताने का कोई पक्का तरीका नहीं कि उसे कौन-सा DNS server इस्तेमाल करना चाहिए। फिर भी/etc/resolv.confकाफ़ी भरोसेमंद विकल्प है। जैसे ही आप process को network namespace में डालते हैं, desktop Linux की सबसे आम configuration, systemd resolverlocalhost:53, अब सुलभ नहीं रहता, इसलिए DNS resolution उपलब्ध कराना पड़ता है/etc/ca-certificatesको overlay के रूप में mount करना भी मददगार हो सकता है। लेकिन जब मैंने उस directory structure को देखा तो यह देखकर हैरानी हुई कि अलग-अलग distributions में इसमें बहुत कम consistency है। फिर भी यह संभव है। कम-से-कम कुछ TLS implementations द्वारा पहचाने जाने वाले तरीके से उस directory में certificate जोड़ने का ज्ञान अगर किसी के पास हो, तो मैं सुनना चाहूँगा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
https://github.com/M66B/NetGuard
यक़ीन करना मुश्किल होगा, लेकिन Firefox network tab के लिए वही काम करने की एक अधूरी-सी कोशिश repository के
networktabdirectory में मौजूद है। यह बहुत शानदार प्रोजेक्ट है, इसलिए मैं और सीखना चाहता हूँ, और इस पर और बात भी हो सकती हैबिना privileged access वाले यूज़र के लिए network traffic analyze करने का एक और टूल rootless Podman और Pasta हो सकता है
बस
podman runoption में यह जोड़ना होगा--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...
काफ़ी दिलचस्प है। मैंने 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 को पढ़ और बदल तो सकते हैं, लेकिन processwrite(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
writesystem call hook करने पर भी TLS decryption में मदद नहीं मिलेगीवैसे भी, जितने ज़्यादा विकल्प हों उतना अच्छा है
शानदार। nginx configuration debugging में मैं इसे तुरंत आज़माना चाहूँगा
अभी मुझे
curl -vका इस्तेमाल करना पड़ता है और output में क्या गड़बड़ है यह हाथ से खोजना पड़ता है, लेकिन इस टूल से redirect loop जैसी चीज़ें तुरंत दिख सकती हैंजब ऐप के 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...
इसका मतलब यह है कि Vermont में 123-acre ज़मीन पर लोग अपेक्षाकृत पारंपरिक बौद्ध मठ संरचना के अनुसार साथ रहते हैं। हालांकि वे औपचारिक रूप से दीक्षित भिक्षु नहीं हैं। दिन में वे कई tech/non-tech projects पर साथ काम करते हैं। ऊपर दिया गया README लिंक इसका अच्छा overview है।
https://github.com/monasticacademy/httptap?tab=readme-ov-fil...