продолжение снова
База данных и скрипты
На программном обеспечении сервера MySQL установлен для доступа к базам данных. LightTPD с поддержкой PHP используется для обработки HTTP - запросов. Часть данных, используемых вмомент наиболее часто кэшируются в памяти с помощью
Memcached программы.
Панель администратора скрипты и скрипты ботнет шлюза расположены в/var/www/engineдиректории, которая организована следующим образом :
+ --- Хрон - регулярные скрипты PHP
+ --- Данных - база данных GeoIP адресов и некоторых текстовых файлов
+ --- Библиотека - различные PHP библиотеки, используемые скрипты
+ --- Общественностью - сценарии для обработки запросов от ботов
| (Корневой каталог шлюза ботнет)
\--- инструменты
| + --- Контроллеры - сценарии панели администрирования
| + --- Макеты - базовый шаблон HTML для панели управления
| + --- Публичные - сценарии базовая панель администрирования
| | (Корневой каталог панели администрирования веб-сервера)
| + --- Вид - HTML макеты страниц панели администрирования различных
+ --- Configuration.php - параметры доступа к базе данных и т.д.
На сегодняшний день доступа, сервер базы данных содержится 47 таблиц с общим 17 719 469 записей, а его размер составлял около 2,6 Гб.
Имена таблиц и его цели:
название таблицы Количество записей размер данных Цель
affiliates 512 80,0 кБ Партнеры счета и его статистика
affiliatesaccounts 607 64,0 кБ
affiliatesregistrations 507 64,0 кБ
affiliatesstatistics ≈ 62 136 8,5 МБ
affiliatesstatisticsbrowser ≈ 53 072 7,1 МБ
affiliatesstatisticsbuild ≈ 5 979 072 655,8 МБ
affiliatesstatisticscountry ≈ 245 253 26,1 МБ
affiliatesstatisticssts 63 3,3 кБ
affiliatesstatisticssystem ≈ 56 982 7,1 мБ
bots ≈ 5 247 199 1,4 ГБ Основная таблица с информацией о ботов
browsers 3 690 240,0 кБ Дополнительная информация о ботов (версии браузера, руткит версии, TDLCMD.DLLверсии модуля, страны, версия ОС)
builds 172 16,0 кБ
countries 253 16,0 кБ
systems 101 16,0 кБ
commands 55 16,0 кБ Команды для ботов, его статистику, историю команд, дополнительные параметры
commandsexecuted ≈ 4 546 977 337,5 МБ
commandshistory 1 590 224,0 кБ)
commandsinfo 55 64,0 кБ
commandsproperties 909 64,0 кБ
modules 13 400,0 кБ Исполняемые модули для ботов
redirects 0 - URL-перенаправлений
redirectsexecuted 0 -
remover_bho 6 050 1,5 МБ Статистика removerмодуля
remover_bho_stat 20 1,9 кБ
remover_dda 642 144,0 кБ
remover_dda_stat 21 1,9 кБ
remover_dir ≈ 37 991 7,5 МБ
remover_dir_stat 20 1,9 кБ
remover_errors 18 914 2,5 МБ
remover_extra ≈ 289 449 54,6 МБ
remover_extra_stat 18 1,9 кБ
remover_guid ≈ 21 220 4,5 МБ
remover_guid_stat 20 1,9 кБ
rules 0 - неизвестный
ruleshistory 0 -
statuses 1 982 72,3 кБ неизвестный
statuses_limits 1 138 919 115,0 МБ
statuses_statistics 3 956 102,8 кБ
users 10 16,0 кБ Учетные записи пользователей панели администрирования
Давайте посмотрим через структуру наиболее интересных таблиц.
Запросы от ботов к серверу
Сразу после установки, бот начинает опроса сервера для команд в цикле. Как уже было сказано выше, запрашивает бота сначала кодируются в RC4, а затем в base64, и, наконец, отправляется ботнет шлюз через HTTPS.
Формат запроса команд может меняться от версии к версии руткита. В большинстве verstions, запрос выглядит следующим образом перед шифрованием:
bot_ID | aff_ID | aff_SID | rootkit_ver | tdlcmd_ver | os_ver | языки | браузер | build_date | install_date
Описание полей:
поле Цель
bot_ID Уникальный идентификатор бота, например, 7a91eb86-a6be-4db5-8694-0337dad2c75d
aff_ID владелец Bot ID
aff_SID Суб идентификатор учетной записи
rootkit_ver Rootkit версия
tdlcmd_ver Версия TDLCMD.DLLмодуля (базовый модуль полезной нагрузки бота)
os_ver версия ОС
lang язык операционной системы
browser Браузер зараженного компьютера. Значение этого поля является путь к исполняемому файлу браузера, найденного в разделе реестраHKEY_LOCAL_MACHINE\SOFTWARE\Classes\ HTTP\shell\open\command
build_date дата компиляции исполняемых файлов бота (необязательно)
install_date Дата инфекции (по желанию)
Помимо запросов для команд, команда сервера сценариев может обрабатывать некоторые специальные запросы, подобные следующему:
MODULE_ID | значение_1 | значение_2 | ... | value_N
поле Цель
module_ID Идентификатор типа запроса (что эквивалентно модулю имя которого указан в запросе)
value_1-value_N Случайное количество строки и / или целочисленных данных, в зависимости от типа запроса
Нет функции не для выполнения специальных запросов жестко прописаны в руткита двоичном, но это может произойти в результате выполнения другой команды, такие как команда, чтобы загрузить дополнительный модуль полезной нагрузки.
Давайте посмотрим , как сервер обрабатывает запросы от ботов. В первых строках/var/www/engine/index.phpсценария, после включения необходимых заголовочных файлов, запрашивает декодирование происходит:
Connect (MCACHE_HOST, MCACHE_PORT);
// Получить информацию о боте из полей запроса
$ RequestName = $ запрос [0];
$ RequestAffAid = $ запрос [1];
$ RequestAffSid = $ запрос [2];
$ RequestRk = $ запрос [3];
$ RequestCmd = $ запрос [4];
$ RequestSystem = $ запрос [5];
$ RequestLang = $ запрос [6];
$ RequestBrowser = $ запрос [7];
если ($ requestCount == 8) {
// Нет никакой информации о компиляции и инфекции даты в запросе
$ RequestBuildDate = 0;
$ RequestInstallDate = 0;
} Еще {
$ RequestBuildDate = StrToTime ($ запрос [8]);
$ RequestInstallDate = StrToTime ($ запрос [9]);
}
$ RequestBuild = "{$ requestRk} _ {$ requestCmd}";
$ RequestIp = ip2long ($ _SERVER [ 'REMOTE_ADDR']);
$ RequestAffId = NULL;
$ RequestSystemId = NULL;
$ RequestBrowserId = NULL;
$ RequestBuildId = NULL;
// Активировать модуль engine.php
// Он добавляет информацию о боте в базу данных и обрабатывает запрос команды
включают в себя ( 'engine.php');
$ ObjMemcache-> близко ();
DBase :: разъединение ();
...
При получении регулярного запроса команд, сервер отправляет список команд обратно в бот.Команды зашифрованы в RC4, бот ID служащий в качестве ключа шифрования.
Партнеры счета
The affiliatesтаблица содержит информацию о партнерах счетов. Такие счета могут быть изменены оператором панели администрирования.
CREATE TABLE IF NOT EXISTS `affiliates` (
`AffId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица
`AffAid` символ (20) NOT NULL, - идентификатор учетной записи партнера
`AffGroup` INT (11) NOT NULL без знака, - группа учетной записи партнера
`AffLogin` символ (32) по умолчанию NULL, - имя (Логин) партнера счета PRIMARY KEY (` affId`)
);
Партнер по учетным записям Редактирование в ботнет панели администратора
Каждый партнер может владеть любое количество бот-исполняемых файлов. Идентификатор партнера жестко закодировано в файле бота исполняемый во время компиляции. После установки руткита идентификатор хранится в файле config.ini в собственной файловой системе руткита.
Субаккаунты могут быть использованы для группы бот исполняемые файлы партнера.
Идентификаторы счета и субсчета партнера хранятся в config.iniфайле.
Партнерские счета могут управляться напрямую отправив запрос на ботнет шлюз:
услуги | operation_code | ARGUMENT_1 | ARGUMENT_2 | ... | argument_N
поле Цель
operation_code Код операции, которая будет выполнена
argument_1-argument_N Необязательный аргумент - его формат определяется конкретной операции
Операция коды определены в следующей таблице:
код операции аргументы Цель
100 affAid,affLogin,affGroup Создание новой учетной записи партнера.
110 affId Удаление существующей учетной записи.
120 affAid Показаны все субсчета для данной учетной записи.
150 engineType Добавление новой учетной записи с автоматической генерации affAid. Значение affGroupвыбирается взависимости от величиныengineType
200 affAid, affSid,statDateFrom,statDateTo Запрашивающий номер бот установок для данной учетной записи и за определенный период времени.
201 affAid, affSid,statDateFrom,statDateTo Запрашивающая бота по статистике стран для данной учетной записи и за определенный период времени.
301 - Перечень существующих учетных записей партнеров.
Запрос параметров детали:
параметр Цель
affId Параметры соответствуют одноименных полей в affiliatesтаблице
affAid
affSid
affLogin
statDateFrom Даты в Y-m-dформате
statDateTo
affGroup Идентификатор группы партнеров
Список существующих групп партнеров находится в /var/www/engine/data/groups.txt:
Филиалы Группы
1 - Тест Установлено
10 - Наши Установлено
20 - InstallConverter
30 - ProfitCash
40 - ReliefPPC
50 - ConvertPPC
Пример: запрос для количества ботов установок между 01.08.2009 и 01.07.2010 на субсчете 0 партнера с affAid10000 выглядит следующим образом :
услуги | 200 | 10000 | 0 | 2009-08-01 | 2010-07-01
Основная таблица ботнет
После того, как бот отправляет запрос на команды в первый раз, он добавляется к таблице '' ботами базы данных сервера. Значения affId, affSidи botNameполя извлекаются из соответствующих полей запроса от бота.
Класс mBots, который позволяет работать с botsтаблицей, находится в/var/www/engine/library/models/mBots.phpфайле. Функции добавления и редактирования информации бот реализуются в /var/www/engine/public/engine.php.
Структура botsтаблицы:
CREATE TABLE IF NOT EXISTS `bots` (
`AffId` INT (11) NOT NULL без знака, - идентификатор учетной записи партнера
`AffIdx` INT (11) NOT NULL без знака, - как правило, равна affId
`AffSid` SmallInt (6) без знака NOT NULL по умолчанию '1', - идентификатор дополнительной учетной записи
`BotId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица
`BotName` символ (60) NOT NULL, - уникальное имя бота (параметр botid в config.ini)
`BotIp` BIGINT (20) NOT NULL, - IP бот
`BotAdded` INT (11) NOT NULL без знака, - дата первого запроса бота к серверу
`BotAccess` INT (11) NOT NULL без знака, - дата последнего запроса бота к серверу
`BotCountry` TINYINT (4) без знака NOT NULL, - идентификатор бота страны
`BotSystem` SMALLINT (6) без знака NOT NULL, - идентификатор версии Windows, зараженного компьютера
`BotBrowser` SMALLINT (6) без знака NOT NULL, - идентификатор версии браузера зараженного компьютера
`BotBuild` SMALLINT (6) без знака NOT NULL, - идентификатор версии руткита и модуля tdlcmd.dll
PRIMARY KEY ( `botId`)
KEY `botName` (` botName`),
KEY `affid_index` (` affId`),
KEY `botAdded_index` (` botAdded`)
);
команды Bot
В конце engine.phpсценария /var/www/enginedata/commands.phpфайла активируется. Его цель состоит в том, чтобы отобразить команды , которые должны выполняться с помощью бота.commands.phpскрипт генерируется динамически , используя данные из commandsinfoтаблицы.
CREATE TABLE IF NOT EXISTS `commandsinfo` (
`CommOwner` INT (11) NOT NULL по умолчанию '1', - идентификатор учетной записи пользователя, который добавил команду
`CommId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица
`CommName` VARCHAR (255) NOT NULL, - имя команды
`CommDesc` текст NOT NULL, - описание команды
`CommExe` VARCHAR (255) NOT NULL, - URL исполняемого файла (для команд, связанных с загрузки и исполнения исполняемых файлов)
`CommStatus` перечислимого типа (" отключить "," включить ",
'Удален', 'Темп') NOT NULL по умолчанию 'Enable', - состояние команды (активная, неактивная, временная, удалена)
`CommAdded` DateTime NOT NULL, - время создания команды
`CommCode` текст NOT NULL, - код команды PHP для включения в commands.php
`CommCodeCond` текст NOT NULL, - дополнительные параметры команды
`CommCodeComm` NOT NULL текст,
`CommOrder` INT (11) NOT NULL, - команда номер заказа
PRIMARY KEY ( `commId`)
);
Класс mCommands, который позволяет работать с командами, находится в/var/www/engine/library/models/mCommands.php. Процедура для динамического созданияcommands.phpфайла реализуется в возрожденном методе - это вызывается командой из панели управления:
Функция регенерировать () {
$ Код = '';
// Получить информацию обо всех доступных команд из базы данных
$ Команды = $ this-> getSummaryFull ();
для ($ I = 0; $ г Получить код ($ команд [$ я] [ 'commId']). "\ Г \ п \ г \ п \ г \ п";
}
}
// Прочитать файл шаблона
// Он содержит статический код, который должен быть включен в commands.php
. $ TemplateFile = имя_директории (__ FILE __) DS.'commands.template ';
$ Fp = FOPEN ($ TemplateFile, 'г');
$ Шаблон = Fread ($ ∥f∥p, размер файла ($ TemplateFile));
fclose ($ Ф.П.);
$ Шаблон = str_replace ( '% COMMS%', $ код, $ шаблон);
// Запись commands.php на диск
$ Файла = '/var/www/enginedata/commands.php';
$ Fp = FOPEN ($ файла, 'W');
FWRITE ($ ∥f∥p, $ шаблон);
fclose ($ Ф.П.);
}
Добавление новой команды в панели администрирования
Можно указать следующие параметры для каждой команды:
- Целевые идентификаторы стран
- Идентификаторы партнер Target
- версии браузера Target
- Версии руткита и модуля tdlcmd.dll.
- Время жизни команды
- Максимальное количество раз, команда может быть выполнена.
Оператор панели администрирования также может редактировать часть PHP кода , который будет включен в commands.php.
Код команды редактирования в панели администрирования
Любой бот может обрабатывать следующие команды:
команда Описание
botnetcmd.SetCmdDelay(
Seconds) Задает интервал между запросами сервера
botnetcmd.ModuleDownloadUnxor(
URL,
LocalPath) Загрузки кодируются исполняемый модуль
botnetcmd.FileDownloadRandom(
URL,
LocalPath) Загрузки случайный файл
botnetcmd.LoadExe(
FileURL) Загрузка и выполняет исполняемый файл
botnetcmd.LoadExeKnock(
FileURL,
KnockURL) Загрузка и выполняет произвольный файл и отправляет HTTP-запрос на случайный URL на успех
botnetcmd.InjectorAdd(
ProcessName,
DLLName) Инъекция DLL в указанном процессе ( *- во все процессы)
tdlcmd.ConfigWrite(
Section,
Parameter,
Value) Пишет случайные данные в config.ini
tdlcmd.Download(
URL,
LocalPath) Загрузки случайный файл.
Деструктивная модули
Основные функции (полезная нагрузка) от TDL3 руткита обеспечиваются дополнительными модулями. Эти модули являются нормальными динамические библиотеки, которые загружаются с сервера и впрыскивают в случайном или текущий процесс пользовательского режима.
Информация о доступных модулей полезной нагрузки хранится в таблице модулей:
CREATE TABLE IF NOT EXISTS `modules` (
`ModId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица
`ModName` символ (255) NOT NULL, - имя модуля
`ModData` LONGBLOB, - данные исполняемого образа модуля
`ModLoads` INT (11) NOT NULL без знака, - количество загрузок модуля
PRIMARY KEY ( `modId`)
);
Файл модуля можно загрузить на зараженный компьютер с помощьюModuleDownloadUnxorкоманды. Она имеет следующие параметры:
модуль |! ModuleId ключ!
поле Цель
ModuleId Идентификатор модуля (значение modIdполя в modulesтаблице)
Key Любая строка (по желанию). Это значение используется в качестве ключа кодирования RC4 для запрашиваемого модуля.
Запрос на модуль загрузки обрабатывается в /var/www/engine/public/modules.phpфайле:
getCommand ($ commId);
$ CommDetailsCreate = FALSE;
если ($ commDetails == FALSE) {
$ CommDetails [ 'commid'] = $ commid;
$ CommDetails [ 'commRefences'] = 0;
$ CommDetails [ 'commSuccesed'] = 0;
$ CommDetailsCreate = TRUE;
}
// Состояние 1
если ($ botBuild> = 26) {
$ CommDetailsBot = mCommands :: getCommandExecuted ($ COMMidt, $ длина места жительства);
$ CommDetailsBotCreate = FALSE;
если ($ commDetailsBot == FALSE) {
$ CommDetailsBot [ 'период проживания'] = $ длина места жительства;
$ CommDetailsBot [ 'commid'] = $ commid;
$ CommDetailsBot [ 'commDate'] = 0;
$ CommDetailsBot [ 'commSuccesed'] = 0;
$ CommDetailsBotCreate = TRUE;
}
// Состояние 2
если (($ commDetailsBot [ 'commSuccesed']