
USB Mass Storage ट्रैफ़िक को ब्लॉक और फ़ाइल स्तर पर इंटरसेप्ट और विश्लेषण करता है, USB उपकरणों का अनुकरण करता है, और सुरक्षा अनुसंधान, फोरेंसिक्स और TOCTOU भेद्यता परीक्षण के लिए कस्टम पायथन स्टब्स का समर्थन करता है।

usb-spy एक यूएसबी मास स्टोरेज ट्रैफिक विश्लेषक है जो WiFi या Ethernet-सक्षम माइक्रोकंट्रोलर के आसपास निर्मित है।
बोर्ड एक डिस्क इमेज (FAT या कोई भी फाइलसिस्टम) को लक्ष्य प्रणाली के लिए एक नकली यूएसबी मास स्टोरेज डिवाइस के रूप में प्रस्तुत करता है, जबकि वास्तविक स्टोरेज डेटा WiFi या Ethernet पर एक दूरस्थ सर्वर द्वारा प्रदान किया जाता है। यह सेटअप usb-spy को लक्ष्य द्वारा किए गए प्रत्येक ब्लॉक एक्सेस को इंटरसेप्ट और विश्लेषण करने की अनुमति देता है।
कच्चे ब्लॉक-स्तरीय ट्रेसिंग से परे, usb-spy फाइलसिस्टम को समझता है और प्रत्येक एक्सेस किए गए ब्लॉक को संबंधित फ़ाइल और निर्देशिका में मैप कर सकता है, जिससे यह तुरंत देखना आसान हो जाता है कि कौन सी फ़ाइल पढ़ी या लिखी जा रही है, केवल कच्चे सेक्टर नंबरों के बजाय।
इसके अतिरिक्त, usb-spy एक JSON कॉन्फ़िगरेशन फ़ाइल के माध्यम से विक्रेता ID, उत्पाद ID, सीरियल नंबर, निर्माता और उत्पाद नाम जैसे डिवाइस गुणों को अनुकूलित करके किसी भी यूएसबी डिवाइस का अनुकरण कर सकता है। यह आपको परीक्षण और विश्लेषण उद्देश्यों के लिए विशिष्ट यूएसबी डिवाइसों की नकल करने की अनुमति देता है।
यह टूल उपयोगकर्ता-लिखित Python स्टब्स के माध्यम से आसानी से विस्तार योग्य है, जिससे आप यूएसबी रीड/राइट इवेंट और ब्लॉक-स्तरीय संचालन को संभालने के लिए कस्टम लॉजिक लागू कर सकते हैं।

जब एक समर्थित फाइलसिस्टम का पता चलता है, usb-spy:
वर्तमान में समर्थित फाइलसिस्टम:
भविष्य में अतिरिक्त फाइलसिस्टम के लिए समर्थन जोड़ा जाएगा।
यदि फाइलसिस्टम समर्थित नहीं है, तो usb-spy अभी भी उपयोग किया जा सकता है:
यह सुनिश्चित करता है कि usb-spy अज्ञात, कस्टम, या मालिकाना फाइलसिस्टम के साथ भी उपयोगी बना रहे।

