Aprire ssh su La Fonera, senza aprirla

Dando un’occhiata a Dema FON Blog ho notato la notizia che riportava la creazione di uno script Perl da parte di Stefan Tomanek, script in grado di modificare le configurazioni della FONERA e quindi di “aprirla”.

In effetti, Tomanek spiega abbastanza chiaramente sul proprio sito il perché si riesca a fare questo: in pratica, La Fonera chiama casa (download.fon.com) a ogni riavvio e si scarica via ssh, su porta 1937 i dati di configurazione della rete, SSID e password.

Occhio, ora: il SSID può essere impostato dalla propria pagina personale sul sito di FON e in seguito questo dato viene trasferito al proprio router via ssh, che salva il tutto in uno script temporaneo sul router stesso e lo esegue. Lo script, quindi, si occupa di alterare le configurazioni. Ora, Tomanek ha giustamente pensato…”Se si riuscisse a iniettare del codice e a farlo eseguire…”

In effetti, in FON hanno ben pensato di sottoporre tutti i valori a quoting stretto, usando degli apici singoli, in modo che non si potessero alterare in maniera troppo semplice i valori inseriti nello script. Oltretutto, hanno ben pensato di sostituire ogni occorrenza di un apice singolo con \’, in modo da sottoporre a escaping un eventuale apice singolo iniettato e impedirgli di chiudere arbitrariamente le stringhe di configurazione.

Peccato che nello shell scripting, un apice singolo non possa venire sottoposto a escaping.

Quindi, Tomanek ha alterato la stringa

iwconfig ath0 essid FON_'YOURPUBLICESSID'

in modo da aggiungere un ulteriore apice singolo, la definizione di una regola di iptables, un carattere di newline e quindi l’istruzione necessaria a lanciare dropbear.

Il tutto viene eseguito tramite uno script Perl basato sulla libreria WWW::Mechanize, in grado di simulare un client web e di oltrepassare le protezioni messe da FON sulle pagine del proprio sito. Tentando di mettere il codice direttamente nel campo ESSID delle proprie pagine su www.fon.com non dovrebbe risultare semplice.

Ora, come fare praticamente?

Il primo passo, consiste nello scaricare il modulo WWW::Mechanize. Basta lanciare l’interprete Perl con la seguente sintassi:

perl -MCPAN -e 'install WWW::Mechanize'

Rispondete si a oltranza.

Quindi, scaricate da qui lo script di Tomanek.

Ora, basterà dare il comando

echo -e '/usr/sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT\n/etc/init.d/dropbear' | perl shellfon.pl email password

Utilizzando l’email e la password con cui siete registrati sul sito di FON.

NOTA: Non è così semplice. Su una Ubuntu Edgy, lo script non ha funzionato dando continui errori di login. Su Una Dapper ha funzionato.

NOTA2: Lo script assume che abbiate un solo router FON. Nel caso abbiate piu’ router fallirà, non essendo in grado di recuperare dalle pagine di FON l’id del vostro router.

Per ovviare a questo inconveniente:

  • Recatevi sul sito di FON e autenticatevi;
  • Cliccate su Configure your FON social Router”;
  • Individuate l’immagine della Fonera e passate sopra uno dei due link “Configure your FON Social Router” e “Personalize your FON Access Portal”;
  • Date un’occhiata in basso, sulla barra di stato del navigatore. Al termine della URL visualizzata, noterete router_id=xxxxx
  • Segnatevi il codice numerico;
  • Aprite lo script che avete scaricato. Si chiama shellfon.pl;
  • Qui, alla riga 42, trovate la stringa

    my $id = extractID($browser->content()) || die “UNABLE TO EXTRACT ROUTER ID”;

  • Commentatela mettendole di fronte il simbolo del cancelletto #

    #my $id = extractID($browser->content()) || die “UNABLE TO EXTRACT ROUTER ID”;

  • Ora inserite la riga:

    my $id = xxxxx;

  • Registrate le modifiche e uscite dal file.

A questo punto, dopo avere lanciato lo script e ottenuto il messaggio di avvenuta modifica della configurazione (vedrete parecchie paginate scorrere sullo schermo), potete riavviare La Fonera.

