
Linux-आधारित फर्मवेयर के अनुकरण और गतिशील विश्लेषण के लिए प्लेटफ़ॉर्म
FIRMADYNE एक स्वचालित और स्केलेबल सिस्टम है जो लिनक्स-आधारित एम्बेडेड फर्मवेयर के एम्यूलेशन और डायनामिक विश्लेषण के लिए है। इसमें निम्नलिखित घटक शामिल हैं:
हमने FIRMADYNE सिस्टम का उपयोग करके निम्नलिखित तीन बुनियादी स्वचालित विश्लेषण भी लिखे हैं।
public और private SNMP v2c समुदायों की सामग्री को डिस्क पर डंप करती है।हमारे 2016 के नेटवर्क और डिस्ट्रीब्यूटेड सिस्टम सुरक्षा संगोष्ठी (NDSS) पेपर में, जिसका शीर्षक Towards Automated Dynamic Analysis for Linux-based Embedded Firmware है, हमने FIRMADYNE सिस्टम का 23,035 फर्मवेयर इमेजों के डेटासेट पर मूल्यांकन किया, जिनमें से हम 9,486 निकालने में सक्षम थे। Metasploit फ्रेमवर्क के 60 एक्सप्लॉइट और हमारे द्वारा खोजी गई 14 पहले से अज्ञात भेद्यताओं का उपयोग करके, हमने दिखाया कि 1,971 में से 846 (43%) फर्मवेयर इमेजें कम से कम एक एक्सप्लॉइट के प्रति संवेदनशील थीं, जो हमारे अनुमान के अनुसार 89+ विभिन्न उत्पादों को प्रभावित करती हैं। अधिक विवरण के लिए, ऊपर दिए गए हमारे पेपर को देखें।
नोट: यह प्रोजेक्ट एक शोध उपकरण है, और वर्तमान में उत्पादन के लिए तैयार नहीं है। विशेष रूप से, कुछ घटक काफी अपरिपक्व और खुरदरे हैं। हम सिस्टम को वर्चुअल मशीन के भीतर चलाने का सुझाव देते हैं। कोई समर्थन प्रदान नहीं किया जाता है, लेकिन दस्तावेज़ीकरण, परीक्षण, या कोड के लिए पुल अनुरोधों की बहुत सराहना की जाती है!
पहले, इस रिपॉजिटरी को रिकर्सिव रूप से क्लोन करें और इसकी निर्भरताएँ स्थापित करें।
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlangit clone --recursive https://github.com/firmadyne/firmadyne.gitएक्सट्रैक्टर binwalk टूल पर निर्भर करता है, इसलिए हमें इसे और इसकी निर्भरताओं को स्थापित करने की आवश्यकता है।
git clone https://github.com/ReFirmLabs/binwalk.gitcd binwalksudo ./deps.shsudo python ./setup.py installsudo apt-get install python-lzmasudo -H pip install git+https://github.com/ahupp/python-magicsudo -H pip install git+https://github.com/sviehb/jeffersonअगला, डेटाबेस स्थापित करें, सेटअप करें और कॉन्फ़िगर करें।
sudo apt-get install postgresqlsudo -u postgres createuser -P firmadyne, पासवर्ड firmadyne के साथsudo -u postgres createdb -O firmadyne firmwaresudo -u postgres psql -d firmware < ./firmadyne/database/schemaसभी घटकों के लिए हमारे पूर्व-निर्मित बाइनरी डाउनलोड करने के लिए, निम्नलिखित स्क्रिप्ट चलाएँ:
cd ./firmadyne; ./download.shवैकल्पिक रूप से, स्रोत से संकलन करने के लिए नीचे दिए गए निर्देशों को देखें।
अपने वितरण द्वारा प्रदान किए गए QEMU का उपयोग करने के लिए:
sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utilsध्यान दें कि x86-आधारित फर्मवेयर का एम्यूलेशन वर्तमान में समर्थित नहीं है, लेकिन qemu-system-x86 स्थापित करने से कुछ डेबियन-आधारित वितरणों पर पैकेजिंग समस्या हल हो जाती है।
वैकल्पिक रूप से, कुछ फर्मवेयर के लिए हमारा संशोधित संस्करण qemu-linaro का उपयोग करें जो एक निश्चित मेमोरी मैपिंग मानता है (अनुशंसित नहीं), या upstream qemu का उपयोग करें।
firmadyne.config में FIRMWARE_DIR सेट करें।wget http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip-nk), कोई समानांतर संचालन नहीं (-np), Netgear ब्रांड (-b) के साथ 127.0.0.1 (-sql) पर SQL सर्वर में image तालिका को आबाद करें, और टारबॉल को images में संग्रहीत करें।
./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "WNAP320 Firmware Version 2.0.3.zip" imagesrun.sh जनरेट नहीं हुआ हैयह एक सामान्य त्रुटि है जो तब होती है जब नेटवर्क कॉन्फ़िगरेशन का अनुमान लगाने में असमर्थ होता है। कारण जानने के लिए नीचे दी गई चेकलिस्ट का पालन करें।
inferNetwork.sh: क्या इस स्क्रिप्ट को कोई नेटवर्क इंटरफ़ेस मिला (जैसे Interfaces: [br0, 192.168.0.1])? यदि हाँ, तो यह एक बग है; कृपया इसकी रिपोर्ट करें। अन्यथा, नीचे जारी रखें।qemu.initial.serial.log: क्या यह फ़ाइल Unable to mount root fs on unknown-block(8,1) के साथ समाप्त होती है? यदि हाँ, तो प्रारंभिक फाइलसिस्टम इमेज kpartx का उपयोग करके सही ढंग से जनरेट नहीं हुई थी। इस फर्मवेयर इमेज के अनुरूप स्क्रैच निर्देशिका को हटाने का प्रयास करें, और makeImage.sh से पुनः प्रारंभ करें। अन्यथा, प्रारंभिक एम्यूलेशन ने कोई उपयोगी इंस्ट्रुमेंटेशन उत्पन्न नहीं किया। inferNetwork.sh में टाइमआउट को 60 से 120 तक बढ़ाने का प्रयास करें और inferNetwork.sh से पुनः प्रारंभ करें।qemu.initial.serial.log: क्या init प्रक्रिया क्रैश हुई, और क्या इससे पहले कोई विफल NVRAM ऑपरेशन हुआ (जैसे )? यदि हाँ, तो नीचे FAQ प्रविष्टियाँ देखें।फर्मवेयर एक असामान्य नाम के साथ एक इनिशियलाइज़ेशन प्रक्रिया का उपयोग करता है। आपको सही प्रक्रिया की पहचान करने के लिए मैन्युअल रूप से फाइलसिस्टम का निरीक्षण करना होगा, फिर QEMU में एक कर्नेल बूट पैरामीटर init=<path> जोड़कर इसका पूरा पथ निर्दिष्ट करने के लिए स्क्रिप्ट को संशोधित करें।
do_page_fault() #2: sending SIGSEGV for invalid read access from 00000000यह संभावना है कि प्रक्रिया ने एक NVRAM प्रविष्टि का अनुरोध किया जिसके लिए FIRMADYNE के पास कोई डिफ़ॉल्ट मान नहीं है। इसे मैन्युअल रूप से libnvram में NVRAM_DEFAULTS_PATH में NVRAM प्रविष्टियों के लिए एक स्रोत, NVRAM_DEFAULTS में एक प्रविष्टि, या OVERRIDE_POINT में एक फ़ाइल जोड़कर ठीक किया जा सकता है। अधिक विवरण के लिए, libnvram के लिए दस्तावेज़ीकरण देखें। ध्यान दें कि पहले दो विकल्पों में config.h को संशोधित करना शामिल है, जिसके लिए libnvram के पुनर्संकलन की आवश्यकता होगी।
gdbserver संकलित करें, इसे फाइलसिस्टम में कॉपी करें, इसे रुचि की प्रक्रिया से संलग्न करें, और gdb-multiarch का उपयोग करके दूरस्थ रूप से कनेक्ट करें। आपको एक क्रॉस-कंपाइल टूलचेन की आवश्यकता होगी; या तो Debian/Ubuntu द्वारा प्रदान किए गए crossbuild-essential-* पैकेज का उपयोग करें, इसे buildroot जैसे उपकरण का उपयोग करके स्क्रैच से बनाएँ, या ऑनलाइन GPL स्रोत और/या पूर्व-संकलित बाइनरी खोजें। यदि आपके पास IDA Pro है, तो आप IDA के पूर्व-संकलित डीबग सर्वर (इंस्टॉल के dbgsrv उपनिर्देशिका में स्थित) का उपयोग कर सकते हैं, हालाँकि वे GDB-संगत नहीं हैं।-s -S पैरामीटर पास करें और gdb-multiarch से target remote localhost:1234 का उपयोग करके स्टब से कनेक्ट करें। हालाँकि, डीबगर स्वचालित रूप से यह नहीं जान पाएगा कि मेमोरी में कर्नेल और यूजरस्पेस कहाँ है, इसलिए आपको gdb में add-symbol-file मैन्युअल रूप से करने और कर्नेल में try_to_run_init_process() के आसपास ब्रेक लगाने की आवश्यकता हो सकती है।यदि आप हमारे पूर्व-निर्मित बाइनरी का उपयोग किए बिना पूरे FIRMADYNE सिस्टम को स्क्रैच से संकलित करना चाहते हैं, तो कृपया नीचे दिए गए चरणों का पालन करें।
FIRMADYNE द्वारा उपयोग किए जाने वाले किसी भी बाइनरी को बनाने के लिए, आपको निम्नलिखित आर्किटेक्चर ट्रिपल के लिए तीन क्रॉस-कंपिलेशन टूलचेन की आवश्यकता होगी। टूलचेन के लिए C रनटाइम लाइब्रेरी के रूप में केवल musl libc का उपयोग करें; अन्य का परीक्षण नहीं किया गया है।
musl के साथ क्रॉस-कंपिलेशन टूलचेन बनाने की प्रक्रिया को सरल बनाने के लिए, हम musl-cross प्रोजेक्ट का उपयोग करने की सलाह देते हैं। इन टूलचेन को स्रोत से बनाने के लिए नीचे दिए गए चरणों का पालन करें, या वैकल्पिक रूप से हमारे पूर्व-निर्मित टूलचेन डाउनलोड करने के लिए यहां क्लिक करें।
git clone https://github.com/GregorR/musl-cross.git
defs.sh में निम्नलिखित चर संशोधित या सेट करें
BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2GCC_VERSION=5.3.0GMP_VERSION=6.0.0aMPC_VERSION=1.0.2MPFR_VERSION=3.1.3LIBELF_VERSION=masterMUSL_DEFAULT_VERSION=1.1.12MUSL_GIT_VERSION=615629bd6fcd6ddb69ad762e679f088c7bd878e2LANG_CXX=noGCC_BUILTIN_PREREQS=yescd ./firmadyne/sources/consolemake clean && CC=/opt/cross/arm-linux-musleabi/bin/arm-linux-musleabi-gcc make && mv console ../../binaries/console.armelmake clean && CC=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl-gcc make && mv console ../../binaries/console.mipsebmake clean && CC=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl-gcc make && mv console ../../binaries/console.mipselcd ./firmadyne/sources/libnvrammake clean && CC=/opt/cross/arm-linux-musleabi/bin/arm-linux-musleabi-gcc make && mv libnvram.so ../../binaries/libnvram.so.armelmake clean && CC=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl-gcc make && mv libnvram.so ../../binaries/libnvram.so.mipsebmake clean && CC=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl-gcc make && mv libnvram.so ../../binaries/libnvram.so.mipselgit clone https://github.com/firmadyne/kernel-v4.1.git && cd kernel-v4.1mkdir -p build/armelcp config.armel build/armel/.configmake ARCH=arm CROSS_COMPILE=/opt/cross/arm-linux-musleabi/bin/arm-linux-musleabi- O=./build/armel zImage -j8cp build/armel/arch/arm/boot/zImage ../firmadyne/binaries/zImage.armelgit clone https://github.com/firmadyne/kernel-v2.6.git && cd kernel-v2.6
बिग-एंडियन MIPS के लिए, निम्नलिखित करें:
mkdir -p build/mipsebcp config.mipseb build/mipseb/.configmake ARCH=mips CROSS_COMPILE=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl- O=./build/mipseb -j8cp build/mipseb/vmlinux ../firmadyne/binaries/vmlinux.mipsebलिटिल-एंडियन MIPS के लिए, निम्नलिखित करें:
mkdir -p build/mipselcp config.mipsel build/mipsel/.configmake ARCH=mips CROSS_COMPILE=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl- O=./build/mipsel -j8cp build/mipsel/vmlinux ../firmadyne/binaries/vmlinux.mipselविकास के दौरान, डेटाबेस एक PostgreSQL सर्वर पर संग्रहीत किया गया था।
हालाँकि हम बाइनरी फर्मवेयर को पुनर्वितरित नहीं कर सकते, हमारे प्रयोगों के लिए उपयोग किया गया डेटा यहां उपलब्ध है।
नीचे स्कीमा में तालिकाओं का विवरण दिया गया है।
brand: प्रत्येक विक्रेता के लिए ब्रांड नाम संग्रहीत करता है।| कॉलम | विवरण |
|---|---|
| id | प्राथमिक कुंजी |
| name | ब्रांड नाम |
image: प्रत्येक फर्मवेयर इमेज के बारे में जानकारी संग्रहीत करता है।object: फाइलसिस्टम में प्रत्येक फ़ाइल के बारे में जानकारी संग्रहीत करता है।| कॉलम | विवरण |
|---|---|
| id | प्राथमिक कुंजी |
| hash | MD5 |
object_to_image: अद्वितीय फ़ाइलों को उनके फर्मवेयर इमेजेस से मैप करता है।productहमारे पेपर में चर्चित परिणाम निम्नलिखित के प्री-रिलीज़ संस्करणों का उपयोग करके उत्पन्न किए गए थे:* टूलचेन:
BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2, GCC_VERSION=4.9.3, GMP_VERSION=6.0.0a, MPC_VERSION=1.0.2, MPFR_VERSION=3.1.3, LIBELF_VERSION=71bf774909fd654d8167a475333fa8f37fbbcb5d, MUSL_DEFAULT_VERSION=1.1.10, MUSL_GIT_VERSION=996d148bf14b477b07fa3691bffeb930c67b2b62, LANG_CXX=noLINUX_HEADERS_URL=https://kernel.org/pub/linux/kernel/v3.x/linux-3.10.84.tar.xzLINUX_HEADERS_URL=https://kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.67.tar.xz1 की आर्किटेक्चर पहचानें और परिणाम को डेटाबेस की image तालिका में संग्रहीत करें।
./scripts/getArch.sh ./images/1.tar.gz1 के फाइलसिस्टम की सामग्री को डेटाबेस में लोड करें, object और object_to_image तालिकाओं को आबाद करें।
./scripts/tar2db.py -i 1 -f ./images/1.tar.gz1 के लिए QEMU डिस्क इमेज बनाएँ।
sudo ./scripts/makeImage.sh 11 के लिए नेटवर्क कॉन्फ़िगरेशन का अनुमान लगाएँ। कर्नेल संदेश ./scratch/1/qemu.initial.serial.log पर लॉग किए जाते हैं।
./scripts/inferNetwork.sh 11 का एम्यूलेशन करें। यह एक TAP डिवाइस बनाकर और एक रूट जोड़कर होस्ट सिस्टम के कॉन्फ़िगरेशन को संशोधित करेगा।
./scratch/1/run.sh./scratch/1/qemu.final.serial.log पर मिरर किए जाते हैं। फर्मवेयर 1 के लिए फाइलसिस्टम को ./scripts/mount.sh 1 और ./scripts/umount.sh 1 के साथ scratch/1/image पर माउंट और अनमाउंट किया जा सकता है।
./analyses/snmpwalk.sh 192.168.0.100./analyses/webAccess.py 1 192.168.0.100 log.txtmkdir exploits; ./analyses/runExploits.py -t 192.168.0.100 -o exploits/exploit -e x (Metasploit फ्रेमवर्क की आवश्यकता है)sudo nmap -O -sV 192.168.0.100root और password के साथ भी लॉग इन कर सकते हैं। ध्यान दें कि Ctrl-c गेस्ट को भेजा जाता है; एम्यूलेशन को समाप्त करने के लिए QEMU मॉनिटर कमांड Ctrl-a + x का उपयोग करें।nvram_get_buf: Unable to open key <foo>chroot करें (वैकल्पिक), LD_LIBRARY_PATH को FIRMADYNE libnvram शामिल करने के लिए सेट करें, और फर्मवेयर /lib निर्देशिका के सही पथ के साथ -L पैरामीटर और QEMU को रुचि के बाइनरी दोनों पास करें। यह डीबग करने में सबसे आसान है, क्योंकि आप gdb-multiarch का उपयोग करके सीधे प्रक्रिया से संलग्न हो सकते हैं और प्रक्रिया के साथ सीधे इंटरैक्ट कर सकते हैं, लेकिन सिस्टम स्थिति सटीक नहीं हो सकती क्योंकि होस्ट कर्नेल का उपयोग किया जा रहा है। यह कुछ हद तक असुरक्षित भी है, क्योंकि एमुलेटेड फर्मवेयर होस्ट फाइलसिस्टम तक पहुँच सकता है और होस्ट कर्नेल के साथ इंटरैक्ट कर सकता है।config.sh में निम्नलिखित चर संशोधित या सेट करें
CFLAGS="-fPIC"लिटिल-एंडियन MIPS के लिए, निम्नलिखित करें:
config.sh में TRIPLE=mipsel-linux-musl सेट करेंdefs.sh में LINUX_HEADERS_URL=https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.xz सेट करें./clean.sh चलाएँ/opt/cross में इंस्टॉल करने के लिए ./build.sh चलाएँबिग-एंडियन MIPS के लिए, निम्नलिखित करें:
config.sh में TRIPLE=mipseb-linux-musl सेट करेंdefs.sh में LINUX_HEADERS_URL=https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.xz सेट करें./clean.sh चलाएँ/opt/cross में इंस्टॉल करने के लिए ./build.sh चलाएँलिटिल-एंडियन ARM के लिए, निम्नलिखित करें:
config.sh में TRIPLE=arm-linux-musleabi, GCC_BOOTSTRAP_CONFFLAGS="--with-arch=armv6 --with-float=softfp", और GCC_CONFFLAGS="--with-arch=armv6 --with-float=softfp" सेट करेंdefs.sh में LINUX_HEADERS_URL=https://kernel.org/pub/linux/kernel/v4.x/linux-4.1.17.tar.xz सेट करें./clean.sh चलाएँ/opt/cross में इंस्टॉल करने के लिए ./build.sh चलाएँआपके पास निम्नलिखित निर्देशिकाएँ होनी चाहिए, या जहाँ भी आपने टूलचेन स्थापित किए हैं:
/opt/cross/arm-linux-musleabi/opt/cross/mipseb-linux-musl/opt/cross/mipsel-linux-musl| कॉलम | विवरण |
|---|
| id | प्राथमिक कुंजी |
| filename | फ़ाइल नाम |
| brand_id | brand के लिए विदेशी कुंजी |
| hash | MD5 |
| rootfs_extracted | क्या प्राथमिक फाइलसिस्टम निकाला गया था |
| kernel_extracted | क्या कर्नेल निकाला गया था |
| arch | हार्डवेयर आर्किटेक्चर |
| kernel_version | निकाले गए कर्नेल का संस्करण |
| कॉलम | विवरण |
|---|
| id | प्राथमिक कुंजी |
| oid | object के लिए विदेशी कुंजी |
| iid | image के लिए विदेशी कुंजी |
| filename | फ़ाइल का पूरा पथ |
| regular_file | क्या फ़ाइल नियमित है |
| permissions | ऑक्टल में फ़ाइल अनुमति |
| uid | स्वामी का उपयोगकर्ता आईडी |
| gid | समूह का समूह आईडी |
| कॉलम | विवरण |
|---|
| id | प्राथमिक कुंजी |
| iid | image के लिए विदेशी कुंजी |
| url | डाउनलोड URL |
| mib_filename | SNMP MIB का फ़ाइल नाम |
| mib_hash | SNP MIB का MD5 |
| mib_url | SNMP MIB का डाउनलोड URL |
| sdk_filename | स्रोत SDK का फ़ाइल नाम |
| sdk_hash | स्रोत SDK का MD5 |
| sdk_url | स्रोत SDK का डाउनलोड URL |
| product | उत्पाद का नाम |
| version | संस्करण स्ट्रिंग |
| build | बिल्ड स्ट्रिंग |
| date | रिलीज़ दिनांक |
e2b9f315547ea50a65baad4899a4780078ab273e और 26bb3636c987fc7e145af73ddea6c10fa93bdae95520c64bfa8554c5c17ab671aaed0fdeec91bf19b60e7d4d576b39dd46107058adb635d43e80e00d4753f5e8126a00cc0a8559bfd9b47d6340903323f2ce2992695fae5477c46980148c89e9c91a5cce
090a33be0be4aac8eee8d825447c0eb18dc8b51a287e4a8e059d3ee7a5f643211fcf00c292cd6f4d