J’ai chez moi un router wifi faisant uniquement office de borne d’accès wifi. C’est un Netgear N750 (ou DGND4000 pour les intimes) et on ne peut pas dire qu’il soit génial. Sur la porteuse à 2.4GHz, il fait son taff mais sur la porteuse à 5GHz, à moins d’être le nez en face, on a un signal aussi faible qu’inutile. Mais on pourrait dire que c’est du détail tant ça marche, non ?
En effet cette bouse ne fonctionne tout simplement plus au bout d’un moment. Ce moment est assez variable mais l’on peut considérer que c’est une fois par semaine environ. Les symptômes sont qu’on est bien identifié sur l’un des deux réseaux Wifi (celui à 2.4GHz ou l’autre à 5GHz), mais qu’on a rien sur la couche IP. Ayant analysé un peu ce qu’il se passait, je devine que la box, pour une raison qui m’échappe, a sa table d’adresses MAC pleine, ce qui empêche les nouveaux arrivant d’avoir une connectivité IP.
La box Wifi qui lave plus blanc que blanc
Juste pour bien recadrer, c’est le genre de box qui sait tout faire: DHCP, DNS, point d’accès Wifi, firewall, modem ADSL, Wifi « invité », contrôle parental, VPN et même NAS en lui collant un disque en USB.
Sur toute cette panoplie de fonctionnalités, il n’y en a qu’une seule qui m’intéresse et que j’ai donc activé, c’est le point d’accès Wifi. Tu achètes une box spécialisée Wifi, qui ne fait que ça, et elle n’est même pas fichu de faire le taff correctement, c’est vraiment gonflant. D’autant plus que le problème n’est pas matériel, mais bien logiciel, donc solvable par une simple mise à jour du firmware, que j’attends toujours.
A côté, mon routeur/firewall/proxy/dhcp/dns/dpi full open-source (oui, même le BIOS est open-source) Linux se porte comme un charme, lui…
Fuck you Netgear !
Le plombier à la rescousse
Pour restaurer le wifi, il y a deux solutions :
- le reset (éteindre/allumer, pas une remise en usine avec clear de la mémoire hein)
- la reconfiguration du wifi via les pages d’admin que j’ai trouvé un peu par hasard
La première solution étant un peu difficile à automatiser, je me suis concentré sur la seconde pour cracher un script que je ferais exécuter par cron par mon routeur disons… toutes les heures.
Pour se faire, rien de plus simple. J’ai analysé un peu comment était foutu le formulaire HTML.
C’est un formulaire tout bidon, sur lequel on a cependant un petit token servant de anti-forgery sur l’action du formulaire.
Pour rappel, un anti-forgery token sert à empêcher de rejouer un formulaire, et donc de pouvoir modifier la configuration du routeur au travers d’une attaque de type XSS par exemple. Cela force à faire la manipulation de manière interactive (du moins en théorie XD…)
Le script devra donc envoyer non pas un appel au routeur mais deux :
- le premier appel sert à afficher la page et ainsi pouvoir récupérer le token (lequel dépend du temps)
- le second appel est le POST pour reconfigurer le wifi, et il incorporera le token obtenu précédemment
Le navigateur du moment est Chrome, et celui-ci permet de récupérer tous les appels effectués sous la forme de commande curl, ce qui est bien pratique pour notre cas et ce qui explique pourquoi il y a tout un tas d’en-têtes HTTP totalement inutiles. J’ai donc fait générer ces commandes par Chrome puis adapté légèrement là où il fallait.
Note: ce script ne peut pas marcher chez vous tel quel, car il appliquera ma configuration. Vous devez modifier l’argument –data dans le script.
Note 2: il faudra vous arranger pour que ce script s’exécute régulièrement. Tout le monde n’a pas de routeur custom comme moi, mais il existe plein d’autre solutions, les tâches planifiées de Windows par exemple.
#!/bin/bash ip=192.168.3.3 user=admin pass=password auth=$( echo -n "${user}:${pass}" | base64 ) TOKEN=$( curl "http://$ip/setup.cgi?next_file=WLG_wireless_2.htm" \ -H "Authorization: Basic $auth" \ -H 'DNT: 1' -H 'Accept-Encoding: gzip, deflate, sdch' \ -H 'Accept-Language: en,en-US;q=0.8,fr-FR;q=0.6,fr;q=0.4' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \ -H 'Cache-Control: max-age=0' \ -H "Referer: http://$ip/WLG_wireless_2.htm&todo=cfg_init" \ -H 'Connection: keep-alive' \ --compressed 2> /dev/null | grep action= | gawk 'match($0, /setup\.cgi\?id\=([0-9a-f]{8})"/, ary) { print ary[1] }' ) curl "http://$ip/setup.cgi?id=$TOKEN" \ -H "Origin: http://$ip" \ -H 'Accept-Encoding: gzip, deflate' \ -H 'Accept-Language: en,en-US;q=0.8,fr-FR;q=0.6,fr;q=0.4' \ -H 'Upgrade-Insecure-Requests: 1' \ -H "Authorization: Basic $auth" \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36' \ -H 'Cache-Control: max-age=0' \ -H "Referer: http://$ip/WLG_wireless_2.htm&todo=cfg_init" \ -H 'Connection: keep-alive' \ -H 'DNT: 1' \ --data 'h_WRegion=Europe&h_ssid_class=primary&tempSetting=0&tempRegion=11&setRegion=11&h_wds_enable=disable&h_wds_enable_an=disable&only_mode=0&show_wps_alert=0&h_enable_ap=enable&h_enable_ap_an=enable&h_ssid_bc=&h_ssid_bc_an=&h_allow_access=disable&h_allow_access_an=disable&h_wire_iso=&h_wire_iso_an=&ssid=Kveer-2G&ssid_an=Kveer-5G&h_w_channel=8&h_w_channel_an=36&h_opmode=300&h_opmode_an=300&h_security_type=WPA2-PSK&h_security_type_an=WPA2-PSK&h_wepenc=0&h_wepenc_an=0&h_wpae_mode=3&h_wpae_mode_an=3&radius_rekey_secs=3600&radius_rekey_secs_an=3600&radiusServer=&radiusServer_an=&textWpaeRadiusPort=1812&textWpaeRadiusPort_an=1812&textWpaeRadiusSecret=&textWpaeRadiusSecret_an=&KEY1=&KEY1_an=&KEY2=&KEY2_an=&KEY3=&KEY3_an=&KEY4=&KEY4_an=&h_wep_key_no=1&h_wep_key_no_an=1&h_authAlgm=3&h_authAlgm_an=3&passphrase=tralala&passphrase_an=tralala&h_ssidSelect=1&h_ssidSelect_an=1&todo=save&load_2g_frame=WLG_2g_wireless2.htm&load_5g_frame=WLG_5g_wireless2.htm&this_file=WLG_wireless_2.htm&next_file=WLG_wireless_2.htm&SID=&Apply=Apply&WRegion=Europe' \ --compressed
Récupérer son –data
Je suis gentil, je vais vous montrer comment adapter ce script à votre sauce. Mais vous vous démerdez pour le faire exécuter.
- On commence donc avec Chrome et l’on va sur la page d’accueil du routeur.
- On ouvre ensuite les outils de développements avec la touche F12, puis on se rend sur l’onglet Network.
- Dans l’onglet Network des Developer Tools, on clique sur Network, puis on coche Preserve log et All.
- Sur la page web, on clique sur Apply.
- De retour dans l’onglet Network, il doit y avoir une ligne, la première normalement, intitulée setup.cgi?id=… et ça doit être le seul de type x-www-form-urlencoded.
- On fait alors un clic droit puis Copy as cURL (bash) et voilà comment obtenir le second curl du script avec les –data de votre wifi.