Flashing remoto su Ubiquiti via Redboot

RedBoot_logo-80pxChi ha giocato un po’ con gli apparati Ubiquiti (Routerstation [PRO], Litestation, Bullet, etc) sa che per caricare una firmware di terze parti come OpenWRT o DD-WRT è necessario avviare il dispositivo in modalità rescue e caricare il software attraverso TFTP. Si tratta di una procedura molto semplice, infatti è sufficiente premere il tasto reset per una manciata di secondi durante l’accensione per ordinare a RedBoot (il bootloader) di avviare la procedura rescue. Sarebbe altrettanto semplice se la scheda fosse già montata in una scatola stagna sul tetto di un palazzo o su una cima di una montagna? Evidentemente no! E’ proprio in questi contesti che ci viene in aiuto una feature di RedBoot chiamata net debug, peccato che, generalmente, non sia abilitata di default. Questa opzione permette di accedere alla console dei comandi di RedBoot via telnet (oltre che via seriale), consentendoci di riprogrammare la flash o eseguire la diagnostica direttamente da remoto. Ora vi spiegherò come fare.

Modificare i parametri di avvio di RedBoot

Per attivare il net debug è necessario modificare la configurazione del bootloader (RedBoot) ed esistono solo 2 modi:

  1. tramite la console dei comandi di RedBoot (via convenzionale)
  2. tramite scrittura “bruta” sulla partizione flash della configurazione

Naturalmente, se state leggendo questa pagina, vuol dire che ormai l’apparato sta già lavorando in qualche posto sperduto e non avete certo l’accesso seriale a porta di mano, perché, finché non attiverete il net debug, è l’unico modo per accedere alla console dei comandi di RedBoot, quindi non vi resta che optare per la seconda opzione,  ovvero scrivere direttamente sulla memoria flash tramite l’utility per linux fconfig di Andrzej Ekiert, da non confondersi con l’omonimo comando di RedBoot.

Per prima cosa bisogna individuare la partizione su cui sono memorizzati i parametri di RedBoot, quindi iniziamo col vedere tutte le partizioni disponibili con i comandi seguenti:

root@DD-WRT:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00030000 00010000 "RedBoot"
mtd1: 007b0000 00010000 "linux"
mtd2: 00630000 00010000 "rootfs"
mtd3: 000a0000 00010000 "ddwrt"
mtd4: 00010000 00010000 "nvram"
mtd5: 00010000 00010000 "FIS directory"
mtd6: 00010000 00010000 "board_config"
mtd7: 00800000 00010000 "fullflash"

Notiamo subito che la nostra memoria flash è organizzata a blocchi di 64kB (erasesize) e che, con molta probabilità, la partizione mtd6 “board_config” è quella che ci interessa, ma per esserne certi è bene fare un dump:

root@DD-WRT:~# hexdump -C /dev/mtd6
 00000000 52 65 64 42 6f 6f 74 00 00 00 00 00 00 00 00 00 |RedBoot.........|
 00000010 bf 00 00 00 bf 00 00 00 00 03 00 00 bf 00 00 00 |................|
 00000020 00 02 c6 68 00 00 00 00 00 00 00 00 00 00 00 00 |...h............|
 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
[cut....]
 00000600 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
 *
 0000f000 00 00 10 00 0b ad fa ce 06 0b 01 00 61 72 37 31 |............ar71|
 0000f010 30 30 5f 65 73 61 00 00 15 6d c1 b5 2b 00 00 01 |00_esa...m..+...|
 0000f020 0c 01 00 62 6f 6f 74 5f 73 63 72 69 70 74 00 00 |...boot_script..|
 0000f030 00 00 01 04 11 01 0c 62 6f 6f 74 5f 73 63 72 69 |.......boot_scri|
 0000f040 70 74 5f 64 61 74 61 00 62 6f 6f 74 5f 73 63 72 |pt_data.boot_scr|
 0000f050 69 70 74 00 63 61 63 68 65 20 6f 66 66 0a 66 69 |ipt.cache off.fi|
 0000f060 73 20 6c 6f 61 64 20 2d 64 20 2d 65 20 6b 65 72 |s load -d -e ker|
 0000f070 6e 65 6c 0a 67 6f 0a 00 00 00 00 00 00 00 00 00 |nel.go..........|

In verità la configurazione di RedBoot occupa solo 4kB e risulta essere memorizzata alla fine della partizione, ovvero nel range [0x0000f000 - 00010000 ]. Questo offset (0x0000f000) ci servirà per utilizzare correttamente l’utility fconfig. Questo esempio è preso da un sistema con DD-WRT, mentre su OpenWRT la configurazione potrebbe essere memorizzata in una partizione dedicata chiamata “RedBoot config” di soli 4kB, che, però, ci complica le cose in fase di scrittura, dal momento che l’erasesize è di 64kB e che per scrivere su alcune memorie flash è necessario, ogni volta, eseguire l’erase dei blocchi che si vogliono modificare. Lo sapevate?

