Passwd, Shadow & Opasswd
En las distros Linux se pueden usar varios mecanismos de autenticación, pero uno de los más comunes y estándar es PAM (Pluggable Authentication Modules).
Los módulos principales se llaman pam_unix.so
o pam_unix2.so
, y en sistemas basados en Debian se encuentran en:
Estos módulos se encargan de manejar todo lo relacionado con los usuarios: autenticación, sesiones, contraseñas actuales y antiguas.
Por ejemplo, cuando usamos el comando passwd
para cambiar la contraseña, PAM se activa, toma medidas de seguridad y gestiona todo el proceso como debe ser.
El módulo pam_unix.so
usa llamadas estándar a las librerías del sistema para actualizar la info de la cuenta. Los archivos que maneja directamente son:
/etc/passwd
/etc/shadow
Además, PAM puede usar otros módulos según lo necesitemos, como para autenticación con LDAP, Kerberos, o incluso para montar recursos.
Passwd File
El archivo /etc/passwd
guarda información sobre todos los usuarios del sistema y puede ser leído por cualquier usuario o servicio.
Cada línea del archivo representa un usuario y está formada por siete campos, separados por dos puntos (:
), que actúan como una especie de base de datos simple.
Un ejemplo de cómo se ve una entrada típica sería algo así:
Passwd Format
Nombre de usuario →
gzzcoo
Contraseña (x) → Un
x
significa que la contraseña está en/etc/shadow
UID → Identificador del usuario, por ejemplo
1001
GID → ID del grupo principal del usuario
Comentario o nombre completo →
Gzzcoo
Directorio home →
/home/gzzcoo
Shell por defecto →
/bin/bash
El campo más interesante para nosotros en el archivo /etc/passwd
es el de la contraseña, porque puede tener diferentes valores.
En sistemas muy antiguos, es raro pero posible encontrar ahí directamente el hash de la contraseña. Si eso pasa, como el archivo es legible por todo el sistema, un atacante podría copiar ese hash y crackearlo fácilmente.
En sistemas modernos, lo normal es que ese campo tenga una x
, lo que significa que el hash real está en /etc/shadow
, un archivo mucho más protegido.
Ahora bien, si por error el archivo /etc/passwd
es escribible, podríamos vaciar el campo de contraseña del usuario root
, dejándolo así:
Root without Password
Aunque estos casos no sean tan comunes, igual hay que estar atentos porque pueden aparecer fallos de seguridad por permisos mal puestos. Hay aplicaciones que piden permisos específicos sobre carpetas enteras, y si el admin no tiene mucha experiencia con Linux o con la app, puede terminar dando permiso de escritura al directorio /etc
, y olvidarse de corregirlo después.
Eso abre la puerta a que un atacante modifique archivos críticos como /etc/passwd
, /etc/shadow
o incluso servicios.
Shadow File
Como leer los hashes de contraseñas puede comprometer todo el sistema, se creó el archivo /etc/shadow
, que tiene un formato similar al /etc/passwd
, pero solo guarda la info de contraseñas y su gestión.
Este archivo contiene los hashes de todas las contraseñas de los usuarios. Si un usuario aparece en /etc/passwd
pero no tiene entrada en /etc/shadow
, se considera inválido.
Además, solo puede ser leído por usuarios con permisos de administrador.
Shadow Format
Nombre de usuario →
cry0l1t3
Contraseña cifrada (hash) → empieza con
$6$
(sha512)Fecha del último cambio de contraseña (en días desde 1970)
Edad mínima de la contraseña (días para poder cambiarla)
Edad máxima de la contraseña (días antes de caducar)
Periodo de aviso (días antes de caducar que se avisa al user)
Periodo de inactividad (días después de caducar sin login)
Fecha de expiración de la cuenta
Campo no usado (vacío)
Shadow File
En el campo de contraseña del archivo /etc/shadow
, si vemos un carácter como !
o *
, significa que el usuario no puede iniciar sesión con contraseña Unix. Pero sí puede autenticarse con otros métodos como Kerberos o claves SSH.
Si el campo está vacío, no se pedirá contraseña para hacer login, aunque eso puede hacer que ciertos programas le bloqueen funciones.
Los hashes tienen esta estructura:
Con esto, podemos identificar el algoritmo usado:
$1$
MD5
$2a$
Blowfish
$2y$
Eksblowfish
$5$
SHA-256
$6$
SHA-512
En las distros modernas de Linux se usa por defecto SHA-512 ($6$
).
En sistemas antiguos aún podemos encontrarnos con MD5, Blowfish, o SHA-256, y ahí es donde es más fácil poder crackear.
Opasswd
El módulo pam_unix.so
de la biblioteca PAM permite restringir la reutilización de contraseñas anteriores. Para ello, almacena los hashes de contraseñas previamente utilizadas en el archivo:
Este archivo es accesible únicamente por el usuario root, a menos que se hayan modificado sus permisos manualmente.
Reading /etc/security/opasswd
Al observar el contenido de este archivo, podemos ver que contiene varias entradas para el usuario cry0l1t3
, separadas por comas (,). Otro aspecto crítico a tener en cuenta es el tipo de algoritmo de hash utilizado. En este caso, el algoritmo MD5 ($1$
) es considerablemente más fácil de romper que SHA-512.
Esto es especialmente relevante para identificar contraseñas antiguas e incluso posibles patrones, ya que es común que las contraseñas se reutilicen en distintos servicios o aplicaciones. Detectar estos patrones aumenta significativamente la probabilidad de adivinar la contraseña actual.
Cracking Linux Credentials
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 Unshadowed Hashes
Hashcat - Cracking MD5 Hashes
Última actualización