Technicolor TG789vac v2: da frustrazione a positiva fruizione

Il Technicolor TG789vac v2 distribuito da Fastweb è uno dei router più schifosi con cui io abbia mai avuto a che fare, ma, sembrerebbe, anche uno dei più interessanti.

Più schifoso perché, come tutti i router Technicolor distribuiti da Fastweb fino a qualche tempo fa, aveva un’interfaccia di configurazione difficile da usare e piena di bug. Anzi, il router stesso più di qualche volta mi ha dato problemi con la rete Ethernet cablata, penso l’unico con cui mi sia mai successa qualcosa del genere.

Fino a gennaio lo usavamo con una ADSL2, dopodiché sono riuscito a combinare un upgrade a FTTC da 200Mbps, quindi con quella che viene anche chiamata EVDSL. Dunque Fastweb ci ha consegnato un router nuovo, questa volta però della ZTE, e io sono riuscito finalmente a sbarazzarmi di quel dispositivo infernale.

Tuttavia, qualche tempo fa è emersa la sua parte interessante. Mentre cercavo informazioni sul Tim hub, ho trovato un sito che spiega come “hackerarli”, cioè come ottenere una shell di root e sbloccare ogni possibilità di configurazione. E, ciliegina sulla torta, i firmware Technicolor sono basati su OpenWRT.

La cosa mi ha subito incuriosito, perché, come ho scritto altre volte, purtroppo il mio TD-W8970 non sarà immortale, e prima o poi dovrò sostituirlo con un altro dispositivo, e trovarne uno con modem compatibile con OpenWRT non è una cosa semplice. O, mal che vada, posso sempre usare il Technicolor come access point e switch gigabit, ottenuto gratis.

La procedura, a grandi linee

Diversi router Technicolor, a quanto pare, non vengono progettati e costruiti solo per un provider, ma sono diversi quelli che li utilizzano, anche all’estero. Eventualmente la scocca viene personalizzata dai vari ISP, ma la scheda dovrebbe essere completamente uguale per tutti.

Questa è una fortuna, perché in realtà il firmware Fastweb sembra non poter permettere il root, insomma, diciamo che è troppo sicuro 😅️ . Magari non è nemmeno basato su OpenWRT, ma su qualche altro progetto sviluppato chissà quanto tempo prima.

Il primo passo sarà dunque scaricare un firmware di un altro ISP, per sostituirlo a quello Fastweb, caricandolo tramite TFTP/BOOTP.

In questo sito parlano di diverse root strategy: la A si basa su un campo della UI web non adeguatamente protetto, che permette di eseguire comandi sulla shell, un po’ come era stato possibile fare con La Fonera, 14 anni prima, e come 14 anni fa, è stato creato uno script per automatizzare il processo, questa volta però in Python, non in Perl.

Io ho scelto quindi il firmware 16.3.7637-ver2.2.1 di iiNet (un provider australiano), ma anche quello Tiscali va bene, e se siete loro clienti potete scaricarlo direttamente tramite HTTP, anziché torrent. Oppure quello di MST sarebbe più recente, ma ha una root strategy diversa, la D.

Disclaimer

Come al solito, non mi assumo alcuna responsabilità in caso seguiate le istruzioni qui riportate.

Qualora intendiate farlo sarà una vostra scelta.

Preparazione

Il sito sopra linkato spiega già come eseguire il tutto su Windows (nella pagina Recovery), però io ho deciso di farlo su Linux, e di usare dnsmasq come server TFTP. Se lo vorrete usare anche voi, vi servirà il MAC address del router da exploitare. Ci sono diversi modi per ottenerlo, come usare Wireshark, o più semplicemente accenderlo un attimo, in modo che venga popolata la tabella ARP, e ottenerlo da lì.

Prima di tutto vi servirà scaricare dnsmasq. Alcune distribuzioni lo installano come dipendenza di Network Manager. Per poterlo usare sono necessari i privilegi di root.

Dovete poi scaricare autoflashgui e i suoi prerequisiti. Io ho clonato il repository, ci sono entrato con cd, ho creato un virtualenv Python e ho installato le dipendenze:

