
تتبع تاريخ أحداث USB على GNU/Linux
usbrip (موروث من "USB Ripper"، وليس "USB R.I.P.") هو أداة بسيطة للأدلة الجنائية بواجهة سطر أوامر تتيح لك تتبع أثر أجهزة USB (أي سجل أحداث USB) على أجهزة لينكس.
جدول المحتويات:
usbrip هو برنامج صغير يحلل بيانات سجلات لينكس: مخرجات journalctl أو محتويات ملفات /var/log/syslog* (أو /var/log/messages*). استنادًا إلى البيانات المجمعة، يمكن لـ usbrip بناء جداول تاريخ أحداث USB تحتوي على الأعمدة التالية:
بالإضافة إلى ذلك، يمكنه أيضًا:
-s* إنشاء مخازن محمية (أرشيفات 7-Zip) لعمل نسخ احتياطي تلقائي وتجميع أحداث USB بمساعدة جدولة cron.الطريقة 1. التثبيت باستخدام pip:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
الطريقة 2. تثبيت الإصدار الأحدث باستخدام install.sh (موصى به، ميزات إضافية متاحة):
~$ sudo apt install python3-venv p7zip-full -y
~$ git clone https://github.com/snovvcrash/usbrip && cd usbrip
~/usbrip$ sudo -H installers/install.sh
~/usbrip$ cd
~$ usbrip -h

