Не видит руткен Astra Linux
Обновлено: 21.11.2024
Приложение A. Типы компьютерных угроз
Здесь термин «угроза» определяется как любой вид программного обеспечения, потенциально или непосредственно способного нанести ущерб компьютеру или сети и поставить под угрозу информацию или права пользователя (то есть вредоносное и другое нежелательное программное обеспечение). В более широком смысле термин «угроза» может использоваться для обозначения любого типа потенциальной опасности для безопасности компьютера или сети (то есть уязвимостей, которые могут привести к хакерским атакам).
Все перечисленные ниже типы программ могут поставить под угрозу пользовательские данные или конфиденциальность. Программы, которые не скрывают своего присутствия в системе (например, программы для рассылки спама и различные анализаторы трафика), как правило, не считаются компьютерными угрозами, хотя при определенных обстоятельствах могут стать угрозами.
Этот тип компьютерных угроз характеризуется возможностью встраивать свой код в другие программы. Такая реализация называется заражением. В большинстве случаев зараженный файл становится носителем вируса, а встроенный код не обязательно совпадает с исходным. Большинство вирусов предназначены для повреждения или уничтожения данных в системе.
В классификации «Доктор Веб» вирусы подразделяются по типу объектов, которые они заражают:
• Файловые вирусы заражают файлы операционной системы (обычно исполняемые файлы и динамические библиотеки) и активируются при запуске зараженного файла.
• макровирусы — это вирусы, заражающие документы, используемые Microsoft® Office и некоторыми другими приложениями, поддерживающими макрокоманды (например, написанные на Visual Basic). Макрокоманды — это тип реализованных программ (макросов), написанных на полнофункциональном языке программирования. Например, в Microsoft® Word макросы могут автоматически запускаться при открытии, закрытии или сохранении документа.
• Скриптовые вирусы создаются с использованием скриптовых языков и обычно заражают другие скрипты (например, служебные файлы операционной системы). Они также могут заражать файлы других форматов, допускающие выполнение сценариев, и, таким образом, использовать уязвимости сценариев в веб-приложениях.
• загрузочные вирусы заражают загрузочные записи дисков и разделов или главные загрузочные записи жестких дисков. Им не требуется много памяти, и они остаются готовыми продолжать выполнение своих задач до тех пор, пока система не будет развернута, перезапущена или выключена.
Большинство вирусов имеют некоторую защиту от обнаружения. Постоянно совершенствуются методы защиты, постоянно разрабатываются способы их преодоления. Все вирусы также можно классифицировать по используемому типу защиты:
• Зашифрованные вирусы шифруют свой код при каждом заражении, чтобы затруднить их обнаружение в файле, загрузочном секторе или памяти. Все копии таких вирусов содержат лишь небольшой общий фрагмент кода (процедура расшифровки), который можно использовать в качестве сигнатуры вируса.
• Полиморфные вирусы тоже шифруют свой код, но помимо этого генерируют специальную процедуру расшифровки, разную для каждой копии вируса. Это означает, что такие вирусы не имеют байтовых подписей.
• Стелс-вирусы выполняют определенные действия, чтобы замаскировать свою активность и таким образом скрыть свое присутствие в зараженном объекте. Такие вирусы перед заражением собирают характеристики объекта, а затем подбрасывают эти «фиктивные» характеристики, которые вводят в заблуждение сканер, ищущий измененные файлы.
Вирусы также можно классифицировать по языку программирования, на котором они написаны (в большинстве случаев это ассемблер, языки программирования высокого уровня, скриптовые языки и т. д.) или по уязвимым операционным системам.
В последнее время вредоносные программы типа «компьютерный червь» стали встречаться гораздо чаще, чем вирусы и другие виды вредоносных программ. Так же, как и вирусы, такие программы могут копировать себя, но не заражать другие объекты. Червь проникает в компьютер из сети (чаще всего в виде вложения в электронное письмо или из Интернета) и рассылает свои функционирующие копии на другие компьютеры. Для начала своего распространения черви могут либо полагаться на действия пользователя компьютера, либо выбирать и атаковать компьютеры в автоматическом режиме.
Черви не обязательно состоят только из одного файла (тела червя). Многие из них имеют заразную часть (шелл-код), которая загружается в оперативную память (ОЗУ), а затем загружает тело червя в виде исполняемого файла по сети. Если в системе присутствует только шеллкод, червя можно удалить, просто перезапустив систему (при этом происходит стирание оперативной памяти и сброс). Однако если тело червя внедрится в компьютер, то справиться с ним сможет только антивирусная программа.
Черви способны вывести из строя целые сети, даже если они не несут никакой полезной нагрузки (т.е. не наносят прямого ущерба) из-за своего интенсивного распространения.
В классификации «Доктор Веб» черви разделены по способу распространения:
• Сетевые черви распространяют свои копии через различные сетевые и файлообменные протоколы.
• почтовые черви распространяются с использованием почтовых протоколов (POP3, SMTP и т. д.).
• чат-черви используют протоколы популярных мессенджеров и чат-программ (ICQ, IM, IRC и т. д.).
Троянские программы (трояны)
Угрозы этого типа не могут воспроизводиться сами по себе. Троянец подменяет часто используемую программу и выполняет ее функции (или имитирует ее работу). При этом совершает в системе какие-то злонамеренные действия (повреждает или удаляет данные, отправляет конфиденциальную информацию и т.д.) или дает возможность хакерам без разрешения получить доступ к компьютеру, например, нанести вред компьютеру третьего лица.< /p>
Маскировка трояна и вредоносные средства аналогичны вирусу. Троян может быть даже компонентом вируса. Однако большинство троянцев распространяется в виде отдельных исполняемых файлов (через серверы обмена файлами, съемные носители данных или вложения электронной почты), которые запускаются пользователями или системными задачами.
Очень сложно классифицировать троянские программы из-за того, что они часто распространяются вирусами или червями, а также потому, что многие вредоносные действия, которые могут выполнять другие типы угроз, относятся только к троянским программам. Вот некоторые типы троянцев, которые в «Доктор Веб» выделяются в отдельные классы:
• бэкдоры — это троянские программы, которые позволяют злоумышленнику войти в систему или получить привилегированные функции в обход любых существующих мер доступа и безопасности. Бэкдоры не заражают файлы, но записывают себя в реестр, модифицируя ключи реестра.
• руткиты используются для перехвата системных функций операционной системы с целью их сокрытия. Кроме того, руткит может скрывать процессы других программ (например, другие угрозы), ключи реестра, папки и файлы. Может распространяться как самостоятельная программа, так и в составе другой вредоносной программы. Существует два типа руткитов в зависимости от режима работы: руткиты режима пользователя (UMR), которые работают в пользовательском режиме (перехватывают функции библиотек пользовательского режима), и руткиты режима ядра (KMR), которые работают в режиме ядра (функции перехвата на уровне ядра системы, что затрудняет его обнаружение).
• кейлоггеры используются для регистрации данных, которые пользователи вводят с помощью клавиатуры. Целью этого является кража личной информации (например, сетевых паролей, логинов, данных кредитной карты и т. д.).
• кликеры перенаправляют гиперссылки на определенные адреса (иногда вредоносные) с целью увеличения посещаемости веб-сайтов или проведения DDoS-атак.
• Трояны-прокси обеспечивают анонимный доступ в Интернет через компьютер жертвы.
Кроме того, трояны также могут изменять стартовую страницу в веб-браузере или удалять определенные файлы. Однако эти действия могут выполнять и другие типы угроз (вирусы и черви).
Hacktools — это программы, предназначенные для помощи злоумышленнику во взломе. Наиболее распространенными среди них являются сканеры портов, обнаруживающие уязвимости в межсетевых экранах и других компонентах системы защиты компьютера. Помимо хакеров, такие инструменты используют администраторы для проверки безопасности своих сетей. Иногда к хакерским инструментам относят обычное программное обеспечение, которое можно использовать для взлома, и различные программы, использующие методы социальной инженерии.
Обычно этот термин относится к программному коду, реализованному в бесплатных программах, которые принудительно отображают рекламу для пользователей. Однако иногда такие коды могут распространяться через другие вредоносные программы и показывать рекламу в веб-браузерах. Многие рекламные программы используют данные, собранные шпионским ПО.
Как и рекламное ПО, этот тип незначительных угроз нельзя использовать для нанесения прямого ущерба системе. Программы-шутки обычно просто генерируют сообщения об ошибках, которых никогда не было, и угрожают совершить действия, которые приведут к потере данных. Их цель — напугать или разозлить пользователей.
Это специальные программы, которые предназначены для сканирования диапазона телефонных номеров и поиска тех, на которых отвечает модем. Затем эти номера используются для наценки на услуги телефонной связи или для подключения пользователя к дорогостоящим телефонным услугам.
Эти программные приложения не были созданы для вредоносных целей, но в силу своих характеристик могут представлять угрозу безопасности компьютера. Потенциально опасные программы могут не только повредить или удалить данные, они также используются взломщиками (т. е. злонамеренными хакерами) или некоторыми вредоносными программами для нанесения вреда системе. Среди таких программ есть различные средства удаленного чата и администрирования, FTP-серверы и так далее.
Это возможные компьютерные угрозы, обнаруженные эвристическим анализатором. Такие объекты потенциально могут представлять угрозу любого типа (даже неизвестную специалистам по ИТ-безопасности) или оказаться безопасными в случае ложного обнаружения.Файлы, содержащие подозрительные объекты, рекомендуется по своему выбору помещать в карантин, а также отправлять в антивирусную лабораторию «Доктор Веб» для анализа.
Матрица MITRE ATT&CK — отличный инструмент для визуализации реальных тактик и методов злоумышленника, пытающегося скомпрометировать корпоративную систему. Хотя конечная цель (цели) злоумышленника может быть разной, для достижения этих целей обычно требуется возможность оставаться незамеченным во время исследования, настройки командного центра, извлечения данных и т. д.
Руткиты 101
Несмотря на то, что существует множество способов добиться повышенной стойкости и обойти защиту, одним из самых опасных и разрушительных может быть использование руткитов. Руткиты — это инструменты пост-эксплуатации, которые можно запускать скрытно на целевом объекте, часто с самыми высокими системными привилегиями. Их можно использовать для сокрытия/изменения программ, служб, файлов, сетевой информации и других системных компонентов, и были задокументированы случаи их активности вредоносными программами в системах-жертвах в течение многих лет и десятилетий.
Как и любой другой вредоносный инструмент, руткиты продолжают развиваться по мере улучшения защиты. Руткиты нацелены на большинство основных операционных систем, и, возможно, из-за природы Linux с открытым исходным кодом мы наблюдаем довольно быстрое развитие разновидностей Linux. Но почему нас это должно волновать? Потому что Linux везде! Поскольку это одна из самых важных частей компьютерного программного обеспечения в мире, вы, вероятно, сознательно или неосознанно взаимодействуете с ней каждый день.
Теперь вы понимаете, почему это такая привлекательная цель для злоумышленников, и вам, возможно, не терпится понять, как работают руткиты. Это здорово, однако правда в том, что руткиты могут работать по-разному. Вместо того, чтобы сразу начинать, лучше начать с понимания того, как работают инструменты, предназначенные для обнаружения руткитов. Затем мы можем экстраполировать эту функциональность на наше определение того, как работает современный руткит Linux.
Обнаружение
Для систем Linux двумя наиболее популярными бесплатными инструментами обнаружения руткитов являются chrootkit и rkhunter. Оба этих инструмента выполняются локально и проверяют наличие признаков руткита. Давайте углубимся в первый инструмент, chrootkit. Эта программа в основном использует сценарий оболочки для проверки двоичных файлов системы на наличие модификаций руткитов. Идеально!
Проанализировав около 3000 строк кода, мы заметили, что основная функциональность скрипта заключается в обходе системы в поисках конкретных индикаторов компрометации, сигнализирующих о потенциальном присутствии руткита. Эти индикаторы варьируются от подозрительного каталога или файла, связанного с руткитом, до проверки определенных команд/утилит. Одним из конкретных примеров является проверка демона SSH (sshd) по значению регулярного выражения, заполненному различными метками, которые, как известно, используются некоторыми руткитами. Эта тенденция повторяется для других команд (ls, netstat, ps и т. д.), а также для файлов журналов, других функций и служб.
На основании этого краткого анализа становится ясно, что руткит — невероятно полезный инструмент для злоумышленника, поскольку его можно настроить для достижения самых разных целей и изменить поведение системы, чтобы оставаться незамеченным. Хотя этот инструмент основан на относительно простом подходе к обнаружению, он все же может быть достаточно эффективным при обнаружении многих «готовых» типов руткитов. Но в целом важно помнить, что обнаружение затруднено, поскольку руткит может повредить программное обеспечение, предназначенное для его обнаружения.
Масштаб потенциального ущерба
Если мы переключим наше мышление с защиты на нападение, мы сможем понять масштабы ущерба, который может быть нанесен с помощью руткита. Общие цели руткитов включают:
- Обход стандартных механизмов аутентификации и авторизации
- Скрытие других вредоносных программ путем скрытия процессов, файлов и каталогов
- Отключение механизмов обнаружения и других методов обхода защиты.
- Почти все, что пожелает ваше злое маленькое сердце
Руткиты Linux: краткая история
Имейте в виду, что это не мгновенное явление. Руткиты Linux развивались на протяжении многих лет, чтобы идти в ногу с механизмами обнаружения. Например, некоторые из самых ранних руткитов Linux были не столько руткитами, сколько просто набором скрытых команд, которые не позволяли системному администратору обнаружить вредоносный процесс, оболочку, файл и т. д. Однако реализация этого была чрезвычайно утомительна. так как вы должны были предположить, какие инструменты/процессы будет использовать системный администратор. Во-вторых, он оставил массу криминалистических данных о цели.
Затем руткиты эволюционировали, чтобы ориентироваться на порядок приоритета в библиотеках динамического связывания с использованием ld_preload. Короче говоря, вы можете изменить то, что делают системные вызовы, перехватив их, и вы снова ослепите системного администратора. Это также оставляет довольно большой след и его легко обнаружить.Как легко обнаружить? Ссылаясь на наш скрипт chrootkit, мы видим, что для обнаружения этих довольно наивных руткитов достаточно одной строки.
К нашему большому разочарованию как специалистам по безопасности, развитие вредоносного ПО не остановилось. В последнее время мы наблюдаем всплеск вредоносных руткитов модулей ядра или руткитов LKM (Loadable Kernel Module). По сути, злоумышленник может вставить вредоносный модуль ядра и делать практически все, что захочет. Общие действия включают сокрытие процессов, файлов или самого модуля, но злоумышленник ограничен только своим воображением, поскольку он может действовать от имени системы.
Классификации руткитов
В предыдущем разделе мы упомянули несколько различных руткитов. Первые два исторических примера работают в пользовательском режиме, тогда как руткит LKM гораздо мощнее и может работать от имени системы. Ниже мы определяем эти классификации руткитов:
- Руткиты пользовательского режима — уровень 3
- Наиболее распространенный и простой в реализации
- Перехват и/или внедрение
- Обычно шумные и легко обнаруживаемые
- Может работать с самыми высокими привилегиями ОС.
- Нацелен на ядро и связанные с ним драйверы
- Обычно замаскирован и его труднее обнаружить.
- В основном до сих пор используется в академических кругах для проверки концепции.
- Результат эксплойта в аппаратной виртуализации
- Возможность перехватывать аппаратные вызовы, сделанные ОС.
- Часто нацелен на загрузку, прошивку периферийных устройств или BIOS.
- Может быть результатом деятельности коммерческой организации (например, LoJack)
- Сложно анализировать или обнаруживать
Защита и смягчение последствий
Как упоминалось ранее, обнаружение наличия руткита и последующее удаление могут быть сложными (и еще более сложными для руткитов на уровне ядра). Поскольку ОС была взломана, может быть трудно определить, чему можно доверять, а чему нет.
Однако это не невозможно! Большинство коммерческих инструментов полагаются на механизмы обнаружения, основанные на поведении или сигнатурах. По сути, отмечая поведение, подобное руткиту, или известные вредоносные индикаторы, они могут обнаруживать часто идентифицируемые руткиты. Более продвинутые методы включают дополнительные формы проверки целостности, загрузку с альтернативного надежного носителя и анализ дампов памяти.
Сегодня вы можете предпринять несколько шагов, чтобы защитить себя от вредоносных руткитов
- Всегда укрепляйте и проверяйте свои системы Linux, следуя рекомендациям по обеспечению безопасности. Глубокая защита и соблюдение принципа наименьших привилегий могут значительно уменьшить потенциальную поверхность атаки.
- Используйте сканер вредоносных программ (rkhunter, chrootkit, коммерческий вариант) с автоматическим инструментом проверки безопасности, например Lynis.
Не существует универсального решения для обнаружения и предотвращения руткитов. Вышеупомянутая стратегия защиты обеспечивает достаточную избыточность и может использоваться в качестве основы, но важно, чтобы ваша защита не оставалась статичной. Руткиты постоянно развиваются, а некоторые новые разновидности даже пытаются обнаруживать и компрометировать такие сканеры, как chrootkit.
Вред руткитов для Linux очевиден, но целостный подход к безопасности системы и следование рекомендациям могут помочь защитить ваши системы, организации и репутацию.
В nix есть переменная окружения, при указании которой ваши библиотеки будут загружены раньше остальных. Это означает, что становится возможной замена системных вызовов. Переменная называется LD_PRELOAD, и в этой статье мы подробно обсудим ее значение для сокрытия (и обнаружения!) руткитов.
Официально основной целью LD_PRELOAD является отладка или проверка функций в динамически подключаемых библиотеках. Если вы не хотите исправлять и перекомпилировать саму библиотеку, вы можете использовать переменную среды.
Например, если нам нужно предварительно загрузить библиотеку ld.so, у нас будет два пути:
- Установите переменную среды LD_PRELOAD с файлом библиотеки.
- Запишите путь к библиотеке в файл /etc/ld.so.preload .
В первом случае мы объявляем переменную с библиотекой для текущего пользователя и его окружения. Во втором наша библиотека будет загружена раньше остальных для всех пользователей системы.
Нас интересует второй метод: именно этот метод часто используется в руткитах для перехвата некоторых вызовов, таких как чтение файла, перечисление каталога, процессов и других функций, позволяющих злоумышленнику скрыть свое присутствие в система.
Переопределение системных вызовов
Прежде чем мы начнем приближаться к реальным функциям руткитов, покажем на небольшом примере, как можно перехватить вызов стандартной функции malloc().
Для этого мы напишем простую программу, которая выделяет блок памяти с помощью функции malloc(), затем помещает в него строку strncpy() с помощью функции, к которой я вернусь, и выводит ее с помощью fprintf( ) адреса, который он вернул malloc() .
Создайте файл call_malloc.c :
Теперь давайте напишем программу, которая переопределяет malloc(). Внутри находится функция с тем же именем, что и в libc. Наша функция не делает ничего, кроме вывода строки в STDERR c с помощью fprintf(). Создадим файл libmalloc.c :
Теперь скомпилируем наш код с помощью GCC:
Давайте выполним нашу программу call_malloc:
Давайте посмотрим, какие библиотеки использует наша программа, с помощью утилиты ldd:
Хорошо видно, что без использования прелоадера LD_PRELOAD стандартно загружаются три библиотеки:
- linux-vdso.so.1 — это виртуальный динамический общий объект (VDSO), используемый для оптимизации часто используемых системных вызовов. Его можно игнорировать (подробнее — man 7 vdso ).
- libc.so.6 — библиотека libc с функцией, которую мы используем malloc() в программе call_malloc .
- ld-linux-x86-64.so.2 — сам динамический компоновщик.
Теперь давайте определим переменную LD_PRELOAD и попробуем перехватить malloc(). Я не буду использовать здесь экспорт и ограничусь для простоты однострочной командой:
Мы успешно перехватили malloc() из библиотеки libc.so , но сделали это не совсем чисто. Функция возвращает значение указателя NULL, которое при разыменовании strncpy() в программе ./call_malloc вызывает ошибку сегментации. Давайте исправим это.
Обработка сбоев
Чтобы иметь возможность выполнять полезную нагрузку руткита без вывода сообщений, нам нужно вернуть значение, которое вернула бы первоначально вызванная функция. У нас есть два способа решить эту проблему:
- наша функция malloc() должна реализовать malloc() функциональность libc в соответствии с запросом пользователя. Это полностью избавит от необходимости использовать malloc() из libc.so ;
- libmalloc.so должна каким-то образом вызывать malloc() из libc и возвращать результаты вызывающей программе.
Каждый раз, когда он вызывается, динамический компоновщик malloc() вызывает malloc() из версии, потому что libmalloc.so это первое вхождение malloc() . Но мы хотим вызвать следующую запись malloc() — что бы ни было в libc.so .
Это связано с тем, что динамический компоновщик внутри использует функцию dlsym() из /usr/include/dlfcn.h для поиска адреса, загруженного в память.
По умолчанию dlsym() дескриптор используется в качестве первого аргумента RTLD_DEFAULT , который возвращает адрес первого вхождения символа. Однако есть еще один динамический библиотечный псевдоуказатель RTLD_NEXT, который ищет следующее вхождение. Используя RTLD_NEXT , мы можем найти библиотечную функцию malloc() libc.so .
Давайте отредактируем libmalloc.с . Комментарии объясняют, что происходит внутри программы:
Цикл проверяет, является ли значение каталога NULL, затем вызывается strncmp(), чтобы проверить, соответствует ли каталог d_name RKIT (файлу руткита). Если оба условия истинны, вызывается функция orig_readdir() для чтения следующей записи каталога. Это пропускает все каталоги, которые d_name начинаются с rootkit.so .
Теперь давайте посмотрим, как на этот раз работает наша библиотека. Снова скомпилируйте и посмотрите на результат работы:
Хорошо! Как видим, все прошло гладко. Сначала при первом вхождении malloc() использовалась наша реализация этой функции, а затем оригинальная реализация из библиотеки libc.so.
Теперь, когда мы понимаем, как работает LD_PRELOAD и как мы можем предопределить работу со стандартными функциями системы, пришло время применить эти знания на практике.
Попробуем сделать так, чтобы утилита ls пропускала руткит при выводе списка файлов.
Скрытие файла из списка ls
Большинство динамически скомпилированных программ используют системные вызовы libc. Воспользуемся утилитой ldd, чтобы узнать, какие библиотеки использует программа ls:
Оказывается, ls динамически компилируется с использованием библиотечных функций libc.so. Теперь давайте посмотрим, какие системные вызовы использует утилита ls для чтения каталога. Для этого в пустой директории выполните ltrace ls :
Очевидно, что когда команда выполняется без аргументов, ls использует системные вызовы opendir() , readdir() и closeir() , которые включены в библиотеку libc. Давайте теперь воспользуемся LD_PRELOAD и заменим эти стандартные вызовы нашими собственными. Напишем простую библиотеку, в которой изменим функцию readdir() так, чтобы она скрывала наш файл с кодом.
Здесь мы уже переходим к написанию простого руткита без нагрузки. Все, что он будет делать, это прятаться от глаз системного администратора.
Я создал каталог rootkit и буду продолжать в нем работать. Создадим файл rkit.c .
Собираем и проверяем работу:
Нам удалось скрыть файл rootkit.so от посторонних глаз. До сих пор мы тестировали библиотеку исключительно в рамках одной команды.
Использование /etc/ld.so.preload
Давайте воспользуемся записью в /etc/ld.so.preload, чтобы скрыть наш файл от всех пользователей системы. Для этого пропишите в ld.so.preload путь к нашей библиотеке:
Теперь мы скрыли файл от всех пользователей (хотя это не совсем так, но об этом позже). Но опытный администратор нас довольно легко найдет, так как наличие самого файла /etc/ld.so.preload может свидетельствовать о наличии руткита — особенно если такого файла раньше не было.
Скрытие ld.so.preload
Попробуем скрыть сам файл из листинга ld.so.preload . Немного изменим код rkit.c :
Для наглядности я добавил в предыдущую программу ld.so.preload еще один макрос LD_PL с именем файла, который мы также добавили в цикл while, где мы сравниваем имя файла, чтобы его скрыть.
После компиляции исходный файл rootkit.so будет перезаписан, а требуемый файл исчезнет из вывода утилиты ls ld.so.preload . Проверяем:
Отлично! Мы только что подошли на один шаг ближе к полному заговору. Вроде бы победа, но не спешите радоваться.
Углубление
Попробуем проверить, можем ли мы прочитать файл ld.so.preload с помощью команды cat:
Ну, ну, ну. Получается, что мы плохо прячемся, если наличие нашего файла можно проверить простым чтением. Почему это произошло?
Очевидно, что утилита cat вызывает другую функцию для получения своего содержимого, а не функцию readdir(), которую мы так кропотливо переписывали. Что ж, давайте посмотрим, что использует кошка:
На этот раз нам нужно работать с функцией open(). Поскольку у нас уже есть опыт, мы добавим в наш руткит функцию, которая при доступе к файлу /etc/ld.so.preload вежливо скажет, что файл не существует (Error no entry или просто ENOENT).
Снова измените rkit.c :
Здесь мы добавили фрагмент кода, который делает то же самое, что и readdir(). Собираем и проверяем:
Это гораздо лучше, но это далеко не все варианты обнаружения /etc/ld.so.preload.
Мы по-прежнему можем без проблем удалить файл, переместить его с изменением имени (и тогда ls его снова увидит), изменить его права без уведомления об ошибке. Даже bash продолжит свое имя, когда вы нажмете клавишу Tab.
В хороших руткитах, использующих лазейку c LD_PRELOAD , перехватываются следующие функции:
- listxattr , llistxattr , flistxattr ;
- getxattr, lgetxattr, fgetxattr;
- setxattr, lsetxattr, fsetxattr;
- removexattr , lremovexattr , fremovexattr ;
- открыть, open64, открыть, создать,
- удалить ссылку , удалить ссылку , rmdir ;
- символическая ссылка, символическая ссылка;
- mkdir, mkdirat, chdir, fchdir, opendir, opendir64, fdopendir, readdir, readdir64;
- выполнить…
Конечно, мы не будем разбирать замену каждого из них. В качестве примера перехвата перечисленных функций можно посмотреть на руткит cub3 — это все те же dlsym() и RTLD_NEXT .
Скрытие процесса с помощью LD_PRELOAD
Во время работы руткиту необходимо как-то скрыть свою активность от стандартных утилит мониторинга, таких как lsof, ps, top.
Мы уже довольно подробно выяснили, как работает переопределение функции LD_PRELOAD . То же самое и с процессами. Более того, стандартные программы используют виртуальную файловую систему procfs, представляющую собой интерфейс для взаимодействия с ядром ОС.
Чтение и запись в procfs реализованы так же, как и в обычной файловой системе. То есть, как нетрудно догадаться, наш опыт работы с readdir() здесь пригодится.
скрытие библиотеки
Теперь скопируем код с GitHub и разберемся, что к чему:
В описании для libprocesshider все просто: делаем make, копируем в /usr/local/lib/ и добавляем в /etc/ld.so.preload. Сделаем все, кроме последнего:
Давайте посмотрим, как ps получает информацию о процессах. Для этого запустите ltrace:
Информацию о процессе мы получаем с помощью функции readproc(). Давайте посмотрим на реализацию этой функции в файле readproc.c:
Из этого кода видно, что PID процессов получаются путем их вызова readdir() в цикле для . Другими словами, если нет каталога процессов, нет и самого процесса для мониторинга утилит. Я приведу пример части кода libprocesshider, где мы используем знакомый метод, чтобы скрыть каталог процесса:
Более того, само имя процесса get_process_name() взято из /proc/pid/stat .
Проверим наши предположения. Для этого запустите предложенный evil_script.py в фоновом режиме:
3435 — это PID запущенного процесса evil_script.py . Давайте проверим вывод утилиты htop и убедимся, что evil_script.py есть в списке процессов.
evil_script.py в списке процессов htop
Давайте проверим вывод ps и lsof для обнаружения сетевой активности:
Теперь посмотрим, есть ли каталог с PID процесса evil_script.py:
Все предсказуемо. Настало время добавить библиотеку libprocesshider.so для глобальной предварительной загрузки для всей системы. Запишем это в /etc/ld.so.preload:
Проверка каталога /proc , а также вывода lsof и ps.
Результат очевиден. Теперь /proc нельзя посмотреть каталог с PID скрипта evil_script.py. Однако статус процесса по-прежнему виден в файле /proc/3435/status.
Подведем итоги. В первой части статьи мы изучили способы перехвата функций и их изменения, что позволяет скрыть руткиты. А потом сделали то же самое, чтобы скрыть процессы от стандартных утилит мониторинга.
Как нетрудно догадаться, простые руткиты, несмотря на все уловки, поддаются обнаружению. Например, с помощью различных манипуляций с файлами /etc/ld.so.preload или изучения используемых библиотек с помощью ldd.
Но что делать, если автор руткита настолько хорош, что зацепил все возможные функции, ldd молчит, а подозрения на сетевую или другую активность все равно есть?
Sysdig как решение
Sysdig имеет другую структуру, чем стандартные инструменты. По архитектуре он близок к таким продуктам, как libcap, tcpdump и Wireshark.
Специальный драйвер sysdig-probe перехватывает системные события на уровне ядра, после чего активируется функция ядра tracepoints, которая, в свою очередь, запускает обработчики этих событий. Обработчики хранят информацию о событии в общем буфере. Затем эту информацию можно отобразить на экране или сохранить в текстовом файле.
Давайте посмотрим, как найти с помощью Sysdig evil_script.py . Например, по загрузке центрального процессора:
Вы можете увидеть выполнение ps. В качестве бонуса Sysdig покажет, что динамический компоновщик загружал пользовательскую библиотеку libprocesshide перед libc:
Аналогичные функции предоставляют утилиты SystemTap, DTrace и его свежая полноценная замена – BpfTrace.
ВНИМАНИЕ! Все ссылки в статьях могут вести на вредоносные сайты или содержать вирусы. Следуйте им на свой страх и риск. Те, кто посещают статью намеренно, знают, что делают. Не нажимайте на все бездумно.
Вся размещенная информация взята из общедоступных источников и предоставлена исключительно в ознакомительных целях и не является призывом к действию. Он был создан только в образовательных и развлекательных целях. Вся информация предназначена для защиты читателей от противоправных действий. Посетитель берет на себя все возможные причиненные убытки. Все действия автор делает только на своем оборудовании и в своей сети. Не повторяйте ничего прочитанного в реальной жизни. | Также, если вы являетесь правообладателем материала, размещенного на страницах портала, напишите нам через контактную форму жалобу на удаление той или иной страницы, а также ознакомьтесь с инструкцией для правообладателей материалов. Спасибо за понимание.
Invicti Web Application Security Scanner — единственное решение, обеспечивающее автоматическую проверку уязвимостей с помощью Proof-Based Scanning™.
Наша аудитория поддерживает Geekflare. Мы можем получать партнерские комиссионные за покупку ссылок на этом сайте.
Обеспечьте безопасность приложений правильно! Обнаружение, защита, мониторинг, ускорение и многое другое…
Вы обратились по адресу, если хотите узнать, как обнаруживать руткиты в разных операционных системах и как их предотвратить.
Руткит – это своего рода скрытая и смертоносная вредоносная программа, которую хакеры используют для получения полного контроля над компьютером или сетью. Используя руткиты, злоумышленник может легко манипулировать данными из системы и украсть их.
Руткиты могут выглядеть как отдельная программа, но обычно они представляют собой набор инструментов, которые предоставляют злоумышленникам несанкционированный административный доступ к целевой системе, активно скрывая свое присутствие.
После того, как руткит каким-либо образом будет размещен в системе, злоумышленник сможет запускать удаленные файлы и изменять конфигурацию системы хост-компьютера. Самый простой способ выявить заражение системы или сервера руткитами — запустить сканирование на наличие руткитов.
Приступим.
Как обнаружить руткиты в системе?
Вручную обнаружить руткит на компьютере или сервере непросто. Руткиты всегда остаются замаскированными в виде другого приложения или файла. Поэтому обнаружить их присутствие сложно. Однако существуют некоторые инструменты командной строки, программное обеспечение и методы для автоматического обнаружения руткитов в различных операционных системах.
Окна
Для Windows нет инструментов командной строки для обнаружения руткитов. Тем не менее, мощное и всеобъемлющее приложение для сканирования под названием GMER очень эффективно обнаруживает и даже удаляет руткит в системе Windows.
Этот инструмент ищет во всей системе скрытые потоки, ключи реестра и другие скрытые процессы. Выполняет все типы анализа, включая проверку поведения, сигнатур и целостности, для обнаружения и удаления руткита.
Это приложение полезно для обнаружения всех типов руткитов, таких как руткиты режима ядра, приложений, памяти и загрузчика. Он работает на всех основных ОС Windows.
Linux и Mac OS
Во всех дистрибутивах Linux и Mac OS руткиты можно легко обнаружить с помощью инструментов командной строки chkrootkit и rkhunter.
Использование chkrootkit
chkrootkit глубоко ищет трояны, вредоносные программы и другие типы вредоносных кодов в двоичной системе компьютера. Он ищет изменения, внесенные руткитом в исполняемые файлы системы. chkrootkit не предустановлен в дистрибутиве Linux.
Этот инструмент прост в использовании и может быть установлен с помощью следующей команды:
или вы также можете установить его, клонировав репозиторий Git.
Затем перейдите в этот каталог и запустите chkrootkit.
Эта команда запускает поиск руткитов в системе. Вы можете использовать команду справки для получения дополнительных инструкций по использованию этого инструмента.
Этот инструмент в основном работает с анализом подписей и проверкой целостности, чтобы найти руткит в системе или на сервере.
Использование rkhunter
Кроме того, есть еще один инструмент командной строки для поиска руткитов в дистрибутивах Linux. Это рхантер. Этот инструмент также может обнаруживать удаленные эксплойты и бэкдоры в системе. Просто установите этот инструмент с помощью следующей команды.
Следующим шагом будет запуск rkhunter для обнаружения бэкдоров и руткитов.
Он выполняет поиск, и статус будет присвоен по умолчанию. Если есть какие-либо проблемы, они будут отмечены красным цветом.
Это идеальный инструмент для криминалистического анализа, поскольку он выполняет дополнительные сетевые тесты, проверки модулей ядра и другие тесты, которые не выполняет chrootkit.
Этот инструмент работает на анализе поведения, анализе сигнатур и принимает условия загрузки на разных носителях для обнаружения руткита.
Всегда обновляйте базы данных инструментов chkrootkit и rkhunter перед выполнением сканирования. Только тогда вы сможете обнаружить последние руткиты, которые в настоящее время отсутствуют. Для этого убедитесь, что в вашей системе Linux установлены новейшие исправления, используя приведенную ниже команду.
Инструменты для удаления руткитов
Приложения и инструменты для удаления руткитов, перечисленные ниже, просты в использовании и эффективны. Эти инструменты могут автоматически обнаруживать и удалять руткиты из системы.
Он имеет комплексную систему отчетов, которая позволяет просматривать текущие и предыдущие результаты сканирования, а также отчеты с оповещениями по электронной почте после каждого сканирования.
Вы можете удалить руткит не только с компьютера, но и с мобильного устройства Android или iOS с помощью Avast.
Вместо того, чтобы просто выявлять недостатки, он также предлагает решения, например, какой файл удалить и что делать, чтобы избежать повторного заражения.
Заключение
Установите на свой компьютер сложное и мощное программное обеспечение для защиты от вредоносных программ и всегда будьте внимательны, открывая вложения и неизвестные электронные письма. Скачивайте файлы и программы только из надежных источников. Наилучшей защитой от руткитов является настройка автоматического и зашифрованного процесса резервного копирования в облачное хранилище.
Если руткит сильно заразил вашу систему, единственный способ удалить его — переустановить операционную систему.
Вам также может быть интересно узнать об инструментах для сканирования серверов Linux на наличие вредоносных программ и недостатков безопасности.
Читайте также: