TFTP Recovery via Serial am Beispiel eines TPLink WDR4300


#1

1. Diagnose:

Ausgangspunkt für diesen Beitrag war ein nicht mehr bootender WDR4300 Router, die in der Firmware integrierte TFTP Recovery Funktion schlug fehl. Also habe ich nach der Anleitung im OpenWrt Wiki ein serielle Konsole angeklebt, ich weiß das Lötstellen besser aussehen sollten.

Im OpenWRT Wiki gibt es für die meisten TPLink Router passende Bilder wo eine Schnittstelle zu finden ist.
Mit einem USB TTL Adapter konnte ich dann den Grund im Terminalprogramm ( z.b. picocom,minicom ) sehen:

Bytes transferred = 8060928 (7b0000 hex)
original_product_id = 00
original_product_ver = 00
recovery_product_id = 43000001
recovery_product_ver = 01
auto update firmware: product id verify fail!

Ein Boot hing dann mit:
Uncompressing Kernel Image … OK

Starting kernel ...

Das heißt wie @Metatron herausgefunden hat das der Router seine eigene Product ID nicht mehr kennt. Metatron hatte dann ein China Tool gefunden das diese IDs wohl passend setzten kann:
Name des Tools: tp路由固件头修改工具.exe
Eine Quelle: http://sqzk.cqedu.net/tz/s/

Sieht dann so aus (hier mit 841 v9 Image):

$ hexdump -s 64 -n 8 tplink.bin
0000040 43 00 00 01 00 00 00 01
0000048

Für mich sieht es fast so aus als würde das Tool nur diese 8 Bytes umsetzen. Meine Idee war sich mit einem Hexeditor zu behelfen, ich habe es letztlich nicht getestet.

2. Software Tools

Für die Reparatur habe folgende Debian Pakete verwendet:
  • picocom
  • minicom
  • tftpd-hpa
  • wireshark

3. Software Setup

Da ich keine Lust habe auf die Dauer einen TFTP Server zu betreiben, habe ich den Daemon direkt nach der Installation per apt wieder deaktiviert:
update-rc.d -f tftpd-hpa remove

Danach kann ich den Daemon einfach als Root starten und mit ctrl-c beenden wenn sinnvoll:

in.tftpd --foreground -s -v --verbosity 10 /srv/tftp

Picocom braucht kein Setup:

picocom -b 115200 /dev/ttyUSB0

Ich habe die ganze Zeit wireshark mit laufen lassen, da man dort einfache Protokolle wie TFTP gut überwachen kann.

4. Recovery Image besorgen

