пятница, 10 января 2014 г.

TP-Link TL-WR1043ND. Рекогносцировка плацдарма.

В прошлой части я рассказал вкратце, что мне нужно сделать с роутером, как его разобрать и что вам понадобится, если вы решитесь на такую же авантюру.

Итак, приступим. Цепляемся к роутеру по UART, как это сделать и с помощью чего, смотрите в постскриптуме первой части. У меня на рабочей станции установлен Linux Mint 16, поэтому я использовал minicom. Для Windows подойдет и Putty (не ведитесь на байки о том, что якобы нормально оно работает только под XP, если кабель нормальный, то заработает и на Win 7). Открываем терминал, включаем роутер, наблюдаем за процессом загрузки. U-Boot в качестве загрузчика, Linux-2.6.15-ap83 в качестве ядра, SquashFS для файловой системы. Учетные данные для входа - root/5up, busybox 1.0.1 в качестве шелла и это все в прошивке 2013 года. Архитектура MIPS big-endian. Это - система, с которой нам предстоит работать. 

U-Boot 1.1.4 (Apr 28 2013 - 16:01:02)

AP83 (ar9100) U-boot 0.0.11
DRAM:
sri
32 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash: 8 MB
Using default environment

In: serial
Out: serial
Err: serial
Net: ag7100_enet_initialize...
No valid address in Flash. Using fixed address
: cfg1 0xf cfg2 0x7114
eth0: 00:03:7f:09:0b:ad
eth0 up
eth0
Autobooting in 1 seconds## Booting image at bf020000 ...
Uncompressing Kernel Image ... OK

Starting kernel ...

Linux version 2.6.15--LSDK-6.1.1.40 (root@CentOS) (gcc version 3.4.4) #1 Thu Ju2
flash_size passed from bootloader = 8
CPU revision is: 00019374
Determined physical RAM map:
memory: 02000000 @ 00000000 (usable)
User-defined physical RAM map:
memory: 02000000 @ 00000000 (usable)
Built 1 zonelists
Kernel command line: console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashM
Primary instruction cache 64kB, physically tagged, 4-way, linesize 32 bytes.
Primary data cache 32kB, 4-way, linesize 32 bytes.
Synthesized TLB refill handler (20 instructions).
Synthesized TLB load handler fastpath (32 instructions).
Synthesized TLB store handler fastpath (32 instructions).
Synthesized TLB modify handler fastpath (31 instructions).
Cache parity protection disabled
PID hash table entries: 256 (order: 8, 4096 bytes)
Using 200.000 MHz high precision timer.
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 30516k/32768k available (1407k kernel code, 2236k reserved, 300k data, )
Mount-cache hash table entries: 512
Checking for 'wait' instruction... available.
NET: Registered protocol family 16
Jumpstart button pressed.
SCSI subsystem initialized
AR7100 GPIOC major 0
squashfs: version 3.3 (2007/10/31) Phillip Lougher
squashfs: LZMA suppport for slax.org by jro
Initializing Cryptographic API
io scheduler noop registered
io scheduler deadline registered
Serial: 8250/16550 driver $Revision: #2 $ 1 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0x0 (irq = 19) is a 16550A
RAMDISK driver initialized: 1 RAM disks of 8192K size 1024 blocksize
PPP generic driver version 2.4.2
PPPoX init, max protocols:3
NET: Registered protocol family 24
pppox protocol 0 register. max:3
cmdlinepart partition parsing not available
Searching for RedBoot partition table
5 RedBoot partitions found on MTD device ar7100-nor0
Creating 5 MTD partitions on "ar7100-nor0":
0x00000000-0x00020000 : "boot"
0x00020000-0x00120000 : "kernel"
0x00120000-0x007e0000 : "rootfs"
0x007e0000-0x007f0000 : "config"
0x007f0000-0x00800000 : "art"


.................................................................................

TL-WR1043ND mips #1 Thu Jun 7 10:37:03 HKT 2012 (none)
TL-WR1043ND login:



Примемся за прошивку. Крайне рекомендую, начиная с этого момента, продолжать работу под Linux, т. к. некоторые вещи будут выглядеть весьма неоднозначно. Качаем последнюю прошивку с официального сайта, именно в нее мы будем пытаться добавить незаявленный функционал. Ставим binwalk, советую вне зависимости от вашего дистрибутива запускать debian-quick-install.sh, поскольку он поставит свежий firmware-mod-kit. Теперь до следующего этапа binwalk, dd и squashfs-tools - наши лучшие друзья. В двух словах: binwalk - это такая хитрая утилита, которая просматривает файл на предмет известных ей сигнатур (а их он знает много) и при натравливании ее на какую-нибудь прошивку с большой вероятностью расскажет, по какому адресу в прошивке находится загрузчик, файловая система и ядро, чем они сжаты (gzip/bzip2/lzo/lzma), какой тип у файловой системы, а заодно попытается расшифровать заголовок прошивки, если таковой встретится; squashfs-tools - комплект утилит для работы со SquashFS; dd - "копируем откуда угодно куда угодно сколько угодно с любым смещением и в любых количествах". Теперь, когда все установлено и скачано, можно разбирать прошивку на составляющие. Проходим по прошивке binwalk'ом, результаты нам понадобятся, по ним разбираем прошивку на составляющие части с помощью dd. 
tomcat@workplace ~/tp-link/archives $ binwalk wr1043nv1_en_3_13_13_up_boot\(130428\).bin

