Laboratorio de Hacking (II): Portal cautivo Zsun Wifi Card Reader (2ª parte)

Vamos con la segunda parte del artículo sobre el portal cautivo Zsun Wifi Card Reader (ver 1ªparte).

Necesitamos que nuestra aplicación PHP sea la fachada de nuestra red Wifi pero también necesitamos acceder a OpenWRT para administrarlo debidamente. Esto podemos hacerlo si ejecutamos LuCI (la interfaz web de OpenWRT) en un puerto alternativo. Instalaremos Lighttpd y PHP para alojar nuestro portal, y moveremos uHTTP y LuCI en el puerto 8080. Hay que comentar que Lighttpd es capaz de manejar certificados SSL y reescrituras de URL para que podamos configurar nuestro portal cautivo.

Instalación de PHP

De acuerdo con https://wiki.openwrt.org/doc/uci/uhttpd y aprovechando que tenenos conexión a Internet en nuestro OpenWRT, tenemos que:

  • Conectarnos por SSH a OpenWRT y hacer log como root
  • Instalar los paquetes con “opkg install php5” y “opkg install php5-cgi”

Puedes hacer un  chequeo “Hello World” con uhttpd para asegurarte de que PHP funciona correctamente de la siguiente manera:

  1. En el archivo de configuración uHTTPd, agrega o elimina el comentario:
    list interpreter ".php = /usr/bin/php-cgi"
  2. Configura un archivo PHP básico de hello world en /www/yourphp/
  3. Ve a http://192.168.1.1/yourphp/file.php

Recuerda que si has cambiado la IP de OpenWRT tendrás que cambiar 192.168.1.1 por la que tú hayas puesto.

Ahora aislaremos la interfaz LuCI de Lighttpd y pondremos en funcionamiento un sitio web desde la tarjeta microSD.

Para cambiar uhttpd al puerto 8080, en /etc/config/uhttpd en “config uhttpd ‘main’”, actualice la siguiente línea:

list listen_http '0.0.0.0:8080'

Reiniciaremos y ahora LuCI estará alojado en 192.168.x.x: 8080

  1. Ejecutar: opkg update
  2. Ejecutar: opkg install lighttpd