git clone https://github.com/mswhirl/autoflashgui.git
cd autoflashgui
python3 -m venv .venv
. .venv/bin/activate
pip install robobrowser==0.5.3
pip install Werkzeug==0.16.1

Il primo comando pip è l’unica dipendenza di autoflashgui, mentre il secondo serve per risolvere un bug noto che Werkzeug 1.0 ha causato.

Ultimo, ma non per importanza, è il firmware da mettere sul Technicolor.

Attenzione: alcuni firmware, incluso quello iiNet, usano una password predefinita che varia da dispositivo a dispositivo, ed è scritta nelle etichette sul retro, alla voce ACCESS KEY. Qualora non abbiate più quelle etichette, potreste dover usare un altro firmware.

Assicuratevi anche di conoscere i vari parametri di configurazione della vostra connessione a Internet, se usate il Technicolor come gateway.

Al giorno d’oggi tutti abbiamo smartphone e dispositivi vari per avere una connessione in caso di emergenza, ma potrebbe essere lo stesso utile aprire tutte le varie pagine utili sul computer da cui eseguirete l’operazione.

Anche uno switch Ethernet potrebbe essere comodo, così l’interfaccia del PC non rileverà il riavvio del router e non rischierete che il sistema operativo ne modifichi la configurazione.

Flash tramite TFTP

In questi casi, è molto utile disattivare Network Manager, secondo la mia esperienza rischia di interferire con quello che andremo a fare. Sulle distribuzioni che usano systemd, bisogna dare il seguente comando da root:

systemctl stop NetworkManager

Andiamo a impostare da una shell di root un indirizzo IP. Nel tutorial per Windows usavano 10.0.0.99 per il gateway, dunque l’ho impostato anch’io al mio computer:

ip addr add 10.0.0.99/24 dev enp9s0

dove enp9s0 è la mia interfaccia Ethernet, probabilmente dovrete cambiarla.

Andiamo poi a eseguire dnsmasq, sempre da root. Se non usate uno switch, vi consiglio di farlo su un altro terminale, in modo da poter usare quello dove avete messo l’indirizzo IP per reimpostarlo velocemente, in caso la scheda Ethernet venisse deconfigurata. Il comando da dare è il seguente:

dnsmasq -k --log-facility=- -q --log-dhcp --enable-tftp --tftp-root=/path/completo/directory/firmware --dhcp-range=10.0.0.100,10.0.0.120,255.255.255.0,10.0.0.99 --dhcp-boot=tag:bootp,vant-6_16.3.7637-ver2.2.1-CRF695-2721005.rbi --dhcp-host=e0:b9:e5:xx:xx:xx,10.0.0.101

-k serve per mantenerlo in foreground, cioè per non falo uscire ma mantenerlo sul terminale da dove lo eseguite, con -q --log-dhcp si abilitano dei log aggiuntivi, che con --log-facility=- vengono mandati su standard error.

Dovrete poi sistemare l’argomento --tftp-root, mettendo la directory dove avete scaricato il firmware, di cui eventualmente dovrete cambiare il nome, se non avete scaricato lo stesso mio, e mettere il MAC address corretto su --dhcp-host.

A questo punto è arrivato il momento di mandare il Technicolor in modalità recovery: spegnamolo, dopodiché teniamo premuto il pulsante di reset, e riaccendiamolo.

Potremo rilasciare il tasto soltanto quanto che vedremo accendersi/lampeggiare il LED vicino alla porta Ethernet a cui è collegato il PC (e dei log compariranno nel terminale dove c’è dnsmasq).

Questi log sono utili per capire se il router è riuscito a scaricare correttamente il nuovo firmware. In caso di esito positivo, non ci sarà nulla da fare, finché non vedremo tutti i LED spegnersi e riaccendersi. A quel punto il dispositivo sarà flashato, farà il boot del nuovo firmware, e noi potremo interrompere dnsmasq, riattivare Network Manager, o attivare manualmente un client DHCP.

