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:
  1. Il numero di cookie ( visibile in codice soprastante dentro elemento "dmcookie")
  2. 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:

  1. Autenticarsi e salvare la sessione
  2. Recuperare il valore dmcookie
  3. 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