Quantcast
Channel: hardware
Viewing all articles
Browse latest Browse all 24

Sblocco modem ADSL AGTWI su linux e senza saldature

$
0
0

Il modem ADSL2+ Wi-Fi N Technicolor, detto anche AGTWI, è fornito da Telecom Italia per i contratti residenziali; il provider non prevede il suo uso come router. Questa è evidentemente una limitazione artificiale del software fornito dal provider, dato che l'hardware è pienamente capace di funzionare come router ADSL. L'hardware è basato su quello del router Technicolor TG582n, la variante usata da Telecom viene chiamata TG582Tn.

La procedura di sblocco del modem ADSL AGTWI per permetterne l'uso come router è interessante: invece di sfruttare una vulnerabilità (o una backdoor) del software per ottenere privilegi e modificare la configurazione predefinita, si aggira completamente il problema sostituendo il bootloader con quello di un dispositivo abbastanza simile; dopo aver fatto ciò diventa possibile installare software di altri provider che permettono l'uso del dispositivo come router.

È possibile trovare il TG582n in due revisioni hardware, con relativa variante software: DANT-T con flash da 8MiB e DANT-1 con flash da 16MiB in configurazione dual-bank (cioè con la possibilità di contenere due immagini software da 8MiB, una alternativa all'altra). Il TG582Tn di Telecom Italia invece usa la variante software DANT-V.

La procedura per sostituire il bootloader DANT-V con quello DANT-T è stata proposta da roleo (necessaria la registrazione al forum) sul forum Il Punto Tecnico e ADSL, ed è stata ripresa fra gli altri da Rix94 e Bestemmie Digitali.

I documenti attualmente presenti in rete spiegano come saldare una interfaccia SPI parallela alla memoria flash per modificarne il contenuto, e dicono di modificare il bootloader a mano copiando e incollando regioni di memoria da un file all'altro.

La procedura può essere semplificata e resa più robusta se mettiamo meglio a fuoco gli obiettivi:

  1. Leggere da una memoria flash che usa il protocollo SPI.
  2. Modificare un file binario sostituendo alcune sue regioni con quelle di un altro file binario.
  3. Scrivere su una memoria flash che usa il protocollo SPI.

Interfaccia seriale

Per lo sblocco del modem nessuna saldatura è strettamente necessaria, tuttavia, per avere maggiore controllo su cosa sta succedendo, si può saldare opzionalmente una striscia di pin sulla piazzola J3 e cortocircuitare le piazzole R62 e R63 per avere accesso all'interfaccia seriale:

Interfaccia seriale su TG582Tn

Per il collegamento si può usare un adattatore USB-seriale basato su chip Prolific PL-2303HX o un adattatore multi protocollo basato su chip FTDI FT2232H o simili.

Leggere la memoria flash SPI

La memoria flash nel mio caso è una Spansion S25FL129P; per accedere al suo contenuto può essere usato un qualsiasi programmatore SPI, non necessariamente uno parallelo auto-costruito.

Come programmatore SPI si può usare per esempio un TIAO USB Multi-Protocol Adapter seguendo questo schema:

Collegamento TUMPA-S25FL129P

Per il collegamento si può usare un morsetto di test per chip SOIC-16 come il Pomona 5252, in questo modo nessuna saldatura è strettamente necessaria:

Collegamento TUMPA-TG582Tn

Per leggere la memoria usando il TUMPA si può usare flashrom:

sudo flashrom -p ft2232_spi:type=tumpa,port=A -Vr dump.bin

È utile conservare una copia di backup del contenuto della flash; potrà essere usata per riportare il dispositivo al suo stato originale.

Modificare il bootloader

A questo punto basterebbe scrivere il file bootloader_pn.bin fornito da roleo per avere un dispositivo DANT-T ed essere in grado di installare un firmware generico per DANT-T, ma così facendo si avrebbero gli stessi dati (chiavi, certificati, MAC address, serial number, product version) del modem da cui è stato preso quel file.

Per mantenere i dati del nostro dispositivo, si dovrà applicare una “patch” al file bootloader_pn.bin.

Il file bootloader_pn.binè composto da due regioni:

  • da 0x00000000 a 0x0001ffff c'è il bootloader; più precisamente c'è una routine di unpacking ed il binario vero e proprio del bootloader compresso con LZMA.
  • da 0x00020000 a 0x0003ffff c'è la “configurazione di fabbrica”; la regione viene anche chiamata mtdss e contiene i dati identificativi del singolo dispositivo.

Invece di copiare e incollare regioni di file binari a mano, è possibile usare dd in uno script di shell per automatizzare la procedura:

#!/bin/sh
#
# patch_dant-v_dump.sh - patch DANT-V flash dump with DANT-T bootloader
#
# Copyright (C) 2014  Antonio Ospite <ao2@ao2.it>
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.

set -e

copy_region()
{
  local INPUT_FILE="$1"
  local OUTPUT_FILE="$2"

  local START_ADDRESS=$3
  local END_ADDRESS=$4

  local SIZE=$(($END_ADDRESS - $START_ADDRESS + 1))

  dd if="$INPUT_FILE" of="$OUTPUT_FILE" \
    skip=$(($START_ADDRESS)) count=$SIZE seek=$(($START_ADDRESS)) \
    conv=notrunc iflag=skip_bytes,count_bytes oflag=seek_bytes
}

erase_region()
{
  local OUTPUT_FILE="$1"
  local START_ADDRESS=$2
  local END_ADDRESS=$3

  local SIZE=$(($END_ADDRESS - $START_ADDRESS + 1))

  # Write all 0xff to $OUTPUT_FILE
  dd if=/dev/zero count=$SIZE iflag=count_bytes | \
    tr '\0''\377' | \
    dd of="$OUTPUT_FILE" seek=$(($START_ADDRESS)) conv=notrunc oflag=seek_bytes
}

DANT_V_DUMP_FILE=dump.bin
DANT_T_BOOTLOADER=bootloader_pn.bin
PATCHED_DANT_V_DUMP_FILE=dump_patched.bin

# Take the DANT-T bootloader
copy_region "$DANT_T_BOOTLOADER""$PATCHED_DANT_V_DUMP_FILE" 0x00000000 0x0001ffff

# Take the DANT-V mtdss region (the board specific data: serial number,
# certificates, mac addresses, etc.)
copy_region "$DANT_V_DUMP_FILE""$PATCHED_DANT_V_DUMP_FILE" 0x00020000 0x0003ffff

# Patch the product code and the firmware variant code, e.g.:
#   DANT-V -> WL
#   DANT-T -> WJ
# This does not appear to be strictly necessary, DANT-T firmwares will install
# even if we keep the DANT-V data here.
copy_region "$DANT_T_BOOTLOADER""$PATCHED_DANT_V_DUMP_FILE" 0x000216fc 0x00021713

# Patch the mtdss region in order to make the device look like a DANT-T,
# otherwise the client will still ask a DANT-V file (output of bootpd):
#
#   bootpd: info(6):   requested path=""  file="DANT-V"
#
# It is not enough to patch only the board name (0x00021727 0x00021728), some
# more data needs to be copied in order to prevent a failure with
# BLFLAG_INV_RI
copy_region "$DANT_T_BOOTLOADER""$PATCHED_DANT_V_DUMP_FILE" 0x00021727 0x00021730

# Erase all the rest of the flash, this will prevent a failure with:
#
#   Version BL: 1.0.5
#   Unhandled TLB
#
#   Unhandled exception
#   EPC=0x8130ff30, BadVAddr=0xc0830000, RA=8130fef8
#   ...
#
# The bootloader will still output the message BLFLAG_FLASH_FAIL (bad FVP) but
# that is OK, it will be fixed whith the firmware installation via tftp.
erase_region "$PATCHED_DANT_V_DUMP_FILE" 0x00040000 0x0ffffff

Scrivere la memoria flash SPI

Il file dump_patched.bin creato dallo script precedente può essere scritto con flashrom:

sudo flashrom -p ft2232_spi:type=tumpa,port=A -Vw patched_dump.bin

Installare un nuovo firmware

Per installare un nuovo firmware si può evitare di usare il Technicolor Home Install Wizard se si configura un server tftp.


Viewing all articles
Browse latest Browse all 24

Trending Articles