Пишем руткит нового поколения Иван Скляров Хакер, номер #096, стр. 096-120-1 (Sklyarov@real.xakep.ru, www.sklyaroff.ru) Скрываем модули, файлы, процессы и сетевые соединения в Linux 2.6.x Руткиты подразделяют на ядерные (уровня ядра) и неядерные (пространства пользователя). Неядерные руткиты состоят из множества троянских версий исполняемых системных файлов: ls, ps, find, ifconfig, netstat, syslogd и т.д. После подмены системных программ и демонов троянскими версиями они не будут отображать хакерские процессы, файлы, установленные соединения и т.д. Ядерные руткиты представляют собой один или несколько модулей ядра (LKM), которые устанавливаются в него и выполняют все действия по сокрытию следов хакера. Сегодня мы научимся писать ядерные руткиты, причем под самые последние версии ядра Linux 2.6.x. Что должен делать руткит Ниже перечислен стандартный набор возможностей, которые должен поддерживать любой полноценный ядерный руткит: * Hide Itself (скрытие самого себя). Модуль не появляется в списке загруженных модулей, выдаваемых командой lsmod. Если хакер не скроет его, то администратор рано или поздно обнаружит посторонний модуль в системе и удалит его командой rmmod. * File Hider (скрытие файлов). Хакер может установить какие-нибудь программы (снифер, кейлоггер, бэкдор и пр.), которые с помощью этой возможности руткита не будут обнаруживаться в файловой системе. * Directory Hider (скрытие каталогов). Хакер может хранить нужные ему файлы в отдельном каталоге. С помощью этой возможности скрывается сразу весь каталог вместе со всеми файлами. * Process Hider (скрытие процессов). Подобно скрытию файлов и каталогов, руткит не дает отображать верную информацию о запущенных процессах, выдаваемую командой ps. * Sniffer Hider (скрытие работающего снифера). Руткит подавляет флаг PROMISC (неразборчивый режим), выводимый утилитой ifconfig, позволяя тем самым скрыть в системе работу снифера. * Hiding from netstat (скрытие информации от утилиты netstat). Руткит позволяет скрыть информацию об открытых портах и установленных соединениях, выдаваемую утилитой netstat. * Setuid Trojan (троянская версия вызова setuid). Автоматически предоставляет пользователю с UID=<магический номер> доступ с правами root. Для удобства и большей ясности мы рассмотрим реализацию каждой из перечисленных возможностей отдельно, в виде независимых модулей. Однако в действительности в руткитах все возможности обычно компануются в один общий модуль, и после его загрузки в ядро хакер может вызывать нужную возможность из командной строки. Для удобства передачи команд руткиту в его состав обычно входит так называемый управляющий файл, которому передаются команды в командной строке. Этот управляющий файл совсем не обязательно является реальным файлом, хранящимся на жестком диске - он может находиться в памяти, по сути, являясь псевдофайлом. В самом рутките (обычно в перехваченном вызове execve()) осуществляется проверка параметра filename, и если он равен названию псевдофайла, то исполняется код, находящийся в модуле ядра. Я изучил исходные коды многих известных ядерных руткитов, таких как adore-ng, knark, IntoXonia, lkm trojan (ищи их все на DVD к журналу). Многие идеи и участки кода я заимствовал именно из этих руткитов. |