Si obtienes “cat: can’t open ‘/etc/lighttpd/conf.d/*.conf’: No such file or directory” no te preocupes, solo está intentando cargar configuraciones para plugins de lighttpd pero no existen todavía.

Ahora configuraremos lighttpd para ejecutarse desde el puerto 80 desde la tarjeta microSD:

  1. Ejecuta: “opkg install lighttpd-mod-cgi”
  2. Ejecuta: “mkdir /mnt/sda1/www” para crear un directorio www en la tarjeta
  3. Pega el Hello World que creamos anteriormente “index.html” en /mnt/sda1/www para comprobar que lighttpd se está ejecutando.
  4. Ejecuta: “mkdir /mnt/sda1/logs” para crear un directorio donde iremos guardando los logs en la tarjeta
  5. Ejecuta: “mkdir /mnt/sda1/logs/lighttpd”

Toca configurar lighttpd para escuchar en el puerto 80 con raíz en el directorio /mnt/sda1/www. Haz esto editando /etc/lighttpd/lighttpd.conf con:

server.document-root = "/mnt/sda1/www"

Levanta Lighttpd en el arranque con “/etc/init.d/lighttpd enable”, reinicia el Zsun, conéctate a 192.168.1.1 o la IP que hubieras configurado y deberías tener un ‘Hello World’.

Configuraremos ahora PHP para ejecutarse desde Lighttpd.

En /etc/lighttpd/lighttpd.conf habilitaremos una directiva para archivos con la extensión .php

cgi.assign = ( ".php" => "/usr/bin/php-cgi" )

Agrega index.php a los nombres de archivo predeterminados, si aún no está configurado:

index-file.names = ( "index.html", "default.html", "index.htm", "default.htm", "index.php" )

Reinicia lighttpd con:

/etc/init.d/lighttpd restart

Si obtenemos este error: “Error: ‘Duplicate config variable’” significa que hay otra variable cgi-assign en otro fichero de configuración. Mira en /etc/lighttpd/conf.d/ a ver si algún archivo de configuración ya contiene esa variable. Para arreglar esto simplemente puedes agregar “”.php” => “/usr/bin/php-cgi””, no olvides quitar la variable conflictiva de nuestro archivo de lighttpd.conf

Finalmente, para que PHP funcione desde la tarjeta MicroSD, hay que comentar:

'doc_root' en /etc/php.ini, así:; doc_root = "/ www"

De lo contrario, php solo intentará ejecutar scripts en la carpeta /www

Configurar un portal cautivo HTTPS seguro

El objetivo es tener un portal cautivo seguro, y para que sea seguro necesitamos configurar un certificado SSL para un nombre de dominio en el que todos sean redirigidos.

Esto suena extraño, pero puede ser útil por una serie de razones. Deshace la advertencia de seguridad SSL de la mayoría de los navegadores. Si ZSun está desconectado y no hay acceso a Internet, nuestro portal nos permite “suplantar” un sitio web real, o mostrar una versión diferente del mismo.

Otra cosa útil es que permite a los usuarios marcar páginas en el portal que pueden corresponder a páginas reales una vez que obtienen acceso a Internet. También permite que nuestro portal funcione bajo HTTPS, lo que permite que WebRTC (webcams) funcione en ciertos navegadores, como Chrome.

Para ello necesitamos instalar el certificado SSL en lighttpd y configurar HTTPS

Partiendo de https://wiki.openwrt.org/doc/howto/owncloud#get_ssl_optional, cargaremos el certificado en el Router y daremos los siguientes permisos

	chmod 0600 /etc/lighttpd/ssl/midominio
	chmod 0600 /etc/lighttpd/ssl/midominio/certificate.pem

Los añadimos a etc/lighttpd/lighttpd.conf

Habilita SSL en el puerto 443 para HTTPS

Tienes que cargar el certificado y los certificados de la autoridad de certificación en una carpeta en el ZSun. Para una fácil administración recomiendo crear la carpeta y subirlos a /etc/lighttpd/ssl/[midominio]/, reemplaza [midominio] con el nombre de dominio para el que está firmado el certificado SSL.

Ahora añadiremos a nuestro /etc/lighttpd/lighttpd.conf:

Reemplaza [micertificado].pem con el nombre del archivo de certificado (pem) que contiene tanto la clave pública como la privada. Si tiene un montón de archivos .pem, es más probable que sea el que tiene dos entradas. Si tiene archivos de clave privados y públicos separados, puede cortar y pegar los dos juntos en un archivo.

Si tienes que incluir la cadena completa en la Autoridad de certificación (CA), simplemente elimine el comentario de la segunda línea del archivo ssl.ca y reemplace [micertificadoCA] con el nombre del certificado de tu Autoridad de certificación.

Ejecuta la siguiente línea para reiniciar Lighttpd

/etc/init.d/lighttpd restart

Puede que aparezca el error: “can’t resolve symbol ‘EC_KEY_new_by_curve_name‘”. Este error pasa por una función faltante, probablemente causada por tener una versión desactualizada de libopenssl.

Ejecutando lo siguiente debería desaparecer el error.

opkg update libopenssl

Reenrutado de solicitudes DNS a la IP de nuestro servidor Web

Para permitir esto, tenemos que configurar dnsmasq añadiendo unas entradas al archivo de configuracion /etc/dnsmasq.conf:

	address=/#/[DireccionIPDeTuOpenWRT]
	local-ttl=0

Reemplaza [DireccionIPDeTuOpenWRT] por la dirección del OpenWRT (normalmente 192.168.1.1 a no ser que se la hayas cambiado)

Nota: La línea “local-ttl=0” garantiza que el tiempo de vida de la reescritura de DNS sea cero, lo que garantiza que no se retenga ninguno de los registros redirigidos. Esto evitará el envenenamiento DNS, que es bastante molesto.

Para reiniciar lighttpd y que los cambios surjan efecto debe ejecutar:

/etc/init.d/lighttpd restart

En este paso toca redirigir todas las solicitudes HTTP a HTTPS, para ello tendremos que instalar mod-redirect con “opkg install lighttpd-mod-redirect” y añadir a /etc/lighttpd/lighttpd.conf esto:

Reiniciaremos lighttpd para que los cambios sean efectivos con:

/etc/init.d/lighttpd restart

Ahora vamos a redirigir dominios externos al nuestro
Añade a /etc/lighttpd/lighttpd.conf:

Asegurate de reemplazar “midominio” y de configurar las expresiones regulares.

Reinicia lighttpd:

/etc/init.d/lighttpd restart

Ahora añadiremos un controlador 404 que redireccione al sitio web principal de nuestro portal modificando /etc/lighttpd/lighthttp.conf añadiendo o modificando:

	server.error-handler-404 = "/" 

Esto asegurará que si recibimos una petición que devuelva un error 404 al cliente, lo redirijamos a nuestro portal.

Reiniciaremos lighttpd para guardar los cambios:

/etc/init.d/lighttpd restart

¡Ya podemos probar (habilitar y deshabilitar) nuestro portal cautivo!

La redirección con dnsmasq solo funcionará cuando el Router no tenga conexión WWAN. Esto se debe a que las solicitudes se enrutan a través de WWAN a un DNS externo. Puedes configurar un bypass usando iptables, pero en realidad lo más fácil es deshabilitar la interfaz inalámbrica ‘wwan’.

Así que, básicamente, puedes activar el portal cautivo deshabilitando la interfaz inalámbrica de “wwan” en /etc/config/wireless comentando todo el bloque “config wifi-iface” que contiene “option network wwan”. Puedes desactivarlo comentándolo #.

Reinicia lighthttpd para que los cambios surtan efecto:

/etc/init.d/lighttpd restart

Para que todo funcione sin problemas añadiremos unas reglas personalizadas a Lighttpd. Para hacer esto ejecutaremos:

opkg install “lighttpd-mod-rewrite

Podrás encontrar algunos ejemplos de reglas aquí.

Reinicia lighttpd

/etc/init.d/lighttpd restart

Para terminar de dejarlo bonito podemos intentar mejorar un poco la ejecución de PHP con archivos pesados como imágenes, en /etc/php.ini modificaremos:

	default_socket_timeout = 180 upload_max_filesize = 20M max_execution_time = 180 	post_max_size = 0 (disabled) max_input_time = -1 (Default disabled) memory_limit = 	32M

La última línea permite que PHP use más memoria en el Zsun.

Este es solo un ejemplo de cómo hacer funcionar una aplicación de portal cautivo utilizando PHP, aunque puedes configurar cualquier plataforma que desees o duplicar algún sitio web existente en Internet o incluso duplicar un portal de administración de un Router, las posibilidades son infinitas.

Comments

  1. elvecinodeabajo says

    BRA-VO. Para 10 eurines que vale el aparato vale la pena probarlo.
    ¡Gracias por la guía!

  2. @elvecinodeabajo: ¡Muchas gracias a ti por leerme! Si te mola todo esto… Stay Tunned, tengo pensadas algunas cosas más para el laboratorio, así que os tocara a los lectores ir guardando pasta ;)

  3. Excelente Guia !!! Muchas gracias por tomarte el tiempo.

  4. @eridanx: Gracias a vosotros por valorar el trabajo y hacer feedback!!!