Вредоносная программа, ориентированная на 32-разрядные дистрибутивы Linux, сочетает в себе функции бэкдора и DDoS-бота. Состоит из двух функциональных модулей: основной представляет собой бэкдор, способный выполнять поступающие команды, второй предназначен для осуществления DDoS-атак. Общение между модулями осуществляется путем открытия порта на зараженном компьютере, при этом номер порта «зашит» в теле бэкдора.
В процессе своей работы Linux.BackDoor.Gates.5 собирает и передает злоумышленникам следующую информацию об инфицированном компьютере:
- Количество ядер CPU (читает из /proc/cpuinfo).
- Скорость CPU (читает из /proc/cpuinfo).
- Использование CPU (читает из /proc/stat).
- IP Gate'a (читает из /proc/net/route).
- MAC-адрес Gate'a (читает из /proc/net/arp).
- Информацию о сетевых интерфейсах (читает из /proc/net/dev).
- MAC-адрес сетевого устройства.
- Объем памяти (используется параметр MemTotal из /proc/meminfo).
- Объем переданных и полученных данных (читает из /proc/net/dev).
- Название и версию ОС (с помощью вызова команды uname).
После своего запуска Linux.BackDoor.Gates.5 проверяет путь к папке, из которой он был запущен:
%curdir%/getty
usr/bin/getty
/bin/netstat
/bin/lsof
/bin/ps
/usr/bin/netstat
/usr/bin/lsof
/usr/bin/ps
/usr/sbin/netstat
/usr/sbin/lsof
/usr/sbin/ps
Если путь запуска бэкдора отличен от путей утилит netstat, lsof, ps, то запускает себя как демон. После этого запускает процедуру инициализации, в процессе которой расшифровывает из своего тела конфигурационный файл, имеющий следующую структуру:
struct CONFIG
{
std::string g_strConnTgt;
DWORD g_iGatsPort;
DWORD g_iGatsIsFx;
DWORD g_iIsService;
std::string g_strBillTail;
std::string g_strForceNote;
std::string g_bDoBackboor;
std::string g_strCryptStart;
std::string g_strDStart;
std::string g_strNStart;
};
В зависимости от значения параметра g_iGatsIsFx в конфигурационном файле троянец либо самостоятельно соединяется с управляющим сервером, либо связывает сокет с портом, указанным в параметре g_iGatsPort, и ожидает входящего соединения. Бэкдор имеет функционал для обновления. В получаемой команде содержится ссылка на скачивание обновления. Файл сохраняется в /tmp/%d, где %d - случайное число.
Установка
При запуске троянец проверяет файл /tmp/moni.lock, если он не пустой, то читает записанное в него значение (PID процесса) и «убивает» этот процесс. Далее проверяет, запущен ли DDoS-модуль. Проверка осуществляется попыткой связывания (бинда) сокета с определенным портом. Если попытка не удалась, модуль считается запущенным. Тогда бэкдор считывает PID DDoS модуля из файла /tmp/bill.lock и «убивает» этот процесс.
Затем троянец создает файл с именем, состоящим из имени запущенного файла и значения g_strBillTail из конфигурационного файла, в него записывается 0x5651C байт из тела бэкдора по смещению 0x81583. Этот файл является DDoS-модулем. Если в файле конфигурации установлен специальный флаг g_iIsService, то троянец прописывает себя в автозагрузку, записывая строку #!/bin/bash\n<path_to_backdoor> в файл /etc/init.d/, после чего Linux.BackDoor.Gates.5 создает следующие символические ссылки:
ln -s /etc/init.d/DbSecuritySpt /etc/rc1.d/S97DbSecuritySpt
ln -s /etc/init.d/DbSecuritySpt /etc/rc2.d/S97DbSecuritySpt
ln -s /etc/init.d/DbSecuritySpt /etc/rc3.d/S97DbSecuritySpt
ln -s /etc/init.d/DbSecuritySpt /etc/rc4.d/S97DbSecuritySpt
Если в конфигурационном файле установлен флаг g_bDoBackdoor, троянец проверяет также наличие у своего процесса прав root, для чего пытается открыть файл /root/.profile.
Далее проверяется, запущен ли процесс самого бэкдора. В качестве .lock-файла бэкдора используется файл /usr/bin/bsd-port/getty.lock, в который записывается PID бэкдора при запуске. Если процесс запущен, он «убивается». Бэкдор копирует себя в /usr/bin/bsd-port/getty и запускает.
На финальном этапе установки Linux.BackDoor.Gates.5 создает еще одну собственную копию в папке /usr/bin/ с именем, записанным в конфигурационном файле в качестве значения параметра g_strForceNote, а также замещает собой следующие утилиты:
/bin/netstat
/bin/lsof
/bin/ps
/usr/bin/netstat
/usr/bin/lsof
/usr/bin/ps
/usr/sbin/netstat
/usr/sbin/lsof
/usr/sbin/ps
На этом процесс установки троянца завершается и вызывается функция для выполнения его основных задач.
Полезная нагрузка
Троянец также стартует на инфицированном компьютере как демон, после чего производит расшифровку конфигурационного файла и выполняет инициализацию. Проверяет, запущены ли его компоненты путем чтения соответствующего .lock-файла (и, если нет, запускает их), однако в разных случаях использует разные имена для сохранения файлов и регистрации себя в автозагрузке. В зависимости от пути запуска либо ожидает входящих команд от управляющего сервера, либо устанавливает с ним связь самостоятельно. Троянец запускает два потока, один из которых с периодичностью 6000 мс проверяет, работает ли бэкдор (путем проверки /tmp/gates.lock) и, если не работает, запускает его. Второй поток проверяет, запущен ли DDoS-модуль (попыткой бинда сокета на заданный порт) и, если не запущен, запускает его.
Установив связь с командным сервером, Linux.BackDoor.Gates.5 получает от него конфигурационные данные с заданием, которое должен выполнить бот. По команде злоумышленников троянец способен осуществить автообновление, начать или прервать DDoS-атаку на удаленный узел с заданным IP-адресом и портом, выполнить команду из блока конфигурационных данных или установить соединения для выполнения других команд с удаленным узлом, имеющим заданный IP-адрес.
Управляющий пакет от сервера имеет вид структуры TASK:
struct IP_LIST
{
char szIP[0]; //C-строка, содержащая IP-адрес для DDoS-атаки
WORD wPort; //Порт
}
struct SUBTASK
{
DWORD Cmd;
BYTE Type; //тип DDoS атаки
BYTE byte05;
BYTE byte06;
BYTE dummy; //0x00
DWORD dword08;
BYTE byte0C;
BYTE byte0D;
WORD word0E;
WORD word10;
WORD word12;
BYTE byte14;
BYTE byte15;
BYTE dummy2[2]; //0x00
DWORD dword18;
DWORD dword1C;
DWORD dwThreadCount; //количество потоков для DDoS атаки
DWORD dword24;
char szDomens[0]; //C-строка содержащая список доменов, разделенных ','
DWORD dwIPCount; //Количество структур IP_LIST
struct IP_LIST[0]; //Пары IP:порт для DDoS'а
};
struct TASK
{
DWORD Cmd;
DWORD Size;
BYTE Data[0x0D];
DWORD dword15;
DWORD dword19;
DWORD dwSubTaskCount; //количество структур SUBTASK в команде
struct SUBTASK[0];
};
Для поддержания соединения используется упрощенная структура:
struct TASK_ping
{
DWORD Cmd; // 0x04
DWORD Size; // 0x00
}
В зависимости от значения CMD-структуры TASK может выполнять следующие команды:
Cmd | Команда |
---|---|
0x02 | Остановить обновление |
0x03 | Выполнить команду из конфигурационного файла |
0x05 | Выполнить обновление |
0x09 | Открыть бэкдор для IP-адреса, указанного в поступившей команде |
Связь с управляющим сервером
Установка соединения с управляющим сервером осуществляется в два этапа. На первом этапе троянец отправляет на сервер пакет длинной 119 байт, который содержит информацию о конфигурации (данные конфигурационного файла, данные системы).
0000000000: 01 00 00 00 6F 00 00 00 │ 00 F4 01 00 00 32 00 00 ☺ o ф☺ 2
0000000010: 00 E8 03 00 00 00 00 00 │ 00 00 00 00 00 00 00 00 и♥
0000000020: 00 01 00 01 02 00 00 00 │ 01 00 00 00 C0 A8 00 C8 ☺ ☺☻ ☺ АЁ И
0000000030: C0 A8 00 C8 C0 A8 00 C8 │ C0 A8 00 C8 C0 A8 00 C8 АЁ ИАЁ ИАЁ ИАЁ И
0000000040: FF FF 01 00 00 00 00 00 │ 6D 6D 3A 00 01 00 00 00 яя☺ mm: ☺
0000000050: B8 0B 00 00 E9 03 00 00 │ 4C 69 6E 75 78 20 33 2E ё♂ й♥ Linux 3.
0000000060: 31 33 2E 30 2D 32 34 2D │ 67 65 6E 65 72 69 63 00 13.0-24-generic
0000000070: 47 2D 31 2E 39 30 00 │ G-1.90
На этот пакет сервер отвечает 20-байтным пакетом:
0000000000: 08 00 00 00 0C 00 00 00 │ 00 00 00 00 00 00 00 00 ◘ ♀
0000000010: E8 FD 00 00 │ ??
Пакет состоит их трех частей. Первая часть имеет размер 4 байта и содержит команду. Вторая часть — 4 байта, которые читаются как DWORD. Данный DWORD представляет собой размер последующего пакета (3-й части пакета). 3-я часть представляет собой конфигурационный блок с заданием, которое должен выполнить клиент.
Далее начинается обмен пакетами для поддержания соединения. В случае отсутствия команды от сервера вторые 4 байта равны нулю (т. е. размер пакета с командой устанавливается в 0 и прием команды пропускается).