بناء هجمات USB في المختبر — أمثلة عملية
كتابة DuckyScript، Pi Pico كـ BadUSB، والدفاع المضاد
نطاق هذا الدرس
الدرس السابق (usb-network-implants) شرح ماذا ولماذا. هذا الدرس يجيب على كيف نبنيها بأيدينا في مختبر مرخّص — وكيف نكتشفها كمدافعين. كل أمثلة الكود هنا تعليمية: تفتح Notepad، تكتب علامة في ملف، تطبع رسالة. لا تحتوي C2 ولا سرقة بيانات.
- كل سكربت هنا قانوني فقط داخل: حاسوبك، VM في مختبرك، عقد red team موقّع، أو تقييم تحت تفويض حكومي.
- تشغيل أيٍ منها على كمبيوتر زميل/عائلة/شركة بدون إذن مكتوب = جناية تحت CFAA §1030(a)(5)(A).
- حتى "مزحة" على جهاز شخص آخر يمكن أن تنتج ملفاً جنائياً فيدرالياً.
إعداد مختبر آمن قبل أي شيء
VirtualBox أو VMware Workstation. Windows 10/11 trial أو Linux. شبكة Host-Only أو Internal — لا NAT ولا Bridge. snapshot قبل كل تجربة.
VirtualBox: Devices → USB → اختر الجهاز. هذا يضمن أن BadUSB لا يلمس المضيف الحقيقي. لو كنت على Mac/Linux مضيف، الأفضل استخدام آلة فيزيائية "قربان" قديمة.
- Hak5 Payload Studio (مجاني، ويب) — لكتابة DuckyScript.
- Raspberry Pi Pico ($4) — أرخص بديل عن Rubber Ducky ($60).
- CircuitPython + مكتبة adafruit_hid — ما يحوّل Pico لـ HID.
- محرر نصوص + Wireshark + USBPcap (لتحليل ما يحدث على ناقل USB).
لتجنب كارثة، اجعل كل سكربت يبحث عن ملف C:\\LAB_OK.txt ولا ينفذ شيئاً إن لم يجده. هكذا لو ضاع USB من الطاولة لن يضرّ جهازاً عشوائياً.
مثال 1 — DuckyScript: "hello world" لـ BadUSB
هذا أبسط سكربت ممكن. يفتح Notepad ويكتب نصاً. الهدف: فهم بنية DuckyScript قبل أي شيء أعقد.
REM أبسط PoC تعليمي — يفتح Notepad ويكتب علامة
DELAY 1500 REM انتظر تعرّف النظام على "لوحة المفاتيح"
GUI r REM Win+R = فتح Run
DELAY 300
STRING notepad
ENTER
DELAY 800
STRING USB lab test - educational only - $(Get-Date)
ENTER
STRING This file proves the HID could type. No payload executed.ما الذي يعلّمه: ضربات المفاتيح (STRING)، المفاتيح الخاصة (GUI, ENTER)، وأهمية DELAY — بدونها السكربت يكتب قبل أن يفتح Notepad فيضيع الإدخال.
مثال 2 — DuckyScript بـ canary وحدود تنفيذ آمنة
REM PoC تعليمي مع canary — لن ينفذ ما لم يجد ملف اختبار
DELAY 1500
GUI r
DELAY 300
STRING powershell -w hidden -nop -c "if (Test-Path C:\LAB_OK.txt) { Add-Content C:\LAB_OK.txt ('USB-PoC ran at ' + (Get-Date)) } else { exit }"
ENTERسطر واحد PowerShell يتحقق من وجود علامة. لو فتحت USB بالخطأ على جهاز ليس فيه C:\\LAB_OK.txt، لا يحدث شيء. هذا نمط "safety net" مهم في مختبرات التدريب.
مثال 3 — اكتشاف بيئة قبل الإقلاع
سكربت تعليمي يطبع نوع نظام التشغيل ولغة لوحة المفاتيح إلى ملف. هذا نمط حقيقي يستخدمه المهاجمون لتعديل لاحق للحمولة — لكن هنا نوقف عند "اعرف فقط".
REM PoC: enumerate environment, write to file, exit
DELAY 1500
GUI r
DELAY 300
STRING powershell -w hidden -nop -c "if (-not (Test-Path C:\LAB_OK.txt)) { exit }; $info = @{ os = $PSVersionTable.OS; user = $env:USERNAME; lang = (Get-Culture).Name; time = (Get-Date) }; $info | Out-File C:\LAB_OK.txt -Append"
ENTERالقيمة الدفاعية: فهم أن المهاجم يحتاج 5–15 ثانية ليجمع هذه المعلومة الأولية. EDR الذي يصطاد "PowerShell hidden launched seconds after USB plug" يكسر السلسلة قبل أن تبدأ.
مثال 4 — Raspberry Pi Pico كـ BadUSB بـ $4
Pi Pico بـ CircuitPython + adafruit_hid يكافئ Rubber Ducky تجارياً. كامل الكود تعليمي ومفتوح:
- حمّل firmware CircuitPython من circuitpython.org اضغط زر BOOTSEL أثناء التوصيل، اسحب ملف .uf2 إلى الـ drive الذي يظهر.
- انسخ مكتبة adafruit_hid إلى مجلد /lib في الـ Pico.
- عدّل code.py أدناه.
# code.py — PoC تعليمي على Raspberry Pi Pico
# يفتح Notepad ويكتب علامة، ثم يتوقف نهائياً.
# لا يحوي اتصال شبكي ولا تنفيذ ثنائي.
import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
# تأخير الإقلاع — ينتظر تعرّف النظام على HID
time.sleep(2.5)
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)
# Win+R
kbd.send(Keycode.GUI, Keycode.R)
time.sleep(0.4)
# اكتب الأمر
layout.write("notepad\n")
time.sleep(1.0)
# اكتب رسالة تعليمية ثم توقف
layout.write("Pi Pico BadUSB lab test - educational PoC only.\n")
layout.write("No network, no exec, no payload.\n")
# قفل لمنع تكرار التنفيذ
while True:
time.sleep(60)مثال 5 — انتحال جهاز موثوق (VID/PID spoofing)
كل جهاز USB يقدّم نفسه بـ Vendor ID + Product ID. أنظمة GPO تسمح أحياناً بـ "Logitech keyboards" فقط. الهجوم: عدّل descriptors لتقول إنك Logitech.
# في boot.py على Pico — قبل أي شيء آخر
import usb_hid
import supervisor
# أمثلة VID/PID — موجودة في قواعد بيانات USB-IF العامة
# 046d:c31c = Logitech generic keyboard
supervisor.set_usb_identification(
manufacturer="Logitech",
product="USB Keyboard",
vid=0x046D,
pid=0xC31C,
)مثال 6 — autorun الكلاسيكي (لِمَ ما زال يهم)
منذ Windows 7 SP1 معطّل افتراضياً، لكن: (أ) أنظمة OT/ICS كثيرة ما زالت تعمل XP/7 RTM، (ب) بعض GPO تعيد تفعيله للـ "ملاءمة".
; autorun.inf تعليمي — على XP/7 RTM يفتح ملف عند الإدخال
[autorun]
open=demo.exe
icon=demo.ico
label=Lab USB
action=Open lab demo- تأكد عبر GPO أن NoDriveTypeAutoRun = 0xFF.
- على ICS: ابن "USB sanitization kiosk" (Olea, OPSWAT) قبل أي توصيل بشبكة OT.
- افحص الـ USB في sandbox منفصل (Cuckoo, ANY.RUN) إن كان مصدره خارجياً.
مثال 7 — رؤية ما يحدث على الناقل (USBPcap)
قبل أن تدافع، شاهد. Wireshark + USBPcap على Windows أو usbmon على Linux يظهران كل packet HID.
هذه الرؤية تكشف: Pico/Ducky يطلق عشرات keystrokes في ثانية واحدة. لا بشري يكتب بهذا الإيقاع. التوقيع التحليلي بسيط جداً للـ EDR ليكتشفه.
بناء الدفاع طبقة طبقة
- سياسة USB مكتوبة وموقّعة. حظر افتراضي، استثناءات بطلب.
- تدريب موظفين كل 6 أشهر بـ drop-test فعلي.
- في OT/ICS: كل USB يدخل عبر kiosk تنظيف فقط.
- Windows GPO: Computer Configuration → Administrative Templates → System → Device Installation → Device Installation Restrictions. اسمح فقط بـ device IDs محددة.
- USBGuard على Linux:
sudo apt install usbguard
sudo usbguard generate-policy > /etc/usbguard/rules.conf
sudo systemctl enable --now usbguard
# قاعدة مثال — اسمح فقط بـ keyboard مسجّل بـ serial:
# allow id 046d:c31c serial "ABC123XYZ"
# block- macOS: اطلب موافقة لكل ملحق USB جديد (System Settings → Privacy & Security → Allow accessories).
- BIOS: عطّل USB boot، اقفل BIOS بكلمة سر، عطّل منافذ غير مستخدمة فيزيائياً (epoxy في بعض بيئات SCIF).
- قاعدة Sigma: "HID device added then PowerShell.exe child of explorer.exe within 10s" → high-severity alert.
- قاعدة: "keystroke rate > 300 chars/sec" — لا بشري يكتب بهذا.
- قاعدة: "new VID/PID combination not in CMDB" → quarantine.
- تتبع DeviceEvents في Microsoft Defender for Endpoint — لها schema جاهز.
- egress baseline: لو محطة عمل فجأة فتحت اتصال خارجي بنطاق غير مألوف خلال دقيقة من event "USB inserted" → تحقيق.
- Sysmon Event ID 22 (DNS query) + Event ID 1 (Process create) للـ powershell.exe = correlation قوية.
- أغطية USB مقفلة (PadJacks).
- كاميرات مراقبة تركّز على المنافذ في غرف الخوادم/SCADA.
- سياسة "لا أجهزة شخصية" في مناطق تصنيف.
قائمة فحص للـ Red Team — قبل التشغيل في عملية مرخّصة
- تفويض مكتوب يغطي USB drops و BadUSB صريحاً (Rules of Engagement).
- تحديد المواقع المسموح إسقاط USB فيها — لا تتسلل إلى مناطق ليست في النطاق.
- كل USB يحوي canary — لن ينفذ خارج الـ environment المتفق عليه.
- تسجيل serial numbers لكل قطعة — حتى يُمكن استرجاعها بعد العملية.
- POC إخطار للمدير الأمني للهدف لو شيء انفلت من السيطرة.
- تقرير ما بعد العملية: ماذا التُقط، كم نقر المستخدمون، ما الكشف الذي عمل، ما الذي فشل.
مراجع تطبيقية
- Hak5 DuckyScript 3.0 reference — اللغة الكاملة
- Adafruit CircuitPython HID guide — لـ Pi Pico
- Microsoft Device Installation Restrictions docs
- USBGuard project (github.com/USBGuard)
- Sigma rules repo: rules/windows/sysmon — usb_ patterns
- SANS FOR509 / FOR526 للـ memory/USB forensics