SHA1: e2432fa6c53dfb62aeba242cd28fc4d51a70dbe3 (backdoor)
de5cc2779b9519bc3bbbda084f0b4cb858d2f890 (dropper)
Троянская программа-бэкдор для ОС Linux. Троянец состоит из дроппера и полезной нагрузки, выполняющей на зараженном устройстве основные шпионские функции.
Дроппер написан с использованием открытой среды разработки Lazarus для компилятора Free Pascal и при запуске демонстрирует следующее диалоговое окно, содержащее форму для ввода логина и пароля:
При вводе произвольных значений (кроме нескольких зашитых в теле троянца) на экране последовательно отобразятся надписи "Initializing", "Connecting", "Signing in", а затем появится сообщение "Incorrect user ID or password. Please try again". Если пользователь введет заранее предусмотренные злоумышленником логин и пароль из следующего списка:
- j****/g***********
- m*****/f*********
- c****/j********
то в этом случае троянец отреагирует на это событие сообщением "An error occurred while attempting to login: invalid user token".
При запуске дроппера происходит сохранение второго компонента троянца — бэкдора — в папку /tmp/.ltmp/. Запустившись на исполнение, бэкдор расшифровывает конфигурационные строки, которые зашифрованы с использованием алгоритма RC4, ключ зашит в теле троянца. Конфигурация содержит следующие структуры:
serversList: список управляющих серверов, к которым будет осуществляться попытка подключения;
proxyList: список прокси-серверов, через которые может быть осуществлено подключение;
Salt: строка, используемая при генерации пароля;
bitMask: число, в котором проверяются определенные биты и при установке их значения в «1» выполняется определенные действия при инициализации.
Значения битов:
bit | Значение |
---|---|
0x1 | создать собственную копию в месте, указанном значением поля pathToExe в конфигурации |
0x2 | обработать параметр -m : -m file удаляет файл или папку file |
0x4 | открыть свой исполняемый файл на чтение/запись |
0x8 | установить автозапуск через $HOME/.config/autostart |
0x10 | установить автозапуск через crontab |
0x20 | открыть /tmp/$tmpLockFileName и заблокировать его на запись |
0x40 | запустить поток с кейлогером |
0x80 | выполнить команду fork/chdir |
0x100 | добавить в список используемых прокси-серверов системные прокси |
0x400 | при подключении к серверу сначала пытаться соединиться через прокси |
0x800 | соединяться только через прокси |
В папке с исполняемым файлом создается файл .default.conf, который хранит следующую структуру:
struct conf{
int32 magic; //0DE03C44h
char hostid[32];
char group[32];
}
После расшифровки конфигурационного файла и завершения инициализации бэкдор соединяется с одним из управляющих серверов, отсылает на него ключ и приступает к выполнению команд. Все сообщения, кроме команды, имеющей id=5, поступают с управляющего сервера в зашифрованном виде.
список команд:
id | Действия |
---|---|
5 | Получить ключ от сервера для расшифровки последующих сообщений. Единственное сообщение, которое приходит в открытом виде. Содержит в себе помимо ключа еще и буфер, отправленный бэкдором при подключении и зашифрованный с использованием присланного ключа. |
7 | Закрыть все открытые файлы и обнулить ключи шифрования. Фактически, это команда прекращения сессии. |
8 | Удалить себя из автозагрузки и выключиться. |
9 | Установить в файле конфигурации поле HostId. |
10 | Установить в файле конфигурации поле group. |
11 | Сделать HTTP-запрос, сохранить полученный файл в папку /tmp/ и выполнить его. |
12 | Запустить файл, путь и аргументы для которого приходят с сервера, при этом сам бэкдор завершается. |
13 | Завершить сессию и выключиться. |
14 | Сделать HTTP-запрос, сохранить полученный файл в папку /tmp/ . Будет выполнен файл или нет, устанавливает сервер. |
17 | Выслать список файлов и папок в указанной директории (без открытия папок). |
19 | Запустить поток, который будет искать в указанной папке файлы, удовлетворяющие переданной маске и отправлять их на сервер до получения команды остановки этого потока. |
21 | Остановить поток-загрузчик файлов. |
22 | Открыть файл, сохранить handle под номером index и отправить содержимое файла на сервер. |
23 | Выполнить запись в файл, handle которого лежит под номером index. |
25 | Скопировать файл. |
26 | Выполнить системный вызов создания нового процесса и запустить новый процесс. |
27 | Переименовать файл. |
28 | Удалить файл. |
29 | Создать папку. |
30 | Удалить папку. |
31 | В зависимости от значения первых 4 байтов либо создать новую папку, либо выслать список файлов в папке (рекурсивно). |
33 | Создать zip-архив с указанной папкой. |
35 | Запустить поток, выполняющий команды bash. |
36 | Отправить команду в поток, выполняющий команды bash. |
37 | Остановить поток, выполняющий команды bash. |
39 | Выслать информацию о машине и файл .default.conf. |
41 | Прочитать информацию из utmp. |
45 | Убить процесс по его pid. |
46 | Получить заголовок текущего окна. |
47 | Закрыть указанное окно (послать ему событие типа ClientMessage : _NET_CLOSE_WINDOW). |
48 | Отправить на сервер содержимое папки /usr/share/applications/ - файлы автозагрузки. |
50 | Сделать HTTP-запрос, сохранить полученный файл в папку /tmp/ . Будет выполнен файл или нет, устанавливает сервер. |
52-53 | Сгенерировать событие KeyPressed. |
54 | Сгенерировать событие ButtonRelease. |
56 | Сделать скриншот экрана и отослать на сервер. |
59 | Если запущен кейлоггер, то отправить на сервер список файлов, которые он создал. |
61 | Получить размер файла, созданного кейлогером. |
62 | Удалить файл, созданный кейлогером. |
63 | Отправить на сервер содержимое файла, созданного кейлогером. |
67 | Получить из /proc информацию об открытых сокетах и послать на сервер. |