Lo hice y lo entendí

El blog de Vicente Navarro
28 feb

Configurando routers domésticos desde la línea de comandos con wget

En ocasiones puede ser útil cambiar alguna configuración de nuestros routers domésticos (ADSL, cable, etc.) desde línea de comandos, de forma que podamos hacer cambios de forma automatizada con scripts.

Por ejemplo, podríamos querer abrir el puerto SSH en el router al detectar un Port Knocking. O podríamos querer abrir un puerto sólo a ciertas horas; o sólo como parte de otra tarea.

También puede ser útil para configurar el WiFi (desactivarlo, activarlo, cambiarle la clave, etc.). En esta entrada vamos a ver, a modo de ejemplo, cómo desactivar o activar el WiFi de varios routers domésticos interaccionando con su interfaz web usando únicamente wget. Un Zyxel P660HW-D1, un Home Station Amper ASL 26555 y un Cisco EPC3825 serán nuestros conejillos de indias.

Los servidores web de los routers domésticos a menudo usan autentificación básica (caso del Zyxel y del Home Station). En otros casos usan cookies para mantener la sesión (caso del Cisco). En ocasiones, la sesión se identifica únicamente con la IP del cliente, de forma que no se permiten accesos concurrentes desde otras IPs (caso del Zyxel). Dichas peticiones pueden hacerse con POSTs (Cisco, Zyxel) o simplemente con parámetros en la URL (Home Station).

La extensión “Live HTTP Headers” para Firefox nos hará muy sencillo ver qué ocurre mientras usamos la web de configuración del router. El wget nos permitirá replicar las mismas operaciones desde línea de comandos.

Zyxel P660HW-D

Comencemos con el Zyxel P660HW-D. Si abrimos el “Live HTTP Headers” mientras probamos a deshabilitar y luego habilitar el WiFi, veremos que usa autentificación básica, que no usa cookies y que envía las peticiones con un POST:

Cabeceras HTTP del Zyxel para deshabilitar el WiFi

Cabeceras HTTP del Zyxel para habilitar el WiFi

Si nos fijamos, la diferencia entre ambas peticiones es ese “EnableWLAN=on” que sólo se usa para activar el WiFi.

Por tanto, sólo necesitamos enviar ese mismo POST con wget usando autentificación básica para desactivar el WiFi:

wget --user=1234 --password=1234 --post-file=post_wifi_off.txt -S -O /dev/null http://192.168.1.1/Forms/WLAN_1

donde el contenido del fichero post_wifi_off.txt es el mismo que hemos visto en el “Live HTTP Headers” tras la línea de Content-Length:

ESSID=WLAN_81&ESSID_HIDE_Selection=00000000&Channel_ID=00000008&WLAN_SaveBtn=Apply

Para activar el WiFi lanzaríamos el mismo comando con un fichero diferente:

wget --user=1234 --password=1234 --post-file=post_wifi_on.txt -S -O /dev/null http://192.168.1.1/Forms/WLAN_1

donde el contenido del fichero post_wifi_on.txt sería esta vez:

EnableWLAN=on&ESSID=WLAN_81&ESSID_HIDE_Selection=00000000&Channel_ID=00000008&WLAN_SaveBtn=Apply

En este router es conveniente cerrar la sesión al finalizar o no será posible conectarse desde otras IPs durante unos minutos:

wget --user=1234 --password=1234 -S -O /dev/null http://192.168.1.1/Logout.html

Home Station Amper ASL 26555

Nota: En este dispositivo, la web de administración completa está en http://192.168.1.1/SETUP/sp_home.htm. La de http://192.168.1.1/ está muy limitada.

Usando el “Live HTTP Headers” mientras accedemos al interfaz web del router para deshabilitar y luego habilitar el WiFi, veremos que este router usa autentificación básica como el Zyxel, pero las peticiones las hace con parámetros en la URL:

Cabeceras HTTP del Home Station para deshabilitar el WiFi

Cabeceras HTTP del Home Station para habilitar el WiFi

Fijémonos esta vez en que aparentemente, según las capturas, la diferencia entre ambas peticiones es el enable=0 vs enable=1; pero además, si exploramos toda la petición, en la de habilitar el WiFi vemos que también aparecen todos los parámetros de la conexión WiFi, como el SSID o la contraseña. En cualquier caso, sólo tenemos que enviar exactamente la misma petición con wget y autentificación básica para deshabilitar/habilitar el WiFi. ¡No puede ser más fácil!

Deshabilitar WiFi:

wget --user=1234 --password=1234 -S -O /dev/null 'http://192.168.1.1/ADVANCED/restartwireless.xgi?save=true&wireless_action=ad_wireless_setup&sssid=0&set/wireless/inf:1/enable=0&CMT=0&EXE=wlan,2'

Habilitar WiFi:

