Статья Учим BadUSB работать с разными раскладками клавиатуры

Заглавие

Всем доброго времени суток, о BadUsb, Usb Rubber Ducky и о том, как самому сделать аналог данного устройства написано уже много статей.
В этой же статье мы рассмотрим решение проблемы BadUsb при работе с разными раскладками клавиатуры. В качестве инструкции по созданию своего BadUsb будем использовать статью размещенную здесь, на codeby:

Делаем USB ducky и Wifi Ducky своими руками

В качестве BadUsb, как и в статье используем Arduino Micro Pro.

О чем речь

Если при выполнении скрипта загруженного на наш BadUsb в операционной системе выставлена русская раскладка, возникает проблема, все команды вводятся в русской раскладке и наш скрипт становится бесполезным.

command.png


Ищем решение этой проблемы

Недолгий поиск в гугле, наводит нас на одно решение, использовать Alt-коды. Alt-коды в Windows иногда используется для ввода символов, которые отсутствуют на клавиатуре.

Например, зажимаем ALT и удерживая набираем цифры на цифровом блоке Numpad 1 и 3, затем отпускаем ALT и получается вот такой символ ноты ♪ и т.д.
Вот неполная таблица Alt-кодов, полную таблицу можно посмотреть по ссылке:

altcodestable.png


Точно также с помощью alt-кодов мы можем эмулировать нажатия клавиш английского, русского алфавита и всех необходимых символов независимо от текущей раскладки клавиатуры, осталось только модифицировать скетч под наши нужны. Дорабатывать скетч мы будем как для голой ардуинки, так и для Wifi Ducky.


Но сначала немного теории, поговорим о том как наша ардуинка эмулирует нажатия клавиш. В большинстве случаев делает она это с помощью базовой библиотеки Keyboard.h, которая по умолчанию уже встроена в Arduino IDE и подключается в самом начале скетча:

Код:
1| #include <Keyboard.h>

Изучив документацию к библиотеке Keyboard.h выясняем, что она использует ASCII коды для "печатаемых" символов клавиатуры.

ascii.png


Нам же нужно найти какие коды соответствуют клавишам цифрового блока., чтобы эмулировать нажатия с помощью Alt-кодов.

Итак, первые 128 значений (от 0 до 127) как мы выяснили, "печатаемые", обрабатываются как ASCII код и переводятся в коды клавиш. Следующие 8 (от 128 до 135) - это клавиши модификаторы (Ctrl, Shift, Alt и и т.д.).

Полный список клавиш модификаторов можно посмотреть в документации к библиотеке Keyboard.h .
Далее из всего что превышает 135 (но не больше 256, поскольку один байт может содержать значения до 256) вычитается 136 и используется как код ключа для клавиатуры согласно USB HID спецификациям.

Здесь по ссылке вы можете найти списки кодов USB HID для различных устройств ввода-вывода (pdf документ). Список кодов конкретно для клавиатуры, начиная со стр. 53 и находим в таблице клавиши цифрового блока и их Usege ID (Dec) в десятичной системе счисления.

usbhid1.png


Это и есть то что нам нужно, и как мы помним все значения ниже 128 обрабатываются как ASCII коды, поэтому не забываем прибавлять 136 к Usage ID (Dec).
NumLock 219 (83 + 136)
KeyPad_1 225 (89 + 136)
KeyPad_2 226 (90 + 136)
KeyPad_3 227 (91 + 136)
KeyPad_4 228 (92 + 136)
KeyPad_5 229 (93 + 136)
KeyPad_6 230 (94 + 136)
KeyPad_7 231 (95 + 136)
KeyPad_8 232 (96 + 136)
KeyPad_9 233 (97 + 136)
KeyPad_0 234 (97 + 136)
Получившиеся значения от 225 до 234 и 219 (для NumLock) мы и будем использовать для написания скетча для ардуино.

В библиотеке Keyboard.h есть несколько основных функций которые эмулируют нажатия клавиш:

Код:
Keyboard.press(parameter)  #- нажатие и удержание клавиши
Keyboard.release(parameter)  #- завершает нажатие клавиши (отпускает клавишу)
Keyboard.write(parameter)  #- нажатие и сразу отпускание клавиши
Keyboard.releaseAll()  #- отпускает все нажатые Keyboard.press() клавиши.

В качестве параметра (parameter, кроме Keyboard.releaseAll() - у нее нет параметров) функции принимают коды клавиш о которых мы говорили выше (ASCII, Клавиши модификаторы и (USB HID Usage ID + 136)), от 0 до 256.

