UA RU
Мобільна версія Гарантійні умови Співпраця
Зворотний зв'язок Мапа сайту
0 0
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 19.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Перше знайомство з BadUSB

2021-08-04

Всі статті →

Вступ.

Увага! Інформація, наведена у статті, має просвітницький характер і не закликає до здійснення BadUSB атак. Використовуйте цю інформацію виключно для тестування власних систем на наявність вразливостей, беручи на себе всю відповідальність за можливі наслідки.

Атаки BadUSB належить до апаратних атак, які полягають у тому, що пристрій USB маскується під інший пристрій з метою прихованого виконання певних дій на атакованому комп’ютері. Наприклад, пристрій, який виглядає як USB «флешка», може виявитися USB клавіатурою, яка дуже швидко вводить команди від імені користувача. Більшість антивірусів не зреагують на таку атаку, бо вона мало чим відрізнятиметься від звичайного вводу з клавіатури.

Інгредієнти.


Для експериментів підійде будь-який мікроконтролер з підтримкою інтерфейсу USB. Наприклад, ATmega32U4. Він встановлений на платах Leonardo та аналогах. Підійдуть навіть деякі плати з програмною підтримкою USB, як-от Digispark. Перевагою останніх є невеликий розмір, що критично, якщо ви плануєте помістити пристрій у корпус, який нагадуватиме «флешку». Однак ATtiny85 з урахуванням завантажувача лишає близько 6Кб для ваших скетчів, чого може бути недостатньо для зберігання складних сценаріїв атак. Приклад у кінці статті розрахований на ATmega32U4. Якщо ви захочете перенести його на Digispark, то відповідна бібліотека буде називатися DigiKeyboard.

Принцип атаки.

Однією з найпоширеніших BadUSB атак є симуляція клавіатури. Розглянемо базовий сценарій атаки: наш пристрій визначається як USB клавіатура, запускає командний рядок і виконує певні команди. Серед переваг цього методу можливість вводити команди чи об’ємні сценарії з привілеями поточного користувача. Водночас основними недоліками є відсутність зворотного зв’язку й неуніверсальність: у різних операційних системах і графічних оболонках за виклик командного рядка відповідає різне клавіатурне скорочення. Для простоти будемо вважати, що атака здійснюється на операційну систему Microsoft Windows, де з великою ймовірністю комбінацією Win+R можна відкрити діалог запуску, а відтак ввести назву оболонки, наприклад, «cmd».

Базова функціональність USB клавіатури вже реалізована в бібліотеці Keyboard. Однак її використання ускладнює той факт, що поточна розкладка клавіатури в момент, коли здійснюється атака, заздалегідь невідома. Наприклад, рядок «cmd» перетвориться в «сьв», якщо поточна розкладка українська. Як уже було сказано, зворотний зв’язок відсутній: ми симулюємо пристрій введення, який не отримує від системи ніякої інформації (насправді отримує щонайменше стан світлодіодів клавіатури, що однак навряд допоможе визначити розкладку клавіатури, якщо користувач спеціально не використовує світлодіоди для її індикації).

Можливим компромісом є натискання можливих комбінацій перемикання розкладки клавіатури (Alt+Shift, Ctrl+Shift...) і повторне введення тексту з розрахунком на те, що рано чи пізно одна зі спроб виявиться успішною. Звісно кожна невдала спроба призводитиме до виведення повідомлень про некоректну команду, які доведеться закривати комбінацією Alt+F4. І звісно, в залежності від швидкодії системи, це може привернути увагу, тому непомітним цей підхід не назвеш.

На щастя, розробники з Microsoft лишили зручну можливість для незалежних від розкладки клавіатури атак, яка відома більшості українських користувачів. Ви користуєтеся нею щоразу, коли вводите апостроф без перемикання на англійську розкладку за допомогою натискання клавіші Alt і коду апострофа на цифровому блоці клавіатури. Механізм Alt-кодів успадкований від MS DOS і дозволяє ввести довільний символ за допомогою його коду. Якщо вам незнайомий цей спосіб вводу, тут можна дізнатися про нього більше. Щоб не переобтяжувати цей текст, зазначимо лише, що існує дві таблиці Alt-кодів. Якщо код починається з нуля, символ береться з кодової сторінки Windows, в іншому випадку - сторінки OEM.

