
व्याकरण-आधारित HTTP/1 फ़ज़र जिसमें उत्परिवर्तन क्षमता है
T-Reqs (Two Requests) एक ग्रामर-आधारित HTTP फ़ज़र है जो paper के भाग के रूप में लिखा गया है जिसका शीर्षक "T-Reqs: HTTP Request Smuggling with Differential Fuzzing" है, जो ACM CCS 2021 में प्रस्तुत किया गया था।
BibTeX of the paper:
@inproceedings{ccs2021treqs,
title={T-Reqs: HTTP Request Smuggling with Differential Fuzzing},
author={Jabiyev, Bahruz and Sprecher, Steven and Onarlioglu, Kaan and Kirda, Engin},
booktitle={Proceedings of the 2021 ACM SIGSAC Conference on Computer and Communications Security},
pages={1805--1820},
year={2021}
}
T-Reqs HTTP सर्वरों को फ़ज़ करने के लिए है, जो संस्करण 1.1 और उससे पहले के संस्करणों के साथ म्यूटेटेड HTTP अनुरोध भेजता है। इसके तीन मुख्य घटक हैं: 1) इनपुट उत्पन्न करना, 2) उत्पन्न इनपुट को म्यूटेट करना और 3) उन्हें लक्ष्य सर्वर(सर्वरों) तक पहुंचाना।
फ़ज़र में डाला गया एक CFG ग्रामर HTTP अनुरोध उत्पन्न करने के लिए उपयोग किया जाता है। जैसा कि नीचे दिखाया गया उदाहरण ग्रामर अनुरोध लाइन फ़ज़िंग के लिए तैयार किया गया है, प्रत्येक अनुरोध लाइन घटक और उनमें से प्रत्येक के लिए संभावित मान स्पष्ट रूप से निर्दिष्ट किए गए हैं। यह हमें अनुरोध लाइन के विभिन्न रूपों के साथ वैध अनुरोध उत्पन्न करने और साथ ही प्रत्येक अनुरोध लाइन घटक को म्यूटेशन के दृष्टिकोण से एक अलग इकाई के रूप में व्यवहार करने की अनुमति देता है।
'<start>':
['<request>'],
'<request>':
['<request-line><base><the-rest>'],
'<request-line>':
['<method-name><space><uri><space><protocol><separator><version><newline>'],
'<method-name>':
['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'],
'<space>':
[' '],
'<uri>':
['/_URI_'],
'<protocol>':
['HTTP'],
'<separator>':
['/'],
'<version>':
['0.9', '1.0', '1.1'],
'<newline>':
['\r\n'],
'<base>':
['Host: _HOST_\r\nConnection:close\r\nX-Request-ID: _REQUEST_ID_\r\n'],
'<the-rest>':
['Content-Length: 5\r\n\r\nBBBBBBBBBB'],
प्रत्येक घटक को दो तरीकों से चिह्नित किया जा सकता है: स्ट्रिंग म्यूटेबल और ट्री म्यूटेबल (देखें उदाहरण कॉन्फ़िगरेशन)। यदि कोई घटक स्ट्रिंग म्यूटेबल है, तो एक यादृच्छिक वर्ण को हटाया, बदला या यादृच्छिक स्थान पर डाला जा सकता है। नीचे दिखाए गए उदाहरण (बाएं ओर) में, प्रोटोकॉल संस्करण का अंतिम वर्ण (1) हटा दिया गया है, विधि नाम का तीसरा अक्षर (S) बदलकर R कर दिया गया है, और URI की शुरुआत में एक फॉरवर्ड स्लैश डाला गया है। जबकि, यदि कोई घटक ट्री म्यूटेबल है, तो उस घटक के अंतर्गत एक यादृच्छिक घटक को हटाया, बदला या यादृच्छिक स्थान पर डाला जा सकता है। नीचे दिया गया उदाहरण (दाएं ओर) अनुरोध लाइन घटक पर लागू तीन ट्री म्यूटेशन दिखाता है: 1) method को protocol से बदल दिया गया है, 2) वर्तमान URI के बाद एक अतिरिक्त URI डाला गया है, और 3) मौजूदा proto हटा दिया गया है।