Collegatevi via wi-fi, tramite MyPlace, in ssh all’indirizzo del vostro router e usate come login:

utente: root
pass: password di accesso all’interfaccia web della Fonera

A questo punto, è necessario rendere stabile lattivazione del demone dropbear che accetta le connessioni ssh e bisogna assicurarsi che il firewall tenga stabilmente aperta la porta 22.

Occorre spostarsi in init.d:

cd /etc/init.d/

E rinominare dropbeard secondo le convenzioni rispettate da Init. Lanciamolo giusto subito dopo http:

mv dropbear S50dropbear

Ora, ci si occuperà di iptables. Spostiamoci in etc:

cd /etc

E adesso editiamo il file di configurazione delle regole utente:

vi firewall.user

E si decommentino le regole alle righe 21 e 22. Da così:

# iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j ACCEPT
# iptables -A input_rule -i $WAN -p tcp --dport 22 -j ACCEPT

A così:

iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j ACCEPT
iptables -A input_rule -i $WAN -p tcp --dport 22 -j ACCEPT

Per eliminare i cancelletti, basta posizionarvisi sopra, premere ESC e quindi x minuscola.

Ora, salviamo e usciamo dal file, premendo

ESC

e quindi

:wq

e infine il tasto Invio.

Fatto. Ora, riavviate La Fonera e il vostro accesso ssh sarà stabilmente disponibile.

Funziona? Dalle mie parti si. Giocherellando insieme, Andrea Beggi e io abbiamo liberato i nostri due router…

PS.

Indovina, indovinello…

Visto che lo script che esegue le istruzioni inviate da fon, quindi anche le nostre injection, è di proprietà di root:


-rwxr-xr-x 1 root root 1.5k Aug 16 2006 thinclient

e che in

/etc/init.d

esiste lo script

-rwxr-xr-x 1 root root 90 Aug 16 2006 N40thinclient

che contiene le seguenti istruzioni:

root@OpenWrt:/etc/init.d# less N40thinclient
#!/bin/sh
mkdir -p /tmp/.ssh
cp /etc/dropbear/known_hosts /tmp/.ssh
/bin/thinclient start
root@OpenWrt:/etc/init.d#

Che lanciano /bin/thinclient con i diritti dell’utente di root….

Cosa succede se “inietto” come codice un bel

rm -fr /

eseguito da root?

Ahem…

