В комментариях к моей заметке об энкодерах для NAS один из читателей поинтересовался, а были ли похожие трояны под FreeBSD? И я подумал: а ведь действительно, интересный вопрос! Шифровальщики для этой платформы существуют, и как минимум один совершенно точно распространялся в «дикой природе». Правда, руткиты и другое вредоносное зверьё для неё встречается гораздо чаще, всё-таки, шифровальщики — это слегка экзотика. Вспоминается, что в период, когда я работал в антивирусной компании, нет-нет, да изредка проскакивало что-то, связанное с FreeBSD. Потому я решил вспомнить вредоносы для этой ОС, о которых мне когда-либо доводилось слышать. Ну, и про шифровальщика тоже поговорим.
▍ Пара слов о вредоносах
О вредоносных программах под Windows говорят очень громко и часто, из-за чего складывается впечатление, будто все остальные операционные системы вирусописатели обходят стороной. Причины этого явления в целом очевидны: основная цель создателей вредоносных программ — извлечение прибыли, потому они ориентируются преимущественно на массовый рынок. Продукция Microsoft в этом отношении идеальна: Windows установлена на подавляющем большинстве компьютеров, ноутбуков и планшетных устройств во всём мире, а особенности архитектуры системы позволяют создавать для неё вредоносы чуть ли не конвейерным способом.
Всё изменилось в сентябре 2008 года с появлением Android. Настоящую массовость эта операционная система обрела далеко не сразу, но, тем не менее, со временем уверенно завоевала статус самой популярной мобильной платформы в мире. Первые робкие попытки распространения троянов под Android пришлись на 2010 год — тогда это были довольно-таки примитивные вредоносы семейства SMSSend, втихаря рассылавшие СМС-ки на платные номера, которые были хардкорно «зашиты» прямо в .apk приложения. Позже появились SMS-боты, получавшие список номеров и содержание отправляемых сообщений с управляющего сервера. В дальнейшем количество и сложность команд, которые научились «понимать» боты, стало стремительно расти. Появились рекламные трояны для Android, мобильные шпионы, банкеры, воровавшие деньги со счетов пользователей, а также локеры и даже шифровальщики. Заражённые устройства стали объединяться в ботнеты.
В общем, интерес злоумышленников к Android вполне объясним: владелец современного смартфона — это фактически ходячий кошелек, поскольку в его телефоне обычно установлены банковские приложения с привязанными картами, а также имеется доступ к мобильному счёту сотового оператора, где тоже лежат деньги. Потенциальная возможность читать и отправлять СМС и сообщения электронной почты на том же телефоне только подогревает азарт вирусописателей.
Следующая волна расширения «ареала обитания» вредоносных программ была вызвана бурным развитием Интернета вещей. Практически все устройства IoT работают на Linux, и к большинству таких «умных» девайсов пользователи относятся, как к обычной бытовой технике. Некоторые даже не подозревают о том, что внутри работает какая-то операционная система, а в ней имеются, установленные производителем, пароли, известные каждому жулику. Результатом такой беспечности стало появление огромного количества троянов для Linux, собранных под разные архитектуры: ARM, MIPS, PowerPC, SPARC, M68K, SuperH, SH-4 и, конечно же, Intel x86-64.
В итоге такие платформы, как FreeBSD и macOS остались далеко на периферии интереса вирусописателей. Вредоносы для них тоже есть (достаточно, например, вспомнить эпидемию трояна FlashFake, в 2012 году заразившего и объединившего в ботнет более 600 000 «маков» под управлением OS X по всему миру). Но таких вредоносных программ относительно мало.
▍ Руткиты для FreeBSD
Первые вредоносные программы для FreeBSD появились ещё в девяностых — так, исходники написанного на Си трояна Snoopy, созданного конкретно для FreeBSD (и легко портируемого на любую другую *nix-платформу), были опубликованы в книге Марка Людвига «The Giant Black Book of Computer Viruses» в 1995 году.
В начале нулевых на админских форумах стали появляться сообщения о руткитах для FreeBSD. Руткитами называют вредоносные программы, умеющие скрывать своё присутствие в заражённой операционной системе, а также активно противодействовать попыткам их поиска или удаления. Кроме того, некоторые руткиты специально разработаны с целью сокрытия деятельности других вредоносных программ и происходящих в системе процессов, таких как запуск и выгрузка приложений, загрузка динамических библиотек, внедрение в запущенные процессы, заражение файловых объектов и т. д.
Для реализации своих функций руткиты используют различные методы: перехват системных функций, захват таблиц вызовов, использование драйверов или непосредственную модификацию системных объектов и объектов ядра (Direct kernel object manipulation) и другие. В *nix-подобных системах многие из таких действий требуют наличия административных прав, поэтому руткиты используют уязвимости в системных компонентах и приложениях для эскалации привилегий.
Одним из первых в этой категории был легендарный fbrk (от FreeBSD rootkit), рассчитанный на работу в ОС версий 4.2-4.5. Троян умел скрывать запущенные процессы и вредоносные файлы, а также позволял удалённо подключаться к системе по FTP с правами root и получать доступ к bash на порту 65535. Альтернативой ему стал Nekit, который позволял прятать файлы и каталоги в системе, скрывать PID собственного и дочерних процессов, а также активные соединения путём модификации стека TCP/IP. Руткит не отличался высокой стабильностью и регулярно крэшился без видимых причин. Чуть более надёжным считался вредонос DarkSide для FreeBSD 4-й ветки, реализовавший примерно такой же набор функций. Вообще, подобных поделий существовало довольно много, но с появлением FreeBSD версий 5 и 6 значительная их часть утратила работоспособность.
С исходниками концептов руткитов для FreeBSD — естественно, чисто в академических целях — можно ознакомиться, например, здесь и здесь. Обе эти программы являются модулями ядра, первая может перехватывать нажатия клавиш и запускает remote shell для получения команд через ICMP (в целях обхода брандмауэров). Сам модуль, процессы и файлы скрываются путём пропатчивания соответствующих системных вызовов и структур данных ядра во время загрузки. Второй руткит очень похож на первый: он тоже имеет функцию кейлоггера и экстрактора файлов, может скрывать файловые объекты путём перехвата системных вызовов и предоставляет Reverse Shell через ICMP.
В наши дни руткиты (в том числе, и для FreeBSD) несколько утратили популярность среди вирусописателей, по крайней мере, о них вот уже несколько лет почти ничего не слышно.
▍ Трояны и черви
В середине нулевых получили распространение сетевые черви, эксплуатирующие уязвимости в веб-сервере Apache. В принципе, таким вредоносам глубоко фиолетово, на какой ОС крутится сервер, но, поскольку множество копий Apache работало на платформе FreeBSD, подобные вредоносные программы можно условно отнести и к этой системе. Так, распространявшийся в 2002 году червь-бэкдор Mighty использовал для проникновения на сервер уязвимость в SSL, а команды от злоумышленников получал по протоколу IRC, подключившись к специально созданному каналу.
Примерно в то же время антивирусные компании рапортовали об обнаружении червя Adore, сканировавшего заданные вирусописателями диапазоны IP-адресов в поисках серверов с известными уязвимостями. Команды с удалённого сервера он принимал через ICMP. Для проникновения на машины с FreeBSD червь использовал уязвимость удалённого переполнения буфера в демоне FTP (BSD ftpd glob()). Воспользовавшись определённым набором метасимволов для формирования строк с именами файлов длиной больше 512 байт, в момент интерпретации этих строк в функции glob() троян вызывал переполнение буфера. Для того чтобы воспользоваться уязвимостью, атакующий должен подключиться к серверу по FTP и иметь право создавать директории (или же директории с достаточно длинными именами должны уже присутствовать на сервере в момент атаки), поэтому первыми — нападению червя подверглись серверы с анонимным FTP-доступом. Если у вредоноса получалось вызвать переполнение буфера, он получал на сервере удалённый сеанс с правами root. Под ударом оказались довольно распространённые в те времена версии FreeBSD вплоть до 4.2.
Другой червь, Lupper, распространялся в течение 2005 года через уязвимости в сценариях CGI и PHP. Своё название вредонос получил за то, что сохранял свою копию в файле /tmp/lupii. После заражения сервера червяк начинал прослушивать UDP-порты 7111 и 7222 для получения дальнейших команд от злоумышленников. В принципе, Lupper не представлял серьёзной опасности для серверов, администраторы которых своевременно обновляли ПО — используемые им уязвимости в скриптах были достаточно оперативно устранены.
▍ Энкодер для FreeBSD
А вот с шифровальщиками, с которых, в общем-то, и началась эта статья, всё не так просто. Энкодеров для Linux, атакующих, в первую очередь, сетевые хранилища NAS, известно на сегодняшний день уже довольно много, и один из первых был обнаружен в ноябре 2015 года — именно его мне довелось подробно описывать для вирусной энциклопедии по просьбе компании, в которой я тогда трудился. Речь идёт о Linux.Encoder.1 (Trojan-Ransom.Linux.Cryptor).
Первые семплы, которые попали для исследования в наш вирлаб, были собраны для архитектуры x86/64 и упакованы UPX, а сам трой представлял собой написанный на Си статически слинкованный ELF-файл. Для шифрования троян использовал код, позаимствованный из криптографической библиотеки PolarSSL, также код из этой библиотеки применялся в функции дешифровки AES.
В дикой природе энкодер загружался на взломанные или сбрученные серверы, на которых злоумышленники смогли получить шелл. С его помощью на взломанный сервак помещался PHP-скрипт, в задачу которого входило определение версии и разрядности операционной системы. С его помощью в файл .host сохранялся распакованный бинарник под соответствующую архитектуру, файлы с требованиями выкупа, публичный RSA-ключ и файлик 1.sh, который, собственно, и запускал шифровальщика из файла .host с параметром «encrypt», передав ему в качестве аргумента имя .pub-файла с публичным ключом.
Первым делом после запуска троян загружал в память своего процесса содержимое двух файлов с требованием выкупа: в текстовом формате (readme.crypto) и в виде веб-странички (index.crypto). Следующим шагом энкодер запускал себя в качестве демона, а исходный ELF-файл удалял и приступал к шифрованию файлов. Сначала он обрабатывал файлы в домашних папках пользователя и содержимое ряда каталогов по списку, а потом выполнял рекурсивный обход всей файловой системы, шифруя файлы определённых типов во всех найденных папках кроме корневой директории, а также каталогов /bin, /usr/bin, /root/.ssh и /etc/ssh. Зашифрованным файлам присваивалось расширение .encrypted, а в каждой папке троян размещал текстовый файл с требованием выкупа.
Шифрование энкодер выполнял в режиме AES-CBC-128, при этом для каждого файла случайным образом генерировался уникальный сессионный 16-байтный AES-ключ по словарю, состоящему из заглавных и строчных букв латинского алфавита, цифр от 0 до 9 и символов «,.-#'?!». Этот ключ в свою очередь шифровался публичным RSA-ключом, а оригинальный файл публичного ключа удалялся. Любопытно, что исходные файлы троян удалял с помощью unlink, поэтому оставалась теоретическая возможность восстановить их с помощью специализированных утилит. Для операций чтения-записи использовались стандартные функции stdio.h. Дешифровка выполнялась с использованием двух функций — decrypt_all() и decrypt_file(), принимавших в качестве параметра полученный от вирусописателей приватный RSA-ключ, с помощью которого трой извлекал из файлов .encrypted зашифрованный ключ AES.
Почему я столь подробно стал рассказывать о каком-то винтажном шифровальщике для Linux? Дело в том, что вскоре обнаружилась и его версия для FreeBSD, собранная под архитектуру x64, вот ее SHA1: 810806c3967e03f2fa2b9223d24ee0e3d42209d3. Принцип действия этого энкодера был очень схож с базовой модификацией для Linux, с небольшими отличиями. Один из известных случаев успешной атаки Linux.Encoder.1 на сервер с FreeBSD 10.1 связан с получением шелла при помощи неправильно работающего механизма загрузки пользователями файлов в WordPress, благодаря чему злоумышленники смогли запустить шифровальщика.
Впоследствии вирусописатели принялись совершенствовать энкодеры для Linux: заменили код из PolarSSL более компактным кодом из OpenSSL, троян научился воровать и передавать на удалённый сервер файлы с паролями. Некоторые версии умели определять, были ли они запущены с использованием sudo или su, а также стали имитировать их работу, чтобы красть и передавать злодеям пароли. Среди таких семплов изредка попадались бинарники, скомпилированные под FreeBSD, но факты успешной атаки на эту систему с их применением лично мне неизвестны.
▍ Выводы
Шифровальщики и вообще трояны под FreeBSD — как тот легендарный суслик. Их не видно, но они определённо существуют. Их относительно небольшое количество (по сравнению с другими ОС) обусловлено, прежде всего, низким спросом со стороны вирусописателей на эту систему: в первую очередь злоумышленников интересуют более распространённые Android, Linux, и, разумеется, винда. Но, тем не менее, трояны и даже шифровальщики для FreeBSD известны, а значит, они представляют определённую опасность — пусть даже большей частью гипотетическую.
Мощные VPS на SSD со скидками до 53%. Панель ISPmanager в подарок*.
Автор: Валентин Холмогоров