Tag: Shell

Resetear contraseña olvidada de tu Raspberry Pi

La semana pasada me encontré con el problema de tener que acceder vía SSH a una Raspberry Pi (rpi), para poder gobernar una serie de maquinas accesibles desde la red local a la que se conectaba dicha rpi, y no poder hacerlo porque no recordaba la contraseña…

Al ver que no recordaba la contraseña me puse a buscar la mejor solución para poder volver a tener acceso a la rpi. Alguno puede pensar que con volver a poner el sistema operativo Raspbian, queda todo solucionado, y tiene razón. El problema, es que toda la configuración y software específico se borra, teniendo que volver a cargar el sistema operativo, instalar el software y generar de nuevo las configuraciones… vamos un peñazo XD .

Alguno se le ocurriría montar un script en el que ir probando las posibles combinaciones por fuerza bruta. En mi caso no era una opción, ni suele serlo en general. Con que cumplas los criterios básicos de una contraseña decente la combinatoria se dispara… Los tiempos en los que las claves eran de hasta 6 caracteres normalmente sólo letras y/o números han quedado atrás.

Con todo ello en mente le di alguna vuelta más al asunto…

Me puse a pensar cuál es nivel de seguridad que me podría permitir resetear la clave, y pronto caí que en el físico. Tenía acceso físico al hardware de la rpi, con lo que cogí la tarjeta SD y la introduje en mi ordenador. En su interior enseguida encontré un archivo, que mirando un poco en Internet, entendí que me podía dar la clave para poder acceder al sistema antes de que completamente se cargase y me obligase a idetificarme con las credenciales de acceeso, de la cual había perdido la contraseña.

El fichero en cuestión es el “cmdline.txt” y contiene parámetros específicos para la carga del kernel de Raspbian:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Según la documentación es posible cargar la ejecución de cualquier binario con el parámetro “init“, y en este caso nos interesa cargar la shell. Para ello añadimos “init=/bin/sh” al final de la línea precedido por un espacio:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait init=/bin/sh

Hecha esta modificación en el fichero lo guardamos, volvemos a introducir la SD en la rpi y la arrancamos. Esta vez durante el arranque, se parará en cierto momento la carga del sistema y nos aparecerá un prompt en el que podremos escribir comandos.

Antes de escribir cualquier comando debemos remontar el volumen para que efectivamente guarde los cambios. Para ello vamos a volver a montar el sistema de ficheros como lectura y escritura con el siguiente comando.

mount -rw -o remount /

Una vez hecho, vamos a invocar al comando que nos permite resetear la contraseña de nuestro usuario (normalmente pi si no los has cambiado):

passwd pi

Te pedirá que introduzcas la contraseña y otra vez más para confirmarla. Si todo ha ido bien verás un mensaje de este tipo:

passwd: password updated successfully

Ahora sincronizaremos los cambios que hemos hecho que están en memoria, para que queden persistentes en la memoria de la SD. Después reanudaremos el boot del sistema:

sync
exec /sbin/init

Una vez se haya cargado el sistema comprueba que puedes acceder con la clave que intruduciste y apaga la rpi con:

sudo poweroff

Una vez apagada la rpi volvemos a cargar la SD en el ordenador y editamos de nuevo el fichero “cmdline.txt” y lo volvemos a dejar como al inicio sin el parámetro “init“:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Ahora ya podemos volver a poner la tarjeta SD en la Raspberry Pi y podremos volver a tener el sistema Raspbian como si nunca hubiéramos perdido la contraseña.

Recordad que esto ha sido posible gracias a tener acceso físico al hardware que ejecuta el software. El nivel físico siempre es el nivel más débil a nivel técnico y de infraestructura, por eso en Seguridad Informática hay que cuidar no sólo a quién damos acceso mediante credenciales, sino también quién tiene acceso físicamente al hardware donde se corre el software.

Añadir fecha y hora al nombre de un archivo en la consola de comandos de Windows

Habitualmente suelo trabajar con la consola de comandos de Windows y con scripts .BAT. Una de las tareas mas habituales es generar outputs en forma de fichero y una buena práctica suele ser añadir al nombre del fichero la fecha y la hora.

Una forma sencilla de mostrar la fecha en la consola de comandos de Windows es poner el siguiente comando:

echo %date%

Y la forma de mostrar la hora es:

echo %time%

Sabiendo esto podemos pasar al siguiente paso para poder añadirlo al nombre de un fichero. Como has podido observar al obtener la fecha, la obtenemos con el signo “/” intercalado entre el día, mes y año. Del mismo modo la hora aparece separada por el signo “:” , para separar las horas, los minutos y los segundos. Además la parte de los segundo viene con “,” para marcar los decimales para las décimas de segundo. Los tres símbolos citados, no están permitidos a la hora de incluirlos en un nombre de un fichero en Windows, por lo que procedemos a quitarlos de la siguiente manera:

echo MyFile_%date:~-4,4%-%date:~-7,2%-%date:~-10,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%.txt

