Sobre cómo obtener la contraseña de root usando .bash_history.
Una de las formas más simples de averiguar la contraseña de root es buscar en los ficheros de histórico de comandos. No siempre funciona, pero cuando lo hace es realmente divertido.
En una auditoría de
seguridad web en formato "caja negra" en la que he trabajado
ultimamente pude obtener la contraseña de root de esta manera.
En la auditoría en cuestión, utilizando una vulnerabilidad de la aplicación, pude subir un JSP que me permitía ejecutar comandos en el sistema. El servicio JBoss corría con el usuario jboss por lo que el siguiente paso era intentar ser root. Y lo conseguí utilizando la contraseña que encontré en el fichero /home/jboss/.bash_history. El siguiente paso fué conseguir un shell como root utilizando un tunel inverso SSH (pero eso lo contare en otro artículo).
¿Por qué estaba la constraseña de root en /home/jboss/.bash_history?
Si está activado, el histórico de comando registra todos los comandos introducidos en el shell, esto incluye también todos los comandos que se teclean incorrectamente. Durante la instalación de cualquier servicio es habitual que, para instalar y configurar cosas, el administrador del sistema inicie sesión con el usuario que se utilizará para ejecutar dicho servicio, por ejemplo jboss. Algunas veces es necesario ejecutar comandos como root, por lo que se suele utilizar el comando su. El problema está en que si vamos con prisas y nos nos fijamos en la pantalla podemos teclear más de la cuenta.
Por ejemplo, Pepito que es administrador de un servidor en el que corre JBoss, va con prisas porque tiene que reiniciar unos servicios para aplicar una actualización que le han enviado el viernes a ultima hora (¿os suena?). Inicia sesión como jboss y posteriormente quiere cambiar a root por lo que utiliza el comando su y teclea la contraseña de root rapidamente y sin mirar la pantalla. Lo que no sabía es que en lugar de su escribió si, por lo que el shell mostró un error y no pidió ninguna contraseña. La contraseña introducida por Pepito se interpreto como otro comando, que tampoco existía pero que quedó registrado en el histórico de comandos de esta forma:
"
si
Mi$ecret0
"
Cuando Pepito mira la pantalla y ve el error vuelve a ejecutar su, esta vez con más cuidado y sigue con sus tareas. En lo que no pensó es que la contraseña introducida cuando no tocaba quedó registrada en el histórico de comandos... Más tarde llegó el hacker (yo) y la encontró.
La contraseña de root es lo más apetitoso que se puede encontrar en el histórico de comandos, pero otro tipo de información tampoco es desdeñable (parámetros de comandos, direcciones ip, etc).
Moraleja: desactiva el histórico de comandos. En la mayoría de shells aunque desactives el histórico de comandos tendrás el histórico de los comandos introducidos durante la sesión en curso, que por otro lado suele ser más que suficiente.
Para desactivar esto en Bash se puede añadir la siguiente línea al fichero ~/.bashrc.
unset HISTFILE

