Como recuperar la contraseña de un Linux o un Windows

Hace ya varios años atrás, en un charla sobre seguridad, el orador empezo con una frase que hoy dia la sigo repitiendo de vez en cuando:
"La seguridad no existe, es solo una sensación"

Esa charla y esa frase vino a mi memoria hace unos días atrás cuando me encontré con un articulo sobre "Kon Boot" que es un BootCD que nos permite ingresar tanto a Linux como a Windows sin saber ninguna de las contraseñas de usuarios.

Este arrancador, en su versión original para Ubuntu, permite modificar parámetros del kernel de Linux al iniciar, en particular donde se define el identificador del usuario (uid) que corre el proceso. Kon-Boot utiliza ese procedimiento para poder saltar el proceso de autenticación y poder ingresar al sistema con un usuario ficticio pero con privilegios de root.

Por lo que se puede leer en el sitio del proyecto, esta aplicación originalmente se desarrollo para Ubuntu, y luego se fue adaptando para las otras distribuciones. Y aunque no funciona en todas las distribuciones , debido a los distintos parches y configuraciones que cada una aporta a su kernel, ya funciona en varias de ellas, e incluso la nueva versión del Kon-Boot ya soporta varias versiones de Microsoft Windows.

Entre las distribuciones de Linux que esta probadas y funcionan se encuetran:
  • Gentoo 2.6.24-gentoo-r5
  • Ubuntu 2.6.24.3-debug
  • Debian 2.6.18-6-6861
  • Fedora 2.6.25.9-76.fc9.i6862
y entre las de MS Windows
  • Windows XP
  • Windows XP SP1
  • Windows XP SP2
  • Windows XP SP3
  • Windows Vista Business SP0
  • Windows Vista Ultimate SP1
  • Windows Vista Ultimate SP0
  • Windows Server 2003 Enterprise
  • Windows Server 2008 Standard SP2 (v.275)
  • Windows 7

Realizando conexions a puertos SSL/TLS

No es muy complicado probar o verificar muchos de los servicios de Internet a mano con un simple Telnet al puerto del servicio. Con esto no solo podemos verificar que el puerto esta abierto y escuchando, sino que en muchos casos es posible simular o realizar a mano el dialogo con servidor.

Pero en el caso que el servicio a probar utilice SSL o TLS, ya no podemos usar Telnet para poder dialogar con el servidor. Pero para ello podemos usar el comando "openssl" en modo cliente. En particular para simular una simple conexion a un puerto que use SSL o TLS podemos usar :
openssl s_client -connect servidor:puerto
Esto iniciara el dialogo SSL con el servidor y nos mostrara el certificado e informacion del mismo, asi tambien como, si no es un certificado auto-firmado, intentara verificarlo. Una vez finalizado el dialogo y la verificacion del certificado, nos mostrara el resumen de la coneccion como el siguiente:
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : AES256-SHA
Session-ID: E9F3218C651A1F59CFA21D997AE63CF80810F70CD9D62F456F98B15E85F71C4D
Session-ID-ctx:
Master-Key: ACCA4FE23EEA8C8FE414C3FAB570C1D51115B685CD6662FB56961604272F0C347A57040FA78DDBF42F35E3B205D4A103
Key-Arg : None
Start Time: 1240453754
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)

Luego de esto, ya tenemos la conexión establecida y podemos ejecutar los comandos a mano para probar el servicio en particular como lo haríamos usando Telnet






Mejoras al History del Bash

Una de las características que le falta al history del bash (por lo menos de mi punto de vista) es poder saber quien y a que hora se ejecutaron los comandos. Para poder solucionar esto existen muchas soluciones, desde agregar keylogers al sistema hasta parchear el mismo fuente del Bash.

Pero los otros dias navegando por un blog encontré una solución que me pareció muy buena y limpia a través del mismo syslog. La idea es agregar en alguno de los scripts de inicio de la sesión de los usuarios una pequeña función que guarda el ultimo comando ejecutado en el syslog a través del comando logger.

En nuestro caso elegimos el archivo /etc/profile y en el le agregamos al final las siguientes lineas:
function history_to_syslog {
declare cmd
cmd=$(fc -ln -0)
logger -p local7.notice -- SESSION = $$, WHO = $(whoami), CMD=$cmd
}

trap history_to_syslog DEBUG

Luego para poder revisar mejor los registros, configuramos el demonio de syslogd para que separe los registros y los guarde en un archivo separado. Para ello agregamos en el /etc/syslog.conf la siguiente linea:
# BASH
local7.* -/var/log/cmdhist.log
Por ahí también es bueno agregar en el logrotate algunas lineas para rotar los logs y evitar que se haga muy grande este archivo. Para ello podemos crear el archivo /etc/logrotate.d/cmdhist y le agregamos las siguientes lineas:
/var/log/cmdhist.log {
daily
rotate 31
compress
missingok
}
y con esto tendremos registrado el día a día de todos los comandos ejecutados en el sistema identificando el usuario, la sesión y la hora en que se ejecuto cada comando.

Lo bueno de esta solución es que le agrega un poco más de seguridad al histórico de los comandos. El bash_history es facil de saltear, si el usuario en algún momento de la sesión ejecutamos el comando:
unset HISTFILE
Con esto, el Bash pierde la configuración de donde tiene que guardar los comandos ejecutados, por lo que al cerrar la sesión no se guardan los comandos ejecutados. La solución de ir guardando los comandos en el syslog, le agrega un poco de seguridad en este aspecto, ya que los comandos se van guardando a medida que se van ejecutando, por lo que hasta los mismos comandos para "borrar las huellas" quedan registrados en el mismo syslog, e inclusive, se puede configurar el demonio del syslog para que guarde los registros en forma remota y de esta forma agregarle un poco mas de seguridad al respecto.