प्रत्येक समर्थित बोर्ड के लिए फर्मवेयर निर्माण निर्देश यहाँ वर्णित हैं:
स्रोत कोड src निर्देशिका में है। यह एक FAT इमेज लोड करेगा, इसे TCP पोर्ट के माध्यम से प्रदर्शित करेगा और इमेज पर किए गए हर एक्सेस को लॉग करेगा। फ़ाइलों और निर्देशिकाओं की जानकारी प्रिंट करने के लिए, टूल TheSleuthKit लाइब्रेरी पर निर्भर करता है।
निर्माण करने के लिए, रूट निर्देशिका में निम्नलिखित कमांड चलाएँ
सभी सबमॉड्यूल प्राप्त करें
git submodule update --init --recursive
फिर waf configure कमांड चलाएँ।
./waf configure
यदि आप Python एम्बेडिंग समर्थन के बिना निर्माण करना चाहते हैं, तो इसके साथ कॉन्फ़िगर करें:
./waf configure --disable-python
यह आवश्यक सभी निर्भरताओं की जाँच और निर्माण करेगा, फिर वास्तव में प्रोजेक्ट बनाने के लिए चलाएँ
./waf build
बाइनरी wbuild निर्देशिका में होगी
जब --disable-python के साथ निर्मित किया जाता है, तो --py और --py-args रनटाइम विकल्प उपलब्ध नहीं होते हैं।
हम इसे mtools यूटिलिटी पैकेज के साथ आसानी से कर सकते हैं
2 MB फ़ाइल बनाएं
dd if=/dev/zero of=disk.img bs=1M count=2
उस पर FAT फाइलसिस्टम डालें (FAT32 के लिए -F का उपयोग करें, अन्यथा यह स्वचालित है)
mformat -i disk.img ::
इसमें एक फ़ाइल जोड़ें
mcopy -i disk.img example.txt ::
फ़ाइलें सूचीबद्ध करें
mdir -i disk.img ::
एक फ़ाइल निकालें
mcopy -i disk.img ::/example.txt extracted.txt
नव निर्मित इमेज के साथ स्पाई चलाएँ
./usb-spy -v disk.img
रॉ मोड को बलपूर्वक लागू करने और फाइलसिस्टम स्वतः-पहचान को छोड़ने के लिए:
./usb-spy --raw disk.img
एक्सेस को सीधे वास्तविक ब्लॉक डिवाइस पर प्रॉक्सी करने के लिए:
./usb-spy --proxy /dev/sda
बोर्ड को लक्ष्य USB पोर्ट में प्लग करें।
एक विशिष्ट USB डिवाइस का अनुकरण करने के लिए, पैरामीटर को json कॉन्फ़िग फ़ाइल के माध्यम से ओवरराइड किया जा सकता है:
निम्नलिखित json फ़ाइल एक Kingston DataTraveler USB डिवाइस का अनुकरण करेगी:
{
"vendor_id": 2385,
"product_id": 5734,
"bcd_device": 272,
"product_rev": "3.0",
"manufacturer": "Kingston",
"product_name": "DataTraveler",
"serial": "509C4BBFACCDE742880C026B",
"language": 1033
}
इस कॉन्फ़िगरेशन फ़ाइल के साथ स्पाई चलाएँ
./usb-spy -c config/kingston.json disk.img
इस डिवाइस के लिए dmesg आउटपुट:
usb 1-8: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.10
usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-8: Product: DataTraveler
usb 1-8: Manufacturer: Kingston
usb 1-8: SerialNumber: 509C4BBFACCDE742880C026B
usb-storage 1-8:1.0: USB Mass Storage device detected
scsi host6: usb-storage 1-8:1.0
scsi 6:0:0:0: Direct-Access Kingston DataTraveler 3.0 PQ: 0 ANSI: 2
यदि आप प्रत्येक रीड/राइट इवेंट के लिए अपना स्वयं का लॉजिक लागू करना चाहते हैं, तो आप इसे python में आसानी से कर सकते हैं।
USBImage क्लास को python में इस dummy इमेज की तरह लागू करें:
class USBImage:
def __init__(self, *args, **kwargs):
"""
Initialize the USBImage.
:param args: should contain:
- filename: The name of the file to manage.
:param kwargs: Arbitrary arguments passed from the c++ command line including:
readOnly: Whether the interface is read-only.
verbose: Whether to enable verbose logging.
block: Whether to enable block mode.
"""
pass
def getBlockNumber(self):
"""Get block number"""
return 100
def getBlockSize(self):
"""Get block size"""
return 512
def read(self, lba, buffer, size):
"""Read block"""
print(f"read block={lba} size={size}")
for i in range(size):
buffer[i] = (lba + i) % 256 # Simulate reading data
return size
def write(self, lba, buffer, size):
"""Write block"""
print(f"write block={lba} size={size}")
print(buffer)
return size
def flush(self):
"""Flush block"""
print("flush data")
और अपने python मॉड्यूल के साथ स्पाई चलाएँ।
./usb-spy --py python/dummy.py disk.img
आप कमांड लाइन से अपनी python क्लास में मनमाने तर्क भी पास कर सकते हैं। तर्क kwargs में उपलब्ध हैं।
./usb-spy --py python/dummy.py --py-args arg1=2 --py-args arg2=Hello disk.img