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

Но время этих руткитов проходит — руткиты меняются. Современные руткиты больше не меняют 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), а подобное разрешение прописано в самом ядре…

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

Оставить мнение

Check Also

Жесткая закалка Linux. Подбираем инструменты для комплексного аудита безопасности

В этом материале мы познакомимся с основными утилитами для Linux hardening. На русском язы…