Наступна проблема полягає в особливості бібліотеки Keyboard при натисканні клавіш цифрового блоку, які потрібні для вводу Alt-кодів. Коди клавіш цифрового блоку знаходяться в діапазоні від 84 (0x54) до 99 (0x63). Однак, якщо функції Keyboard.press передати клавішу з кодом, меншим за 128 (0x7F), вона поводиться з ним як із друкованим символом і шукає відповідник у таблиці ASCII. Для обходу цієї особливості можна до кодів клавіш додавати константу 136. Більше технічних деталей можна знайти у цьому обговоренні та вихідному коді бібліотеки Keyboard. Знову, щоб не обтяжувати цей текст, ось кінцева таблиця клавіш цифрового блоку, які треба передавати в функцію Keyboard.press:

  • 225 — Numpad 1
  • 226 — Numpad 2
  • 227 — Numpad 3
  • 228 — Numpad 4
  • 229 — Numpad 5
  • 230 — Numpad 6
  • 231 — Numpad 7
  • 232 — Numpad 8
  • 233 — Numpad 9
  • 234 — Numpad 0

Приклад.

Нарешті, демонстраційний приклад такого способу вводу. Працюватиме незалежно від того, яка поточна розкладка клавіатури. Константа KEYBOARD_DELAY означає паузу між натисканнями й відпусканнями клавіш. Якщо робити це миттєво, на деяких повільних системах натискання можуть не встигати опрацьовуватися. Значення 30 мс встановлено з метою демонстрації, щоб було візуально видно введення тексту. Підберіть самостійно значення, яке вас влаштовує. Функція printAltCode вводить лише однобайтові коди, які не починаються з нуля. Цього достатньо для виконання команд у командному рядку, але за потреби можете змінити цю поведінку. 60-секундну паузу на початку прибирати не рекомендується. Вона гарантуватиме вам, що введення тексту не почнеться одразу після підключення плати, що зробить більш зручним завантаження наступного скетчу в процесі відлагодження.

#include <Keyboard.h>

#include <string.h>   

#define KEYBOARD_DELAY 30

//масив клавіш цифрового блоку клавіш 0(234)-9(233)

const char numpad[] = {234, 225, 226, 227, 228, 229, 230, 231, 232, 233};

//команда, яка буде виконуватися в командному рядку

const char command [] = "echo BadUSB demo";

void setup() {

Keyboard.begin();

///!!!Пауза 60с - потрібна для того, щоб потім можна було встигнути перепрошити плату

delay(60000);

}

//Функція, що вводить один символ за допомогою переданого їй Alt-коду

void printAltCode(char c)

{

//Розбиття Alt-коду на три цифри

char digits[] = {c/100, (c / 10) % 10, c % 10};

//Натиснути Alt

Keyboard.press(KEY_LEFT_ALT);

delay(KEYBOARD_DELAY);

byte i = 0;

//Пропустити нулі на початку, якщо є

while (!digits[i])

i++;

//Введення десяткових розрядів

for (; i < 3; i++)

{

Keyboard.press(numpad[digits[i]]);

delay(KEYBOARD_DELAY);

Keyboard.release(numpad[digits[i]]);

delay(KEYBOARD_DELAY);

}

Keyboard.releaseAll();

}

void loop() {

//Натискання комбінації Win+r

Keyboard.press(KEY_LEFT_GUI);

Keyboard.press('r');

delay(KEYBOARD_DELAY);

//Пауза, поки відкриється діалог

delay(KEYBOARD_DELAY*5);

//Введення команди cmd

printAltCode('c');

printAltCode('m');

printAltCode('d');

Keyboard.press(KEY_RETURN);

delay(KEYBOARD_DELAY);

Keyboard.releaseAll();

delay(KEYBOARD_DELAY*5); //Чекаємо поки відкриється вікно cmd

//Введення команди в командний рядок

for (int i = 0; i<strlen(command); i++)

printAltCode(command[i]);

Keyboard.press(KEY_RETURN);

delay(KEYBOARD_DELAY);

Keyboard.releaseAll();

delay(KEYBOARD_DELAY);

delay(60000);

}

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Перше знайомство з BadUSB"
5 з 5
зроблена на основі 2 оцінок 2 клієнтських відгуків.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Александр
11.01.2023 03:33:40
Можно ссылку на сайт где я смогу купить такое устройство в Украине?
Кирилл
29.12.2022 11:57:07
Весьма интересно, но, увы, способ атаки не является хорошим. Хотя узконаправленная атака с таким устройством имеет место быть.
оплата картами Visa і MasterCard