Docker (*للعرض فقط!*)
~$ docker run --rm -it snovvcrash/usbrip
يدعم usbrip نوعين من الطوابع الزمنية لتحليلها ضمن ملفات سجل النظام:
"%b %d %H:%M:%S"، مثال "Jan 1 00:00:00"). هذا النوع من الطابع الزمني لا يوفر معلومات عن السنة."%Y-%m-%dT%H:%M:%S.%f%z"، مثال "1970-01-01T00:00:00.000000-00:00").إذا كان لديك journalctl مثبتًا، فلا داعي للقلق لأنه يمكنه تحويل الطوابع الزمنية مباشرة. وإلا، يمكن تحقيق هيكل syslog المطلوب عن طريق تعيين تنسيق RSYSLOG_FileFormat في إعدادات rsyslog.
/etc/rsyslog.conf:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf مخصص لـ usbrip:~$ echo '$ActionFileDefaultTemplate RSYSLOG_FileFormat' | sudo tee /etc/rsyslog.d/usbrip.conf
~$ sudo rm -f /var/log/syslog* /var/log/messages*
~$ sudo systemctl restart rsyslog
أولاً، سيتحقق usbrip مما إذا كان هناك إمكانية لتفريغ أحداث النظام باستخدام journalctl كأكثر خيار قابلية للنقل. إذا لم يكن الأمر كذلك، فسيبحث ويحلل ملفات سجل النظام /var/log/syslog* أو /var/log/messages*.
storage)للبساطة، دعنا نتفق على أن جميع الأوامر التي يظهر فيها البادئة ~/usbrip$ يتم تنفيذها في الدليل ~/usbrip الذي يتم إنشاؤه نتيجة لعملية git clone:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shبالإضافة إلى التثبيت باستخدام pip، يمكن أيضًا تثبيت usbrip باستخدام السكريبت المخصص installers/install.sh.
عند استخدام install.sh، تصبح بعض الميزات الإضافية متاحة:
storage – تعيين مهمة cron لنسخ أحداث USB احتياطيًا وفقًا لجدول زمني (مثال على مهمة cron موجود في usbrip/cron/usbrip.cron).⚠️ تحذير: إذا كنت تستخدم جدولة cron، فأنت تريد تكوين crontab باستخدام sudo crontab -e لفرض تشغيل الوحدة الفرعية storage update كجذر. كلمات مرور التخزين محفوظة في /var/opt/usbrip/usbrip.ini ولا يمكن الوصول إليها إلا من قبل الجذر بشكل افتراضي.
لتثبيت usbrip باستخدام install.sh استخدم:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l، يتم حل تبعيات Python من حزم .tar المحلية (دليل 3rdPartyTools) بدلاً من PyPI.-s، لا يتم تثبيت مشروع usbrip فحسب، بل يتم أيضًا إنشاء قائمة أجهزة USB الموثوقة ومخازن التاريخ والانتهاكات.بعد اكتمال التثبيت، يمكنك حذف الدليل ~/usbrip بحرية.
عند التثبيت باستخدام install.sh، يستخدم usbrip المسارات التالية:
/opt/usbrip/ – الدليل الرئيسي للمشروع./var/opt/usbrip/log/ – سجلات cron لـ usbrip./var/opt/usbrip/storage/ – مخازن أحداث USB (history.7z و violations.7z، يتم إنشاؤها أثناء عملية التثبيت)./var/opt/usbrip/trusted/ – قوائم أجهزة USB الموثوقة (auth.json، يتم إنشاؤها أثناء عملية التثبيت)./var/opt/usbrip/usbrip.ini – ملف تكوين usbrip (يحتوي على كلمات مرور لمخازن 7-Zip)./usr/local/bin/usbrip – رابط رمزي إلى السكريبت /opt/usbrip/venv/bin/usbrip.يمكن تعيين مهام cron على النحو التالي:
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shيقوم السكريبت installers/uninstall.sh بإزالة usbrip وجميع آثار التثبيت من نظامك.
لإلغاء تثبيت usbrip استخدم:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a، لا يتم حذف دليل مشروع usbrip فحسب، بل يتم أيضًا حذف جميع المخازن وسجلات usbrip.لا تنس إزالة مهمة cron إذا كنت قد قمت بإعدادها.
# ---------- BANNER ----------
~$ usbrip banner
الحصول على شعار usbrip.
# ---------- EVENTS ----------
~$ usbrip events history [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
الحصول على سجل أحداث USB.
~$ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
فتح تفريغ أحداث USB.
~$ sudo usbrip events genauth <OUT_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
إنشاء قائمة بأجهزة USB الموثوقة (المصرح بها).
~$ sudo usbrip events violations <IN_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
الحصول على أحداث انتهاك USB بناءً على قائمة الأجهزة الموثوقة.
# ---------- STORAGE ----------
~$ sudo usbrip storage list <STORAGE_TYPE> [-q] [--debug]
سرد محتويات المخزن المحدد. STORAGE_TYPE إما "history" أو "violations".
~$ sudo usbrip storage open <STORAGE_TYPE> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
فتح المخزن المحدد. يتصرف بشكل مشابه للوحدة الفرعية EVENTS OPEN.
~$ sudo usbrip storage update <STORAGE_TYPE> [IN_AUTH.JSON] [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
تحديث المخزن – إضافة أحداث USB إلى المخزن الحالي. COMPRESSION_LEVEL رقم في [0..9].
~$ sudo usbrip storage create <STORAGE_TYPE> [IN_AUTH.JSON] [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
إنشاء مخزن – إنشاء أرشيف 7-Zip وإضافة أحداث USB إليه وفقًا للخيارات المحددة.
~$ sudo usbrip storage passwd <STORAGE_TYPE> [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
تغيير كلمة مرور المخزن الحالي.
# ---------- IDs ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
الحصول على تفاصيل إضافية حول جهاز USB محدد بواسطة <VID> و/أو <PID> من قاعدة بيانات معرفات USB.
~$ usbrip ids download [-q] [--debug]
تحديث (تنزيل) قاعدة بيانات معرفات USB.
للحصول على قائمة بأسماء الوحدات استخدم:
~$ usbrip -h
للحصول على قائمة بأسماء الوحدات الفرعية لوحدة معينة استخدم:
~$ usbrip <MODULE> -h
للحصول على قائمة بجميع المفاتيح لوحدة فرعية معينة استخدم:
~$ usbrip <MODULE> <SUBMODULE> -h
عرض سجل أحداث جميع أجهزة USB، مع إخفاء إخراج الشعار ورسائل المعلومات وتفاعل المستخدم (-q, --quiet)، معروضًا كقائمة (-l, --list) بأحدث 100 إدخال (-n NUMBER, --number NUMBER):
~$ usbrip events history -ql -n 100
عرض سجل أحداث أجهزة USB الخارجية (-e, --external, التي تم فصلها فعليًا) معروضًا كجدول (-t, --table) يحتوي على أعمدة (متصل، VID، PID، مفصول، رقم تسلسلي) (-c COLUMN [COLUMN ...], --column COLUMN [COLUMN ...]) تمت تصفيته حسب التاريخ (-d DATE [DATE ...], ) و PID () مع سجلات مأخوذة من ملفات خارجية (, ):
--date DATE [DATE ...]--pid <PID> [<PID> ...]-f FILE [FILE ...]--file FILE [FILE ...]~$ usbrip events history -et -c conn vid pid disconn serial -d '1995-09-15' '2018-07-01' --pid 1337 -f /var/log/syslog.1 /var/log/syslog.2.gz
👽 ملاحظة: هناك شيء يجب تذكره عند العمل مع المرشحات. هناك 4 أنواع من التصفية المتاحة: فقط أحداث USB الخارجية (الأجهزة التي يمكن إزالتها بسهولة، -e)، حسب التاريخ (-d)، حسب الحقول (--host, --vid, --pid, --product, --manufact, --serial, --port) و حسب عدد الإدخالات التي تحصل عليها كمخرج (-n). عند تطبيق مرشحات مختلفة في وقت واحد، ستحصل على السلوك التالي: أولاً، يتم تطبيق مرشحات الخارجية و حسب التاريخ، ثم سيبحث usbrip عن قيم الحقل المحددة في تقاطع المرشحين الأخيرين، وفي النهاية سيقطع الإخراج إلى العدد الذي حددته مع الخيار -n. لذا فكر فيه كـ تقاطع لتصفية الخارجية و حسب التاريخ و اتحاد لتصفية حسب الحقول. أتمنى أن يكون هذا واضحًا.
بناء سجل أحداث جميع أجهزة USB وإعادة توجيه الإخراج إلى ملف لمزيد من التحليل. عندما لا يكون دفق الإخراج هو stdout الطرفي (| أو > مثلاً) لن تكون هناك أحرف هروب ANSI (لون) في الإخراج لذا لا تتردد في استخدامه بهذه الطريقة. لاحظ أيضًا أن usbrip يستخدم بعض رموز UNICODE لذا سيكون من الجيد تحويل الملف الناتج إلى ترميز UTF-8 (باستخدام encov مثلاً) بالإضافة إلى تغيير أحرف السطر الجديد إلى نمط Windows لسهولة النقل (باستخدام awk مثلاً):
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 ملاحظة: يمكنك دائمًا التخلص من أحرف الهروب بنفسك حتى لو حصلت على الإخراج إلى stdout. للقيام بذلك، ما عليك سوى نسخ بيانات الإخراج إلى usbrip.out وتطبيق تعليمة awk إضافية:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
إنشاء قائمة بأجهزة USB الموثوقة كملف JSON (trusted/auth.json) مع سمات VID و PID تحتوي على أول ثلاثة أجهزة متصلة في 30 نوفمبر 1984:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ تحذير: هناك حالات قد تحتوي فيها محركات أقراص USB مختلفة على أرقام تسلسلية متطابقة. يمكن أن يحدث هذا نتيجة خطأ في التصنيع أو ببساطة بعض الهاكرز تمكنوا من إعادة كتابة شريحة ذاكرة المحرك التي تبين أنها غير قابلة للبرمجة لمرة واحدة وهكذا... على أي حال، "لا يوجد نظام آمن". usbrip لا يتعامل مع مثل هذه الحالات بطريقة ذكية حتى الآن، أي سيعامل زوجًا من الأجهزة بأرقام تسلسلية متطابقة (إذا وجد) كجهاز واحد فيما يتعلق بقائمة الأجهزة الموثوقة ووحدة genauth.
البحث في سجل أحداث أجهزة USB الخارجية عن انتهاكات بناءً على قائمة أجهزة USB الموثوقة (trusted/auth.json) بواسطة سمة PID، وتقييد الأحداث الناتجة لتلك التي تحتوي على Bob-PC كاسم مضيف، EvilUSBManufacturer كشركة مصنعة، 0123456789 كرقم تسلسلي، وتمثيل الإخراج كجدول بأعمدة (متصل، VID، PID):
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
البحث عن تفاصيل حول جهاز USB محدد بواسطة VID (--vid VID) و PID (--pid PID):
~$ usbrip ids search --vid 0781 --pid 5580
تنزيل أحدث إصدار من قاعدة بيانات usb.ids قاعدة البيانات:
~$ usbrip ids download