Saltar al contenido

Recuperar el acceso al sistema cuando pierdes la contraseña de usuario

Tres fallos de la contraseña tras intentar acceder por SSH al servidor OSMC

Lo mío con la Raspberry es una especie de relación amor-odio. La abandoné en su caja hace algún mes, y esta misma semana la quise retomar, de nuevo, como un proyecto multicosa (perdón por la patada al diccionario). Algo así como mediacenter Kodi, servidor de ficheros y alguna que otra cosa. Eso sí, con la lentitud propia de la primera raspberry (la de 256MB de RAM).

El caso, que para ahorrar algo de tiempo decidí que era más sencillo retomar la copia de la tarjeta de memoria que ya traía instalada la distribución OSMC. Todo bien hasta que no podía iniciar sesión con SSH. Ni una sola de las contraseñas que recuerdo hacía que diera válido el usuario (no, ni siquiera con la que viene por defecto: osmc). Me había olvidado la contraseña.

Por suerte, simplemente sacando la tarjeta SD y metiéndola en un ordenador cualquiera es posible acceder al sistema de archivos. Y es aquí donde radica la principal condición para poder aplicar este método: tienes que poder acceder, tanto como lectura y escritura, al sistema de ficheros, incluidos los que corresponden al usuario root. Dicho de otro modo, debes de ser capaz de acceder físicamente al disco desde otra máquina.

Atención: Este método es aplicable a cualquier sistema Linux al cual  tengas acceso root al disco duro, sea la tarjeta sd de una raspberry pi o el disco duro o SSD de un ordenador cualquiera. Eso sí, no puede estar cifrado.

Un poco de teoría

Vamos a meternos un poco en teoría de Sistemas Operativos. Podemos destacar principalmente dos archivos relevantes que gestionan las propiedades de los usuarios, y datos asociados, ya sean grupos, permisos, u otra información parecida. Estos son: /etc/passwd y /etc/shadow.

cambiadeso@cambiadeso.es ~ $ ls -la /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 1524 sep 13 12:04 /etc/passwd
-rw------- 1 root root  928 sep 13 12:05 /etc/shadow

Podemos ver los permisos que tienen asignados cada uno de los ficheros. Mientras que /etc/passwd puede ser leído por cualquiera, /etc/shadow no, y sólo puede ser leído por el usuario root. Ésta es precisamente la razón por la que nos interesa, y es que si está bien protegido, es porque guarda algo importante: nuestras contraseñas.

Por suerte, pero por desgracia para lo que nos ocupa ahora, la contraseña no se guarda en texto plano. Es decir, que no se puede leer como tal, está hasheada (otra patada a la RAE, perdón). Lo que se almacena es el resultado de aplicar una función de resumen al texto original de tu contraseña. Esto evita que alguien que haya conseguido acceder al fichero de contraseñas pueda leer la tuya a simple vista. La explicación de la función resumen (o función hash) está fuera del ámbito de este artículo, pero podéis informaros tanto en la Wikipedia (EN) como en H4ckseed.

Esa función hash es la que tiene la culpa de que no podamos averiguar cuál era nuestra contraseña de antes. Pero sí que podemos generar de nuevo la cadena hash que se guarda en ese fichero para que coincida con la nueva contraseña que queremos. De esta forma, el sistema no notará nada raro cuando volvamos a iniciar sesión. Eso sí, hay que respetar el formato propio de los archivos, para que no de problemas. Vamos a abrir el fichero con gedit, aunque podremos usar cualquier otro editor de texto como nano, kate o vim:

sudo gedit /etc/shadow

Podremos ver que prácticamente todas las líneas del fichero cumplen el siguiente patrón:

usuario:hash:[nº dias]::::::

Nos vamos a centrar sólo en los dos primeros campos, en el de usuario y en el de hash. Recorreremos el fichero en busca de nuestro nombre de usuario, y borraremos todo lo que haya en el campo del hash. El resto de campos, incluyendo los dos puntos (:) deben quedarse tal cual. Ahora solo nos falta regenerar la contraseña cifrada.

Aplicación práctica

Hay varias formas de obtener el hash que se necesita. Voy a coger sólo una, que es la que me ha funcionado a mí, y pondré un enlace al resto, aunque espero que a vosotros os funcione igual que a mí. Esta solución viene empaquetada en un sólo comando Python, ejecutándolo con bash.

python -c "import crypt;  print(crypt.crypt('contrasena', '\$6\$aleatorio\$'))"

Lo único que tendremos que cambiar es el campo donde pone contrasena, y poner ahí la que queramos. Del otro campo, os recomiendo dejarlo tal y como está, pero si insistís, cambiad sólo la parte donde pone aleatorio. Al ejecutar el comando, nos escupirá por consola un simple string que será el hash que debemos copiar al fichero /etc/shadow.

Ejecución del comando para obtener el hash de una contraseña
Ejecución del comando para obtener el hash de una contraseña

En concreto, para un usuario con el nombre «cambiadeso», la línea que hay que cambiar en ese fichero quedaría así.

cambiadeso:$6$aleatorio$r6n4IZynNePVk5lqqvn3jsDGCzcVJdzvFEkozRCxdxYexLV17VZx.TecZk0Z4WSRDnLyt4YDEJ5ZVb7Er4M97.:16692:0:99999:7:::

Los últimos campos los he dejado tal y como estaban antes de cambiar nada en el archivo. Ahora sí, ya podremos guardar el fichero y probar si definitivamente podemos iniciar sesión con la contraseña con la que generamos el hash.

PD: Es una buena práctica entre los Sysadmin la de editar el fichero /etc/shadow utilizando el comando vipw -s. Éste comando te dirá al cerrar el editor si hay algún problema con el formato del archivo que provoque que no pueda ser leído. Para más información, man vipw.

Un saludo 😉

Fuente | Unix StackExchange | $ man 5 shadow | $ man vipw

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.