
يعترض ويحلل حركة مرور أجهزة التخزين الكتلي USB على مستوى الكتلة والملف، ويحاكي أجهزة USB، ويدعم برامج ثابتة مخصصة بلغة بايثون لأبحاث الأمن، والتحليل الجنائي، واختبار ثغرات TOCTOU.

usb-spy هو محلل حركة مرور USB Mass Storage مبني حول متحكم دقيق يدعم WiFi أو Ethernet.
يعرض اللوح صورة قرص (FAT أو أي نظام ملفات) كجهاز USB Mass Storage وهمي للنظام المستهدف، بينما يتم توفير بيانات التخزين الفعلية من خادم بعيد عبر WiFi أو Ethernet. يتيح هذا الإعداد لـ usb-spy اعتراض وتحليل كل عملية وصول إلى الكتل يقوم بها النظام المستهدف.
إلى جانب التتبع على مستوى الكتل الخام، يفهم usb-spy أنظمة الملفات ويمكنه ربط كل كتلة تم الوصول إليها بالملف والدليل المقابلين، مما يسهل رؤية الملف الذي يتم قراءته أو كتابته فورًا، بدلاً من مجرد أرقام القطاعات الخام.
بالإضافة إلى ذلك، يمكن لـ usb-spy محاكاة أي جهاز USB من خلال تخصيص خصائص الجهاز مثل معرف البائع، ومعرف المنتج، والرقم التسلسلي، والشركة المصنعة، واسم المنتج عبر ملف إعدادات JSON. يتيح لك ذلك انتحال شخصية أجهزة USB محددة لأغراض الاختبار والتحليل.
الأداة قابلة للتوسعة بسهولة من خلال أكواد Python النصية التي يكتبها المستخدم، مما يتيح لك تنفيذ منطق مخصص للتعامل مع أحداث القراءة/الكتابة USB وعمليات مستوى الكتل.

عند اكتشاف نظام ملفات مدعوم، يقوم usb-spy بما يلي:
أنظمة الملفات المدعومة حاليًا:
سيتم إضافة دعم لأنظمة ملفات إضافية في المستقبل.
إذا لم يكن نظام الملفات مدعومًا، فلا يزال بإمكان usb-spy العمل:
يضمن ذلك بقاء usb-spy مفيدًا حتى مع أنظمة الملفات غير المعروفة أو المخصصة أو الاحتكارية.

تعليمات بناء البرنامج الثابت لكل لوحة مدعومة موصوفة هنا:
الكود المصدري موجود في دليل src. سيقوم بتحميل صورة FAT، وعرضها عبر منفذ TCP، وتسجيل كل عملية وصول تتم على الصورة. لطباعة معلومات الملفات والأدلة، تعتمد الأداة على مكتبة TheSleuthKit.
للبناء، قم بتشغيل الأمر التالي في الدليل الجذر
جلب جميع الوحدات الفرعية
git submodule update --init --recursive
ثم قم بتشغيل أمر إعداد waf.
./waf configure
إذا كنت تريد البناء بدون دعم تضمين Python، قم بالإعداد باستخدام:
./waf configure --disable-python
سيقوم بالتحقق من وبناء جميع التبعيات التي يحتاجها، ثم لبناء المشروع فعليًا قم بتشغيل
./waf build
سيكون الملف الثنائي في دليل wbuild
عند البناء باستخدام --disable-python، لن تكون خيارات التشغيل --py و --py-args متاحة.
يمكننا القيام بذلك بسهولة باستخدام حزمة أدوات mtools
إنشاء ملف بحجم 2 ميجابايت
dd if=/dev/zero of=disk.img bs=1M count=2
وضع نظام ملفات FAT عليه (استخدم -F لـ FAT32، وإلا فسيكون تلقائيًا)
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
يمكنك أيضًا البدء من مثال rawimage الذي يوفر تنفيذًا كاملاً (~100 سطر من الكود) لما هو منفذ في ملف usb-spy الثنائي بشكل أصلي.
يتم توفير هذا المشروع "كما هو". لا يوجد ضمان للصحة أو الأمان أو الملاءمة لأي غرض معين.
استخدم الأدوات والبرامج الثابتة على مسؤوليتك الخاصة. المؤلف والمساهمون غير مسؤولين عن أي ضرر أو فقدان بيانات أو عواقب قانونية قد تنشأ عن استخدام هذا البرنامج أو العتاد.
المساهمات مرحب بها! يرجى اتباع الخطوات التالية:
هذا المشروع مرخص بموجب رخصة GNU العامة العامة الإصدار 3.0. راجع ملف LICENSE للحصول على التفاصيل.