Non ho tenuto conto del tempo preciso che ci ha messo il mio router, di sicuro qualche minuto, quindi bisogna attendere pazienti.

A volte il trasferimento potrebbe invece fallire, e il router continuare l’avvio normalmente. In questi casi bisogna spegnere il router e ricominciare la procedura.

Rooting

Finita l’installazione di un firmware exploitabile, potremo andare a ottenere il root.

Con il firmware iiNet, il Technicolor ha come indirizzo IP predefinito 10.1.1.1. Lo username dell’amministratore è admin e la password è quella scritta nell’etichetta ACCESS KEY. Se volete potete provare ad accedere al pannello di amministrazione.

O anche se non volete accedere al pannello di amministrazione, quei dati serviranno ad autoflashgui, che entrerà nel pannello per eseguire l’exploit.

Avviamolo (python autoflashgui.py, dalla directory dove l’avevamo installato, con il virtualenv attivo), mettiamo indirizzo IP, username e password, quindi scegliamo TG789vac v2 e il firmware appena installato, infine premiamo Esegui.

Ci metterà qualche secondo, ma una volta che avrà finito, dirà di provare a connettersi in SSH.

La configurazione di default del server SSH purtroppo non è troppo sicura, e i client OpenSSH più recenti potrebbero rifiutarsi di connettersi:

ssh root@10.1.1.1
Unable to negotiate with 10.1.1.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,kexguess2@matt.ucc.asn.au

bisogna quindi abilitare uno di quei metodi, anche temporaneamente, per esempio con questo comando:

ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 root@10.1.1.1

La password di default dovrebbe essere root, ma fate sempre riferimento a quanto riportato dallo script.

Alcune cose interessanti

Appena entrato nella shell, mi ha dato il benvenuto questo motd:

BusyBox v1.23.2 (2017-03-09 09:52:23 UTC) built-in shell (ash)

  _______              __           __              __
 |_     _|.-----.----.|  |--.-----.|__|.----.-----.|  |.-----.----.
   |   |  |  -__|  __||     |     ||  ||  __|  _  ||  ||  _  |   _|
   |___|  |_____|____||__|__|__|__||__||____|_____||__||_____|__|
                 N E X T   G E N E R A T I O N   G A T E W A Y
 --------------------------------------------------------------------
 NG GATEWAY SIGNATURE DRINK
 --------------------------------------------------------------------
  * 1 oz Vodka          Pour all ingredients into mixing
  * 1 oz Triple Sec     tin with ice, strain into glass.
  * 1 oz Orange juice
 --------------------------------------------------------------------

Hanno preso quello solito di OpenWRT, ma hanno cambiato il drink, che non sembra esistere veramente. A quel tempo, la versione stabile doveva essere Chaos Calmer, ma è una ricetta diversa.

Il motd prosegue:

Product: vant-6_iinet
Release: Aqua (16.3)
Version: 16.3.7637-2721005-20170630233806-718b590506a915e24be58946f4755c0c617d9c8d
 Demo build, unofficial Technicolor SW, not suitable for deployment!
                                                                     

Il messaggio è già chiaro di per sé, e questi sono veramente i colori con cui si presenta.

Hash config:         19daa8a9106e152adeecb4dcb3eefd7d1cfead73
Hash openwrt:        dc65f5fc6f312c9d5e6d8c1f778d407c8b0424fa
Hash kernel:         8a61de4d1c2d12ae21b5fc32f87c361a033c4124
Hash custo:          0e83af2cdc41e736d2703b0c53eb6b7da3edd2f6
Hash packages:       5cf55b5e7a5bde79d5de52973ae5321b3a256b67
Hash routing:        7b853f235ce96cd14f3abaebf9253c5ca7f72f7d
Hash lte:            0db43dcbdd270791131c723d6de2ec15c82a2ff2
Hash mindspeed:      91b6a7a4d703268d6023c3a58da3d33fc62e7ed8
Hash technicolor:    ca75650ca535b4b00ed46391eef82f3f37e42785

Bootloader: 2.0.85