फ़ज़र को इनपुट के जनरेशन और म्यूटेशन के बारे में उपयोगकर्ता की प्राथमिकताओं के बारे में सूचित किया जाना चाहिए। अधिक विशेष रूप से, इनपुट ग्रामर, म्यूटेबल घटक, म्यूटेशन प्राथमिकताएं आदि को कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जाना चाहिए (उदाहरण कॉन्फ़िगरेशन देखें)।
प्रत्येक पुनरावृत्ति में उत्पन्न और म्यूटेट किए गए इनपुट को पुन: उत्पन्न करने में सक्षम होने के लिए, एक सीड संख्या का उपयोग किया जाता है। वास्तव में, यह सीड संख्या इनपुट के निर्माण और म्यूटेशन के दौरान यादृच्छिक संख्या पीढ़ी के लिए बीज के रूप में कार्य करती है। यह इस बात पर निर्भर करता है कि ये सीड फ़ज़र में कैसे डाले जाते हैं, यह इन दो मोडों में से एक में चलता है: व्यक्तिगत और बल्क। व्यक्तिगत मोड में, इनपुट एक उपयोगकर्ता द्वारा निर्दिष्ट सीड के आधार पर उत्पन्न और म्यूटेट किए जाते हैं। नीचे दिए गए कमांड में, एक एकल सीड (यानी, 505) निर्दिष्ट किया गया है। वैकल्पिक रूप से, -f विकल्प के साथ सीड की एक सूची निर्दिष्ट की जा सकती है (अधिक के लिए सहायता पृष्ठ देखें)।
python3 main.py -i -c config -s 505
जबकि, बल्क मोड में (जो डिफ़ॉल्ट है), यह सीड मान के रूप में शून्य से शुरू होता है और अंत संख्या तक पहुंचने तक प्रत्येक पुनरावृत्ति में इसे बढ़ाता है। प्रारंभ और अंत संख्याओं को अनुकूलित किया जा सकता है।
python3 main.py -c config
हम आपके लिए t-reqs कोड चलाने में सक्षम होने के लिए एक Dockerfile भी साझा कर रहे हैं। आरंभ करने के लिए आप नीचे दिए गए कमांड चला सकते हैं:
# run the command below under the directory which has the Dockerfile
docker build -t test/treqs .
# create a container after you built the image using the command above
docker run -ti test/treqs bash
# run the commands below in the started docker shell
cd t-reqs/
python3 code/main.py -c config -n -i -s90
HTTP Request Smuggling सर्वरों के बीच अलग-अलग बॉडी पार्सिंग व्यवहारों पर निर्भर करता है जहां एक सर्वर Transfer-Encoding हेडर का उपयोग करता है जबकि दूसरा Content-Length हेडर को प्राथमिकता देता है, या एक सर्वर अनुरोध बॉडी को अनदेखा करता है, जबकि दूसरा उसे प्रोसेस करता है।
HTTP अनुरोध के विभिन्न रूपों में विभिन्न म्यूटेशनों के जवाब में सर्वरों के बॉडी पार्सिंग का विश्लेषण करने के लिए, हमें उन सर्वरों पर एक फीडबैक तंत्र स्थापित करने की आवश्यकता है जो हमें बॉडी पार्सिंग व्यवहार के बारे में बताए। सर्वर पर फीडबैक तंत्र स्थापित करने का एक तरीका, सर्वर को रिवर्स-प्रॉक्सी मोड में चलाना और इसे एक सेवा के रूप में चल रहे "feedback provider" स्क्रिप्ट को अनुरोध अग्रेषित करना है। यह सेवा प्राप्त अनुरोधों में बॉडी की लंबाई मापती है और इसे बाद में अन्य सर्वरों के साथ तुलना करने के लिए सहेजती है।
एक उदाहरण "feedback provider" स्क्रिप्ट इस रिपॉजिटरी में उपलब्ध है। हालाँकि, यह स्क्रिप्ट बॉडी लंबाई की जानकारी एक प्रतिक्रिया में वापस भेजती है, यह मानते हुए कि यह जानकारी क्लाइंट पक्ष पर संग्रहीत है।
T-Reqs MIT लाइसेंस के तहत लाइसेंस प्राप्त है।