Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/10/2008, à 17:23

Dr4gOoN

[Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Bonjour,

Je souhaiterais me connecter en ligne de commande à l'interface hotspot de neuf (https://hotspot.neuf.fr/), qui necessite, d'entrer un user, mot de pass, de cocher un checkbox, et de valider l'ensemble.

J'ai tenté un :

wget "https://hotspot.neuf.fr/" --no-check-certificate --post-data="username=[b]user[/b]&password=[b]pass[/b]&cond=1"

mais, rien n'y fait, et je crois savoir pourquoi.

D'une part, ce n'est pas les seuls variable envoyé dans le POST (plusieurs champs hidden).
=> Peut-être faut il spécifier TOUS les champs dans mon --post-data ?

D'une autre part, il y a une full-titude de javascript derriere la connexion, dont 1 generation pseudo-aléatoire d'un pass "challenge" de type "9ed8ef1c67ec8931fbcdce2a48dcc93c"
=> Comment le prendre en compte, ou le générer ?

Merci d'avance !

Dernière modification par Dr4gOoN (Le 26/10/2008, à 21:19)

Hors ligne

#2 Le 24/10/2008, à 17:46

chcamier

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Bonjour,

Apparemment, tu essaie de rejouer une connexion en utilisant wget pour t'éviter de devoir manuellement t'identifier pour l'accès. Hors, le pseudo-aléatoire "challenge" est justement utilisé pour empêcher la rejouabilité de la connexion. C'est l'une des base pour la création de système d'identification sécurisé ad minima.

CC

Hors ligne

#3 Le 24/10/2008, à 17:49

Dr4gOoN

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Jusqu'à preuve du contraire, d'après les conditions d'usage, rien ne me l'interdit ...

Hors ligne

#4 Le 24/10/2008, à 18:20

chcamier

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Le problème n'est pas juridique mais technique. Si tu désires jouer une connexion complète, il faut que tu charges la première page, remplisse les champs utilisateur et mot de passe puis, après avoir fait tourné les routines en javascript, que tu retourne, en mode POST, le résultat au serveur.

Ce qui dépasse grandement les capacités d'un simple wget et nécessite un développement lours, embarquant un interpréteur javascript.

CC

Hors ligne

#5 Le 24/10/2008, à 18:39

Dr4gOoN

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

je suis près a me lancer dans l'interpréteur javascript, mais ne serait il pas possible d'executer le javascript récupéré sur le serveur, en local, le faire tourner, et renvoyer le tout dans la page de connexion ?

Hors ligne

#6 Le 24/10/2008, à 18:46

Link31

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

chcamier a écrit :

Ce qui dépasse grandement les capacités d'un simple wget et nécessite un développement lours, embarquant un interpréteur javascript.

Non, pas forcément lourd.

Déjà, la première moitié du gros tas de code js de cette page n'est qu'une implémentation de md5, donc on peut faire la même chose avec la commande md5sum en console.

Je n'ai pas cherché à comprendre la deuxième moitié, mais je suppose qu'elle ne fait qu'appeler l'algorithme md5 pour remplir le champ challenge, ou pour crypter le mot de passe lui-même en md5 avant de l'envoyer.

Et, si vraiment c'est nécessaire, il existe un interpréteur Javascript en ligne de commande (donc facilement utilisable depuis un script), dans le paquet spidermonkey.

Hors ligne

#7 Le 24/10/2008, à 18:52

chcamier

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Le MD5, c'est pour le code embarqué directement dans la page. Mais je n'ai pas dépouillé tout le code, qui est, il faut le dire, arrangé pour être imbitable.
Quoi qu'il en soit, si ce n'est pas le développement, c'est l'étude rétro de la dynamique d'authentification qui risque d'être coton. Pas tant au niveau théorique, mais dans l'opacité appliquée dans le code.

Hors ligne

#8 Le 24/10/2008, à 19:07

Dr4gOoN

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

(je me suis tappé la ré-indentation de la source de la page d'accueil, si jamais ca interesse quelqu'un pour la compréhension ...)

J'aurais bien voulu savoir comment (et OU °o°) est geré ce pass challenge :s

pour le md5, md5sun devrait (??) faire l'affaire, mais, de quel facon ?


Et dans l'idée qu'au clavier, un simple "user[tab]pass[tab][space][tab][tab][enter]" sur la page me connecte, ne serait-il pas possible de faire ca via lynx par exemple ? (une autre idée d'orientation peut etre ???)

Hors ligne

#9 Le 24/10/2008, à 19:28

Link31

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

echo -n "texte" | md5sum

Elinks est le seul navigateur en mode texte à gérer le JS correctement (avec SpiderMonkey, justement). Seulement je ne sais pas comment lui passer des valeurs de formulaire. Si tu y arrives, ça pourrait être une solution.

Hors ligne

#10 Le 24/10/2008, à 19:39

chcamier

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

J'ai effectué la même chose. Je n'ai pas encore trouvé.
Le formulaire visible est un formulaire nommé "pc". L'action est associée au bouton connexion et est l'appel de la méthode "dosubmit" de l'objet contrôleur. Cette méthode est un alias de "ai" qui remplie le formulaire caché "portal"
Remplissage du formulaire caché "portal".
Pour le reste, le code est très alambiqué et assez indigeste. Apparemment, le mot de passe est un encodage en base 64 du MD5 du mot de passe entré. Il va falloir tracer le code Javascript pour comprendre ce qu'il fait.

Hors ligne

#11 Le 25/10/2008, à 10:21

bougie

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Ce sujet m'intéresse smile

Effectivement le probleme c'est la première page.
Actuellement j'essaye de passer les variables qu'il faut à nb'_crypt.php, mais cela ne marche pas, il me met que mes identifiants ne marchent pas.
Pour ceux qui veulent, voila mon code. Son but est de le mettre dans une boucle pour me reidentifier automatiquement lors d'une déconnexion :

<?php
$neufId = '';
$neufMdp = '';

$service_port = getservbyname('www' , 'tcp');
$adresse = gethostbyname('www.google.fr');

$reception = '';
$tout = '';
$toutt = '';

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)
   echo "socket_create() a echoue : raison : ".socket_strerror($socket)."<br />";
else
{
	$resultat = socket_connect($socket, $adresse, $service_port);
	if ($resultat < 0)
	   echo "socket_connect() a echoue : raison : (".$result.")".socket_strerror($result)."<br />";
	else 
	{
		$envoi = "HEAD / HTTP/1.0\r\n\r\n";
		$envoi .= "Host: www.google.com\r\n";
		$envoi .= "Connection: Close\r\n\r\n";
		
		socket_write($socket, $envoi, strlen($envoi));
		while ($reception = socket_read($socket, 512))
			$tout .= $reception;
		$toutt = explode("\n", $tout);
		
		socket_close($socket);
		
		if(preg_match("#Location: https://hotspot.neuf.fr/#", $toutt[1]))
		{
			$location = str_replace("Location: ", "", $toutt[1]);
			$location = str_replace("\n", "", $location);

			$useragent = "Mozilla/5.0";
			$referer = $location;
			$ch = curl_init($location);
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
			curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
			curl_setopt($ch, CURLOPT_REFERER, $referer);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
			curl_setopt($ch, CURLOPT_PORT, 443);
			$tout  = curl_exec($ch);
			curl_close($ch);
			
			preg_match('!<input type="hidden" name="userurl" value="(.+)" />!', $tout, $match);
			$userurl = $match[1];
			
			preg_match('!<input type="hidden" name="challenge" value="(.+)" />!', $tout, $match);
			$challenge = $match[1];
			
			system('curl -F "username='.$neufId.'&password='.$neufMdp.'&lang=fr&ARCHI=&accessType=neuf&userurl='.$userurl.'&nb4=https://hotspot.neuf.fr/nb4_crypt.php&challenge='.$challenge.'" https://hotspot.neuf.fr/nb4_crypt.php > '.dirname(__FILE__).'/redirect.html');
			
			$ch = curl_init("http://localhost/redirect.html");
			curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
			curl_setopt($ch, CURLOPT_REFERER, "http://localhost/redirect.html");
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			$return = curl_exec($ch);
			curl_close($ch);
			
			preg_match('!<meta http-equiv="refresh" content="0;URL=(.+)" />!', $return, $match);
			$newUrl = $match[1];
			
			$ch = curl_init($newUrl);
			curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
			curl_setopt($ch, CURLOPT_REFERER, $newUrl);
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			echo curl_exec($ch);
			curl_close($ch);
		}
	}
}
?>

Malheureusement, la page retournée, c'est la page de login avec comme message en haut "votre identifiant ou votre mot de pass est incorrect"


Avant d'essayer ça, j'avais reussi à faire un truc qui marchait bien, mais il fallait un navigateur.
En gros, je récupéré la page de login, je remplissais les champs avec php, et je rajoutais un "ctrl.dosubmit()" dans le onload du body. Donc quand je chargeais la page dans un navigateur, tout ce faisait automatiquement.
Le seul probleme, c'est quand mode texte, les navigateurs n'ont pas d'interpréteur de JS (Sauf en lisant plus haut, elinks permeterait de faire ce qu'il faut, à tester sad
Voici mon ancien code :

<?php
$neufId = '';
$neufMdp = '';

$service_port = getservbyname('www' , 'tcp');
$adresse = gethostbyname('www.google.fr');

$reception = '';
$tout = '';
$toutt = '';

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)
echo "socket_create() a echoue : raison : ".socket_strerror($socket)."<br />";
else
{
$resultat = socket_connect($socket, $adresse, $service_port);
if ($resultat < 0)
echo "socket_connect() a echoue : raison : (".$result."mdss[{;)}]".socket_strerror($result)."<br />";
else
{
$envoi = "HEAD / HTTP/1.0rnrn";
$envoi .= "Host: www.google.comrn";
$envoi .= "Connection: Closernrn";

socket_write($socket, $envoi, strlen($envoi));
while ($reception = socket_read($socket, 512))
$tout .= $reception;
$toutt = explode("n", $tout);

socket_close($socket);

if(preg_match("#Location: https://hotspot.neuf.fr/#", $toutt[1]))
{
$location = str_replace("Location: ", "", $toutt[1]);
$location = str_replace("n", "", $location);

$useragent = "Mozilla/5.0";
$referer = $location;
$ch = curl_init($location);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_PORT, 443);
$tout = curl_exec($ch);
curl_close($ch);

$fo = fopen(dirname(__FILE__).'/connecHotspot.html', 'w+');

$tout = str_replace('<body onload="ctrl.init()">', '<body onload="ctrl.init(); return ctrl.dosubmit()">', $tout);
$tout = str_replace('<input name="username" type="text" size="8" style="margin-right:40px" title="Veuillez saisir ici votre Neuf ID et votre mot de passe" />', '<input name="username" type="text" size="8" style="margin-right:40px" value="'.$neufId.'" />', $tout);
$tout = str_replace('<input name="password" type="password" size="8" title="Veuillez saisir ici votre Neuf ID et votre mot de passe" />', '<input name="password" type="password" size="8" value="'.$neufMdp.'" />', $tout);
$tout = str_replace('<input id="cond" name="cond" type="checkbox" />', '<input id="cond" name="cond" type="checkbox" checked="checked" />', $tout);

fwrite($fo, $tout);
fclose($fo);

//Faut wget avec le support ssl
system('wget '.dirname(__FILE__).'/connecHotspot.html');
}
}
}
?>