Un po’ di hash, ma non sono riuscito a trovare alcun riferimento.

root@dsldevice:~# uname -a
Linux dsldevice 3.4.11-rt19 #1 SMP PREEMPT Thu Mar 9 10:01:39 UTC 2017 mips GNU/Linux

Il kernel è il solito 3.4.11. Per VDSL Broadcom deve aver modificato questo Kernel un po’ come aveva fatto per ADSL con il 2.6.18, e quindi tutti i router usano sempre questo. Broadcom e/o Technicolor dovrebbero rilasciare il sorgente per quel kernel, secondo la GPLv2; molti produttori di router hanno delle pagine da cui fare il download autonomamente, ma loro no.

Ciononostante, ci sono un paio di posti dove si possono trovare dei pacchetti correlati ai firmware, con anche i sorgenti del kernel Linux. Il primo è proprio per un router Technicolor, una pagina dedicata all’Actiontec T3200, un router abbastanza diverso, ma magari qualcosa di utile lo potrebbe anche avere.

Andando avanti con la prima occhiata, ho voluto anche dare un’occhiata alla CPU:

root@dsldevice:~# cat /proc/cpuinfo
system type		: VANT-6
processor		: 0
cpu model		: Broadcom BMIPS4350 V8.0
BogoMIPS		: 397.31
wait instruction	: yes
microsecond timers	: yes
tlb_entries		: 32
extra interrupt vector	: no
hardware watchpoint	: no
ASEs implemented	:
shadow register sets	: 1
kscratch registers	: 0
core			: 0
VCED exceptions		: not available
VCEI exceptions		: not available

processor		: 1
cpu model		: Broadcom BMIPS4350 V8.0
BogoMIPS		: 409.60
wait instruction	: yes
microsecond timers	: yes
tlb_entries		: 32
extra interrupt vector	: no
hardware watchpoint	: no
ASEs implemented	:
shadow register sets	: 1
kscratch registers	: 0
core			: 0
VCED exceptions		: not available
VCEI exceptions		: not available

una CPU dual core, MIPS, da 400MHz, quindi non proprio velocissima (il TD-W8970 - molto più vecchio - ha una CPU MIPS da 500MHz).

Infine, ho provato a vedere con il comando free quanta RAM ha - 256MB - e la flash con df, che riporta 32MB, anche se su Internet mi era parso di leggere 128MB, ma in ogni caso, avendo una porta USB, la flash è l’ultimo dei problemi.

Non ho cercato il modello di altri componenti, come modem e interfaccia wireless; di quest’ultima so solo che supporta 802.11ac e ho provato a vedere come se la cava come copertura. Sono andato in giro per casa col mio vetusto Oneplus One e una app chiamata WiFi Analyzer, che riporta le potenze dei vari access point. Il buon vecchio TD-W8970 riesce sempre ad avere tra 1dBm e i 12dBm di potenza in più. Anche a 1m dai due router il TD-W8970 aveva 4-5dBm in più, c’è da dire però che avendo i driver liberi, ho potuto alzare la potenza del trasmettitore, in più è dotato di antenne esterne da 3dB.

Connessione a Internet (TIM)

Come dicevo, dove usavamo questo router, adesso abbiamo una VDSL da 200Mbps, con cui non è compatibile, però ho anche accesso a una VDSL Tim da 100Mbps.

Si può configurare, sia tramite SSH (con i soliti file in /etc/config che usa OpenWRT), sia tramite la GUI. Ho provato con quest’ultima, che mi è risultata un po’ macchinosa, ma alla fine ce l’ho fatta: bisogna cliccare Setup Wizard in alto, scegliere Adam Internet come provider, perché è l’unico che usa PPPoE. A quel punto bisogna abilitare l’id VLAN e mettere 835. Andando un po’ a toccare tra WLAN auto sensing e di nuovo nelle impostazioni Internet ad un certo punto è partita, ma non sono neppure io sicurissimo di cosa ho fatto.

