Ana Gutierrez
Colmena SvQ
Published in
6 min readMar 25, 2019

--

Hace poco tuve la suerte de asistir a un taller de RedHat donde se nos puso a prueba con una serie de retos sobre el sistema de Linux. La primera de las pruebas resultó ser un clásico: entrar en un sistema donde desconocemos la contraseña de root.

Mi experiencia en este taller, más luego afianzando estos conocimientos por mi cuenta, me han llevado a escribir este breve artículo, donde no sólo repasaré cómo hacerlo en un Ubuntu Server18.04, sino también como tratar de mitigar este agujero de seguridad. Efectivamente, no hay sistemas seguros o inseguros por sí mismos. Cada sistema es tan seguro como tú hagas que sea.

Acceder y editar el GRUB

El primer paso es sencillo: tenemos que acceder como sea al GRUB de Linux. Sea como sea, esta es la única forma de poder entrar en el sistema, puesto que una vez que ya entremos en el SO como tal no habrá manera de modificar la contraseña. En cambio, el GRUB, al arrancar antes que Ubuntu, es nuestra puerta de entrada a lo que va a cargar después, el SO.

En mi caso, al no aparecer el GRUB de primeras al iniciar el servidor tuve que reiniciarlo y esperar a que volviera a hacer todas sus comprobaciones. Esto la verdad que llevó bastante tiempo. Una vez terminó con la tarjeta de red, antes justo de que cambiara la tipografía de las letras al dar paso a Ubuntu, pulsé Shift y así conseguí acceder por fin al GRUB. Si tenéis suerte os aparecerá el GRUB sin necesidad de hacer nada más. Si no, ya sabéis que la clave es pulsar Shift en el momento preciso.

Una vez dentro hay que hacer ‘edit’ en la primera opción, pulsando la letra ‘e’. Nos aparece un archivo en pantalla que es el archivo de configuración del GRUB.

Aspecto del archivo del grub antes de editarlo

Buscamos la línea que empieza con la palabra linux. Aquí debemos cambiar ese ‘ro’ de la última parte de la línea. Significa ‘readonly’, sólo lectura, así que lógicamente habrá que cambiarlo por ‘read/write’, es decir, ‘rw’. También tendremos que borrar el último comando que nos aparece. En mi caso aparecía ‘maybe-ubiquity’ y eso fue lo que borré, sin dejar espacios sobrantes. Parece que por lo general (según esta web) debería poner ‘quiet splash $vt_handoff’. Quizá este último sea el más común. En mi caso se trataba de un headless server, así que tal vez de ahí la diferencia.

Por último debemos escribir ‘init=/bin/bash’. Mucho cuidado con los espacios, porque si dejáis el doble espacio que hay antes de ‘quiet’ o de ‘maybe-ubiquity’ luego al arrancar no encontrará el /bin/bash.

Archivo una vez lo hemos editado

Una vez tenemos esto escrito correctamente le damos a Ctrl + x o bien a F10.

A continuación estaremos logueados como superuser dentro ya de Ubuntu.

¡Ya estamos dentro!

Una vez dentro…

podemos comprobar que efectivamente el sistema está montado como read/write con el comando

mount | grep -w /

Cambiamos la contraseña con normalidad con el comando passwd

y reiniciamos el sistema por último con

exec /sbin/init
Todos los comandos usados una vez entramos a través del

La verdad es que no lo probé con reboot pero debería funcionar igualmente. Con sbin/init nos logueamos directamente como root, pero igualmente ya cada vez que reiniciemos nuestra máquina podremos acceder como root, al haber cambiado su contraseña de forma definitiva.

Protegiendo nuestro sistema

Hemos visto que nuestro sistema linux tiene por tanto un grave fallo de seguridad. Imaginaros, si sólo con un taller o una búsqueda rápida en Google adquirimos esta capacidad, debe haber un importante número de personas que sepan cómo hacerlo y que además quizá no tengan las mejores intenciones. Nuestra responsabilidad es, por tanto, cubrir de alguna forma esta puerta de atrás.

Siguiendo las indicaciones encontradas aquí cifré mi GRUB, de forma que no se pueda ya cambiar el archivo de configuración sin la contraseña establecida. Dejo aquí los comandos usados para ello.

