Reverse engineering Vodafone Station 2 reset function
Torna in cima
-
Resettare la Vodafone Station 2 automaticamente
- Reset periodico con Cron.
- Reset in caso di mancata raggiungibilità internet.
- Resettare la Vodafone Station 2 da remoto
Torna in cima Questo articolo tratta il reset remoto della Vodafone Station 2. Una volta appreso come fare il reset remoto sarà possibile effettuarlo regolarmente con "cron" o con uno script PHP, SHELL o qualsiasi altro linguaggio di programmazione.
Verrà spiegato che la Vodafone Station è improntata su un approccio SOAP. In caso di connessione via browser sarà il JavaScript eseguito sul nostro browser a fare le veci del client SOAP.
Non sarà necessario comprendere il runzionamento delle RPC ( Remote Procedure Calls ) SOAP perchè basterà replicare il codice.
Torna in cima Questa procedura è stata testata sulla Vodafone Station 2, versione firmware: # 5.4.8.1.160.8.24 . Funzionerà sicuramente anche su tante altre versioni più o meno recenti. Versione curl 7.37.1 (x86_64-apple-darwin14.0) che è ben diversa da quelle montate su sistemi linux!
Torna in cima
Analizzando la procedura di reset con tools appositi ( Wireshark, Ethereal, Firebug ) si evince il tipo d'azione intrapresa:
Il client ( nel mio caso il browser ) effettua una chiamata SOAP al server ( vodafone station ).
Codice mandato in POST dal client SOAP ( browser ) al server ( Vodafone Station 2 ) all'indirizzo 'https://192.168.1.1/data_model.cgi':
967172251
All'indirizzo 'https://192.168.1.1/data_model.cgi' risiede il server SOAP che viene usato per tutte le comunicazioni dal client ( interfaccia sul vostro browser oppure un'app sul telefono o quant'altro ).
Dovremo quindi mandare al server la richiesta di reset postata qui sopra.
Ostacoli: La Vodafone Station 2 richiede autenticazione ( se non lo fa vi consiglio di impostare password ed username ) e comunica in SSL ( HTTPS ).
Quindi:
- Il numero di cookie ( visibile in codice soprastante dentro elemento "dmcookie")
- Autenticazione & certificato SSL.
Analisi - Effettuare il login:
L'autenticazione è effettuata via protocollo HTTP, sarà il server Apache od equivalente montato sulla Vodafone Station 2 ad eseguire l'autenticazione.
Per autenticarsi sarà quindi necessario inviare via HTTP protocol tutti i vostri dati d'autenticazione.
Esempio con CURL ( da usare con schell UNIX via Mac OSx o linux ):
curl --insecure --user name:password "https://192.168.1.1"
Se fate come scritto sopra la Vodafone Station 2 vi ridizionerà ( HTTP code 303 moved temporarily ) al link sotto stante. Almeno per me è cosi, è probabile che lievi cambiamenti siano dovuti alla versione del firmware.
curl --insecure --user name:password "https://192.168.1.1/main.cgi?page=index.html"
Il codice sottostante memorizza nel file cookies.txt i cookie restituiti.
curl
--insecure
-c cookies.txt
--user name:password "https://192.168.1.1/main.cgi?page=index.html"
NB: l'opzione '--insecure' disabilità il controllo del certificato presso un authority CA. Questo perchè il sistema si reputa fidato ed è la criptazione è solo a scopo di protezione dallo sniffing.
Esempio con PHP sfruttando sempre la libreria CURL:
$process = curl_init($host);
$h = array('Content-Type: application/xml', $additionalHeaders);
curl_setopt($process, CURLOPT_HTTPHEADER, $h);
curl_setopt($process, CURLOPT_HEADER, 1);
curl_setopt($process, CURLOPT_USERPWD, "user:password");
curl_setopt($process, CURLOPT_TIMEOUT, 30);
//curl_setopt($process, CURLOPT_POST, 1);
//curl_setopt($process, CURLOPT_POSTFIELDS, $payloadName);
// Ci interessa la risposta per Debug & variabile
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
/* per cookie */
//curl_setopt($ch, CURLOPT_COOKIEJAR, "PHP_cookies.dat"); // takes from file
curl_setopt($ch, CURLOPT_COOKIEFILE, "PHP_cookies.dat"); // store in file
$res = curl_exec($process);
curl_close($process);
Le due righe commentate ci serviranno dopo.
Per testare il funzionamento del vostro script potete creare una pagina php alla quale inviare i dati di autenticazione. Leggerne poi il risultato per capire se avete fatto bene. Posto un esempio di una possibile pagina php per i test:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Autenticati!"');
header('HTTP/1.0 401 Unauthorized');
echo 'WTF!';
exit;
} else {
echo "Hai inviato correttamente: ";
echo "User: '".$_SERVER['PHP_AUTH_USER']."' ";
echo "Pass: '".$_SERVER['PHP_AUTH_PW']."' ";
/* per compatibilità con tutte possibili variazioni di server PHP */
echo "";
print_r($_SERVER);
echo "";
}
NB: è possibile che a seconda del vostro server PHP le costanti come PHP_AUTH_USER cambino per verificarle fate un print_r($_SERVER); e/o inglobatelo nello script
A questo punto siamo quasi alla fine e dobbiamo solo fare la richiesta SOAP !
Dovremo quindi:
- Autenticarsi e salvare la sessione
- Recuperare il valore dmcookie
- Effettuare la richiesta di reset reinviando anche i dati di sessione
Torna in cima
Dovremo quindi inviare l'autenticazione come al punto precedente ed in piu i dati in POST.
Esempio in script SH:
Useremo l'opzione "-b cookies.txt" per poter riutilizzare i dati.
var=$(curl
--insecure
--user name:password
-c cookies.txt
"https://192.168.1.1/?page=index.html" | grep -oE "([0-9]{5,})");
echo "
$var
" > soap_envelope.txt;
curl
--insecure
-b cookies.txt
--header "Content-Type: text/xml;charset=UTF-8"
--data-binary @soap_envelope.txt
"https://192.168.1.1/data_model.cgi";
rm soap_envelope.txt cookies.txt;
NB: Ricordarsi di trattare le " dell'echo come \".
Dove @soap_envelope.txt è un file di testo nella cartella attuale contenente la richiesta XML soap.
Esempio con PHP sfruttando sempre la libreria CURL:
$process = curl_init("https://192.168.1.1/data_model.cgi");
$h = array('Content-Type: application/xml', $additionalHeaders);
curl_setopt($process, CURLOPT_HTTPHEADER, $h);
curl_setopt($process, CURLOPT_HEADER, 1);
curl_setopt($process, CURLOPT_USERPWD, "user:password");
curl_setopt($process, CURLOPT_TIMEOUT, 30);
/*
* Stavolta usiamo le due righe sottostanti;
* La variabile payload sarà la richiesta SOAP
*/
$payloadName = "\
\
\
967172251\
\
\
\
\
";
/*
* il codice soprastante può stare tutto in-line
* ( eliminando gli slash ovviamente!! )
*/
curl_setopt($process, CURLOPT_POST, 1);
curl_setopt($process, CURLOPT_POSTFIELDS, $payloadName);
curl_setopt($process, CURLOPT_RETURNTRANSFER, FALSE); // non ci interessa la risposta
curl_exec($process);
curl_close($process);
Torna in cima
|