
फ़ज़िंग के लिए दोहराए जाने वाले कार्यों को स्वचालित करें
इसे अभी पूरी तरह से फिर से लिखा जा रहा है। शुरुआत में केवल इंटरैक्टिव लिनक्स ऐप्स पर ध्यान केंद्रित किया जाएगा जो केवल stdin से इनपुट लेते हैं। Shellphish के Driller और Fuzzer कार्यक्षमता का उपयोग करने का प्रयास किया जा रहा है।
autoPwn अपनी वर्तमान स्थिति में इसे सीमित रूप में करेगा। बस autoPwn ./binary चलाएँ और फिर Start विकल्प चुनें।
यहाँ सभी निर्भरता मुद्दों को देखते हुए, autoPwn को चालू और चलाने का सबसे आसान तरीका Docker बिल्ड का उपयोग करना है। ध्यान दें, आप --security-opt और --cap-add कथन को हटा सकते हैं, लेकिन कुछ फ़ज़िंग पहलू काम नहीं कर सकते हैं।
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ bannsec/autopwn
Docker बिल्ड में, सब कुछ उपयोग के लिए तैयार होना चाहिए। आप टूल को इस प्रकार शुरू कर सकते हैं:
$ autoPwn ./file
autoPwn किसी प्रोजेक्ट के स्रोत को फ़ज़िंग के लिए संकलित करना आसान बनाने का प्रयास करता है। इसमें मदद के लिए, autoPwnCompile बनाया गया था। बस इसे अपने स्रोत कोड पर इंगित करें, और इसे विकल्प दें, और यह एक निष्पादन योग्य आउटपुट देगा जो फ़ज़िंग के लिए तैयार हो।
usage: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
[--fuzzer FUZZER]
Compile source to binaries for use in autoPwn.
optional arguments:
-h, --help show this help message and exit
--file FILE Single file to compile.
--ASAN Enable ASAN (default off)
--MSAN Enable MSAN (default off)
--UBSAN Enable UBSAN (default off)
--fuzzer FUZZER (optional) What fuzzer to compile for. Options are:
['AFL']. Default is AFL.
नीचे autoPwn के पुराने संस्करण से है..
autoPwn एक सरल स्क्रिप्ट के लिए एक ऊँचा नाम है। फ़ज़िंग और afl-fuzz के साथ काम करते समय, मैंने देखा कि मैं बार-बार एक ही कार्य करता रहता हूँ। इसे ध्यान में रखते हुए, मैं एक ऐसी स्क्रिप्ट बनाना चाहता था जो निम्नलिखित को पूरा करे:
अब तक, स्क्रिप्ट पहले 5 को करने में सक्षम है। भाग 6 अनुमानात्मक है और अभी विकास का प्रयास किया जा रहा है। यह संभावित प्रारंभिक पथ बनाने के लिए angr प्रतीकात्मक निष्पादन इंजन का लाभ उठाएगा। उस बिंदु पर, स्क्रिप्ट सैद्धांतिक रूप से सरल फ़ज़िंग कार्यों को पूरी तरह से स्वचालित कर सकती है।
आइए "WoO2" नामक एक हालिया TUCTF चुनौती पर एक नज़र डालें। जबकि यह आवश्यक रूप से आवश्यक शोषण नहीं ढूंढता है, यह दिखाता है कि पथ खोज को सरल बनाने के लिए autoPwn का उपयोग कैसे किया जा सकता है।
यहाँ प्रोग्राम के माध्यम से एक बुनियादी रन है:
$ ./e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Welcome! I don't think we're in Kansas anymore.
We're about to head off on an adventure!
Select some animals you want to bring along.
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
1
Choose the type of lion you want:
1: Congo Lion
2: Barbary Lion
1
Enter name of lion:
Test
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
5
आइए एक सरल इनपुट परीक्षण मामला बनाएं:
$ cat in/1
1
1
Test
5
अब हम आसानी से फ़ज़र शुरू कर सकते हैं:
$ autoPwn
Setting up fuzz configuration
Target Binary (full or relative path): e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Command line args:
Number of cores (default: 8):
Test Case Dir (default: 'in/'):
Test Case Dir (default: 'out/'):
Max memory (default: 200): 4096
Starting fuzz
autoPwn> s
status check tool for afl-fuzz by <[email protected]>
Individual fuzzers
==================
>>> SESSION007 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION000 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION002 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION006 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION004 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION001 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION005 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION003 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
Summary stats
=============
Fuzzers alive : 8
Total run time : 0 days, 0 hours
Total execs : 0 million
Cumulative speed : 8 execs/sec
Pending paths : 8 faves, 8 total
Pending per fuzzer : 1 faves, 1 total (on average)
Crashes found : 0 locally unique
autoPwn> h
autoPwn
s == fuzzer (s)tatus
e == collect (e)xploits
a == collect (a)ll paths
m == (m)inimize corpus
q == (q)uit
तो यहाँ क्या हुआ कि स्क्रिप्ट ने कुछ डिफ़ॉल्ट मान बनाए (जिसमें उपलब्ध कोर की संख्या निर्धारित करना शामिल है)। हमने QEMU में इसे चलाने के लिए अतिरिक्त मेमोरी की आवश्यकता के कारण एक डिफ़ॉल्ट मान बदल दिया। autoPwn ने एक कॉन्फ़िग फ़ाइल बनाई जिसे उसने फिर afl-utils (https://github.com/rc0r/afl-utils) को दिया। कॉन्फ़िग फ़ाइल में, इसने CPU एफ़िनिटी भी सेट की, ताकि फ़ज़िंग डिफ़ॉल्ट रूप से इष्टतम हो।
इस बिंदु पर, आपका कंप्यूटर फ़ज़िंग में लगा हुआ है। हालाँकि, फ़ज़िंग का एक प्रमुख पहलू कॉर्पस को न्यूनतम करना है। इसे ध्यान में रखते हुए, autoPwn afl-fuzz इंस्टेंस पर नज़र रख रहा है ताकि यह मॉनिटर कर सके कि उत्परिवर्तनों की एक श्रृंखला कब पूरी होती है। जब ऐसा होता है, तो यह फ़ज़िंग को रोक देगा (गैर-इष्टतम, लेकिन अभी के लिए ठीक है), कॉर्पस को न्यूनतम करेगा, और फिर फ़ज़िंग को पुनः आरंभ करेगा। यह बिना किसी मानवीय हस्तक्षेप के करता है ताकि आप इसे चालू करके भूल सकें।
किसी बिंदु पर आप देखना चाह सकते हैं कि afl ने कौन से पथ पाए हैं। "a" कमांड निष्पादित करके, autoPwn सभी ज्ञात पथों को कॉपी करेगा, कॉर्पस को न्यूनतम करेगा और फिर केसों को स्वयं न्यूनतम करेगा और उन्हें एक आउटपुट निर्देशिका में प्रदान करेगा।