20 Risposte a “Aprire ssh su La Fonera, senza aprirla”

  1. E’ cd /etc/init.d mi pare…

  2. Hai ragione. Mi sono incartato nel saliscendi delle directory.

  3. A prima vista non saprei dare una risposta.

    L’altra notte ho giusto cercato di fare andare lo script, senza debuggare più di tanto.

    Ho giusto notato che su 2 Edgy non funzionava e su una Dapper si, ma all’1:30 ho preferito sonnecchiare piuttosto che pormi dei quesiti esistenziali 😉

    Prova sulla tua Edgy e fammi sapere. La mia è stata sottoposta a fin troppi esperimenti e non fa fede.

  4. E’ l’errore tipico cui sono incorsi alcuni, me compreso. Non serve installare la Dapper: ti basta trovare qualcuno con una installazione di Linux sulla quale lo script funzioni e far lanciare a lui il programma. Chiunque può sbloccare la tua fonera, conoscendo login e password del tuo account sul sito di FON.

    Purtroppo non ho tempo per dare un’occhiata alle cause che portano al fallimento dello script. Prova a commentare la riga che intercetta il fallimento, sempre presumendo che lo script esegua il login giusto ma interpreti in maniera non corretta il valore di ritorno.

  5. A me funziona tutto ma sembra che i dati non vengano recepita da FON. Pensate siano corsi ai ripari ?

  6. @Alessandro hai riavviato la fonera, tenendo collegato il cavo di rete? Tieni conto che devi collegarti via ssh usando la rete wifi.

  7. Credo di aver risolto il problema dello script.

    Provate a fare la modifica proposta su questo post

    http://andreafortuna.wordpress.com/2006/11/06/abilitare-ssh-su-la-fonera-risolvere-il-problema-del-login-failed/

    e fatemi sapere se funziona. 🙂

  8. Si, ma non va. Guardando lo script ho visto che dovrebbe modificare anche il nome del SSID ma non fa nulla.

  9. Ho lo stesso problema.
    No such field ‘router_public_ssid’ at /usr/local/share/perl/5.8.8/WWW/Mechanize.pm line 1383

    Volevo capire una cosa.
    Questo campo in cui è inserito il ssid è nascosto nella pagina?

  10. @Lerio
    Se controlli il sorgente della pagina https://en.fon.com/userzone/router_config.php?router_id=xxxxx il campo e’ effettivamente presente.
    Domando: hai per caso modificato qualcos’altro nello script, rimuovendo qualche controllo? (sembra quasi non riesca a arrivare sulla pagina di configurazione del router).

  11. Ottimo, grazie Andrea.

    Per qualche ragione, Akismet ha bloccato i vari commenti ritenendoli spam. Li ho riportati online.

  12. Chiedo scusa a tutti per i ripetuti interventi sul LOGIN FAILED.
    Ieri pensavo di avere un problema nel post e l’ho ripetuto più volte.

  13. Scusa Alessandro, sei riuscito a risolvere il problema?
    Spiegati meglio.
    A me restituisce questo errore : “No such field ‘router_public_ssid’…”.

  14. No, non ho risolto.
    In pratica lo script non restituisce errore, ho provato a lanciarlo da diverse versioni di linux, ma non aggiorna nulla sul sito di fon.
    Secondo me hanno turato la falla.

  15. Idem come Alessandro: lo script non restituisce nessun errore. Ho aggiunto un po di debug nel codice perl con un paio di print sullo stderr per vedere cosa succede e arrivo fino alla fine e fino al messaggio “Code has been injected. Now reboot your La Fonera to force an configuration update.”. L’ID del router viene preso giusto e dunque direi che lo script fa il suo lavoro, solo che i dati non vengono aggiornati e l’essid della rete pubblica resta uguale a prima. Di conseguenza, dopo il riavvio l’ssh è ancora chiuso.

    Sembra proprio che abbiano riparato la falla di corsa… 🙁

  16. dimenticavo: provato con gentoo amd64. ho installato il “WWW::Mechanize” con emerge e poi ho seguito il resto delle istruzioni…

  17. Bisogna trovare un’altro modo, FON e’ corsa ai ripari. Potremmo utilizzare un DNS locale e far puntare la fonera ad un PC nella rete locale da dove scaricarsi la configurazione che vogliamo noi.
    Secondo voi potrebbe funzionare ?`

  18. Secondo me è un po più complesso del solo dns: ti serve instaurare la connessione ssh. Cioè devi avere un dns per fare credere alla fonera che l’host download.fon.com sia nella rete locale (ok, questo è semplice), ma devi anche mettere un server ssh che risponde alla connessione della fonera (facile anche) e che instauri la connessione usando il “certificato” che la fonera invia e, forse, presentare qualche sorta di “certificato” che la fonera si aspetta.
    Il fingerprint tra il tuo pc in locale e il server di fon non è uguale.

    Poi, forse, non sto vedendo in questo momento qualche cosa… magari qualcuno ha l’illuminazione giusta… 😉

  19. Cavoli, che triste non aver visto prima questa vostra scoperta… Ho emerso mechanize per perl in gentoo e ho scaricato il programma perl. Non ha dato nessun errore e ho riavviato la fonera mantenendo il cavo di rete attaccato.

    altair ~ # echo -e ‘/usr/sbin/iptables -I INPUT 1 -p tcp –dport 22 -j ACCEPT\n/etc/init.d/dropbear’ | perl shellfon.pl xxxxx@xxxx.xxx xxxxxxx
    By your command…
    Code has been injected. Now reboot your La Fonera to force an configuration update.
    altair ~ #

    Tuttavia ssh al riavvio non c’e’, e nmap via wifi della fonera restituisce un tristissimo

    PORT STATE SERVICE
    53/tcp open domain
    80/tcp open http
    8080/tcp open http-proxy

    Avranno cambiato il sistema di gestione della pagina?
    Federico

  20. […] Aprire ssh su La Fonera, senza aprirla | Crisis (tags: fon fonera hack network ssh) […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.