Me he dado cuenta de que no tenía ninguna publicación al respecto sobre esto. Se trata de un viejo trick ya conocido por la comunidad, hace un tiempo ya publicara algo similar, pero en esta ocasión lo comento en más detalle y el cómo protegerse de este tipo de técnica de bypass login en sistemas Linux.

Si tenemos acceso físico a la máquina o al hipervisor de una máquina virtual Linux, para poder restablecer la password de root, dejarla en blanco o cualquier otra acción privilegiada como acceder a los volúmenes del sistema para realizar un volcado o copia de los ficheros /etc/passwd y /etc/shadow con el fin de realizar un cracking de contraseñas por fuerza bruta a sus hashes, es aprovechar un pequeño hack -si se puede llamar así- usando el gestor de arranque múltiple GNU Grub (multiboot boot loader).

No se trata de ningún bug, explotación o vulnerabilidad (aunque pueda ser aprovechada de forma malintencionada). Simplemente es una funcionalidad estándar del kernel de Linux que permite a los administradores de sistemas entrar en un modo a una consola interactiva para poder recuperar un sistema de ficheros dañado o una contraseña olvidada.

Más adelante veremos cómo se puede fortificar el acceso a la edición desde el menú del gestor de arranque Grub.

En sistemas Linux ya sea con interfaz gráfica como un entorno de terminal sin GUI, podemos invocar manualmente el menú de Grub presionando la tecla Shift en el momento del arranque del sistema.

Figura 1: Menú del gestor de arranque GNU Grub.

Figura 1: Menú del gestor de arranque GNU Grub.

Presionando la tecla e podemos editar Grub. Localizamos una línea similar a linux /boot/vmlinuz-VERSION-generic root=UUID=IDENTIFICADOR ro maybe-ubiquity modificamos ro (solo lectura) por rw (lectura y escritura) y añadimos al final init=/bin/bash, guardamos y salimos con Ctrl-x. Esto reiniciará el sistema y nos levantará una shell privilegiada en un contexto de root.

Bypass total de autenticación

Añadir rw init=/bin/bash a la línea de kernel desde GRUB arranca el sistema con una shell root sin autenticación. Cualquier usuario con acceso físico (o consola virtual) al boot puede tomar el control total. Mitígalo con: password de GRUB (grub-mkpasswd-pbkdf2), cifrado de disco (LUKS) y BIOS/UEFI password.

linux /boot/vmlinuz-VERSION-generic root=UUID=IDENTIFICADOR ro maybe-ubiquity  quiet splash
linux /boot/vmlinuz-VERSION-generic root=UUID=IDENTIFICADOR
rw
maybe-ubiquity
init=/bin/bash

quiet splash

  • quiet: Indica un modo silencioso (menos verbose), útil para ver todos los mensajes en el arranque del sistema, como los controladores y módulos, checks del sistema y errores.
  • splash: Simplemente muestra una imagen de carga (en movimiento) en el arranque del sistema.

init=/bin/bash: Indica al kernel de Linux que ejecute /bin/bash como init, en lugar de ejecutar init como sistema.

Figura 2: Modificación del Grub para iniciar un shell con privilegios de root.

Figura 2: Modificación del Grub para iniciar un shell con privilegios de root.

Después de reiniciar se levantará una terminal en un contexto de root. Podremos restablecer la password y establecer una nueva con el comando passwd o realizar cualquier acción privilegiada.

Figura 3: Restablecer la password de root.

Figura 3: Restablecer la password de root.

Eliminar la password root dejando una contraseña en blanco. Para ello editamos el fichero /etc/shadow eliminando el asterisco (*) después de los primeros dos puntos (:) de forma que quede un espacio vacío, con esto eliminamos el uso de una contraseña para un usuario.

root::18305:0:99999:7:::

Figura 4: Password en blanco root editando /etc/shadow.

Figura 4: Password en blanco root editando /etc/shadow.

Como comenté al principio, podemos insertar una memoria USB externa, montarla y realizar una copia del fichero /etc/passwd y /etc/shadow con la finalidad de realizar ataques de fuerza bruta para la obtención de contraseñas de los usuarios del sistema. Debemos unir ambos ficheros en un único fichero con unshadow.

/usr/bin/unshadow <fichero-passwd> <fichero-shadow> > /tmp/crack.passwords

¿Cómo evitar y protegerse de esta técnica? Link to heading

El hardening para evitar que cualquier persona que pueda tener acceso a la máquina de forma física o virtual desde el entorno del hipervisor y pueda realizar esta técnica.

1. Establecer password de arranque y BIOS/UEFI Link to heading

Si se trata de un equipo físico. Establecer una password de arranque del sistema, algo que podemos configurar en la BIOS/UEFI. También establecer una password en el acceso al Setup de la BIOS/UEFI evitando así que no se pueda realizar un boot de otro sistema a través de Live CD/USB.

2. Cifrar el disco Link to heading

Si existe la posibilidad es recomendable cifrar el volumen del sistema con LUKS.

3. Establecer una password de acceso a Grub Link to heading

Establecer una password en el Grub es la opción más sencilla y segura. Creamos una password tipo PBKDF2 (Password-Based Key Derivation Function 2) que se caracteriza por reducir ataques de fuerza bruta. Se nos genera un hash pbkdf2 el cual copiaremos.

grub-mkpasswd-pbkdf2

Figura 5: Establecer password al gestor de arranque Grub.

Figura 5: Establecer password al gestor de arranque Grub.

Editamos el siguiente fichero.

sudo nano /etc/grub.d/00_header

Al final del fichero pegamos lo siguiente.

cat << EOF
set superusers="admin"
password_pbkdf2 admin *HASH*
EOF

Donde “admin” será el nombre del usuario que queremos que valide para el acceso al menú del gestor de arranque Grub y HASH lo sustituimos por el generado anteriormente.

Actualizamos el Grub para aplicar los cambios.

sudo update-grub

Reiniciamos y pulsamos la tecla Shift para forzar que se muestre el menú de Grub. Se nos mostrará un login para su acceso donde introduciremos el usuario y contraseña establecidos anteriormente.

Figura 6: User y password para acceder al gestor de arranque Grub.

Figura 6: User y password para acceder al gestor de arranque Grub.

Saludos!