the_open_door
café
ESEN
← Volver al índice

mlocate database enumeration

locate es un buscador de ficheros que no recorre el disco en cada consulta, sino que lee un índice precalculado: /var/lib/mlocate/mlocate.db (o /var/lib/plocate/plocate.db en sistemas con plocate). Ese índice lo genera updatedb (normalmente por cron, como root) y contiene la ruta de casi todos los ficheros del sistema, incluidos los que hay dentro de directorios que nuestro usuario no puede listar.

El fichero mlocate.db suele estar protegido: pertenece al grupo mlocate y solo lo leen root y los miembros de ese grupo. Por eso, si nuestro usuario está en el grupo mlocate, tenemos una fuga de la estructura del sistema aunque no podamos leer el contenido de esos ficheros.

Enumeración

Primero se comprueba la pertenencia al grupo y, si el binario locate está disponible, se usa directamente (consulta el mismo índice privilegiado):

id                                  # ¿pertenecemos al grupo mlocate/plocate?
locate -S                           # estadisticas de la base de datos (existe y es legible)
locate password                     # rutas que contienen "password"
locate -i .kdbx ; locate id_rsa ; locate .bak

Si locate no está pero sí podemos leer el .db, el formato es binario y se pasa por strings:

find / -group mlocate 2>/dev/null
strings /var/lib/mlocate/mlocate.db | grep -E '/home/|/root/|\.ssh|\.conf|backup'

No leemos el contenido de los ficheros, pero sí descubrimos que existen y dónde están, lo que orienta el siguiente paso: un fichero creds.txt en el home de otro usuario, una clave privada, un backup con secretos, un script que podamos abusar por otra vía. Como el índice lo genera root sin las restricciones de nuestro usuario, revela rutas invisibles para un find normal.

Requisitos

Pertenecer al grupo mlocate/plocate (o poder leer el .db de otro modo). Es enumeración pura, no ejecución: el valor está en saber qué buscar cuando después consigamos leer esas rutas (por un script sudo que sigue symlinks, por reutilización de credenciales, por un SUID, etc.).

Cómo detectarlo. La lectura del índice deja poca huella por sí sola. Con auditd y una SACL sobre /var/lib/mlocate/mlocate.db, un 4663 de lectura por una cuenta que no es de indexación es la señal; el uso de locate con patrones de secretos (password, id_rsa, .kdbx) desde una cuenta de usuario también es sospechoso si se registra la línea de comando. La detección real, sin embargo, se produce en el paso siguiente: el acceso efectivo a las rutas descubiertas.

Defensa. Limitar la pertenencia al grupo mlocate/plocate al mínimo, y restringir PRUNEPATHS/PRUNEFS en /etc/updatedb.conf para que el índice no recorra directorios sensibles (homes ajenos, /root, puntos de montaje temporales). Es una forma de caza de credenciales orientada a la estructura del disco.

Máquinas donde se aplica