
कवरेज-निर्देशित इन-प्रोसेस फज़र iOS ब्लूटूथ डेमन (bluetoothd) के लिए FRIDA का उपयोग करते हुए, MagicPairing प्रोटोकॉल के लिए ओवर-द-एयर फज़िंग के साथ और क्रैश रीप्ले क्षमताएँ।

ToothPicker एक इन-प्रोसेस, कवरेज-निर्देशित फज़र है जो iOS के लिए है। इसे विशेष रूप से iOS के ब्लूटूथ डेमॉन bluetoothd को लक्षित करने और iOS पर विभिन्न ब्लूटूथ प्रोटोकॉल का विश्लेषण करने के लिए विकसित किया गया था। चूंकि यह FRIDA का उपयोग करके बनाया गया है, इसे FRIDA चलाने वाले किसी भी प्लेटफॉर्म को लक्षित करने के लिए अनुकूलित किया जा सकता है।
इस रिपॉजिटरी में एक ओवर-द-एयर फ़ज़र भी शामिल है जिसमें InternalBlue का उपयोग करके Apple के MagicPairing प्रोटोकॉल को फ़ज़ करने का एक उदाहरणात्मक कार्यान्वयन है। इसके अतिरिक्त, इसमें ReplayCrashFile.py स्क्रिप्ट शामिल है जिसका उपयोग इन-प्रोसेस फ़ज़र द्वारा पाए गए क्रैश को सत्यापित करने के लिए किया जा सकता है।
यह एक बहुत ही सरल फज़र है जो केवल सक्रिय कनेक्शनों में बिट्स और बाइट्स को फ़्लिप करता है। कोई कवरेज-मार्गदर्शन नहीं, कोई इंजेक्शन नहीं, लेकिन एक डेमो और स्टेटफुल के रूप में अच्छा है। केवल Python+Frida के साथ चलता है, किसी मॉड्यूल या इंस्टॉलेशन की आवश्यकता नहीं है। iOS 13.5-14.3 पर परीक्षण किया गया। inplace-fuzzer देखें।
इन-प्रोसेस फ़ज़र विभिन्न iOS संस्करणों (13.3-13.7 परीक्षित) पर आउट-ऑफ-द-बॉक्स काम करता है, लेकिन प्रतीकों को निर्दिष्ट करना आवश्यक है। अन्य iOS संस्करणों में फ़ंक्शन पतों के अनुकूलन की आवश्यकता होती है। इसके अतिरिक्त, ऐसा लगता है कि FRIDA के स्टॉकर को iPhone 8 के साथ कुछ समस्याएँ हैं। नए iPhones पर जो PAC का समर्थन करते हैं, पॉइंटर्स पर हस्ताक्षर करने से प्रदर्शन काफी प्रभावित होता है। इसलिए, इसे iPhone 7 पर चलाने की अनुशंसा की जाती है।
ToothPicker frizzer के कोडबेस पर बनाया गया है। हालाँकि, इसे इस विशिष्ट अनुप्रयोग के लिए अनुकूलित किया गया है और इसलिए यह अब मूल संस्करण के साथ संगत नहीं है। भविष्य में इसे एक अधिक समर्पित घटक से बदलने की योजनाएँ हैं।
iPhone पर:
Linux पर:
Arch-आधारित Linux के लिए:
# usbmuxd typically comes with libimobiledevice
# but just to be sure, we manually install it as well
sudo pacman -S usbmuxd libimobiledevice python-virtualenv radamsa
# Connect the iPhone to the computer
# Unlock it.
# If a pairing message pops up, click "Trust"
# If no pairing message pops up:
idevicepair pair
# Now there should be the pop up, accept and then again:
idevicepair pair
# In case of connection errors:
sudo systemctl restart usbmuxd
# or pair phone and computer again
# Other useful commands
# To ssh into the iPhone:
# Checkra1n comes with an SSH server listening on Port 44
# Proxy the phone's SSH port to 4444 localport:
iproxy 4444 44
# Connect:
ssh root@localhost -p 4444
# Default password: alpine
# To fetch some device information of the phone:
ideviceinfo
Debian Linux के लिए:
लगभग ऊपर जैसा ही। अपवाद:
radamsa को git रिपॉजिटरी से स्थापित करने की आवश्यकता है क्योंकि यह पैकेज नहीं है।iproxy को अतिरिक्त पैकेज libusbmuxd-tools की आवश्यकता है।macOS के लिए:
Arch Linux सेटअप की तुलना में थोड़े भिन्न कमांड...
brew install libimobiledevice usbmuxd radamsa npm
idevicepair pair
npm install frida-compile
pip3 install frida-tools
macOS पर, PacketLogger, जो Additional Tools for Xcode का हिस्सा है, Bluetooth Debug Profile स्थापित होने के बाद विभिन्न पैकेटों को डीकोड कर सकता है। इसके अलावा, यदि आप Xcode के साथ iOS क्रैश लॉग खोलते हैं, तो यह कुछ प्रतीक जोड़ देगा।
सेटअप:
frizzer के लिए एक वर्चुअल Python वातावरण स्थापित करने की अनुशंसा की जाती है।frizzer निर्देशिका में चलाकर आवश्यक पैकेज स्थापित करें।projects निर्देशिका में MagicPairing प्रोटोकॉल को फ़ज़ करने के लिए एक उदाहरण प्रोजेक्ट है।MagicPairing हार्नेस को एक फ़ाइल में संकलित करें।harness निर्देशिका में cd करें और frida-compile स्थापित करें। ध्यान दें कि इसे उस फ़ोल्डर में चलाने की आवश्यकता है और इसे npm install frida-compile चलाकर उपयोगकर्ता के रूप में सीधे स्थापित किया जा सकता है।frida-compile ../projects/YOUR_PROJECT/YOUR_SPECIALIZED_HARNESS.JS -o ../projects/YOUR_PROJECT/harness.js चलाएँ। चूंकि यह npm संदर्भ में स्थापित किया गया था, इसके बजाय npx frida-compile चलाने की आवश्यकता हो सकती है। हर बार जब हार्नेस बदलता है, तो आपको को फिर से चलाना होगा।फ़ज़िंग:
bluetoothd को ताज़ा शुरू करने के लिए killall -9 bluetoothd चलाएँ।cd करें, क्रैशलॉग-निर्देशिका बनाएँ (mkdir crashes) और ../../frizzer/fuzzer.py fuzz -p . चलाएँ।संक्षेप में, एक नया प्रोजेक्ट शुरू करने के लिए, चलाएँ:
cd harness
npx frida-compile ../projects/YOUR_PROJECT/YOUR_SPECIALIZED_HARNESS.JS -o ../projects/YOUR_PROJECT/harness.js
cd ../projects/YOUR_PROJECT/
mkdir crashes
../../frizzer/fuzzer.py fuzz -p .
आप frizzer/fuzzer.py fuzz --seed 1234 -p . का उपयोग करके एक अलग सीड से शुरू कर सकते हैं।
नए iOS संस्करण जोड़ना:
वर्तमान में, iOS के विभिन्न संस्करण bluetoothd.js में परिभाषित हैं। आप इन्हें Ghidra संस्करण टूल के साथ पा सकते हैं, बशर्ते एक प्रारंभिक संस्करण हो जिसमें सभी आवश्यक प्रतीक हों। ध्यान दें कि उनमें से कुछ मूल iOS बाइनरी में नामित नहीं हैं, इसलिए आदर्श रूप से उस संस्करण से शुरू करें जो पहले से एनोटेट किया गया हो। हर बार जब bluetoothd.js बदलता है, तो आपको frida-compile को फिर से चलाना होगा।
bluetoothd क्षमताएँ बढ़ाना:
iOS क्रैश लॉग Settings -> Privacy -> Analytics & Improvements -> Analytics Data में संग्रहीत होते हैं। यदि उनमें bluetoothd.cpu_resource-*.ips पैटर्न के bluetoothd क्रैश होते हैं, तो यह इंगित करता है कि क्रैश संसाधनों से अधिक होने के कारण हुआ था। उन्हें निम्नानुसार बढ़ाया जा सकता है।
On an iPhone 7, run:
cd /System/Library/LaunchDaemons/
plistutil -i com.apple.jetsamproperties.D10.plist -o com.apple.jetsamproperties.D10.plist.txt
plistutil -i com.apple.jetsamproperties.D101.plist -o com.apple.jetsamproperties.D101.plist.txt
On iPhone SE2, these are in com.apple.jetsamproperties.D79.plist.:
cd /System/Library/LaunchDaemons/
plistutil -i com.apple.jetsamproperties.D79.plist -o com.apple.jetsamproperties.D79.plist.txt
Search for bluetoothd, update the priority to 19 (highest valid priority) and set the memory limit to something very high. Apply the same changes to both files.
<dict>
<key>ActiveSoftMemoryLimit</key>
<integer>24000</integer>
<key>InactiveHardMemoryLimit</key>
<integer>24000</integer>
<key>EnablePressuredExit</key>
<false/>
<key>JetsamPriority</key>
<integer>19</integer>
</dict>
Write the changes back and restart bluetoothd.
plistutil -i com.apple.jetsamproperties.D10.plist.txt -o com.apple.jetsamproperties.D10.plist
plistutil -i com.apple.jetsamproperties.D101.plist.txt -o com.apple.jetsamproperties.D101.plist
killall -9 bluetoothd
क्रमशः iPhone SE2 पर:
plistutil -i com.apple.jetsamproperties.D79.plist.txt -o com.apple.jetsamproperties.D79.plist
killall -9 bluetoothd
पुराने लॉग हटाना:
iOS एक प्रोग्राम के लिए क्रैश लॉग सहेजना बंद कर देता है जब 25 की सीमा पहुँच जाती है। यदि Xcode (Simulators & Devices के माध्यम से) के साथ क्रैश लॉग लोड किया जाता है, तो स्टैक ट्रेस में कुछ प्रतीक जोड़ दिए जाते हैं। एक बार सीमा पहुँचने पर, लॉग को या तो Xcode के माध्यम से या सीधे iOS डिवाइस पर /var/mobile/Library/Logs/CrashReporter/ फ़ोल्डर में हटाकर हटाया जा सकता है।
A12+:
iPhone XR/Xs से शुरू करके, PAC पेश किया गया है। इसके लिए FRIDA में NativeFunction पर sign() को कॉल करने की आवश्यकता होती है। जबकि यह पहले के CPUs पर एक नो-ऑप है, नए उपकरणों पर यह गति को बहुत कम कर देता है, लेकिन उन्हें काम करने के लिए इसकी आवश्यकता है। हमने देखा कि ToothPicker iPhone 7 के बजाय iPhone SE2 का उपयोग करने पर आधी गति से काम करता है।
ओवर-द-एयर फ़ज़र के MagicPairing कार्यान्वयन के लिए InternalBlue स्थापित होना आवश्यक है और इसे python MagicPairingFuzzer.py TARGET_BD_ADDR चलाकर निष्पादित किया जा सकता है।
यदि आप क्रैश को पुन: उत्पन्न करना चाहते हैं, तो ReplayCrashFile.py स्क्रिप्ट का उपयोग करें, जो एक क्रैश फ़ाइल ले सकती है और क्रैश पर आधारित पेलोड के साथ एक ओवर-द-एयर कनेक्शन आरंभ करती है।
frida-compile