Vorsicht hier sollte man wissen was man tut, es empfiehlt sich das OpenWRT Wiki aufmerksam zu lesen oder das Image z.b. bei [http://www.friedzombie.com/tplink-stripped-firmware/][2] herunterladen.
dd if=wdr4300v1_en_3_14_3_up_boot\(150518\).bin of=tplink.bin skip=257 bs=512
 cp tplink.bin /srv/tftp/wdr4300v1_tp_recovery.bin

So liegt das Image für den TFTP Push Button Recovery bereit. Auf einem TPLink 1043 habe ich fürs Push Button recovery auch schon ein Gluon Factory Image verwendet.

5. Recovery

Nun wird es spannender, wenn das Terminal Programm, in meinem Fall picocom laeuft muss man sobald die Zeile **Autobooting in 1 seconds** sehr schnell das Passwort **tpl** eingeben um zum db12x Prompt zu kommen, ich habe das mit minicom nicht geschafft, mit picocom hat es beim 2. Mal geklappt. hier braucht man Geduld schnelle Finger und viele Resets des Routers. U-Boot 1.1.4 (Jun 17 2013 - 12:31:57)
U-boot DB120


DRAM:  128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment

PCIe Reset OK!!!!!!
In:    serial
Out:   serial
Err:   serial
Net:   ag934x_enet_initialize...
No valid address in Flash. Using fixed address
 wasp  reset mask:c03300 
WASP  ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
Autobooting in 1 seconds
db12x> tftpboot
dup 1 speed 1000
*** Warning: no boot file name; using '6F01A8C0.img'
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename '6F01A8C0.img'.
Load address: 0x81000000
Loading: T 
Abort

Hier habe ich erkannt ich brauche auf meinem Linux System die Adresse 192.168.1.100 und habe die Datei von wdr4300v1_tp_recovery.bin nach 6F01A8C0.img kopiert. Das T bei Loading steht wohl fuer timeout.

db12x> tftpboot
Unknown command 'tftpboot' - try 'help'
db12x> tftpboot
Unknown command 'tftpboot' - try 'help'

An diesem Prompt werden Tippfehler nicht toleriert daher kannte er ein korrigiertes ttfpboot nicht.

db12x> tftpboot
*** Warning: no boot file name; using '6F01A8C0.img'
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename '6F01A8C0.img'.
Load address: 0x81000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
   ...
         #################################################################
         ###############
done
Bytes transferred = 8060928 (7b0000 hex)
db12x> erase 0x9f020000 +7b0000

First 0x2 last 0x7c sector size 0x10000
 124
Erased 123 sectors

Das OpenWRT Wiki empfiehlt das Flash zu löschen, also habe ich es gemacht.

db12x> cp.b 0x81000000 0x9f020000 0x7c0000
Copy to Flash... write addr: 9f020000
done
db12x> reset

Danach wird die Firmware von der Adresse an die sie per TFTP geladen wurde kopiert so das sie bei Start gefunden wird, und nun die Router resettet.
Und schon zeigt sich der Erfolg:

U-Boot 1.1.4 (Jun 17 2013 - 12:31:57)

U-boot DB120


DRAM:  128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment

PCIe Reset OK!!!!!!
In:    serial
Out:   serial
Err:   serial
Net:   ag934x_enet_initialize...
No valid address in Flash. Using fixed address
 wasp  reset mask:c03300 
WASP  ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
Autobooting in 1 seconds
## Booting image at 9f020000 ...
   Uncompressing Kernel Image ... OK

Starting kernel ...

Booting Atheros AR934x
[    0.000000] Linux version 2.6.31--LSDK-9.2.0_U6.616 (root@liaozhiming) (gcc version 4.3.3 (GCC) ) #1 Mon May 18 19:25:55 CST 2015
[    0.000000] Ram size passed from bootloader =128M
[    0.000000] flash_size passed from bootloader = 8
[    0.000000] CPU revision is: 0001974c (MIPS 74Kc)
[    0.000000] ath_sys_frequency: cpu srif ddr srif cpu 560 ddr 450 ahb 225
[    0.000000] Determined physical RAM map:
[    0.000000]  memory: 08000000 @ 00000000 (usable)
[    0.000000] Zone PFN ranges:
[    0.000000]   Normal   0x00000000 -> 0x00008000
[    0.000000] Movable zone start PFN for each node
[    0.000000] early_node_map[1] active PFN ranges
[    0.000000]     0: 0x00000000 -> 0x00008000
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
...

Damit hat der Router wieder eine TPLink Firmware, ich habe dann noch dreist per Push Button Recovery ein Gluon Factory Image geflashed.


Router Recovery - TFTP Pushbutton und TTL (Serial Recovery)
TL-WR1043ND umflashen (webui nicht zu finden)
#2

Traumhafte Zusammenfassung, die werde ich direkt mal für einen verstorbenen WDR4900 nutzen.


#3

Mich würde interessieren, wie denn bei dem Gerät die HardwareID verloren gegangen ist.
Gibt es dazu eine nachvollziehbare Erklärung?


#4

Gut, erstmal danke für diese weitere ausführliche Anleitung. Ich habe nun mehrere Anleitungen und schritte ausprobiert und komme zu unterschiedlichen Ergebnissen, jedoch keinem erfolgreichen.

Wenn ich die Stripped Firmware von TP Link nutze, bekomme ich eine TFTP Schleife.

U-Boot 1.1.4 (Jun 17 2013 - 12:31:57)

U-boot DB120


DRAM:  128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment

PCIe Reset OK!!!!!!
In:    serial
Out:   serial
Err:   serial
Net:   ag934x_enet_initialize...
No valid address in Flash. Using fixed address
wasp  reset mask:c03300
WASP  ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
dup 1 speed 1000
Using eth0 device
TFTP from server 192.168.0.66; our IP address is 192.168.0.86
Filename 'wdr4300v1_tp_recovery.bin'.
Load address: 0x80060000
Loading: T #################################################################
         #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     #################################################################
     ###############
done
Bytes transferred = 8060928 (7b0000 hex)
original_product_id = ffffffff
 original_product_ver = ffffffff
 recovery_product_id = 43000001
 recovery_product_ver = 01
 auto update firmware: product id verify fail!
Autobooting in 1 seconds
## Booting image at 9f020000 ...
   Uncompressing Kernel Image ... Stream with EOS marker is not supportedLZMA ERROR 1 - must RESET board     to recover

Also, was hab ich versucht? Ich habe einfach das Image wie gewünscht umbenannt und dann, den Router einfach machen lassen, er will ja direkt mit TFTP starten. Nachdem das auch wegen der ganzen Product Hardware ID, whatever nicht funktioniert hab, hab ich das ganze eben manuell versucht.
Diesmal inkl ID und eigentlich sauberen Durchgang. Nachdem ich den Router dann neugestartet hatte, kam jedoch GENAU der gleiche Bootvorgang, der Router will zuerst IMMER per TFTP laden, da aber jetzt kein Netzwerkkabel mehr steckte, kann er es nicht.
Was macht er also nach ein paar Timeouts? Er flashed sich irgendwas selbst zusammen, was ich mir nicht erklären kann. Siehe:

U-boot DB120


DRAM:  128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment

PCIe Reset OK!!!!!!
In:    serial
Out:   serial
Err:   serial
Net:   ag934x_enet_initialize...
No valid address in Flash. Using fixed address
 wasp  reset mask:c03300
WASP  ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
dup 1 speed 1000
Using eth0 device
TFTP from server 192.168.0.66; our IP address is 192.168.0.86
Filename 'wdr4300v1_tp_recovery.bin'.
Load address: 0x80060000
Loading: *
Abort
original_product_id = 43000001
 original_product_ver = 01
 recovery_product_id = 43000001
 recovery_product_ver = 01
 auto update firmware: product id verify sucess!

First 0x2 last 0x7d sector size 0x10000                                                                                                                                                                                                       125
Erased 124 sectors
Copy to Flash... write addr: 9f020000
done

Also bin ich wieder in der Schleife gefangen, obwohl eigentlcih alles gut aussieht,

Hat da jemand einen Rat für mich?

Router: TP-Link TL-WDR4300 v1.7
Board: 2050500272 Rev. 1.3


#5

Versuche es mal mit einem (nahezu beliebigen) Gluon-Images (“Factory”).


#6

Problem gefunden:

Ich hatte zuvor schon mal ein paar 1043er v2.1 unbricked, dort habe ich zum Schluss einfach noch kurz gesagt, er soll ohne reboot eben das System von der Speicheradresse xy starten . ergo in meinem fall nach dem kopieren auf den Flash Speicher einfach noch

boot.m 0x9f020000

eintippeln.

BZW: !!!

Aufpassen: ->

  1. Ich gehe davon aus, ihr habt den WDR4300 schon mit eurem USB TTL Converter verbunden und könnt schon was auf der Console über den COM Port was sehen.

Als erstes möchte der Router von eurem TFTP Server (Notebook/PC hat die statische IP: 192.168.0.66 ODER 192.168.1.100 (je nach Modell, steht aber in der Konsole beim booten)) im /24 Subnetz also 255.255.255.0. Gateway ist egal.

Wenn man sieht, dass der Router sich nun das Image von eurem Server laden möchte ganz fix STRG und C drücken und dann innerhalb einer Sekunde

tpl 

drücken.
nun müsste dort “db12x” stehen.

Ab nun hoffe ich, dass euer TFTP Server läuft und ihr das passende Image (in meinem Fall, das Moerser GLUON Freifunk Image (http://images.freifunk-moers.de) im TFTP Space liegen habt.

Das muss man nun von dem Notebook auf den Router per TFTP holen, dazu folgendes eingeben:

tftpboot 0x81000000 FIRMWARENAME.bin 

Firmwarename ist hierbei eine Variable, die man natürlich so benennen muss, wie sie auch im TFTP Space heißt.

Nachdem dieses Image erfolgreich auf den Router geladen wurde, löschen wir erst einmal den Flash Speicher.

 erase 0x9f020000 +7c0000

Nach dem löschen, kopieren wir das Image in den Flash Speicher hinein:

cp.b 0x81000000 0x9f020000 0x7c0000

Bis hierhin wurde es überall gleich beschrieben. Jetzt kommt MEINE Lösung.
Nachdem dieser Schritt ausgeführt wurde, könnte man den Router neustarten. Das hat bei mir leider nicht geholfen. Daher möchte ich den Router ohne neustart zum booten bewegen und das hat so funktioniert:

boot.m 0x9f020000

Und ab jetzt bootet der Router auch ganz normal durch. Ich weiß nur leider nicht wieso es so funktioniert und anders eben nicht. :slight_smile:
Eventuell konnte ich ja jemanden helfen.

Und ja, ich weiß, ich bin hier durch etliche Zeitformen gereist.


#7

Da muss ich leider einmal zurückrudern.

Der Router funktioniert soweit, er verbindet sich mit Freifunk Gateway alles gut.

Jedoch, wenn ich ihn neustarten möchte hängt er wieder in der TFTP Schleife fest. Er startet erst, wenn ich STRG C drücke um den TFTP Vorgang abzubrechen. Erst dann startet er das System auf dem Router.

Weiß da gerade jemand einen Rat?


#8

Kannst bitte du mal einen Konsolen Auszug im aktuellen Zustand schicken und am db12x> mal einen “printenv” absetzen?


#9
U-Boot 1.1.4 (Jun 17 2013 - 12:31:57)

U-boot DB120


DRAM:  128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment

PCIe Reset OK!!!!!!
In:    serial
Out:   serial
Err:   serial
Net:   ag934x_enet_initialize...
No valid address in Flash. Using fixed address
 wasp  reset mask:c03300
WASP  ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
dup 1 speed 1000
Using eth0 device
TFTP from server 192.168.0.66; our IP address is 192.168.0.86
Filename 'wdr4300v1_tp_recovery.bin'.
Load address: 0x80060000
Loading: *
Abort
original_product_id = 43000001
 original_product_ver = 01
 recovery_product_id = 5a008ac0
 recovery_product_ver = fffffdff
 auto update firmware: product id verify fail!
Autobooting in 1 seconds
db12x> printenv
bootargs=console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),6336k(rootfs),1408k(uImage),64k(mib0),64k(ART)
bootcmd=bootm 0x9f020000
bootdelay=1
baudrate=115200
ethaddr=0xba:0xbe:0xfa:0xce:0x08:0x41
dir=
lu=tftp 0x80060000 ${dir}u-boot.bin&&erase 0x9f000000 +$filesize;cp.b $fileaddr 0x9f000000 $filesize
lf=tftp 0x80060000 ${dir}db12x${bc}-jffs2&&erase 0x9f050000 +0x630000;cp.b $fileaddr 0x9f050000 $filesize
lk=tftp 0x80060000 ${dir}vmlinux${bc}.lzma.uImage&&erase 0x9f680000 +$filesize;cp.b $fileaddr 0x9f680000    $filesize
stdin=serial
stdout=serial
stderr=serial
serverip=192.168.0.66
ipaddr=192.168.0.86
ethact=eth0

Environment size: 684/65532 bytes
db12x>

Da fällt mir auf, dass die Product ID wieder nicht stimmt. Er bootet aber trotzdem, wenn ich den TFTP Scan abbreche. Nur das ist nicht im Sinne…


#10

Das Firmware Image was der Router vom TFTP bekommt wird nicht akzeptiert:

Bitte lade nochmal ein Gluon Factory Image herunter und nenne das nach wdr4300v1_tp_recovery.bin um. Danach sollte der Router es per TFTP laden und nach 2 Mal rebooten um das Image zu kopieren und sauber zu booten.


#11

der Vollständigkeit halber sei noch der Link aus dem Openwrt Wiki erwähnt.
Der Artikel hier ist quasi die deutsche Übersetzung:
https://wiki.openwrt.org/toh/tp-link/tl-wdr4300

Für fast alle Openwrt Router gibt es dort ausführliche Infos.


#12

Jetzt scheiterts komplett an der Product ID :confused:

Hab das Image genutzt: http://images.freifunk-moers.de/stable/factory/gluon-ffmo-0.7.7-tp-link-tl-wdr4300-v1.bin

done
Bytes transferred = 8126464 (7c0000 hex)
original_product_id = 43000001
 original_product_ver = 01
 recovery_product_id = 43000001
 recovery_product_ver = 01
 auto update firmware: product id verify sucess!

First 0x2 last 0x7d sector size 0x10000                                                                                                                                                                                                       125
Erased 124 sectors
Copy to Flash... write addr: 9f020000
done

#13

Permanent “hängender” Reset-Taster?


#14

Das ist ein sehr guter Tipp, aber das habe ich schon überprüft.

Ich habs jetzt einfach mal 2 andere 4300er genommen die auch gebricked sind. Die laufen wieder mit Original firmware, da gab es keine komplikationen.

Ich vermute das hängt wirklich irgendwie mit der Product ID zusammen, die der Router irgendwie vergessen hat.
Nun muss ich irgendwie herausfinden, wie das China Tool da funktioniert und was ich da genau machen muss… Oder hat da jemand einen schnellen Rat? :smiley:


#15

Ich hatte mehrere 3600er, die nicht mehr booten wollten (was auch immer, mir unbekannt) und sich beharrlich geweigert haben, eine Pushbutton-TFTP-Recovery der StockFW zu nehmen.
Also genommen haben sie es schon, aber dann nicht geflashed.
Aus Faulheit habe ich dann aber nicht aufgeschraubt, sondern dem dann einfach mehrfach(!) einen aktuellen OpenWRT-Trunk-factory gegeben.
Beim gefühlt 3. Anlauf bootete das dann auch.
Danach habe ich dann noch einen TFTP-Pushbutton auf die Stockfirmware ausgeführt.

Das mag jetzt Glück gewesen sein, es fühlt sich für mich aber so an, als ob es da irgendeine “Instabilität” im Bootloader gibt, wo es dann auf Geduld ankommt. Belegen per Consolen-Log kann ich’s jedoch leider nicht.


#16

@mrx Die Produkt IDs passen jetzt nach dem letzten Logauszug. Dieses Chinatool wird da auch nichts bringen. Ist die Konsole sauber gelötet, es könnte auch sein das der Reset Schalter kurzgeschlossen ist.
@adorfer Kann man den Bootloader komplett neu schreiben? Könnte es was bringen die Stockfirmware mit CTRL-C zu booten und dann ein ungestripptes Stockimage zu schreiben?


#17

Einige Chinesen scheinen das getan zu haben, da gibt es nämlich für TP-Link-Geräte einen UBoot mit Webinterface.
(Das ist jetzt kein Witz! Auch wenn’s dir hier nicht weiterhelfen wird mit dem vermutlich vergurkten Original-Bootloader. Ich würde mir wünschen, dass diese Dinger auch den Weg nach Westeuropa finden würden. Screenshot ist von Google-Translate übersetzt. Im Original ist das alles Mandarin.)


#18

das mit dem product id verify fail! hatte ich auf nem 4900 auch. er wollte nix, aber auch gar nix fressen…
eth0 der lan karte muss 192.168.0.66 haben
org tp-link fw bootloader gestrippt mit:
dd if=wdr4900nv1_en_3_14_3_up_boot(130320).bin of=wdr4900nv1_tp_recovery.bin skip=769 bs=512 das ganze auf den tftp server geworfen.
auf der seriellen dann eigeben:
tftpboot
lädt das recovery ins ram vom 4900
dann:
sf erase 0x60000 0xf80000
sf write 0x1000000 0x60000 0xf80000
reset

und? :wink: er bootet wieder…

vlt hilft es ja jemand


#19

das ganze geht ohne serielle normalerweise auch prima. hab das bei uns mal ins wiki gepinnt …
TP Link flashen per tftp ohne Console


#20

Genau das Flashen per Push Button hat bei mir nicht geklappt, das Image hat der Router wegen kaputter Product ID nicht geflasht.