В итоге код который будет эмулировать нажатие клавиш клавиатуры с помощью Alt-кодов будет выглядеть следующим образом
Например для английской буквы n или ALT + 110 (смотрим таблицу Alt-кодов):

Код:
Keyboard.press(KEY_LEFT_ALT);  // зажимаем ALT
Keyboard.write(225);           // N1
Keyboard.write(225);           // N1
Keyboard.write(234);           // N0
Keyboard.releaseAll();         // отпускаем ALT
Да, многовато кода, 5 строк чтобы написать всего одну букву!
Получится довольно длинный скетч, но он повторяющийся и его можно немного оптимизировать. Такой код уже напечатает полное слово "notepad".

Код:
void altRun2(int a,int b)
{
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.write(a);
  Keyboard.write(b);
  Keyboard.releaseAll();
}

void altRun3(int a,int b, int c)
{
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.write(a);
  Keyboard.write(b);
  Keyboard.write(c);
  Keyboard.releaseAll();
}
void setup()
{
  Keyboard.begin();
  altRun3(225,225,234);
  altRun3(225,225,225);
  altRun3(225,225,230);
  altRun3(225,234,225);
  altRun3(225,225,226);
  altRun2(233,231);
  altRun3(225,234,234);
}

Конечно мы не будем все это писать вручную, в интернете можно найти много реализаций DuckyScript to Arduino code конвертера с открытым исходным кодом, я модифицировал одну из версий такого конвертера и добавил поддержку Alt-кодов. За основу взял от .

Просто используйте стандартный синтаксис DuckyScript, а когда вам нужно сгенерировать скетч который будет эмулировать нажатия клавиш используя Alt-коды, поставьте галочку Activate Alt-codes support и замените STRING на ALTCODE



d2a1.png


Эти тестовые примеры запускают notepad и печатают Hello World!!!

С использованием STRING:

Код:
DELAY 3000
GUI r
DELAY 500
STRING notepad
DELAY 500
ENTER
DELAY 750
STRING Hello World!!!
ENTER
С использованием ALTCODE:

Код:
DELAY 3000
GUI r
DELAY 500
ALTCODE notepad
DELAY 500
ENTER
DELAY 750
ALTCODE Hello World!!!
ENTER
На выходе получаем вот такой скетч который эмулирует нажатия клавиш с помощью Alt-кодов, запускает notepad и пишет в нем Hello World!!!
И теперь он не зависит от раскладки клавиатуры, то чего мы и хотели!
Код:
#include <Keyboard.h>

void altRun2(int a,int b)
{
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.write(a);
  Keyboard.write(b);
  Keyboard.releaseAll();
}

void altRun3(int a,int b, int c)
{
  Keyboard.press(KEY_LEFT_ALT);
  Keyboard.write(a);
  Keyboard.write(b);
  Keyboard.write(c);
  Keyboard.releaseAll();
}

// Init function
void run()
{
  // Begining the stream
  Keyboard.begin();

  // Waiting 500ms for init
  delay(500);

  delay(3000);

  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press(114);
  Keyboard.releaseAll();

  delay(500);

  altRun3(225,225,234);
  altRun3(225,225,225);
  altRun3(225,225,230);
  altRun3(225,234,225);
  altRun3(225,225,226);
  altRun2(233,231);
  altRun3(225,234,234);

  delay(500);

  typeKey(KEY_RETURN);

  delay(750);

  altRun2(231,226);
  altRun3(225,234,225);
  altRun3(225,234,232);
  altRun3(225,234,232);
  altRun3(225,225,225);
  altRun2(227,226);
  altRun2(232,231);
  altRun3(225,225,225);
  altRun3(225,225,228);
  altRun3(225,234,232);
  altRun3(225,234,234);
  altRun2(227,227);
  altRun2(227,227);
  altRun2(227,227);

  typeKey(KEY_RETURN);
}

void setup()
{
  run();
  typeKey(219);
  run();
}

void typeKey(int key)
{
  Keyboard.press(key);
  delay(50);
  Keyboard.release(key);
}

// Unused
void loop() {}
Обратите внимание на вот эти строки.
Здесь мы повторно запускаем код после нажатия Numlock typeKey(219) , на случай если цифровой блок был выключен:

Код:
void setup()
{
  run();
  typeKey(219);
  run();
}
Если вам не нужен повторный запуск просто оставьте один вызов функции run()

Код:
void setup()
{
  run();
}


