О руткитах уже писали; писали, что главная задача любого руткита - "позволить хакеру возвращаться в систему и не быть при этом замеченным". Писали, что этого достигается посредством замены системных программ и установки "протрояненных" демонов…

Но время этих руткитов проходит - руткиты меняются. Современные руткиты больше не меняют ps и ls, не устанавливают протроянненый passwd и inetd - теперь руткиты добрались до сердца ОС - ее ядра (kernel). Такие руткиты мы и рассмотрим.

LKM-руткиты достигают своей цели посредством искажения работы системы на уровне манипуляциями системными вызовами (sys_getdents, sys_write, sys_close, sys_kill, sys_fork, sys_clone, sys_symlink - в случае с руткитом Adore, который мы позже рассмотрим). Для этого руткит использует загружаемые модули ядра (Loadable Kernel Modules - отсюда и сокращение -
LKM).

Загружаемы модули ядра были задуманы для повышения функциональности ядра и вместе с тем сохранения его разумного размера. В общем виде работа с загружаемыми модулями происходит следующим образом: если происходит обращение к ресурсу, недоступному в данный момент, то происходит обращение к демону ядра (/sbin/kerneld ), который подгружает необходимый модуль и ядро продолжает свою работу. Находясь в системе в виде модуля, руткит может вызывать следующую манипуляцию: при вызове, к примеру, sys_open (оригинальный вызов) вызывается некая функция open_hacked ("хакерская" функция) и результаты ее работы выдаются за результаты работы оригинального
sys_open.

С другой стороны - все программы (к примеру ls) используют системные вызовы и если эти системные вызовы исказить, то изменится и информация, выдаваемая программой. Т.е. чтобы исказить выходные результаты, вовсе не обязательно заменять саму программу (как было раньше). В результате становят бесполезным такой способ борьбы с руткитами как контрольные суммы "бинарников", перестановка системных программ.

Итак, LKM-руткиты манипулируют системными вызовами, но что же они умеют?

Adore

Изменяемые процедуры: sys_getdents, sys_write, sys_close, sys_kill, sys_fork, sys_clone, sys_symlink

Сокрытие процессов, файлов, соединений, препятствует записи "ненужных" логов. Можно сказать - стандартный
джентльменский набор. С детства любит Linux, но есть и версия для FreeBSD - AdoreBSD. Руткит динамично развивается - текущая версия - 0.39b4.

Knark

Манипулируемые вызовы: sys_getdents, sys_ioctl, sys_settimeofday, sys_kill, sys_fork, sys_clone, sys_read, sys_execve

Тот же джентльменский набор + возможность исполнения команд посланных с удаленного хоста. Опять же динамично развивается - текущая версия - 0.59 дружит с Linux 2.2.

Rial

Манипулируемые вызовы: sys_getdents, sys_query_module, sys_read, sys_open, sys_close

Стандартный набор + очень интересная возможность - скрытие части файлов. Механизм работы прост и гениален одновременно: если в файле имеется два <секретных_фрагмента>, то все что находится между этими фрагментами будет скрыто (и
сами фрагменты тоже). Написан для Linux 2.2.

Synapsis

Манипулируемые вызовы: sys_getdents, sys_getuid, sys_query_module, sys_kill, sys_fork, sys_clone, sys_open

Скрывает файлы, процессы и пользователей. Дает рута пользователю с UID=666 (очень оригинально ;-). Скрывает открытые порты. Задуман для Linux 2.1, 2.2.

Heroin

Подставу искать тут: sys_getdents, sys_query_module, sys_read, sys_kill

Скрывает файлы и процессы. Очень действенный инструмент, предназначенный для Linux 2.1.

Afhrm

Изменяемые функции: sys_getdents, sys_open

Спрячет твои файлы от глаз пытливого админа. Очень старый инструмент, написанный для Linux 2.0

Вот тебе и небольшая коллекция… конечно это еще не все LKM-руткиты, но думаю - самые достойные. 

Как же засечь подобный руткит? Т.к. это модуль, то можно попробовать:

1. Команду lsmod
2. Проверить содержимое файла /proc/modules ( cat /proc/modules ).

Хочу сразу предупредить - пробуй оба способа, т.к. различные руткиты имеют от них разный "иммунитет". К примеру, Synapsis прячет себя от lsmod (но виден через cat /proc/modules ), Rial - попадется на оба сразу, а adore и knark ты так вообще не найдешь…

К счастью для админов (и к несчастью для кулхацкеров) есть способ лучше - т.к. руткит замещает системные вызовы своими собственными функциями, то он изменяет так называемую "таблицу системных вызовов". С другой стороны существует файл system.map, который создается при компиляции ядра и содержит информацию об оригинальных адресах. Так…берем
kern_check.c.gz и сравниваем…

Но нет предела совершенству и LKM-руткиты - это уже "последний писк". Мысль авторов руткитов пошла дальше - зачем внедряться в ядро, если можно писать сразу в память? Именно так и родилось новое поколение руткитов, пионером которого является
Kernel Intrusion System (KIS). KIS позволит скрыть файл, процесс, соединение, предотвратить запись ненужных логов, но главное - это условия, которые ему нужны: если LKM-руткит можно остановить используя статичное ядро (т.е. без использования загружаемых модулей), то все что нужно для KIS - это возможность записи в память (/dev/kmem), а подобное разрешение прописано в самом ядре…

Как же бороться с руткитами? Совет стар и универсален, как доктор Айболит - просто не давай себя поломать…

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии