Hacking la Fonera, step by step guide
Qualche giorno fa, sento da Andrea che La Fonera è suscettibile di una code injection sull’interfaccia locale. Ohibò, troppo allettante per non provarci ma…ahem…la mia Fonera è già aperta e quella di Andrea anche.
Per fortuna, c’è Andrea il quale è un infelice possessore di Fonera muta e alla mia richiesta di provare l’hack non ci ha pensato poi molto e si è messo all’opera.
Ebbene si, ha aperto la Fonera. Ora, anche lui, può fregiarsi del titolo di “FON Liberator”. Mmmm…dove ho già sentito questo termine?
Gentilmente, Andrea ha accondisceso a scrivere una veloce guida all’utilizzo di questo nuovo hack.
È il primo form da inviare alla fonera.
Si tratta di un semplice form che utilizza il metodo post per inviare invia il campo “wifimode”all’indirizzo
http://192.168.10.1/cgi-bin/webif/adv_wifi.sh
192.168.10.1 è l’IP della Fonera, il vostro potrebbe essere differente, nel qual caso il valore va aggiornato alle vostre esigenze.
/cgi-bin/webif/adv_wifi.sh
È il cgi-bin che si occupa, tra le altre cose, di eseguire i comandi shell contenuti nel campo wifimode inviatogli (la fonera usa l’httpd di busybox e i cgi-bin sono script webif – un sistema di generazione dinamica di html tramite script shell e awk)
Una volta inviato il form vi sarà richiesta l’autenticazione http del webserver della fonera (esattamente come se vi collegaste da browser).
Il valore predefinito della coppia login/pass e’
Login: admin
Password: admin
Potreste aver cambiato la password predefinita, nel qual caso utilizzate quella che avete definito.
Come potete notare l’iniezione del codice richiama iptables dicendogli di aprire la porta 22 per le connessioni ssh.
Quello che vedete nell’immagine e’ il testo che viene visualizzato nel browser dopo il submit e l’autenticazione: come potete osservare, si tratta del sorgente html dell’home page del webserver della fonera, preceduta da degli header. La prima riga è:
“/bin/sh: /tmp/.webif/config-fon: 2: Permission denied”
Il permission denied non si riferisce al tentativo di accesso o iniezione del codice nella fonera, ma alla scrittura (o alla lettura, non sono sicuro, lo script fa entrambe le cose) del file /tmp/.webif/config-fon.
Non preoccupatevi di quella scritta, l’iniezione del codice è andata a buon fine.
Si tratta del secondo form. Il codice iniettato avvia dropbear, il server ssh della Fonera.
Dopo l’invio del form si ripresenta lo stesso output visto per il primo.
A questo punto, collegatevi in ssh, come utente root. all’IP della fonera, la password
è la stessa che avete usato per l’autenticazione, et voila’!
Una volta loggatisi sulla Fonera occorre rinominare dropbear in
S50dropbear.
root@OpenWrt:/#mv /etc/init.d/dropbear /etc/init.d/S50dropbear
In questo modo la Fonera eseguirà il file al boot del sistema.
Quindi, ora avete un server ssh avviato a ogni boot della Fonera.
Il secondo passo da compiere consiste nell’abilitare in maniera definitiva le connessioni ssh verso la Fonera. Perottenere questo risultato, bisogna editare il file
/etc/firewall.user
Con cosa? ovviamente con vi
Le righe in questione sono le seguenti, come risulta chiaro dal commento:
### Open port to WAN
## -- This allows port 22 to be answered by (dropbear on) the router
# 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
Decommentate le due righe che iniziano per iptables.
A questo punto vi basterà riavviare la Fonera, oppure eseguire i due script sui quali avete apportato le modifiche:
root@OpenWrt:/#/etc/init.d/S50dropbear
root@OpenWrt:/#/etc/firewall.user
Se poi volete esagerare, disabilitando la possibilità che del codice inviato da Fon venga eseguito dalla Fonera, modificate /bin/thinclient
root@OpenWrt:/#vi /bin/thinclient
commentate la riga
. /tmp/.thinclient.sh
in fondo al file.
Potete infine aggiungere questa
cp /tmp/.thinclient.sh /tmp/thinclient-$(date'+%Y%m%d-%H%M')
che alla ricezione dei file da parte di Fon, li salverà nella directory /tmp nel formato thinclient-AAAA-MM-GG-HHMM.
In questo modo potrete controllarli di tanto in tanto (e ricordatevi anche di cancellarli, per non correre il rischio che vi occupino tutto lo spazio).
E in effetti il metodo funziona…mi fa loggare come root!
Quello che mi chiedo io è: come si fa ad aprire determinate o tutte o una porta tcp/udp nel caso si voglia impostare la fonera per servizi tipo amule/emule? Qui le mie conoscenze si fermano e aspetto che qualcuno mi aiuti!
ciao ciao
Eccoti le regole per il forward delle porte verso il tuo PC.
All’indirizzo 192.168.10.101 sostituisci l’indirizzo del tuo PC, per intenderci quello dal quale vuoi scaricare in FTP. Ti ho messo anche il redirect di FTP e SSH, che puoi ingnorare se non ti interessano questi protocolli.
Ogni regola è composta da 2 righe, ogni riga inizia con “iptables”. Non farti trarre in inganno dall’impaginazione dei commenti:
# Forward delle porte FTP
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 20 -j DNAT --to 192.168.10.101:20
iptables -A forwarding_rule -i $WAN -p tcp --dport 20 -d 192.168.10.101 -j ACCEPT
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 21 -j DNAT --to 192.168.10.101:21
iptables -A forwarding_rule -i $WAN -p tcp --dport 21 -d 192.168.10.101 -j ACCEPT
# Forward delle porte SSH
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j DNAT --to 192.168.10.101:22
iptables -A forwarding_rule -i $WAN -p tcp --dport 22 -d 192.168.10.101 -j ACCEPT
iptables -t nat -A prerouting_rule -i $WAN -p udp --dport 22 -j DNAT --to 192.168.10.101:22
iptables -A forwarding_rule -i $WAN -p udp --dport 22 -d 192.168.10.101 -j ACCEPT
# Forwad delle porte aMule
iptables -t nat -A prerouting_rule -i $WAN -p udp --dport 4665 -j DNAT --to 192.168.10.101:4665
iptables -A forwarding_rule -i $WAN -p udp --dport 4665 -d 192.168.10.101 -j ACCEPT
iptables -t nat -A prerouting_rule -i $WAN -p udp --dport 4672 -j DNAT --to 192.168.10.101:4672
iptables -A forwarding_rule -i $WAN -p udp --dport 4672 -d 192.168.10.101 -j ACCEPT
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 4662 -j DNAT --to 192.168.10.101:4662
iptables -A forwarding_rule -i $WAN -p tcp --dport 4662 -d 192.168.10.101 -j ACCEPT
grazie, veramente utile e gentile!!!!!!!
credo di avere un problema. Quando provo ad aprire le porte con iptables ottengo sempre il sguente errore:
Warning: wierd character in interface `-p’ (No aliases, :, ! or *).
Bad argument `tcp’
Try `iptables -h’ or ‘iptables –help’ for more information.
Come devo procedere?
a proposito, l’errore è lo stesso sia con putty e winxp che con shell da mandriva 2007! ho provato a fare ricerca su google ma non si parla di quel tipo di errore
è evidente che la var $WAN non è definita … impostala per contenere il nome della interfaccia interna…
questa variabile è definita in /etc/firewall.user, quindi se esegui quelle regole da cmdline te la ritrovi vuota!
@LUCA
Il problema :
Warning: wierd character in interface `-p’ (No aliases, :, ! or *). Bad argument `tcp’
e’ dovuto al fatto che il parametro -dport in ogni riga e’ errato.
Cambia “-dport” con “–dport” in ogni riga e risolvi il problema.
Giorgio si e’ dimenticato un “-“, ecco tutto.
SALUTI!
Scusa LUCA….
Errore di battitura. Volevo dire:
Cambia “-dport” con “–-dport” in ogni riga e risolvi il problema.
diego non so se è solo un problema mio legato all’inesperienza ma neanche come hai detto tu sembra funzionare…e l’errore è sempre il medesimo!
a proposito ho anche provato a inserire le regole direttamente in /etc/firewall.user (se è li’ che vanno inserite)
c’erano già le regole per le porte 80 e 8080
le ho aggiunte sotto modificanto il–
in pratica adesso la sintassi è identica a quella delle regole già presenti
tuttavia ne’ il reboot ne’ altro ha dato risultati positivi
sempre e solo id basso con amule e porte chiuse
ho anche provato a inserire le regole direttamente in /etc/firewall.user (se è li’ che vanno inserite)
c’erano già le regole per le porte 80 e 8080
le ho aggiunte sotto modificanto il —
in pratica adesso la sintassi è identica a quella delle regole già presenti
tuttavia ne’ il reboot ne’ altro ha dato risultati positivi
sempre e solo id basso con amule e porte chiuse
Scusatemi, in effetti è un problema di formattazione di WordPress che sostituisce al doppio tratto un tratto semplice.
Ora dovrebbe essere tutto a posto.
Questi comandi non sono intesi per essere utilizzati dalla riga di comando ma per essere scritti all’interno del file
/etc/firewall.user
Se volete lanciare le regole da riga di comando ti conviene sostituire alla variabile $WAN, questa altra variabile:
$(nvram get wan_ifname)
oppure inserire il nome della interfaccia, ovvero
vlan1
giorgio spero che la mia insistenza serva anche ad altri…io i comandi sostituendo il – lungo col doppio — li ho inseriti in /etc/firewall.user
ci sono già le regole per porte 80 e 8080 e io li ho inseriti sotto rispettando la sintassi delle regole già presenti! tuttavia non riesco ad aprire le porte! sempre id basso e porte chiuse…bo non so che pensare…ci perdo ancora un po’ di tempo e vedo se risolvo. Cmq grazie per gli aiuti
giorgio spero che la mia insistenza serva anche ad altri…io i comandi (sostituendo il – lungo col doppio –) li ho inseriti in /etc/firewall.user
ci sono già le regole per porte 80 e 8080 e io li ho inseriti sotto rispettando la sintassi delle regole già presenti! tuttavia non riesco ad aprire le porte! sempre id basso e porte chiuse…bo non so che pensare…ci perdo ancora un po’ di tempo e vedo se risolvo. Cmq grazie per gli aiuti
non mi fa piu’ postare dice che faccio spam!
vittoria! ho risolto il problema. nell’inserire le regole in /etc/firewall.info mi sono portato dietro dalla prima all’ultima riga un errore. Non ho la tastiera italiana e una volta fatto il copia incolla la prima volta…direi che adesso funziona alla grande. grazie a tutti per l’aiuto, veramente prezioso
nella guida ho scritto questo: “(in realtà l’esecuzione avviene ogni N boot con N pari al numero successivo alla S, quindi potete rinominare il file anche in un altro modo volendo, basta che inizi per S seguito da un numero – escluso il 4x, che ha un significato diverso)”
ma in realta’ e’ sbagliato, avevo capito male il senso dalla frase nella documentazione. in realta’ il numero successivo ad S nei file di /etc/init.d/ indica la priorita’ di esecuzione all’avvio: gli script saranno eseguiti secondo l’ordine numerico del prefisso (riguardo al fatto che S4x abbia un significato diverso sto ancora indagando)
Si, copiando il testo non me ne ero accorto. In realtà Fon ha modificato il sistema di inizializzazione derivato da System V. Sxx indica lo script da eseguire, con xx numerico a determinare l’ordine di esecuzione. Per fermare uno script in un determinato runlevel, è sufficiente linkarlo con un symlink che inizi per Kxx. In realtà, in /etc/init.d dovrebbero risiedere gli script nudi e crudi, linkati con Sxxnomescript dalle directory dei runlevel ai quali si vuole eseguirli (rc.x).
FONERA: New firmware 0.7.1.1 21/11/2006
http://en.fon.com/downloads/changelog.php
Leggendo su un forum che il nuovo firmware non comprometteva il server ssh ho effettuato l’aggiornamento. Risultato: Fonera di nuovo bloccata… 🙁
Qualcuno sa se è possibile effettuare un downgrade del firmware?
@MarioMix. Semplicemente, fai un hard reset del router. Gira lo scatolotto, tira via il cavo della corrente, premi il tasto del reset e, tenendolo premuto, collega il cavo della corrente. A questo punto, tieni premuto per 30 secondi e il router si resetta ai valori originali, rispondendo su 192.168.1.1 con login=root password=admin
Mi è arrivato La Fonera con firmware 0.7.1 r1
Niente hacking …
8(
… dimenticavo … pero’ c’e’ il port forwarding …
Vorrei sapere da chi ne sa se :
la FONERA può funzioare in modalità di ROAMING ( collegata tramite cavo ad un altro router/modem/access point Wireless in modo tale che spostandomi con un pc wireless nelle diverse stanze AGGANCIO sempre l’ AP con il miglior segnale ?
E’ corretto ?
Volevo sapere anche se può funzionare stand alone , cioè in Modalità REPEATER ( wds) senza collegarlo ad un router , in modo da avere la “ripetizione” del wifi come un normale Access point wireless ?
E’ possibile ?
volevo chiedervi una mano ho effettuato un reset della fonera
tramite il pulsante staccando l’alimentazione e tenedo premuto il pulsante per 30 secondi, solo che ora la fonera si accende(i led rimangono accessi) ma non la pingo su nessu ip e le due rete wifi non sono visibili.
Ho provato a fare un net scan della mia sottorete ma niente 🙁 ho visto i log del mio dhcp server ma niente 🙁
cosa posso fare?
Grazie in Anticipo a tutti
Sulla mia Fonera l’hard reset reimposta solo le impostazioni… il firmware resta l’ultimo installato. 😐
Comunque è stato trovato il metodo per usare l’hack sulla nuova versione del firmware (0.7.1 r1)! 🙂
Hacking La Fonera… parte 3:
http://www.mariomix.net/mariomix-blog/2006/11/hacking-la-fonera-parte-3/
Ovviamente l’hard reset non ha il dono magico di tirare fuori dal cilindro una diversa versione del firmware…
tra l’altro guardando il changelog del nuovo firmware risulta inutile un aggiornamento, visto che le modifiche riguardano tutte migliore e correzioni di bug dell’interfaccia di configurazione web, che non vi serve se avete una fonera con l’ssh aperto 😉
@Giorgio. Beh… ho precisato che l’hard reset lascia intatto l’ultimo firmware perchè hai risposto di fare un hard reset alla mia domanda di come downgradare. 😉
Comunque qualcuno, con una procedura particolare, è riuscito a riportare il firmware alla versione originale:
http://www.amvtec.com/fon/viewtopic.php?t=221
Volevo sapere se la fonera può funzionare stand alone , cioè in Modalità REPEATER senza collegarlo ad un router , in modo da avere la “ripetizione” del wifi come un normale Access point wireless ?
é normale che dopo aver configurato tutto ed essermi collegato alla rete MyPlace non “veda” più la rete pubblica??
Come posso assegnare IP fisso hai pc che si collegano wifi tramite la rete privata?
Credo di aver killato la mia fonera provando a installare nmap.
Sono fiero di me 🙂
Oddio! Sono capitato in un sito in cinese!
Qual è la procedura corretta per resettare la Fonera? Ho già provato una volta e mi ha portato tutti i nomi alle impostazioni di fabbrica ma non so se mi ha resettato anche i parametri interni.
1. Togli la corrente;
2. Premi il pulsante di reset e lo tieni premuto;
3. Riattivi la corrente;
4. Tieni premuto il pulsante di reset per 30 secondi;
5. Rilasci il pulsante di reset.
Il tutto chiaramente senza attaccare il cavo di rete…
La prima volta quanto tengo premuto?
C’è un modo per filtrare un determinato mac address?
Vi dico come l’ho resettata io: con l’aggeggio acceso ho tenuto premuto il reset finche’ non si sono spente le due spie wifi e ethernet.
Ora devo acherarlo di nuovo cmq pare tornato in vita.
Ah in compenso mentre la acheravo la prima volta mi si e’ fritto l’hd del portatile seminuovo. L’hd ha piu’ di un anno ma l’avro’ acceso si e no 10 volte 🙁
@Stefano: devi tenerlo premuto sempre, per 30 secondi dall’accensione. Stacchi il cavo, premi il tasto di reset, accendi, aspetti 30 secondi e rilasci il tasto di reset.
@Tommaso: la fortuna è cieca, la sfiga ci vede fin troppo bene.
Ok capito. Spengo, premo, accendo, 30 sec., rilascio.
Così torna come nuova appena tolta dalla scatola, giusto?
@Stefano: esatto per tutte e due le tue affermazioni.
Ultima cosa.
C’è qualche segnale che mi fa capire che è andata a buon fine? Led che si spengono o si accendono, ecc..
Ultima cosa.
C’è qualche segnale che mi fa capire che è andata a buon fine? Lucine che si spengono o si accendono.
ciao
segnalo che i due link PRIMO FORM e SECONDO FORM nell’articolo puntano entrambi al medesimo file step1.html… 😉
Corretto, grazie mrshark
Ho provato la procedura ma le impostazioni sono rimaste tale e quali quelle di prima.
Altri consigli??
tra le tante schede di rete che escono sulla fonera con ifconfig, è possibile sapere ognuna a cosa serve? In particolare per sapere qual è quella della FONAP… Comincio io…
ath0
ath1 questa dovrebbe essere la wifi privata, infatti ha ip 192.168.10.1
eth0 questa è la lan privata, l’ho messa con ip fisso 192.168.1.200
eth0:1 questa dovrebbe essere un alias della eth0 in modo che la fonera sia sempre raggiungibile con l’ip d’emergenza 169.254.255.1 via cavo
tun0
wifi0
lo è naturalmente il localhost
Volevo far notare che nella linea di comando
cp /tmp/.thinclient.sh /tmp/thinclient-$(date’+%Y%m%d-%H%M’)
bisogna mettere uno spazio fra date e l’apice. Cioè deve essere così
cp /tmp/.thinclient.sh /tmp/thinclient-$(date ‘+%Y%m%d-%H%M’)
altrimenti non inserirà la data e l’orario ma rinominerà il file in thinclient- e basta.
Spero di essere stato d’aiuto.
In ogni caso grazie a tutti voi per i consigli e soprattutto a Giorgio Zarrelli per ospitare questo splendido blog.