Теперь займемся модификацией прошивки для WiFi Ducky. Для начала изучим прошивку для ардуино из статьи Делаем USB ducky и Wifi Ducky своими руками
Обратим внимание на блок команд отвечающих за обработку клавиш модификаторов в функции void Press()
Все что нам остается это дописать свой код, добавляющий обработку клавиш цифрового блока:

Код:
else if (b.equals("NUMLOCK"))Keyboard.press(219);
else if (b.equals("N9")) {Keyboard.press(233); Keyboard.release(233);}
else if (b.equals("N8")) {Keyboard.press(232); Keyboard.release(232);}
else if (b.equals("N7")) {Keyboard.press(231); Keyboard.release(231);}
else if (b.equals("N6")) {Keyboard.press(230); Keyboard.release(230);}
else if (b.equals("N5")) {Keyboard.press(229); Keyboard.release(229);}
else if (b.equals("N4")) {Keyboard.press(228); Keyboard.release(228);}
else if (b.equals("N3")) {Keyboard.press(227); Keyboard.release(227);}
else if (b.equals("N2")) {Keyboard.press(226); Keyboard.release(226);}
else if (b.equals("N1")) {Keyboard.press(225); Keyboard.release(225);}
else if (b.equals("N0")) {Keyboard.press(234); Keyboard.release(234);}
В итоге получаем такую прошивку:
Ей мы и будем прошивать ардуинку для WiFi Ducky.

Синтаксис DuckyScript для такой версии WiFi Ducky также будет немного отличаться, вместо STRING нам нужно вводить символы как если бы мы нажимали последовательность Alt-кодов (см. таблицу Alt-кодов).

Например слово notepad теперь будет выглядеть так:

Код:
ALT N1 N1 N0
ALT N1 N1 N1
ALT N1 N1 N6
ALT N1 N0 N1
ALT N1 N1 N2
ALT N9 N7
ALT N1 N0 N0

И чтобы облегчить задачу, я написал простенький конвертер.


Вам всего лишь нужно подставить стоку которая шла после STRING в конвертер и на выходе получить последовательность Alt-кодов. Эту последовательность мы используем для написания полезной нагрузки для нашей модифицированной WiFi Ducky.
Не забываем про NUMLOCK, на случай если клавиши цифрового блока отключены.

Тестовый скрипт который открывает notepad и пишет в нем Hello World!!! будем выглядеть следующим образом:
DELAY 1000
GUI r // Вызваем «Выполнить»
DELAY 500
ALT N1 N1 N0
ALT N1 N1 N1
ALT N1 N1 N6
ALT N1 N0 N1
ALT N1 N1 N2
ALT N9 N7
ALT N1 N0 N0 // Вводим «notepad»
DELAY 500
ENTER
DELAY 750
ALT N7 N2
ALT N1 N0 N1
ALT N1 N0 N8
ALT N1 N0 N8
ALT N1 N1 N1
ALT N3 N2
ALT N8 N7
ALT N1 N1 N1
ALT N1 N1 N4
ALT N1 N0 N8
ALT N1 N0 N0
ALT N3 N3
ALT N3 N3
ALT N3 N3 // Пишем в блокноте «Hello World!»
ENTER
NUMLOCK // Если NumLock был выключен, то мы его включаем этой командой и снова вводим код
DELAY 1000
GUI r
DELAY 500
ALT N1 N1 N0
ALT N1 N1 N1
ALT N1 N1 N6
ALT N1 N0 N1
ALT N1 N1 N2
ALT N9 N7
ALT N1 N0 N0
DELAY 500
ENTER
DELAY 750
ALT N7 N2
ALT N1 N0 N1
ALT N1 N0 N8
ALT N1 N0 N8
ALT N1 N1 N1
ALT N3 N2
ALT N8 N7
ALT N1 N1 N1
ALT N1 N1 N4
ALT N1 N0 N8
ALT N1 N0 N0
ALT N3 N3
ALT N3 N3
ALT N3 N3
ENTER
Краткие выводы

Что мы в итоге получили? Не самый производительный вариант, в плане того что такие скрипты будут дольше выполнятся, оно и понятно, мы эмулируем нажатие трех - четырех клавиш вместо одной. Приходиться использовать дублирование кода на случай если клавиши цифрового блока отключены NumLock'ом. В сценариях использования BadUsb когда у нас есть физический доступ к компьютеру, иногда проще поменять раскладку.

Если у вас есть предложения по улучшению или вы знаете еще способы обойти проблему раскладок для BadUsd, делитесь идеями в обсуждении.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!