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

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

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

प्रत्येक समर्थित बोर्ड के लिए फर्मवेयर निर्माण निर्देश यहाँ वर्णित हैं:
स्रोत कोड src निर्देशिका में है। यह एक फैट इमेज लोड करेगा, इसे TCP पोर्ट के माध्यम से एक्सपोज़ करेगा और इमेज के लिए किए गए प्रत्येक एक्सेस को लॉग करेगा। फ़ाइलों और निर्देशिकाओं की जानकारी प्रिंट करने के लिए, उपकरण TheSleuthKit लाइब्रेरी पर निर्भर करता है।
निर्माण करने के लिए, रूट निर्देशिका में निम्नलिखित कमांड चलाएँ
सभी सबमॉड्यूल प्राप्त करें
git submodule update --init --recursive
फिर waf कॉन्फ़िगर कमांड चलाएँ।
./waf configure
यह सभी आवश्यक निर्भरताओं की जाँच और निर्माण करेगा, फिर वास्तव में प्रोजेक्ट बनाने के लिए चलाएँ
./waf build
बाइनरी wbuild निर्देशिका में होगी
हम 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 पोर्ट में प्लग करें।
एक विशिष्ट 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
आप rawimage उदाहरण से भी शुरुआत कर सकते हैं जो usb-spy बाइनरी में मूल रूप से लागू की गई चीज़ों का एक पूर्ण कार्यान्वयन (~100 लाइनों का कोड) प्रदान करता है।
यह परियोजना "जैसी है" प्रदान की गई है। किसी विशेष उद्देश्य के लिए शुद्धता, सुरक्षा या उपयुक्तता की कोई गारंटी नहीं है।
उपकरणों और फर्मवेयर का उपयोग अपने जोखिम पर करें। लेखक और योगदानकर्ता इस सॉफ्टवेयर या हार्डवेयर के उपयोग से उत्पन्न होने वाली किसी भी क्षति, डेटा हानि या कानूनी परिणामों के लिए जिम्मेदार नहीं हैं।
योगदान का स्वागत है! कृपया इन चरणों का पालन करें:
यह परियोजना GNU जनरल पब्लिक लाइसेंस v3.0 के तहत लाइसेंस प्राप्त है। विवरण के लिए LICENSE फ़ाइल देखें।