🔑Passwd, Shadow y Opasswd
Las distribuciones basadas en Linux pueden utilizar muchos mecanismos de autenticación diferentes. Uno de los mecanismos estándar y más comúnmente utilizado son los Pluggable Authentication Modules( PAM
). Los módulos utilizados para esto se llaman pam_unix.so
o pam_unix2.so
y están ubicados en /usr/lib/x86_x64-linux-gnu/security/
en distribuciones basadas en Debian. Estos módulos administran la información del usuario, la autenticación, las sesiones, las contraseñas actuales y las contraseñas antiguas. Por ejemplo, si queremos cambiar la contraseña de nuestra cuenta en el sistema Linux con passwd
, se llama a PAM, que toma las precauciones adecuadas y almacena y maneja la información en consecuencia.
El módulo estándar de administración pam_unix.so
utiliza llamadas API estandarizadas desde las bibliotecas y archivos del sistema para actualizar la información de la cuenta. Los archivos estándar que se leen, administran y actualizan son /etc/passwd
y /etc/shadow
. PAM también tiene muchos otros módulos de servicio, como LDAP, mount o Kerberos.
Passwd
El archivo /etc/passwd
contiene información sobre cada usuario existente en el sistema y puede ser leído por todos los usuarios y servicios. Cada entrada en el /etc/passwd
identifica a un usuario en el sistema. Cada entrada tiene siete campos que contienen un formulario de base de datos con información sobre el usuario en particular, donde dos puntos ( :
) separan la información. En consecuencia, una entrada de este tipo podría verse así:
Formato de contraseña
|
|
|
|
|
|
|
|
|
|
|
|
|
Nombre de inicio de sesión | Información de contraseña | UID | GUID | Nombre completo/ comentarios | Directorio de inicio | Shell |
El campo más interesante para nosotros es el campo Información de contraseña en esta sección porque aquí puede haber diferentes entradas. Uno de los casos más raros que podemos encontrar sólo en sistemas muy antiguos es el hash de la contraseña cifrada en este campo. Los sistemas modernos tienen los valores hash almacenados en el archivo /etc/shadow
, al que volveremos más adelante. Sin embargo, /etc/passwd
es legible en todo el sistema, lo que brinda a los atacantes la posibilidad de descifrar las contraseñas si los hashes se almacenan aquí.
Por lo general, encontramos el valor x
en este campo, lo que significa que las contraseñas se almacenan de forma cifrada en el archivo /etc/shadow
. Sin embargo, también puede ser que el /etc/passwd
se pueda escribir por error. Esto nos permitiría borrar este campo para el usuario root
de modo que el campo de información de contraseña esté vacío. Esto hará que el sistema no envíe una solicitud de contraseña cuando un usuario intente iniciar sesión como root
.
Editando /etc/passwd - Antes
Editando /etc/passwd - Después
Acceso root sin contraseña
Aunque los casos mostrados rara vez ocurrirán, debemos prestar atención y estar atentos a las brechas de seguridad porque hay aplicaciones que requieren que establezcamos permisos específicos para carpetas enteras. Si el administrador tiene poca experiencia con Linux o las aplicaciones y sus dependencias, puede que le dé permisos de escritura al directorio /etc
y se olvide de corregirlos.
Shadow
Dado que la lectura de los valores hash de las contraseñas puede poner en peligro todo el sistema, se desarrolló un archivo /etc/shadow
que tiene un formato similar a /etc/passwd
pero solo es responsable de las contraseñas y su gestión. Contiene toda la información de contraseña de los usuarios creados. Por ejemplo, si no hay ninguna entrada en el /etc/shadow
para un usuario en /etc/passwd
, el usuario se considera no válido. Además, el /etc/shadow
solo lo pueden leer los usuarios que tienen derechos de administrador. El formato de este archivo se divide en 9 campos
:
Formato de etc/shadow
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nombre de usuario | Contraseña cifrada | Último cambio de contraseña | Mín. PW age | Max. PW age | Periodo de advertencia | Periodo de inactividad | Fecha de caducidad | No usado |
etc/shadow
Si el campo de contraseña contiene un carácter, como !
o *
, el usuario no puede iniciar sesión con una contraseña de Unix. Sin embargo, aún se pueden utilizar otros métodos de autenticación para iniciar sesión, como Kerberos o la autenticación basada en claves. El mismo caso se aplica si el campo contraseña cifrada
está vacío. Esto significa que no se requiere contraseña para iniciar sesión. Sin embargo, esto puede llevar a que programas específicos nieguen el acceso a funciones. La contraseña cifrada
también tiene un formato particular mediante el cual también podemos conocer alguna información:
$<type>$<salt>$<hashed>
Como podemos ver aquí, las contraseñas cifradas se dividen en tres partes. Los tipos de cifrado nos permiten distinguir entre los siguientes:
Tipos de algoritmos
$1$
– MD5$2a$
– Blowfish$2y$
– Eksblowfish$5$
– SHA-256$6$
– SHA-512
De forma predeterminada, el método de cifrado SHA-512 ( $6$
) se utiliza en las distribuciones de Linux más recientes. También encontraremos otros métodos de cifrado que luego podremos intentar descifrar en sistemas más antiguos. Discutiremos cómo funciona el craqueo en un momento.
Opasswd
La biblioteca PAM ( pam_unix.so
) puede evitar la reutilización de contraseñas antiguas. El archivo donde se almacenan las contraseñas antiguas es el /etc/security/opasswd
. También se requieren permisos de administrador/root para leer el archivo si los permisos para este archivo no se han cambiado manualmente.
Leyendo /etc/security/opasswd
Si observamos el contenido de este archivo, podemos ver que contiene varias entradas para el usuario cry0l1t3
, separadas por una coma ( ,
). Otro punto crítico al que hay que prestar atención es el tipo de hash que se ha utilizado. Esto se debe a que el algoritmo MD5
( $1$
) es mucho más fácil de descifrar que SHA-512. Esto es especialmente importante para identificar contraseñas antiguas y tal vez incluso su patrón, porque a menudo se utilizan en varios servicios o aplicaciones. Aumentamos muchas veces la probabilidad de adivinar la contraseña correcta según su patrón.
Descifrando credenciales de Linux
Una vez que hayamos recopilado algunos hashes, podemos intentar descifrarlos de diferentes maneras para obtener las contraseñas en texto sin cifrar.
Unshadow
Hashcat - Cracking Hashes Unshadow
Hashcat - Descifrando hashes MD5
Caso práctico
Examine el objetivo utilizando las credenciales del usuario Will y descubra la contraseña del usuario "root". Luego, envíe la contraseña como respuesta.
Vamos a usar las credenciales encontradas en la sección anterior para acceder por SSH con el usuario Will
Al acceder a .bash_history
encontramos la ruta /.backups
que contiene los archivos .bak
del passwd y shadow
Vamos a llevarnos estos 2 archivos a nuestro host de atacante y vamos a hacer la técnica de Unshadow
Unshadow
Una vez tenemos el unshadow.hashes
vamos a crackearlo con hashcat, utilizando el archivo mut_password.txt
de contraseñas mutadas que hemos creado en este sección, en vez del diccionario rockyou:
También podríamos centrarnos solo en el hash de root, que es el que nos interesa:
Obtenemos correctamente la contraseña en plano del usuario root: J0rd@n5
Última actualización