Hola, amigos!

Запуск обычных user-land программ из ядра.

Зачем это нужно? Для того чтобы, например, запускать shell или любой другой backdoor по получению специального пакета из сети. Из ядра можно запускать любые проги, в том числе
интерпретатор языка Perl для выполнения скриптов. На Perl’е можно полностью написать backdoor и запускать его чисто из kernel’а безо всякого файла со скриптом в файловой системе! В результате обнаружить backdoor, в то время когда хаксор с ним не работает, будет довольно тяжело, так как обнаруживать то и нечего. 😉

Я довольно долго мучался пытаясь научится запускать проги из ядра. Сначала я придумал один способ,
но он работал нормально только 2 раза, а после третьего запуска проги происходил kernel panic и комп падал. 🙁 Это происходило из-за особенностей
управления процессами при запуске проги из interruptment’а (прерывания). Но со временем я разобрался и нашел достаточно простое и красивое решение. Для того, чтобы запустить прогу из ядра надо использовать две специальные функции: schedule_task и call_usermodehelper.
Schedule_task нужна чтобы комп не падал, а call_usermodehelper собственно запускает саму прогу. Функция schedule_task принимает один аргумент — указатель на структуру tq_struct. Эта структура и функция описаны в /usr/src/linux/include/linux/tqueue.h (и копия в /usr/include/linux/tqueue.h). Аргументы функции call_usermodehelper очень похожи
на те, которые принимают user-land функции из семейства execve. Для полной доки смотри kernel-api и исходники.
Kernel-api дока генерится из исходников ядра методом, описанным во 2-й части.

#define __KERNEL__
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/config.h>

#include <linux/tqueue.h>

char shell[] = «/bin/sh»;
char *arg[] = { shell, «-c», NULL, NULL };
char *env[] = { «PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:», «HOME=/», NULL };

struct tq_struct tq;

void __cmd_exec(void *ptr)
{
arg[2] = ptr;
call_usermodehelper(shell, arg, env);
}

void cmd_exec(void *ptr)
{
tq.sync = 0;
tq.routine = __cmd_exec;
tq.data = ptr;
schedule_task(&tq);
}

int init_module()
{
cmd_exec(«echo defaced > /tmp/index.html»);
return 0;
}

void cleanup_module()
{
}

Откомпилируй и загрузи модуль, после чего в /tmp появится файл index.html с содержанием defaced. 🙂

Coming soon: networking & rootkit.

Adios.

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

Check Also

Прятки с Windows 10. Тестируем программы для отключения слежки и повышения приватности

С выхода Windows 10 прошло уже три с лишним года, а проблема слива пользовательских данных…