Para generar nuestra contraseña cifrada, ejecutamos

grub-mkpasswd-pbkdf2

A continuación recibiremos un hash, que debemos guardar en lugar seguro, además de necesitarlo justo a continuación para terminar nuestro hardening.
En el archivo /etc/grub.d/40_custom, un archivo para configuraciones customizables del GRUB, añadimos:

set superusers=‘aquí-el-nombre-del-usuario-o-root’password_pbkdf2 nombre-del-usuario (El hash PBKDF2 de su contraseña)
Una imagen vale más que mil palabras

Y por último hacemos

update-grub

Ahora ya lo hemos puesto un poquito más difícil para quien quiera vulnerar la seguridad de nuestro sistema. Sin embargo, aún quedarían agujeros por cerrar, como por ejemplo la posibilidad de cambiar la contraseña de root a través de un Live CD o USB con Ubuntu a través del cual alguien se pudiera loguear. Para cerrar esta posibilidad lo primero que se no viene a la cabeza es encriptar la BIOS, estableciendo también ahí una contraseña que no permita a cualquiera entrar y modificarla y, segundo, eliminando por completo la opciones alternativas de arranque que no sean por disco duro. En el gran artículo anteriormente referido podéis encontrar más información sobre esta vía de hardening o endurecimiento de nuestras medidas de seguridad.

LUKS

Sin embargo, siguiendo esta vía tan sólo cerramos esa posibilidad mientras se use la máquina donde actualmente se encuentra alojado nuestro disco duro, ya que ahí es donde reside la BIOS. El atacante aún podría extraer el disco y arrancarlo desde otra máquina valiéndose de un Live USB. Por eso, lo que suelen hacer las empresas e instituciones es encriptar totalmente las particiones del disco, o bien los archivos concretos que contengan información sensible.

Linux viene ya con una serie de herramientas de encriptación integradas en el kernel, como es LUKS (Linux Unified Key System), incluido dentro del subsistema de encriptación de disco dm-crypt (device mapper-crypt). Para usar dm-crypt es necesario primero instalar alguno de los front-ends de consola disponibles, actualmente cryptsetup y cryptmount. Cómo se llevaría a cabo la encriptación de forma detallada se escapa ya a los objetivos de este breve artículo. Por ahora, tan sólo quiero hacer referencia a esta magnífica herramienta ya integrada en nuestro Linux, y dejar la la puerta abierta a otro posible artículo que sirva de tutorial completo sobre cómo encriptar una de nuestras particiones usando dm-crypt+LUKS. Sin embargo, si os habéis quedado con ganas de saber más sobre estas herramientas y no podéis esperar, os recomiendo seguir este enlace (el artículo está en inglés).

Como último apunte, me gustaría señalar que existen otras posibles herramientas de encriptación más allá de dm-crypt, que trabajan de forma diferente. Mientras que dm-crypt+LUKS encriptan a nivel de bloque o partición de disco (block-level encryption), existen otras herramientas que trabajan encriptando a nivel de archivos (filesystem-level encryption), como son eCryptfs y EncFS. Sobre todo eCryptfs es bastante popular y se puede usar para encriptar todos los archivos dentro de /home. Al igual que LUKS, se usa también en SOs más allá de Linux, como Windows, macOS e incluso Android gracias a una serie de proyectos open source.

Últimas consideraciones

Por supuesto, cabe preguntarse si todas estas contraseñas y medidas de seguridad no se podrían volver también en contra nuestra en algún momento, pues puede darse el caso de que olvidemos nuestra propia contraseña de root. Como siempre, todo tiene sus ventajas y desventajas, pero creo que sólo con un poco de sentido común, sabiendo poner nuestras contraseñas a buen recaudo y haciendo backups de las mismas, muy raro el llegar a arrepentirnos de nuestro hardening. Por el contrario, opino que una vez conoces estos agujeros de seguridad no es posible quedarse tranquilo hasta tenerlos todos cubiertos. Mucho más si tu sistema contiene información sensible o que simplemente no quieres que caiga en otras manos.

Espero de verdad que este artículo os haya servido tanto como a mí escribirlo. Y también que a partir de ahora vuestras máquinas Linux sean fortalezas inexpugnables.

--

--