
मैन्युल एक कवरेज-निर्देशित समांतर फ़ज़र है जो विंडोज, लिनक्स और मैकओएस पर ओपन-सोर्स और ब्लैकबॉक्स बाइनरीज़ के लिए है।

Manul एक कवरेज-निर्देशित समानांतर फज़र है जो विंडोज़, लिनक्स और macOS (बीटा) पर ओपन-सोर्स और ब्लैक-बॉक्स बायनरीज़ के लिए है, जो शुद्ध Python में लिखा गया है।
pip3 install psutil
git clone https://github.com/mxmssh/manul
cd manul
mkdir in
mkdir out
echo "AAAAAA" > in/test
python3 manul.py -i in -o out -n 4 "linux/test/test_afl @@"
sudo apt-get install gcc make git wget
git clone https://gitlab.com/akihe/radamsa.git && cd radamsa && make && sudo make install
विंडोज़ पर radamsa स्थापित करने की आवश्यकता नहीं है; Manul इस प्लेटफॉर्म पर radamsa नेटिव लाइब्रेरी के साथ वितरित किया जाता है।
| CVE IDs | Product | Finder |
|---|---|---|
| CVE-2019-9631 CVE-2019-7310 CVE-2019-9959 | Poppler | Maksim Shudrak |
| CVE-2018-17019 CVE-2018-16807 CVE-2019-12175 | Bro/Zeek | Maksim Shudrak |
यदि आप Manul का उपयोग करके कोई नई बग खोजने में सफल हुए हैं, तो कृपया मुझसे संपर्क करें और मैं आपको सूची में जोड़ दूंगा।