Una cosa su cui ero curioso, in particolare, è il limite di download imposto dalla CPU del router: purtroppo con il TD-W8970, è di 7-8MB/s. Provando a fare un port forwarding e connettendosi tramite l’indirizzo IP assegnato alla WAN, mi ero imbattuto in questo limite, invece col Technicolor no, va alla come se mettessi l’indirizzo locale.

Quindi, di fatto, non mi viene in mente alcun modo per trovare il limite di questo router: la mia connessione va a circa 5-6MB/s, che non basta a saturarlo (per fortuna). Però il TD-W8970 non supportava ufficialmente la VDSL2, mentre il Technicolor sì, quindi mi aspetto che possa raggiungere i 100Mbps tranquillamente.

Ci sarebbe anche la possibilità di configurare il VoIP, ma non ho voluto provarla.

GUI alternativa e pacchetti OpenWRT

Un’altra altra cosa che invece ho provato, è una GUI alternativa a cui facevano riferimento nel sito precedentemente linkato.

L’installazione è molto semplice, sono pochi comandi, che riporto dal readme del progetto:

curl -k https://raw.githubusercontent.com/Ansuel/gui-dev-build-auto/master/GUI.tar.bz2 --output /tmp/GUI.tar.bz2
bzcat /tmp/GUI.tar.bz2 | tar -C / -xvf -
/etc/init.d/rootdevice force

Espone davvero molte funzionalità, però personalmente sono più uno per una cosa alla LuCI, magari con il tema storico di OpenWRT (luci-theme-openwrt) 🤩️ . E tra i vari addon elencati nella GUI alternativa si parla anche di LuCI, quindi sembra che sia possibile installarla!

Non sono riuscito tramite la GUI, anche se potrebbe essere stato un problema mio, siccome nel frattempo ho riattaccato il mio router principale, per fornire di nuovo connettività al resto della mia rete, e ho configurato al volo (tramite il comando route) il Technicolor affinché usasse l’altro router come gateway.

Ho però così avuto modo di notare che la GUI installa anche una serie di repository per opkg, gestiti dall’utente FrancYescO e originariamente creati da Pietrotti97, a quanto pare un altro fan di OpenWRT e possessore (almeno in passato) del TD-W8970. L’architettura di questi pacchetti, come il repository del 799 linkato precedentemente, ha come suffisso -tch.

Ho provato a installare manualmente LuCI. La procedura non è andata a buon fine subito, bisogna installare alcuni pacchetti che non si installano da soli (luci-lib-nixio e luci-lib-ip), modificare la configurazione di uHTTPd affinché ascolti in una porta non già occupata (modificando il file /etc/config/uhttpd), ma non sono comunque riuscito a farlo andare, viene fuori un errore il cui messaggio è che non trova un tema valido.

Probabilmente, spendendoci un po’ di tempo, si potrebbe sistemare, però, piuttosto, mi piacerebbe riuscire a creare un’immagine OpenWRT il più simile possibile a quelle ufficiali.

Ah, la GUI non ufficiale include un easter egg: un cronjob che trasforma il router in un albero di Natale tra il 24 e il 26 dicembre.

Conclusioni

Questo dispositivo ai miei occhi è passato da essere una disgrazia, una peste bubbonica, all’essere parecchio promettente.

Però, così come è preso al momento potrebbe andarmi bene solo in caso avessi proprio bisogno di cambiare router. L’idea di avere una serie di moduli integrati nel firmware, come il controllo remoto, disattivati, ma pur sempre presenti, o in generale, di non partire da un firmware pulito, un po’ mi infastidisce.

Ci sono inoltre alcune personalizzazioni che io faccio nella mia installazione di OpenWRT. Una è il supporto ai DDNS, cosa che sembra essere completamente supportata. Un’altra invece è il supporto a Wireguard, possibile, in questo caso, solo con l’implementazione in Go (come fatto da Yong Jie Wong per un ASUS RT-N56U), una soluzione non ottimale.

Infine, mi piacerebbe dare vedere se è possibile sfruttare quel tree del TG799vac, ma magari più avanti, è una cosa che va sicuramente oltre quest’indagine iniziale 😊️ .