(désolé de l'indentation, mais c'est un copié collé d'une forum ou je l'avais posté car je ne l'ai plus sur mon HDD wink)


Je suis donc actuellement dans une impasse. Je voit que deux solutions possibles :
- utiliser un navigateur en mode texte qui gere correctement le JS et le HTTPS
- se plonger dans le code de chillispot (je crois qu'il est opensource)


Si certains ont d'autres idées wink

Dernière modification par bougie (Le 25/10/2008, à 10:37)

Hors ligne

#12 Le 25/10/2008, à 10:32

Dr4gOoN

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

il me semble qu'en plus du code source, il y a aussi certains fichiers dans un repertoire /js/ mais comme tu l'as dit, les différentes fonctions sont écrit assez dégeulassement.

'Pas ENCORE trouvé" signifie que tu comptes re-chercher par hasard ?

EDIT :

bougie a écrit :

Ce sujet m'intéresse smile

Effectivement le probleme c'est la première page.
Actuellement j'essaye de passer les variables qu'il faut à nb'_crypt.php, mais cela ne marche pas, il me met que mes identifiants ne marchent pas.

Merci de ta participation, d'après les commentaires un peu plus haut, elinks pourait repondre à nos problème d'interpreteur JS.

Par contre, as tu un login/pass valide pour tester ?
(et comment test tu la reconnexion, une fois deja effectué ?)

Dernière modification par Dr4gOoN (Le 25/10/2008, à 10:35)

Hors ligne

#13 Le 25/10/2008, à 10:40

bougie

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Hum, pour le couple login/mdp, vu que ce ne sont déjà pas les miens mais ceux d'un pote, je ne préféré pas les divulguer wink

Oui, je compte bien le faire marcher.

Pour la (re) connexion, le problème ne se pose pas car j'ai pas encore reussi à me connecter une première fois xD

Hors ligne

#14 Le 25/10/2008, à 11:35

bougie

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Je viens de refaire mon premier script, mais sans succes. On dirait que elinks n'aime pas le js de la page.
Rien ne se passe, et lorsque l'on clique sur connexion, ça ne fait absolument rien.

Une idée ?

EDIT: dans la page, y'a un <script ... lien="/js/wreport.js">, c'est peut être ça le problème, sous firefox, y'a pas de problème avec ça, ça marche bien, mais avec elinks, c'est peut être autre chose, non ?

Dernière modification par bougie (Le 25/10/2008, à 11:46)

Hors ligne

#15 Le 26/10/2008, à 21:08

bougie

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Bon, apres de multiples recherches sur le net et gràce à Dr4gOoN, j'ai reussi à fair eun script shell qui marche :

#!/bin/bash

url="https://hotspot.neuf.fr/nb4_crypt.php"
okmatch="licitations"
login="0000000000"
password="cacaproot"

# quel que soit le site visité, on sera redirigé vers le
# portail captif qui génerera un token. L'utilisation du switch
# -L permet de suivre la redirection de type 302
challenge=`curl -L http://www.google.com|grep name=\"challenge|sed -r 's/.*value=\"([0-9a-z]+)\".*/\1/'`

#echo "challenge: ${challenge}"

# la phase 2 renvoie une réponse au token
response=`curl -L -d "username=${login}&password=${password}&cond=on&accessType=neuf&nb4=https://hotspot.neuf.fr/nb4_crypt.php&challenge=${challenge}" ${url}|grep response=|sed -r 's/.*response=([0-9a-z]+).*/\1/'`

#echo "reponse: ${response}"
# enfin, un refresh renvoie sur une page qui attend la
# réponse précedente pour activer la connexion
final=`curl -L "http://192.168.2.1:3990/logon?username=ssowifi.neuf.fr/${login}&response=${response}&uamip=192.168.2.1&userurl=http%3A%2F%2Fwww.fon.com%2Ffr%2Flanding%2Ffoneroneufbox%3Bfon%3B%3B&lang=fr&ARCHI"|grep ${okmatch}`

if [ ! -z "${final}" ];then
        echo "connected"
else
        echo "connection failed"
fi

Voila pour ceux que ça interesse wink

PS : j'aurai aimé savoir comment eviter que curl affiche les stats des pages téléchargées outre le fait de faire un > /dev/null ?

Hors ligne

#16 Le 26/10/2008, à 21:38

Link31

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

bougie a écrit :

PS : j'aurai aimé savoir comment eviter que curl affiche les stats des pages téléchargées outre le fait de faire un > /dev/null ?

Avec l'option -s.

Hors ligne

#17 Le 26/10/2008, à 22:03

yurek

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Salut il te suffisait d'utiliser GET qui te donnait le challenge, puis en fonction du lien tu regénérait ton lien avec ton identifiant et ton mot de passe./


http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros

Hors ligne

#18 Le 12/11/2008, à 17:01

freechelmi

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Merci beaucoup pour cette contribution.

je cherchais un moyen de me connecter aux chillispot sous Openwrt , voilà une première solution.

une autre solution serait de coder un client Wispr en C ansi. 99% de sportails Web sont compatible Wispr.  on trouves deja une extension Firefox qui fait client Wispr  :

http://coova.org/wordpress/index.php/2008/03/06/for-firefox-users/

Hors ligne

#19 Le 13/11/2008, à 12:26

freechelmi

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Salut , j'ai testé le script sur Openwrt Kamikaze , ça fonctionne parfaitement et permet donc de repeter un signal Neuf Wifi de façon transparente.

j'ai juste ajouter l'option -k afin d'éviter les erreurs du  aux vérifications des certificats. 

en ajoutant une tache Cron qui vérifie si la connection est toujours "ouverte" , on doit pouvoir garder le routeur connecté en permanence.

Hors ligne

#20 Le 13/11/2008, à 12:28

Dr4gOoN

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Tu serais chaud pour faire un tuto explicatif ?
Edit : Et illustré ...

Dernière modification par Dr4gOoN (Le 13/11/2008, à 12:28)

Hors ligne

#21 Le 13/11/2008, à 12:36

freechelmi

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

1- Prendre un routeur comptable ( fonera, buffalo etc..)
2- installer une version recente de openwrt Kamaikaze
3- Mettre l'interface Wifi en mode client avec le channel de la neufBox et le SSID Neuf WiFi ( DHcp client doit etre actif par defaut sur cette interface)
4 Mettre une IP sur le LAN différente genre 192.168.10.1 avec n DHCP actif.
5 installer Curl : opkg update  opkg install curl
6 créer le script en mettant ash comme shell et en ajoutant -k a chaque appel de Curl
7 lancer le script.
8-verifier qu'en ethernet ça fonctionne

Hors ligne

#22 Le 10/12/2008, à 20:31

globul

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Bonsoir, désolé d'etre un poil hors sujet mais j'utilise un firefox comme navigateur.

Y a t'il un moyen simple d'automatiser la connection avec firefox?


Merci

bonne soirée a vous!

#23 Le 10/12/2008, à 22:03

freechelmi

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Beh avec un sript c'est quand meme plus simple non ? tu le mets en Cron et tu n'as plus a t'en soucier

Hors ligne

#24 Le 15/12/2008, à 17:54

Chep

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

'jour!

alors oui c'est plus facile avec un script sous linux aucun soucis ca marche bien sur cette machine la.

Malheureusement.....  enfin vous avez deviné l'horrible chose que j'ai en tete..

winrrrr pardon.

disons donc firefox puisque ce joli script va pas tourner terrible sous wintruc ,)

il y a quelques plugins qui remplisse tout seul le formulaire, c'est mignon mais pas automatique.

Greasemonkey est pas tout mal pour ca car il detecte que le portail captif du hotspot s'affiche et lance un script, il peut aussi ignorer si il y a already ou success dans l'url.

Seulement c'est du javascript et puis moi le javascript il me comprend pas bien.

Enfin si vous aviez une suggestion a me faire...

(Non pas cette suggestion la, je la connais deja ,) )

Hors ligne

#25 Le 15/12/2008, à 18:08

Link31

Re : [Résolu] (Re)Connexion au HotSpot Neuf en shell script.

Ça devrait tourner sous windows avec Cygwin.

Hors ligne