Si analizamos el código, lo que se hace es una concatenación de valores que se imprimen como nombre. La fecha se le da la vuelta porque a la hora de ordenar por nombre, a nombres iguales se puede ordenar por años con una simple ordenación por orden alfabético. En el caso de la hora no es necesario darle la vuelta.

Para cada variable date o time se cogen los caracteres que nos interesan de la siguiente forma:

%variable:~startIndex,numChars%

startIndex determina la posición desde la que se empiezan a coger los caracteres dentro de la variable. El índice empieza en 0 y también puede ser negativo el índice, indicando la posición de inicio desde el final de la variable.

numChars determina el número de caracteres que se van a coger desde el startIndex fijado.

cmd-win-append-date-time

De esta forma y extrapolándolo  a otros comando, es posible añadir fecha y hora, sólo fecha o solo hora al nombre de un fichero de un output de un comando.

Lanzar procesos en la consola de comandos de Windows

Si sueles realizar scripts .BAT para el intérprete de la consola de comandos de Windows, te habrás encontrado seguramente en la necesidad de lanzar procesos. Dependiendo de las necesidades que tengamos a la hora de lanzar esos procesos, diferenciaremos entre la necesidad de mantener orden de ejecución secuencial o que sea en paralelo. Léase también que cuando hablamos de un proceso podemos referirnos tanto a un ejecutable como a otro script.

Los dos comandos más habituales para lanzar procesos, son el comando CALL y el comando START. El comando START puede que sea mas flexible que el CALL cuando hablamos de  lanzar procesos, ya que puede sustituirlo en la mayoría de los casos.

El comando CALL se usa para llamar a un proceso, saltando la ejecución al proceso que se llama y ejecutándolo hasta el final. Mientras se ejecuta el proceso invocado con el CALL, la ejecución principal desde donde se invoca al proceso, queda bloqueada y sólo es reanuda cuando se termina la ejecución del proceso invocado.

Por otro lado, el comando START llama a un proceso y lo lanza en una ventana nueva (como comportamiento por defecto). Desde el momento que se invoca el proceso, éste se ejecuta en paralelo con la ejecución principal. A efectos prácticos conseguimos ejecutar en paralelo la ejecución principal con la del proceso.

Para que quede un poco más claro, puedes probar la diferencia entre ambos con el siguiente código en el que primero se ejecuta un CALL al comando ping, luego se hace lo mismo usando START sin lanzar nueva ventana y por último usando START creando nueva ventana y esperando a que termine su ejecución.

@ECHO OFF

ECHO Execution using CALL
ECHO -------------------------------------------
ECHO Main execution running...
ECHO Calling to ping...

call ping google.es
ECHO.
ECHO Continue main execution
TIMEOUT 5 > NUL
ECHO Main execution finished!
PAUSE

cls

ECHO Execution using START
ECHO -------------------------------------------
ECHO Main execution running...
ECHO Calling to ping...

start /b ping google.es
ECHO.
ECHO Continue main execution
TIMEOUT 5 > NUL
ECHO Main execution finished!
PAUSE

cls

ECHO Execution using START with waiting
ECHO -------------------------------------------
ECHO Main execution running...
ECHO Calling to ping...

start /w ping google.es
ECHO.
ECHO Continue main execution
TIMEOUT 5 > NUL
ECHO Main execution finished!
PAUSE

El primer y el tercer ejemplo son ejecuciones secuenciales, mientras que en el segundo cuando se lanza el proceso, éste se ejecuta en paralelo con la ejecución principal.

Como esto lo mejor es probarlo para poder verlo, os animo a copiarlo en un archivo de texto y renombrar la extensión a .BAT para poder ejecutarlo con doble click. Así lo podréis ejecutar tantas veces como os haga falta.

También tenéis disponible el script en Github:

test_call-VS-start.bat

Copy-Pega en la consola de comandos de Windows

La consola de comandos es una herramienta básica para todo aquel que trabaja en algún ámbito de la informática y es la forma menos recargada y rápida para ejecutar ciertas acciones en un sistema.

En el caso de Windows su interprete de comandos CMD, a veces resulta un poco engorroso cuando queremos recoger un resultado, y es que la consola no nos permite hacer algo tan simple como seleccionar y copiar. Algo a lo que todos nos hemos acostumbrado…

Existe la posibilidad de redirigir la salida usando “>” “>>” dependiendo si queremos sobrescribir el fichero o añadir información al final del mismo. Un ejemplo:

ping 127.0.0.1 > Log.txt
ping google.es >> Log.txt

Esta opción no resulta práctica cuando lo que queremos es conseguir de manera rápida la salida de un comando, para por ejemplo copiarla y pegarla en otro sitio sin pasar por un fichero.

A tal efecto puedes usar junto a un comando la siguiente pipeline:

 ping 127.0.0.1 | clip

De esta forma el output del comando queda guardado en el portapapeles de Windows y podrás pegarlo en cualquier sitio con la acción contextual “Pegar” del botón secundario del ratón o usando CTRL + V.