wget --user=1234 --password=1234 -S -O /dev/null 'http://192.168.1.1/ADVANCED/restartwireless.xgi?save=true&wireless_action=ad_wireless_setup&sssid=0&set/wireless/inf:1/wps/enable=1&save=true&set/wireless/inf:1/enable=1&set/wireless/inf:1/ssidhidden=0&set/wireless/inf:1/wmm=1&set/wireless/inf:1/authtype=6&set/wireless/inf:1/wpa/format=1&set/wireless/inf:1/wpa/key=AQUIVALACLAVEWPA&set/wireless/inf:1/wpa/grp_rekey_interval=3600&set/wireless/inf:1/encrypttype=4&CMT=0&EXE=wlan,2'

Cisco EPC3825

Este router ya nos lo pone un poco más difícil, ya que no usa autentificación básica, sino cookies, para mantener la sesión. Aquí vemos cómo hacemos la autentificación con un POST (nótese que se ve el usuario y el password):

Cabeceras HTTP del Cisco al registrarnos

y aquí cómo el servidor web del router nos envía la cookie:

Cabeceras HTTP del Cisco cuando nos envía la cookie

y ahora, ya podemos enviar el POST para deshabilitar el WiFi pero enviando también la cookie que identifica la sesión (fijémonos en el wifi_enable=disable):

Cabeceras HTTP del Cisco al deshabilitar el WiFi

y lo mismo para habilitar el WiFi:

Cabeceras HTTP del Cisco al habilitar el WiFi

Para cerrar la sesión sólo tenemos que solicitar la página de logout enviando la cookie:

Cabeceras HTTP del Cisco al cerrar la sesión

Por tanto, para hacer lo mismo con wget, esta vez no será suficiente con enviar directamente el POST o el GET con autentificación básica, sino que también tendremos que registrarnos, guardar la cookie, enviar el POST que habilita o deshabilita el WiFi añadiendo la cookie a la petición y cerrar la sesión.

Registrarnos:

wget -S -O /dev/null --save-cookies galletita.txt --keep-session-cookies \
--post-file=post_login.txt http://192.168.1.1/goform/Docsis_system

donde post_login.txt es:

username_login=admin&password_login=cisco&LanguageSelect=en&Language_Submit=0&login=Log+In

Deshabilitar el WiFi:

wget -S -O /dev/null --load-cookies galletita.txt --save-cookies galletita.txt --keep-session-cookies \
--post-file=post_wifi_off.txt http://192.168.1.1/goform/Quick_setup

donde post_wifi_off.txt es:

Password=&PasswordReEnter=&setup_wifi_enable=disable&save=Save+Settings&h_setup_wifi_enable=disable&qs_wds_setting=disable&UserId=

Habilitar el WiFi:

wget -S -O /dev/null --load-cookies galletita.txt --save-cookies galletita.txt --keep-session-cookies \
--post-file=post_wifi_on.txt http://192.168.1.1/goform/Quick_setup

donde post_wifi_on.txt es:

Password=&PasswordReEnter=&setup_wifi_enable=enable&ssid=NOMBRE_RED_WIFI&security_mode=psk2_mixed&wpa_enc=tkip%2Baes&wpa_psk_key=**************************&radius_ip_1=0&radius_ip_2=0&radius_ip_3=0&radius_ip_4=0&keysize=64&tx_key=1&save=Save+Settings&h_setup_wifi_enable=enable&h_security_mode=psk2_mixed&h_wpa_enc=tkip%2Baes&qs_wds_setting=disable&UserId=

Cerrar la sesión:

wget -S -O /dev/null --load-cookies galletita.txt http://192.168.1.1/logout.asp

Comentarios finales

En esta entrada hemos visto qué opciones usar con wget para enviar POSTs, para aceptar cookies y mantener la sesión, para usar autentificación básica… Estas herramientas nos permitirían interactuar con un gran número de routers domésticos. Sólo necesitamos ver qué ocurre cuando hacemos las mismas operaciones con un navegador real e intentar replicarlas. La extensión “Live HTTP Headers” de Firefox es muy útil para esto, aunque también podríamos haber usado, por ejemplo, Wireshark para tomar trazas incluso más detalladas.

:wq!

Entradas relacionadas

5 Comentarios a “Configurando routers domésticos desde la línea de comandos con wget”

  • AlBundy dice:

    Hola Vicente:

    ¡fantástico artículo!. Si me permites un comentario, cuando usas cookies en el último caso, utilizas los parámetros “–load-cookies” y “–save-cookies” a la vez.

    En principio, me parecía poco lógico usar ambos argumentos a la vez, pero leyendo a los que saben más que yo, parece un modo de mantener la sesión con el servidor abierta y actualizada.

    ¡Gracias por volver a escribir en tu blog!

  • Robert dice:

    Hola Vicente

    Muy buen articulo, como siempre.

    Indicarte que desde hace unas versiones ya no hace falta el Live HTTP Headers en el Firefox para ver estas cosas, ahora puedes hacerlo desde el Web Console (Ctrl+Shift+K) que está dentro del apartado de Web Developer del Firefox.

    Un saludo.

Trackbacks y pingbacks:

Tema LHYLE09, creado por Vicente Navarro