Podemos usar ldd para imprimir el objeto compartido requerido por un objeto binario o compartido. Ldd muestra la ubicación del objeto y la dirección hexadecimal donde se carga en la memoria para cada una de las dependencias de un programa.
Vemos una biblioteca no estándar nombrada libshared.so como dependencia para el binario. Como se dijo anteriormente, es posible cargar bibliotecas compartidas desde ubicaciones personalizadas. Una de esas configuraciones es la configuración RUNPATH. Las bibliotecas en esta carpeta tienen preferencia sobre otras carpetas. Esto se puede inspeccionar usando la utilidad readelf .
La configuración permite cargar bibliotecas desde la carpeta /development, en la que todos los usuarios pueden escribir. Esta configuración incorrecta se puede aprovechar colocando una biblioteca maliciosa en /development, que tendrá prioridad sobre otras carpetas porque las entradas de este archivo se comprueban primero (antes que otras carpetas presentes en los archivos de configuración).
htb-student@NIX02:~$ ./payroll
./payroll: symbol lookup error: ./payroll: undefined symbol: dbquery
Podemos copiar una biblioteca existente a la carpeta development. Al ejecutar el binario ldd, la ruta de la biblioteca aparece como /development/libshared.so, lo que significa que es vulnerable. Al ejecutar el binario, se genera un error que indica que no se pudo encontrar la función denominada dbquery. Podemos compilar un objeto compartido que incluya esta función.
SSH a 10.129.175.139 (ACADEMY-LPE-NIX02)
Usuario "htb-student"
Contraseña "Academy_LLPE!"
Siga los ejemplos de esta sección para escalar privilegios, vuelva a crear todos los ejemplos (no ejecute simplemente el binario payroll). Practique el uso de ldd y readelf. Envíe la versión de glibc (es decir, 2.30) en uso para pasar a la siguiente sección.
Al acceder por SSH nos encontramos con estos archivos, entre los que destaca payroll ya que pertenece al usuario root:
Esto mostrará las rutas de las bibliotecas compartidas y si están correctamente enlazadas.
Usar readelf para analizar el binario
Ejecuta el comando readelf -h <nombre_del_binario> para obtener el encabezado ELF del binario.
readelf-hpayrollELFHeader:Magic:7f454c46020101000000000000000000Class:ELF64Data:2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x1080 Start of program headers: 64 (bytes into file) Start of section headers: 14744 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 13 Size of section headers: 64 (bytes) Number of section headers: 31 Section header string table index: 30
Opcionalmente, puedes inspeccionar otras secciones como la tabla de símbolos: