lunes, abril 20, 2009

Truco para ussh

Ya comenté en la entrada anterior que nada en el mundo de la seguridad es infalible, que siempre se puede en última instancia coger los fuentes del programa más seguro del mundo y trastocarlos para que deje de serlo.

Ya enseñamos el otro día cómo modificar los fuentes de openssh-client para saber donde andaba la contraseña, hoy vamos a ver como engañar a una víctima para robarle las contraseñas que use para conectarse a otros servidores mediante ssh. El escenario es el siguiente:

De alguna forma u otra hemos conseguido colarnos en la cuenta de una víctima en el ordenador A. Como sabemos un mínimo "information gathering" miramos el fichero historial de comandos ejecutados por este usuario, en general .bash_history... este fichero es muy cómodo pero también compromete bastante ya que una vez se hayan colado en la cuenta, da muchísima información sobre el usuario víctima, con él podremos circunscribirnos únicamente a los programas que usa (los más comunes), no necesitamos hackear todos los programas del sistema (en principio). Además también podremos ver si se conecta por SSH a otros servers, cuáles son y con qué cuentas... ¡ANDA, ya tenemos cuentas válidas en otros servers!. Ahora podemos empezar un ataque por fuerza bruta o medianamente informado (diccionario, bla bla bla...). Pero eso no es interesante, lo guay es hacer truquillos para sacar esas contraseñas. El que a mi se me ha ocurrido es éste:

1- Ver que versión de ssh usa el sistema "ssh -V"
2- Bajarse los fuentes de esa versión
3- Modificarla como se comentó en el post anterior
4- Compilar nuestro ussh*
5- Esconder ussh dentro de la carpeta de la víctima (podemos ya que tenemos acceso).
6- Ahora hay que conseguir que cuando la víctima esté dentro de su cuenta comprometida ejecute nuestro ussh... Podemos ponerle un mensajito de inicio de que por favor lo haga... esto no dará demasiado resultado y es un poco cantoso, no? xDDDDDDDD. La forma que uso yo es la siguiente:

Modificar .bashrc para engañarle, de forma que la víctima escriba "ssh ...." pero no sea eso lo que se ejecuta. Básicamente vale con algo así:

ssh() {
if [[ -x path_a_ussh ]]; then
path_a_ussh $*
else
path_a_ssh $*
fi
}

Con poner esa pequeña función en .bashrc ya tendremos a la víctimas bastante comprometida y sin que se de demasiada cuenta. Es evidente que nos pueden pillar viendo que hay nuevos ficheros ocultos dentro de su cuenta y que .bashrc ha sido modificado... pero es bastante raro que estas acciones se lleven a cabo.

7- Dale permisos a ussh, si te olvidas no pasa nada porque la función lo contempla con el -x, pero si eres algo más rústico puedes acabar generando un mensaje de error por permisos y que enseña la ruta a ussh.

Simple, no? Con estos pocos pasos podemos sacar las tri-uplas usuario/servidor/contraseña que use la víctima... Yo he visto mucho por ahí usuarios que hacen root@localhost...

Realmente con estos trucos de alias y funciones en .bashrc se puede conseguir muchísimo juego, pero intentar (y lograr) sacar la contraseña de root de un sistema es el más peligroso y límite en mi opinión.



*NOTA: Este paso tiene cierta cosa, no podemos (no siempre) compilar en un ordenador y luego llevarnos el binario creado a otro, ¿por qué? los programas en general usan bibliotecas que están en el sistema, si compilamos en un sistema (con unas bibliotecas) e intentamos ejecutar en otro ordenador (probablemente con otras bibliotecas) aparecerán problemas entre versiones. Puedes bajarte la versión de bibliotecas en el sistema víctima y compilar usando esas versiones o puedes compilar en el sistema víctima... MUCHO OJO, esto último deja ciertos rastros en el sistema víctima, sin ir más lejos lo que hagas se guarda en el fichero .bash_history que antes usamos para sacar información xD... tampoco me gusta porque me puede delatar jejeje... En general es más seguro (para el atacante) realizar el máximo posible de acciones en su sistema y trasladar y/o estar en el sistema víctima sólo lo imprescindible.