Procedete ora all’installazione dell’utility fconfig utilizzando il package manager ipkg/opkg (bisogna avere jffs attivato) o copiando direttamente l’eseguibile su una partizione scrivibile, ad esempio /tmp. Ad esempio su DD-WRT :

cd /tmp
wget http://www.darkman.it/wp-content/uploads/2013/07/fconfig_20080329-1_ar71xx.ipk
ipkg install fconfig_20080329-1_ar71xx.ipk

Se tutto è andato bene, possiamo lanciare fconfig e vedere la configurazione corrente di RedBoot. Nel nostro caso è sufficiente lanciare l’utilty come segue:

root@DD-WRT:/# fconfig -v -o 0x0000f000 -l -d /dev/mtd6
Low verbosity messages are printed.
Normal verbosity messages are printed.
Read 4096 bytes
Data length is 4096, maxlen is 4096
CRC is valid.
ar7100_esa: 00:00:00:00:46:61
boot_script: TRUE
boot_script_data: fis load -d -e kernel
exec

boot_script_timeout: 1
bootp: FALSE
bootp_my_gateway_ip: 0.0.0.0
bootp_my_ip: 192.168.1.20
bootp_my_ip_mask: 255.255.255.0
bootp_server_ip: 0.0.0.0
console_baud_rate: 115200
gdb_port: 9000
info_console_force: FALSE
info_console_number: 0
net_debug: FALSE
EOF reached

Se avete un output del genere, possiamo procedere con la modifica dei parametri che vogliamo, ma badate bene: non potete scrivere direttamente sulla memoria flash! Procediamo quindi a copiare prima l’intero contenuto di mtd6 in /tmp, effettuare le modifiche sulla copia e, infine, trasferire la configurazione modificata sulla memoria flash, dopo aver effettuato l’erase.

root@DD-WRT:/# cp /dev/mtd6 /tmp/mtd6
root@DD-WRT:/# fconfig -w -v -o 0x0000f000 -d /tmp/mtd6 -n boot_script_timeout -x 8 
root@DD-WRT:/# fconfig -w -v -o 0x0000f000 -d /tmp/mtd6 -n net_debug -x TRUE 
root@DD-WRT:/# mtd erase "board_config"
root@DD-WRT:/# cat /tmp/mtd6 > /dev/mtd6

Per essere certi che la configurazione sia stata correttamente scritta, vi consiglio di lanciare nuovamente fconfig -v -l -o 0x0000f000 -d /dev/mtd6  e verificare che venga correttamente letta, in caso contrario vuol dire che avete sbagliato qualcosa, come, ad esempio, l’aver tentato di scrivere direttamente sulla flash tramite fconfig, una operazione che produrrebbe una configurazione “corrotta”. Grazie al CRC (ultimi 4byte), il bootloader ha modo di verificare se la configurazione è genuina, quindi, se riavvierete il dispositivo con una configurazione corrotta, ottereste un bel “brick”, reversibile solo tramite seriale (è necessario eseguire la reinizializzazione della configurazione con fconfig -i).

Accedere alla console dei comandi RedBoot via Telnet

Se siete riusciti a modificare correttamente i parametri, al riavvio del dispositivo avrete 8 secondi (boot_script_timeout) per connettervi via telnet all’indirizzo IP 192.168.1.20 (bootp_my_ip) e porta 9000 (gdb_port). Una volta connessi, è sufficiente inviare la combinazione CTRL-C per interrompere la sequenza di boot e accedere al prompt dei comandi di RedBoot.

telnet 192.168.1.20 9000
== Executing boot script in 5.760 seconds - enter ^C to abort
^C
RedBoot> urescue

A questo punto potete accedere alle innumerevoli funzioni del bootloader, inclusa la procedura “rescue”, che è un modo, secondo me il più semplice, per caricare una firmware e/o fare il recovery.

Considerazioni finali

Questa procedura è stata eseguita correttamente su una Ubiquiti Routerstation e su una LiteStation SR71, entrambe con DD-WRT. Non posso assicurarvi che funzioni su altri apparati, tuttavia vi ho fornito sufficienti indizi per provare, ovviamente è necessario che il dispositivo abbia RedBoot come bootloader. Sarei lieto se poteste darmi qualche feedback in tal senso, anche aggiungendo un commento a questo articolo. Ho provato ad eseguire la stessa procedura da OpenWRT, ma,  a causa della partizione dedicata “Redboot config” di soli 4KB, risulta impossibile eseguire l’erasing. Sembra sia necessario patchare il kernel per sbloccare questa funzionalità, ma io ho una sola vita da spendere…

Link utili

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>