
Turbo Intruder के लिए Python लाइब्रेरी जो पेलोड पोजीशन सपोर्ट और Sniper/Clusterbomb/Pitchfork अटैक प्रकारों को जोड़ती है, साथ ही HTTP फ़ज़िंग के लिए टैग-आधारित टेस्ट जनरेशन।

Haptyc एक पायथन लाइब्रेरी है जिसे Turbo Intruder में पेलोड पोजीशन सपोर्ट और Sniper/Clusterbomb/Batteringram/Pitchfork अटैक प्रकार जोड़ने के लिए बनाया गया था। जबकि Haptyc इन लक्ष्यों को अच्छी तरह से पूरा करता है, यह सामान्य रूप से परीक्षण अनुक्रमों को व्यक्त करने का एक सरल तरीका भी प्रस्तुत करता है। जबकि यह लाइब्रेरी Turbo Intruder को लक्षित करने के लिए थी, इसकी Turbo Intruder पर कोई कठोर निर्भरता नहीं है और इसका उपयोग कहीं भी किया जा सकता है जहाँ पायथन संदर्भ में परीक्षण निर्माण की आवश्यकता हो। दुर्भाग्य से, इस समय Haptyc को jython इंटरप्रेटर के लिए बनाया गया था, इसलिए यह केवल Python 2.7 का समर्थन करता है (हालाँकि भविष्य में परिवर्तन इसे ठीक कर देंगे)।
Haptyc टैग वे टैग हैं जिनका उपयोग एक परीक्षक मूल इनपुट पेलोड को एनोटेट करने के लिए कर सकता है। एक परीक्षक HTTP अनुरोध में मुख्य डेटा के टुकड़ों को घेरने के लिए कई टैग का उपयोग कर सकता है ताकि इसे एक स्थितिगत पेलोड के रूप में लपेटा जा सके। जब परीक्षण उत्पन्न किए जा रहे होते हैं, Haptyc मूल पेलोड में सभी टैगों को पार्स करेगा और टैग नामों से जुड़े कार्यों के अनुसार परीक्षण उत्पन्न करेगा। जब Haptyc एक Haptyc टैग का मूल्यांकन करता है, तो वह संबंधित टैग फ़ंक्शन (इसे Haptyc Transform कहा जाता है) को एक परीक्षण पेलोड के लिए निष्पादित करेगा ताकि अनुरोध में संबंधित टैग की स्थिति में रखा जा सके। प्रत्येक टैग फ़ंक्शन को एक data तर्क और एक state तर्क प्राप्त होगा। डेटा तर्क में टैग का आंतरिक डेटा हो सकता है या कोई अन्य परीक्षण पेलोड अनुक्रम हो सकता है। State तर्क टैग से जुड़ी एक state ऑब्जेक्ट है जहाँ परीक्षण पुनरावृत्तियों के बीच state संग्रहीत की जा सकती है। आइए एक उदाहरण देखें।
मूल पेलोड:
GET /animal/[+GuessAnimal]dog[+end] HTTP/1.1
Haptyc वर्ग और Haptyc Transform:
from haptyc import *
original = "GET /animal/[+GuessAnimal]dog[+end] HTTP/1.1"
class TestLogic(Transform):
@ApplyList(["snake","cat","owl","lion"])
def test_GuessAnimal(self, data, state):
return data + "?original=" + self.inner() + "&attempt=" + str(state.iter)
TestFactory = TestLogic(original)
for test in TestFactory:
print(test)
उत्पन्न परीक्षण:
GET /animal/snake?original=dog&attempt=0 HTTP/1.1
GET /animal/cat?original=dog&attempt=1 HTTP/1.1
GET /animal/owl?original=dog&attempt=2 HTTP/1.1
GET /animal/lion?original=dog&attempt=3 HTTP/1.1
ऊपर दिए गए उदाहरण में हम देखते हैं कि Haptyc का उपयोग करके परीक्षणों को सरल तरीके से कैसे व्यक्त किया जा सकता है। पहले Haptyc लाइब्रेरी को आयात किया जाता है। दूसरे, हमने अपने Haptyc टैग एनोटेशन (GuessAnimal) के साथ मूल डेटा को परिभाषित किया है। इसके बाद TestLogic वर्ग को परिभाषित किया गया है और इसे Transform वर्ग के रूप में विस्तारित किया गया है। इस वर्ग के अंदर प्रत्येक विधि जो test_ से शुरू होती है, मूल पेलोड में मूल्यांकन के लिए Haptyc टैग के रूप में पंजीकृत हो जाएगी। हम इस Haptyc transform के लिए state लॉजिक लागू करने के लिए एक लॉजिक डेकोरेटर का उपयोग करते हैं। इस मामले में हम @ApplyList(list) डेकोरेटर का उपयोग करके Haptyc को बताते हैं कि निर्दिष्ट सूची के प्रत्येक आइटम के लिए एक परीक्षण उत्पन्न करें और उस आइटम को Haptyc transform में data तर्क के रूप में रखें। Transform के अंदर हम टैग की स्थिति में वापस सम्मिलित करने के लिए data का एक उत्परिवर्तित संस्करण लौटाते हैं। इस मामले में उत्परिवर्तन data के रूप में सूची आइटम है जो टैग द्वारा घिरे डेटा (dog) से जुड़ा है और फिर state ऑब्जेक्ट में iter मान से जुड़ा है। अंत में शेष पायथन कोड TestFactory ऑब्जेक्ट बनाने और for लूप इटरेटर में सभी परीक्षण उत्पन्न करने को दर्शाता है। यह एक मानक sniper-शैली के हमले का उदाहरण है जो एकल पेलोड स्थिति को लक्षित करता है। आगे हम अन्य शैलियों के हमलों को देखते हैं।
मूल पेलोड:
GET /animal?type=[%type]dog[%end]&name=[%name]fido[%end] HTTP/1.1
Haptyc वर्ग और Haptyc Transform:
from haptyc import *
original = "GET /animal?type=[%type]dog[%end]&name=[%name]fido[%end] HTTP/1.1"
class TestLogic(Transform):
@ApplyList("snake","cat","owl","lion")
def test_type(self, data, state):
return data
@ApplyList("Frank", "Lisa", "Jin", "Tooth")
def test_name(self, data, state):
return data
TestFactory = TestLogic(original)
for test in TestFactory:
print(test)
उत्पन्न परीक्षण:
GET /animal?type=snake&name=Frank HTTP/1.1
GET /animal?type=snake&name=Lisa HTTP/1.1
GET /animal?type=snake&name=Jin HTTP/1.1
GET /animal?type=snake&name=Tooth HTTP/1.1
GET /animal?type=cat&name=Frank HTTP/1.1
GET /animal?type=cat&name=Lisa HTTP/1.1
GET /animal?type=cat&name=Jin HTTP/1.1
GET /animal?type=cat&name=Tooth HTTP/1.1
GET /animal?type=owl&name=Frank HTTP/1.1
GET /animal?type=owl&name=Lisa HTTP/1.1
GET /animal?type=owl&name=Jin HTTP/1.1
GET /animal?type=owl&name=Tooth HTTP/1.1
GET /animal?type=lion&name=Frank HTTP/1.1
GET /animal?type=lion&name=Lisa HTTP/1.1
GET /animal?type=lion&name=Jin HTTP/1.1
GET /animal?type=lion&name=Tooth HTTP/1.1
उदाहरण 1 ने दिखाया कि '+' चिन्ह एनोटेशन टैग [+tag][+end] का उपयोग करके sniper शैली में transforms का मूल्यांकन कैसे किया जाता है। उदाहरण 2 दिखाता है कि हम clusterbomb-शैली के हमले को संचालित करने के लिए 2 transforms/positions का उपयोग कैसे कर सकते हैं। जैसा कि आप देख सकते हैं, हम दो अलग-अलग transform टैग का उपयोग करते हैं जिन्हें [%type][%end] और [%name][%end] कहा जाता है। '%' चिन्ह Haptyc को बताता है कि इन transforms का मूल्यांकन clusterbomb-शैली में करें, पहले transform के प्रत्येक पेलोड के लिए दूसरे transform से पेलोड के साथ एक परीक्षण बनाएं। परीक्षणों की संख्या प्रत्येक शामिल transform के परीक्षणों की संख्या को गुणा करके प्राप्त की जाती है।
समान पायथन कोड का उपयोग करके हम '%' को '#' में बदलकर हमले की शैली को clusterbomb से pitchfork में बदल सकते हैं। Pitchfork शैली के हमले स्थिति पेलोड को समानांतर में रखेंगे। परीक्षणों की संख्या सभी शामिल transforms में से सबसे कम परीक्षणों की संख्या होगी।
मूल पेलोड:
GET /animal?type=[#type]dog[#end]&name=[#name]fido[#end] HTTP/1.1
उत्पन्न परीक्षण:
GET /animal?type=snake&name=Frank HTTP/1.1
GET /animal?type=cat&name=Lisa HTTP/1.1
GET /animal?type=owl&name=Jin HTTP/1.1
GET /animal?type=lion&name=Tooth HTTP/1.1
मूल पेलोड:
GET /animal?type=dog&id=[+idor]0[+end]&process=[@randbool]False[@end] HTTP/1.1
Haptyc वर्ग और Haptyc Transform:
from haptyc import *
import random
original = "GET /animal?type=dog&id=[+idor]0[+end]&process=[@randbool]False[@end] HTTP/1.1"
class TestLogic(Transform):
@ApplyIteration(10)
def test_idor(self, data, state):
return str(state.iter)
def per_randbool(self, data):
return random.choice(["True", "False"])
TestFactory = TestLogic(original)
for test in TestFactory:
print(test)
उत्पन्न परीक्षण:
GET /animal?type=dog&id=0&process=False HTTP/1.1
GET /animal?type=dog&id=1&process=True HTTP/1.1
GET /animal?type=dog&id=2&process=False HTTP/1.1
GET /animal?type=dog&id=3&process=True HTTP/1.1
GET /animal?type=dog&id=4&process=False HTTP/1.1
GET /animal?type=dog&id=5&process=True HTTP/1.1
GET /animal?type=dog&id=6&process=False HTTP/1.1
GET /animal?type=dog&id=7&process=True HTTP/1.1
GET /animal?type=dog&id=8&process=False HTTP/1.1
GET /animal?type=dog&id=9&process=False HTTP/1.1
स्थायी transforms को '@' चिन्ह से दर्शाया जाता है और transform फ़ंक्शन हमेशा per_ से शुरू होते हैं क्योंकि ये transforms पुनरावृत्त नहीं होते हैं, वे परीक्षण नहीं बनाते हैं या state नहीं रखते हैं। ये transforms केवल सरल रूपांतरण हैं जिन्हें आप पेलोड में कहीं भी स्थितिहीन रूपांतरण के लिए लागू कर सकते हैं, बिना स्थितिगत transforms को प्रभावित किए। चूँकि वे कोई परीक्षण निर्धारित नहीं करते हैं, आप केवल स्थायी transforms के साथ परीक्षण उत्पन्न नहीं कर सकते हैं, वे पुनरावृत्त transforms के साथ मिश्रित होने के लिए होते हैं। ऊपर दिए गए उदाहरण में हमारे पास 10-परीक्षण snipe शैली का transform है जो बढ़ती हुई id रखता है। साथ ही हमारे पास एक स्थायी transform है जो अपनी स्थिति में एक यादृच्छिक बूलियन रखता है।
ऐसे मामले हो सकते हैं जहाँ परीक्षण अनुक्रम शुरू होने से पहले परीक्षक कुछ प्रसंस्करण/आरंभीकरण करना चाहे। इसका समर्थन करने के लिए Haptyc परीक्षण निर्माण के लिए transform को निष्पादित करने से पहले आरंभीकरण चरण के लिए सभी शामिल transforms को निष्पादित करता है। इस आरंभीकरण चरण का उपयोग परीक्षक जो भी आरंभीकरण आवश्यक है उसे करने और उसे state ऑब्जेक्ट में रखने के लिए किया जा सकता है। इसके लिए परीक्षक state.init का उपयोग बूलियन के रूप में यह निर्धारित करने के लिए कर सकता है कि निष्पादन आरंभीकरण में है या नहीं। आरंभीकरण चरण से लौटाया गया कोई भी डेटा अनदेखा कर दिया जाएगा।
मूल पेलोड:
GET /animal?data=[+b64mutate]SGVsbG8gSGFja2VyIQ==[+end] HTTP/1.1
Haptyc वर्ग और Haptyc Transform:
from haptyc import *
import base64
original = "GET /animal?data=[+b64mutate]SGVsbG8gSGFja2VyIQ==[+end] HTTP/1.1"
class TestLogic(Transform):
@ApplyIteration(10)
def test_b64mutate(self, data, state):
if state.init:
state.decoded = base64.b64decode(data)
return
return base64.b64encode(random_insert(state.decoded, ["'"]))
TestFactory = TestLogic(original)
for test in TestFactory:
print(test)
उत्पन्न परीक्षण:
GET /animal?data=SGVsbG8gSCdhY2tlciE= HTTP/1.1
GET /animal?data=SGVsbG8gSGFja2VyISc= HTTP/1.1
GET /animal?data=SGVsbG8gSGFjaydlciE= HTTP/1.1
GET /animal?data=SGVsbG8gSGEnY2tlciE= HTTP/1.1
GET /animal?data=SCdlbGxvIEhhY2tlciE= HTTP/1.1
GET /animal?data=SGVsbG8gSGFjaydlciE= HTTP/1.1
GET /animal?data=SGVsbG8gSGFja2VyISc= HTTP/1.1
GET /animal?data=SCdlbGxvIEhhY2tlciE= HTTP/1.1
GET /animal?data=SGVsbG8gSGFjJ2tlciE= HTTP/1.1
GET /animal?data=SGVsbG8gSGFjJ2tlciE= HTTP/1.1
ऊपर दिए गए उदाहरण में परीक्षण state.init का उपयोग करता है ताकि परीक्षण अनुक्रम की शुरुआत में केवल एक बार लिपटे आंतरिक पेलोड को base64 डीकोड किया जा सके और उस परिणाम को state.decoded में संग्रहीत किया जा सके। फिर सभी सामान्य परीक्षण निर्माण निष्पादन के लिए state.decoded का उपयोग संसाधित किए जाने वाले डीकोड किए गए आंतरिक डेटा के रूप में किया जाता है। इस प्रकार का पैटर्न आपके transform के प्रदर्शन को बेहतर बनाने के लिए उपयोगी है क्योंकि प्रारंभ में केवल 1 डीकोड होता है (प्रत्येक परीक्षण के निर्माण पर समान पेलोड को डीकोड करने के विपरीत)।
[+tag]inner[+end] - Sniper शैली पुनरावृत्त transform[%tag]inner[%end] - Clusterbomb शैली पुनरावृत्त transform[#tag]inner[#end] - Batteringram/Pitchfork शैली पुनरावृत्त transform[@tag]inner[@end] - स्थितिहीन स्थायी transform (Stateless persistent transform)| नाम | तर्क | विवरण |
|---|---|---|
| @CloneTransform(srcname, destname) | srcname = किसी transform विधि को कॉपी करने का स्ट्रिंग नाम, destname = किसी मौजूदा transform विधि में कॉपी करने का स्ट्रिंग नाम | CloneTransform का उपयोग एक transform के कार्यान्वयन को दूसरे नामस्थान में कॉपी करने के लिए किया जाता है बिना कॉपी/पेस्ट की आवश्यकता के। यह '%' और '#' शैली के हमलों में उपयोगी है जब आपको एक ही transform कार्यान्वयन को कई स्थानों पर पुन: उपयोग करने की आवश्यकता होती है |
| नाम | विवरण |
|---|---|
| self.inner() | टैग के आंतरिक पेलोड को पुनर्प्राप्त करता है |
| नाम | विवरण |
|---|---|
| state.iter | transform की वर्तमान पुनरावृत्ति गणना (0-आधारित) |
| state.init | बूलियन जो इंगित करता है कि क्या आरंभीकरण चरण में है |
| नाम | विवरण |
|---|---|
| radamsa(data) | यह फ़ंक्शन इनपुट डेटा पर radamsa निष्पादित करेगा और उसका परिणाम लौटाएगा (radamsa को स्थापित करना आवश्यक है) |
| index_insert(data, list, index) | यह फ़ंक्शन प्रदान किए गए डेटा में प्रदान किए गए सूचकांक पर सूची से एक पेलोड सम्मिलित करेगा |
| random_insert(data, list) | यह फ़ंक्शन प्रदान किए गए डेटा में एक यादृच्छिक सूचकांक पर सूची से एक पेलोड सम्मिलित करेगा |
Haptyc को स्थापित करने के 2 तरीके हैं
turbo-intruder-all_w_haptyc.jar का उपयोग करके आसान तरीकाआप जो भी तरीका चुनें, इन रिलीज़ में radamsa शामिल नहीं है और यदि आप radamsa समर्थन चाहते हैं तो आपको इसे इस रिपॉजिटरी से स्थापित करना होगा: (वैकल्पिक) radamsa को https://gitlab.com/akihe/radamsa से स्थापित करें
turbo-intruder-all_w_haptyc.jar नोट करेंAdd बटन पर क्लिक करेंSelect File ... बटन पर क्लिक करें और turbo-intruder-all_w_haptyc.jar चुनें./install.sh <turbo-intruder-all.jar वाला निरपेक्ष निर्देशिका> निष्पादित करें| नाम | तर्क | data इनपुट | विवरण |
|---|
| @ApplyIteration(n) | n = पुनरावृत्तियों की संख्या | haptyc टैग का आंतरिक मान | आंतरिक डेटा के साथ N परीक्षण उत्पन्न करने का तर्क |
| @ApplyRange(b,e,s=1) | b = प्रारंभ मान, e = अधिकतम मान, s = चरण | श्रेणी का उत्पन्न मान | प्रत्येक चरणित मान के लिए डेटा के रूप में दिए गए मान के साथ परीक्षण उत्पन्न करने का तर्क |
| @ApplyList(L) | L = पायथन सूची | सूची का आइटम | सूची में प्रत्येक मान के लिए डेटा के रूप में दिए गए मान के साथ परीक्षण उत्पन्न करने का तर्क |
| @ApplyFilelist(path) | path = फ़ाइल सिस्टम पथ | सूची का आइटम | फ़ाइल सूची में प्रत्येक मान के लिए डेटा के रूप में दिए गए मान के साथ परीक्षण उत्पन्न करने का तर्क |
| @ApplyPayloads(name) | name = अंतर्निर्मित सूची नाम | सूची का आइटम | अंतर्निर्मित सूची में प्रत्येक मान के लिए डेटा के रूप में दिए गए मान के साथ परीक्षण उत्पन्न करने का तर्क |
| self.stop() |
| उस transform का परीक्षण निर्माण तुरंत रोक देगा |
| self.me() | वर्तमान transform संदर्भ का नाम लौटाएगा |
| self.set_label(label) | इस वर्तमान परीक्षण के लिए लेबल सेट करेगा |
| self.get_label(label) | इस वर्तमान परीक्षण के लिए लेबल प्राप्त करेगा |