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 информацию об открытых сокетах и послать на сервер. |