pip install pywin32) (केवल DBI पर्सिस्टेंस मोड के लिए आवश्यक)।वर्तमान में, Manul दो प्रकार की इंस्ट्रुमेंटेशन का समर्थन करता है: AFL-आधारित (afl-gcc, afl-clang और afl-clang-fast) और DBI।
अपने लक्ष्य को afl-gcc या afl-clang-fast और Address Sanitizer के साथ इंस्ट्रुमेंट करें (बेहतर परिणामों के लिए अनुशंसित)। उदाहरण के लिए:
CC=afl-gcc CXX=afl-g++ CFLAGS=-fsanitize=address CXXFLAGS=-fsanitize=address cmake <path_to_your_target>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <path_to_your_target>
make -j 8
अधिक विवरण के लिए ये निर्देश देखें।
इस मोड में आपको अपने लक्ष्य को इंस्ट्रुमेंट करने की आवश्यकता नहीं है, लेकिन आपको विंडोज़ या लिनक्स के लिए DynamoRIO फ्रेमवर्क का नवीनतम संस्करण डाउनलोड करना होगा।
Manul लिनक्स और विंडोज़ के लिए x86/x64 प्रीकंपाइल्ड क्लाइंट के साथ वितरित किया जाता है। आप इन्हें निम्नलिखित फ़ोल्डरों में पा सकते हैं:
linux/dbi_32|dbi_64/libbinafl.so (DynamoRIO क्लाइंट)
win/dbi_32|dbi_64/binafl.dll
दुर्भाग्य से, DynamoRIO को MacOS पर आधिकारिक रूप से समर्थित नहीं किया गया है।
आप DynamoRIO रिलीज़ पैकेज DynamoRIO डाउनलोड पेज पर पा सकते हैं।
आपको manul.config फ़ाइल में निम्नलिखित पंक्तियों को अनकमेंट करना होगा और DynamoRIO लॉन्चर और क्लाइंट का सही पथ प्रदान करना होगा।
# Manul को कवरेज प्रदान करने के लिए DBI फ्रेमवर्क चुनें ("dynamorio" या "pin")। उदा. dbi = dynamorio
dbi = dynamorio
# यदि dbi पैरामीटर None नहीं है, तो dbi इंजन लॉन्चर और dbi क्लाइंट का पथ निर्दिष्ट किया जाना चाहिए।
dbi_root = /home/max/DynamoRIO/bin64/drrun
dbi_client_root = /home/max/manul/linux/dbi_64/libbinafl.so
dbi_client_libs = None
इसके अतिरिक्त, आप पर्सिस्टेंट इन-मेमोरी फ़ज़िंग का उपयोग करके अपने ब्लैक-बॉक्स फ़ज़िंग अभियान के प्रदर्शन को बढ़ा सकते हैं। इस मोड में, आपको Manul को एक विशेष फ़ंक्शन को इंस्ट्रुमेंट करने का निर्देश देना चाहिए (हाँ, आपको अपने बायनरी को डिसअसेंबल करके इसे खोजना होगा) और यह इसे एक लूप में चलाएगा, निम्नलिखित पंक्तियों को अनकमेंट करके:
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # वैकल्पिक रूप से आप नाम के बजाय इस फ़ंक्शन का ऑफ़सेट प्रदान कर सकते हैं
dbi_fuzz_iterations = 1000
winAFL के लेखक यहाँ बहुत अच्छी व्याख्या प्रदान करते हैं कि यह वास्तव में कैसे काम करता है। Manul लक्ष्य के साथ संवाद करने और उसे इंस्ट्रुमेंट करने के लिए winAFL इंस्ट्रुमेंटेशन लाइब्रेरी के एक बड़े हिस्से का उपयोग करता है।
महत्वपूर्ण नोट: 32-बिट बायनरीज़ को फ़ज़ करने के लिए 32-बिट लॉन्चर और 32-बिट क्लाइंट, और 64-बिट बायनरीज़ के लिए 64-बिट लॉन्चर और 64-बिट क्लाइंट का उपयोग करें!
इंस्ट्रुमेंटेशन लाइब्रेरी को संकलित करने के लिए, आपको DynamoRIO के नवीनतम संस्करण का उपयोग करना होगा। इंस्ट्रुमेंटेशन लाइब्रेरी का स्रोत कोड Manul मुख्य फ़ोल्डर में स्थित dbi_clients_src में पाया जा सकता है।
64-बिट लिनक्स
cd dbi_clients_src
wget <DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz> - नवीनतम DynamoRIO डाउनलोड करें
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz/cmake
make
32-बिट लिनक्स
cd dbi_clients_src
wget <DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz> - नवीनतम DynamoRIO डाउनलोड करें
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
CFLAGS=-m32 CXXFLAGS=-m32 cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz/cmake
make
विंडोज़ पर, लाइब्रेरी को संकलित करने का सबसे आसान तरीका Visual Studio (2017 और 2013 संस्करणों पर परीक्षण किया गया) स्थापित करना, VS20XX Cross Tools Command Prompt लॉन्च करना और निम्नलिखित कमांड चलाना है:
64-बिट विंडोज़
cd dbi_clients_src
<DynamoRIO का नवीनतम संस्करण डाउनलोड और निकालें>
mkdir client_64
cd client_64
cmake -G"Visual Studio 15 Win64" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (या यदि आवश्यक हो तो केवल Debug)
32-बिट विंडोज़
cd dbi_clients_src
<DynamoRIO का नवीनतम संस्करण डाउनलोड और निकालें>
mkdir client_32
cd client_32
cmake -G"Visual Studio 15" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (या यदि आवश्यक हो तो केवल Debug)
Manul ने प्रारंभ में Intel PIN कवरेज-निर्देशित फ़ज़िंग का समर्थन किया था, लेकिन कम प्रदर्शन और उच्च रखरखाव ओवरहेड के कारण, यह अब समर्थित नहीं है।
सबसे अधिक उपयोग किए जाने वाले विकल्प कमांड लाइन के माध्यम से प्रदान किए जा सकते हैं। अधिक विकल्प कॉन्फ़िगरेशन फ़ाइल (manul.config) का उपयोग करके समर्थित हैं।
उदाहरण: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
स्थितीय तर्क:
target_binary निष्पादित किया जाने वाला लक्ष्य बायनरी और विकल्प (कोट्स शामिल करना न भूलें जैसे "target e @@").
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
-n NFUZZERS समानांतर फ़ज़र्स की संख्या
-s डंब फ़ज़िंग चलाएं (कोई कोड इंस्ट्रुमेंटेशन नहीं)
-c CONFIG अतिरिक्त विकल्पों वाली कॉन्फ़िगरेशन फ़ाइल का पथ (नीचे कॉन्फ़िगरेशन फ़ाइल विकल्प अनुभाग देखें)
-r पिछला सत्र पुनर्स्थापित करें
आवश्यक पैरामीटर:
-i INPUT प्रारंभिक कॉर्पस वाली निर्देशिका का पथ
-o OUTPUT आउटपुट निर्देशिका का पथ
Manul डिफ़ॉल्ट manul.config फ़ाइल के साथ वितरित किया जाता है जहाँ उपयोगकर्ता सभी समर्थित विकल्प और उपयोग उदाहरण पा सकता है। विकल्पों को निम्नलिखित प्रारूप में निर्दिष्ट किया जाना चाहिए Format: <option_name> = <value>। प्रतीक # का उपयोग एक पंक्ति को अनदेखा करने के लिए किया जा सकता है।
dict = /home/max/dictionaries/test.dict। AFL उत्परिवर्तन रणनीति उपयोगकर्ता को कस्टम टोकन की एक सूची निर्दिष्ट करने की अनुमति देती है जिन्हें फ़ज़ की गई फ़ाइल में यादृच्छिक स्थानों पर डाला जा सकता है। Manul इस विकल्प के माध्यम से इस कार्यक्षमता का समर्थन करता है (पूर्ण पथ पसंद किए जाते हैं)।
mutator_weights=afl:7,radamsa:2,my_mutator:1। उत्परिवर्तक भार उपयोगकर्ता को Manul को बताने की अनुमति देते हैं कि प्रति 10 निष्पादनों में कितने उत्परिवर्तन एक निश्चित फ़ज़र द्वारा किए जाने चाहिए। इस उदाहरण में, AFL उत्परिवर्तक 10 में से 7 उत्परिवर्तनों में निष्पादित होगा, Radamsa 10 में से 2 और कुछ कस्टम my_mutator को 10 में से 1 मिलेगा। यदि आप किसी निश्चित उत्परिवर्तक को अक्षम करना चाहते हैं, तो भार 0 निर्दिष्ट किया जाना चाहिए (जैसे mutator_weights=afl:0,radamsa:1,my_mutator:9)।
deterministic_seed = False|True। True प्रदान करके, Radamsa उत्परिवर्तन नियतात्मक हो जाएंगे, जिससे Manul का प्रत्येक रन समान आउटपुट उत्पन्न करेगा।
print_per_thread = False|True। इस विकल्प को सक्षम करके, Manul कुल सारांश के बजाय निष्पादित किए जा रहे प्रत्येक थ्रेड के लिए सारांश प्रिंट करेगा।
disable_volatile_bytes = False|True इस विकल्प को सक्षम करके, Manul अस्थिर पथों को ब्लैकलिस्ट नहीं करेगा।
forkserver_on = False|True AFL के forkserver को सक्षम या अक्षम करें।
dbi = dynamorio|pin। यह विकल्प Manul को बताता है कि लक्ष्य को इंस्ट्रुमेंट करने के लिए किस DBI फ्रेमवर्क का उपयोग किया जाएगा।
dbi_root = <path>। यह विकल्प Manul को बताता है कि DBI फ्रेमवर्क का मुख्य लॉन्चर कहाँ खोजना है।
dbi_client_root = <path>। यह विकल्प Manul को बताता है कि इंस्ट्रुमेंटेशन करने के लिए DBI क्लाइंट कहाँ खोजना है।
dbi_client_libs = name_#1,name_#2|None। इस विकल्प का उपयोग उन लाइब्रेरीज़ की सूची निर्दिष्ट करने के लिए किया जा सकता है जिन्हें मुख्य लक्ष्य के साथ इंस्ट्रुमेंट किया जाना चाहिए (उदाहरण के लिए, आपके पास एक निष्पादन योग्य है जो लक्ष्य लाइब्रेरी और कुछ अन्य लोड करता है जहाँ आप बग खोजना चाहते हैं)।
dbi_persistence_mode = 0|1|2। इस विकल्प का उपयोग DBI पर्सिस्टेंट मोड के बीच चयन करने के लिए किया जाता है। 0 - कोई पर्सिस्टेंस नहीं, 1 - मानक पर्सिस्टेंस (फ़ंक्शन रैपिंग), 2 - अभी तक समर्थित नहीं है।
यदि dbi-persistence_mode = 1|2 है, तो निम्नलिखित विकल्प निर्दिष्ट किए जाने चाहिए:
dbi_target_module = <module name>। Manul यहाँ निर्दिष्ट मॉड्यूल में लक्ष्य फ़ंक्शन खोजने का प्रयास करेगा।
dbi_target_method = <function name>। पर्सिस्टेंस के लिए रैप किया जाने वाला फ़ंक्शन नाम।
dbi_target_offset = <function का ऑफ़सेट जैसे 0x3198>। पर्सिस्टेंस के लिए रैप किया जाने वाला फ़ंक्शन ऑफ़सेट। यदि डीबग प्रतीक उपलब्ध नहीं हैं, तो इस विकल्प का उपयोग dbi_target_method के बजाय किया जा सकता है।
dbi_fuzz_iterations = 500। पूरे प्रोग्राम के पुनरारंभ होने से पहले मेमोरी में चलने वाले फ़ज़ पुनरावृत्तियों की संख्या। आप अपने लक्ष्य के लिए सबसे अच्छा काम करने वाला मान खोजने के लिए इस तर्क के साथ खेल सकते हैं।
dbi_thread_coverage = False। केवल उस थ्रेड से कवरेज इंस्ट्रुमेंट करें जिसने लक्ष्य फ़ंक्शन को निष्पादित किया (अभी तक समर्थित नहीं है)।
timeout = 10। लक्ष्य को मारने और अगला परीक्षण मामला भेजने से पहले प्रतीक्षा करने का समय।
init_wait = 1। इस विकल्प का उपयोग लक्ष्य को आरंभ करने के लिए आवश्यक टाइमआउट सेट करने के लिए किया जा सकता है।
net_config_master और net_config_slave विकल्पों का उपयोग Manul इंस्टेंस को नेटवर्क पर वितरित करने के लिए किया जाता है। वितरित फ़ज़िंग चलाने के लिए आपको निम्नलिखित 3 चरण करने होंगे।
IP:port जहाँ आपके स्लेव निष्पादित होंगे।net_config_slave = 0.0.0.0:1337। Manul इंस्टेंस लॉन्च करेगा और पोर्ट 1337 पर मास्टर इंस्टेंस से आने वाले कनेक्शन की प्रतीक्षा करेगा।net_config_master = file_name का उपयोग करके प्रदान करें।debug = False|True - डीबग जानकारी प्रिंट करें।
logging_enable = False|True - डीबग जानकारी लॉग में सहेजें।
manul_logo = False|True - शुरुआत में Manul लोगो प्रिंट करें।
no_stats = False|True - सांख्यिकी सहेजें।
sync_freq = 10000। उपयोगकर्ता को कवरेज बिटमैप सिंक्रनाइज़ेशन आवृत्ति बदलने की अनुमति देता है। यह विकल्प Manul को बताता है कि इसे समानांतर फ़ज़िंग इंस्टेंस के बीच कितनी बार कवरेज सिंक्रनाइज़ करना चाहिए। कम मान प्रदर्शन को कम करता है लेकिन इंस्टेंस के बीच समन्वय बढ़ाता है।
#custom_path = test_path - यह विकल्प परीक्षण मामले को कस्टम फ़ोल्डर में सहेजने की अनुमति देता है (यदि लक्ष्य इसे किसी पूर्वनिर्धारित स्थान से लोड करना चाहता है)।
cmd_fuzzing = True|False। यदि यह विकल्प सक्षम है, तो Manul फ़ाइल में सहेजने के बजाय कमांड लाइन के माध्यम से लक्ष्य में इनपुट प्रदान करेगा।
user_signals = 6,2,1|None। उपयोगकर्ता Manul को बता सकता है कि लक्ष्य से कौन से सिग्नल को अनदेखा किया जाना चाहिए (क्रैश के रूप में नहीं माना जाना चाहिए)।
target_ip_port = 127.0.0.1:7715|None - लक्ष्य IP और PORT निर्दिष्ट करने के लिए उपयोग किया जाता है।
target_protocol = tcp|tcp - नेटवर्क पर लक्ष्य में इनपुट भेजने के लिए प्रोटोकॉल निर्दिष्ट करने के लिए उपयोग किया जाता है।
net_sleep_between_cases = 0.0। इस विकल्प का उपयोग लक्ष्य में भेजे जा रहे परीक्षण मामलों के बीच देरी को परिभाषित करने के लिए किया जा सकता है।
वर्तमान में, नेटवर्क फ़ज़िंग एक प्रायोगिक सुविधा है (अधिक विवरण के लिए issues देखें)।
कस्टम उत्परिवर्तक को निम्नलिखित तीन चरणों में जोड़ा जा सकता है: चरण 1. एक python (.py) फ़ाइल बनाएँ और इसे कुछ नाम दें (जैसे example_mutator.py)
चरण 2. दो फ़ंक्शन बनाएँ def init(fuzzer_id) और def mutate(data)। अधिक विवरण के लिए example_mutator देखें। Manul फ़ज़िंग आरंभीकरण के दौरान init फ़ंक्शन और लक्ष्य में प्रदान की जा रही प्रत्येक फ़ाइल के लिए mutate फ़ंक्शन को कॉल करेगा।
चरण 3. manul.config में mutator_weights का उपयोग करके इसका नाम निर्दिष्ट करके उत्परिवर्तक को सक्षम करें। उदा. mutator_weights=afl:2,radamsa:0,example_mutator:8।
नोट: AFL और Radamsa उत्परिवर्तकों को हमेशा निर्दिष्ट किया जाना चाहिए। यदि आप AFL और/या Radamsa को अक्षम करना चाहते हैं, तो बस उन्हें 0 भार निर्दिष्ट करें।
TBD