DECIMAL HEX DESCRIPTION
---------------------------------------------------------------------------------------------------------
0 0x0 TP-Link firmware header, firmware version: 3.13.13, image version: "ver. 1.0", product ID: 0x10430001, product version: 1, kernel load address: 0x80002000, kernel entry point: 0x801AE000, kernel offset: 512, kernel length: 828991, rootfs offset: 1048576, rootfs length: 7077888, bootloader offset: 0, bootloader length: 113884
94784 0x17240 U-Boot boot loader reference
131584 0x20200 TP-Link firmware header, firmware version: 3.13.13, image version: "ver. 1.0", product ID: 0x10430001, product version: 1, kernel load address: 0x80002000, kernel entry point: 0x801AE000, kernel offset: 512, kernel length: 828991, rootfs offset: 1048576, rootfs length: 7077888, bootloader offset: 0, bootloader length: 0
132096 0x20400 gzip compressed data, was "vmlinux.bin", from Unix, last modified: Sun Apr 28 11:02:58 2013
1180160 0x120200 Squashfs filesystem, big endian, lzma signature, version 3.1, size: 3774504 bytes, 545 inodes, blocksize: 65536 bytes, created: Sun Apr 28 11:12:31 2013
tomcat@workplace ~/tp-link/archives $ dd if=wr1043nv1_en_3_13_13_up_boot\(130428\).bin of=bootldr bs=1 skip=512 count=113884
113884+0 записей получено
113884+0 записей отправлено
скопировано 113884 байта (114 kB), 0,15294 c, 745 kB/c

В этой прошивке U-Boot хранит свой заголовок в середине своей области, поэтому мы вытаскиваем все от конца первого header до начала второго. Я один раз по запаре уже вытащил только от заголовка загрузчика до конца, теперь у меня есть материал для будущей статьи про восстановления роутера с помощью JTAG.

После разбора прошивки на составляющие наиболее интересным для нас является rootfs, то есть файловая система прошивки. Можете с ней поэкспериментировать самостоятельно с учетом вывода binwalk, а можете не экспериментировать и сразу выбрать squashfs-tools-3.3-lzma из набора firmware-mod-kit. Только распаковывать рекомендую сразу от root или с sudo, потому что от обычного пользователя файловая система распакуется с пустым каталогом /dev. Если ее собрать обратно и залить на роутер, придется заниматься процедурой восстановления прошивки, т. к. ядро не сможет найти ни init, ни ttyS0, ни mtdX, один из которых должен быть примонтирован в качестве корневой ФС, что в свою очередь ввергнет его в пучину страха и отчаяния (kernel panic по-нашему). Изучение файловой системы приведет нас к следующему выводу - на самом деле всем управляет местный httpd, который, забегая вперед, является разработкой TP-Link и исходников в свободном доступе не имеет. Заодно можно убедиться в том, что никаких других штатных средств управления, кроме web-интерфейса, роутер не имеет. Busybox через /dev/ttyS0 не в счет, поскольку для доступа к нему требуется разобрать роутер и попрощаться с гарантией (в теории - на самом деле никаких пломб внутри нет, поэтому если разбирать аккуратно, никто этого определить и доказать не сможет). Так вот, при дизассемблировании штатного веб-сервера и при просмотре содержимого каталога /web выясняется, что практически каждая страничка интерфейса обрабатывается сервером по-своему, т. к. почти на каждую из них в сервере есть отдельная функция. То есть при нажатии на кнопку HTML-формы страница вызывает сама себя POST-запросом с указанием некоторого параметра (или нескольких), который в свою очередь обрабатывается веб-сервером особым образом (открытие flash, запись туда, закрытие flash, перезапуск сервисов и т. д.)
Возвращаясь к файловой системе, хочется отметить, что нормальное управление и UART - слегка неподходящие друг другу понятия, поэтому мне захотелось встроить в прошивку какой-нибудь SSH-сервер. Весьма неплохим решением для этого является dropbear. Поскольку собирать его в той среде, в которой он должен работать, возможности нет, придется заняться кросс-компиляцией, что и будет рассмотрено в следующей части. А для этого пристальное изучение файловой системы нам сообщит о том, что следов libc6 там не обнаружено, зато присутствует uClibc версии 0.9.29. 
Подведем итоги перед завершением второй части. У нас есть Linux-2.6.15 MIPS big-endian и uClibc-0.9.29 в качестве библиотеки C, причем поменять ее на что-нибудь другое не получится, т. к. управлением роутера занимается проприетарный веб-сервер. В принципе, для третьей части этой информации хватит.

Комментариев нет:

Отправить комментарий