Практический реверс-инжиниринг. Часть 2 – Исследование прошивки

Практический реверс-инжиниринг. Часть 2 – Исследование прошивки

Теперь у нас есть те же самые возможности, как и у разработчика устройства, который хочет выполнить отладку, управлять системой и так далее.

Автор: Juan Carlos Jiménez

В первой части мы нашли UART-порт, позволяющий получить доступ к шеллу в ОС Linux. Теперь у нас есть те же самые возможности, как и у разработчика устройства, который хочет выполнить отладку, управлять системой и так далее.
Метод, которым мы воспользовались для доступа к системе, - довольно прост, не требует дорогостоящих инструментов и зачастую дает хорошие результаты. Если вы хотите выполнить какие-то трюки с аппаратной частью, но у вас нет времени на глубокий анализ, на этом этапе можно закончить низкоуровневые исследования и приступить к работе с высокоуровневыми интерфейсами: сетевыми уязвимостями, протоколами настроек ISP и так далее.

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

Однако вначале ознакомьтесь с заявлением об отказе от ответственности на случай, если я обнаружу нечто конфиденциальное.

Примечание: я нахожусь в постоянном контакте со специалистами по безопасности компанииHuawei, и у разработчиков было время ознакомиться с теми данными, которые я собираюсь опубликовать в данной статье. Сотрудники подтвердили, что в опубликованных сведениях нет ничего конфиденциального. Кроме того, я попытался договориться с TalkTalk, но не смог найти специалистов по безопасности этой компании.

Краткое содержание предыдущей статьи


Рисунок 1: Плата роутера Huawei HG533

Мы запустили последовательный терминал и включили роутер.


Рисунок 2: Процедура загрузки роутера

Нажимаем enter и получаем приветственное сообщение от командной оболочки ATP CLI с предложением ввести логин и пароль. Вводим admin:admin и оказываемся в командной строке. Выполняем команду shell и попадаем в оболочку BusyBox CLI (подробнее о BusyBox будет рассказано далее).

-------------------------------
-----Welcome to ATP Cli------
-------------------------------
Login: admin
Password: #Password is ‘admin'
ATP>shell
BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# ls
var usr tmp sbin proc mnt lib init etc dev bin

На данный момент мы обнаружили три основных слоя прошивки, используемой на чипсете Ralink IC:

  • U-boot: загрузчик устройства, который анализирует схему памяти, активизирует главную прошивку и выполняет некоторые другие низкоуровневые задачи.
  • Linux: роутер работает на базе ОС Linux, которая управляет аппаратной частью, координирует параллельные процессы и так далее. Поверх Linux запускаются оболочки ATP CLI и BusyBox.
  • Busybox: небольшой бинарный файл, включающий урезанные версии linux-команд. Сюда же входит шелл (команда shell), откуда мы запускаем команды.

Низкоуровневые интерфейсы менее понятны и могут не иметь доступа ко всем нужным данным и могут привести устройство к выводу из строя. То есть всегда лучше начинать исследования с BusyBox.
Вначале рассмотрим повнимательнее процесс загрузки на предмет присутствия полезной информации.

Отладочные сообщения при загрузке

Анализируя процесс загрузки, можно найти много полезной информации, например, тип компрессионного алгоритма, используемого для сжатия некоторых сегментов флеш-памяти.


Рисунок 3: Компрессионный алгоритм, используемый для сжатия ядра

Перед извлечением информации будет полезным предварительно ознакомление со структурой памяти.



Рисунок 4: Полная карта флеш-памяти

Далее выявляем использование других компрессионных алгоритмов:


Рисунок 5: Компрессионный алгоритм, используемый для сжатия файловой системы

Мы будем иметь дело с компрессионными алгоритмами во время работы с «сырой» информацией во внешней флеш-памяти, и будет нелишним получить базовое представление об этих алгоритмах.

Что такое ATP CLI и BusyBox? (теория)

В роутере на базе чипсета Ralink IC используется Linux-ядро в целях управления памятью и параллельными процессами и осуществления общего контроля над системой. Согласно документации, используется Linux 2.6.21 SDK. ATP CLI используется в качестве интерфейса командной строки и одновременно является частью ядра. Кроме того, ATP CLI представляет собой первый уровень аутентификации, но по возможностям является очень ограниченным:

ATP>help
Welcome to ATP command line tool.
If any question, please input "?" at the end of command.
ATP>?
cls
debug
help
save
?
exit
ATP>

В перечне выше не указана команда для запуска шелла (обычно shell или sh). ATP CLI включает в себя менее 10 команд и не поддерживает сложное управление процессами и навигацию по файловой системе. И здесь нам на помощь приходит BusyBox.

BusyBox представляет собой одиночный бинарный файл, содержащий урезанные версии самых распространенных unix-команд, полезных и для разработчиков и, что более важно, для извлечения/сохранения памяти (начиная от ls/cd и заканчивая top). Во время загрузки System V инициирует скрипты и каналы (pipe), что позволяет использовать Ralink IC как полноценную систему на базе ОС Linux.

Внутри бинарного файла BusyBox включен шелл, что дает доступ к остальным командам:

ATP>shell
BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# ls
var usr tmp sbin proc mnt lib init etc dev bin
#
# ls /bin
zebra swapdev printserver ln ebtables cat
wpsd startbsp pppc klog dns busybox
wlancmd sntp ping kill dms brctl
web smbpasswd ntfs-3g iwpriv dhcps atserver
usbserver smbd nmbd iwconfig dhcpc atmcmd
usbmount sleep netstat iptables ddnsc atcmd
upnp siproxd mount ipp date at
upg sh mldproxy ipcheck cwmp ash
umount scanner mknod ip cp adslcmd
tr111 rm mkdir igmpproxy console acl
tr064 ripd mii_mgr hw_nat cms ac
telnetd reg mic ethcmd cli
tc radvdump ls equipcmd chown
switch ps log echo chmod
#

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

Исследование файловой системы

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


Рисунок 6: Результат работы команды top

Полученная информация не представляет особого интереса, поскольку роутер не выполняет каких-либо задач.

На рисунке выше видно, что запущен процесс usbmount, и, следовательно, роутер должен поддерживать нечто, что можно воткнуть в USB-порт. Попробуем, подключить флешку…

usb 1-1: new high speed USB device using rt3xxx-ehci and address 2
[...]
++++++sambacms.c 2374 renice=renice -n +10 -p 1423

USB-устройство опознано, смонтировано в папку /mnt/usb1_1/, а также запущен сервер Samba. Содержимое папки /etc/samba/:
# ls -l /etc/samba/
-rw-r--r-- 1 0 0 103 smbpasswd
-rw-r--r-- 1 0 0 0 smbusers
-rw-r--r-- 1 0 0 480 smb.conf
-rw------- 1 0 0 8192 secrets.tdb
# cat /etc/samba/smbpasswd
nobody:0:XXXXXXXXXXXXXXXXXXX:564E923F5AF30J373F7C8_______4D2A:[U ]:LCT-1ED36884:

Другая информация, которая может оказаться полезной:

  • netstat -a: сетевые порты, которые просушивает устройство.
  • iptables –list: мы могли бы установить telnet и продолжить исследование сети, но я предпочитаю пользоваться средствами системы bare metal (система виртуализации с гипервизором).
  • wlancmd help: утилита для управления WiFi-радио. Доступно множество опций
  • /etc/profile
  • /etc/inetd
  • /etc/services
  • /var/: содержит файлы, используемые системой, во время каких-либо операций
  • /etc/: конфигурационные файлы системы и т. д.

Директории /var/ и /etc/ всегда содержат массу полезной информации. Смысл некоторых файлов понятен почти сразу. Например, говорит ли вам о чем-то название /etc/serverkey.pem?


Рисунок 7: Содержимое файла serverkey.pem

Присутствие секретных ключей для TLS-сертификатов во встроенных системах не является распространенным явлением. Если вы получите ключи через аппаратную часть, то в будущем сможете атаковать все остальные устройство схожей модели.

Данный ключ также можно использовать для коммуникации с сервером, принадлежащим компании Huawei или ISP, хотя подобная практика не особо распространена. С другой стороны, достаточно часто можно найти публичные сертификаты, используемые для коммуникации с удаленными серверами.

В нашем случае мы нашли два сертификата рядом с секретным ключом; оба сертификата являются самоподписанными одной и той же «личностью».

  • /etc/servercert.pem: наиболее вероятно этот сертификат используется в связке с serverkey
  • /etc/root.pem: возможно используется для связи с сервером, принадлежащим ISP или Huawei.

Больше информации содержится в файлах /etc/ppp256/config и /etc/ppp258/config:


Рисунок 8: Содержимое файла etc/ppp256/config

Данная учетная запись доступна через HTTP-интерфейс, поэтому я опубликовал эту информацию. Однако в других роутерах этих учетных данных может не быть (подробности далее).

Когда в системе находится столь много файлов, быстро провести исследование без специальных утилит затруднительно. Поэтому мы скопируем данные на USB-устройство и продолжим анализ на нашем компьютере.

Поиск паролей

После того как мы скопировали множество файлов на наш компьютер, то можем значительно ускорить анализ. Результат работы команды find . -name *.pem говорит о том, что среди файлов отсутствуют TLS-сертификаты.

Попробуем поискать слово password во всех файлах. Команда: grep -i -r password.


Рисунок 9: Перечень файлов с содержимым password

На рисунке выше видно множество учетных записей, большинство из которых используются для протоколов STUN, TR-069 и локальных служб. Я опубликовал данные записи здесь, поскольку их можно также найти через HTTP-интерфейс (но эта информация обычно скрыта).

Если хотите узнать, что произойдет, если кто-то украдет эти учетные записи, можете ознакомиться с докладом Александра Графа (Alexander Graf) BeyondYourCableModem с конференции CCC 2015. Существуют и другие доклады, где описываются атаки на протокол TR-069, с конференций DefCon, BlackHat и т. д.

Учетные записи идут либо в чистом тексте, либо закодированы в base64. Естественно, раскодировка не представляет особого труда:

$ echo "QUJCNFVCTU4=" | base64 -D
ABB4UBMN


Рисунок 10: Учетные записи в кодировке base64

Выделенная последовательность символов - текущий WiFi-пароль установленный на роутере. Используя данный пароль, находим два очень интересных файла. Не потому, что там интересное содержимое, а потому, что данные файлы являются важной частью функционирования роутера:

  • /var/curcfg.xml: Текущий конфигурационный файл. Среди всего прочего содержит текущий WiFi-пароль, закодированный в base64.
  • /etc/defaultcfg.xml: Стандартный конфигурационный файл, используемый для «заводской перезагрузки». Не содержит стандартный WiFi-пароль (подробнее об этом в следующих статьях).

Исследование ATP CLI

В ATP CLI предусмотрено очень мало команд. Наиболее интересная (помимо shell) - debug. Данная команда не используется в качестве отладчика. debug display выводит информацию относительно команд igmpproxy, cwmp, sysuptime и atpversion, большинство из которых не представляет для нас особого интереса. Однако команда cwmp, кажется, имеет отношение к удаленной настройке роутеров.


Рисунок 11: Информация о команде cwmp

На рисунке выше показана учетная запись протокола CWMP (TR-069), используемая для удаленной настройки роутера. В этот раз отсутствует даже кодировка.

Остальные команды не представляют особого интереса (такие как: очистить экран, раздел справки, сохранить на флешку и выйти).

Исследование CLI в Uboot

Интерфейс командной строки в загрузчике предоставляет доступ к некоторым областям памяти. К сожалению, CLI не дает прямого доступа к флеш-памяти, но в любом случае заслуживает внимания:

Please choose operation:
3: Boot system code via Flash (default).
4: Entr boot command line interface.
You choosed 4
Stopped Uboot WatchDog Timer.
4: System Enter Boot Command Line Interface.
U-Boot 1.1.3 (Aug 29 2013 - 11:16:19)
RT3352 # help
? - alias for 'help'
bootm - boot application image from memory
cp - memory copy
erase - erase SPI FLASH memory
go - start application at address 'addr'
help - print online help
md - memory display
mdio - Ralink PHY register R/W command !!
mm - memory modify (auto-incrementing)
mw - memory write (fill)
nm - memory modify (constant address)
printenv- print environment variables
reset - Perform RESET of the CPU
rf - read/write rf register
saveenv - save environment variables to persistent storage
setenv - set environment variables
uip - uip command
version - print monitor version
RT3352 #

Крайне не рекомендую пользоваться командами erase, mm, mw и nm, если вы не являетесь опытным пользователем и точно не знаете, что делаете. Зачастую вы перезагрузите роутер и в некоторых случаях можете вывести устройство из строя. Нам потребуются команды md (memory display; отобразить память) и printenv.

RT3352 # printenv
bootcmd=tftp
bootdelay=2
baudrate=57600
ethaddr="00:AA:BB:CC:DD:10"
ipaddr=192.168.1.1
serverip=192.168.1.2
ramargs=setenv bootargs root=/dev/ram rw
addip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname):$(netdev):off
addmisc=setenv bootargs $(bootargs) console=ttyS0,$(baudrate) ethaddr=$(ethaddr) panic=1
flash_self=run ramargs addip addmisc;bootm $(kernel_addr) $(ramdisk_addr)
kernel_addr=BFC40000
u-boot=u-boot.bin
load=tftp 8A100000 $(u-boot)
u_b=protect off 1:0-1;era 1:0-1;cp.b 8A100000 BC400000 $(filesize)
loadfs=tftp 8A100000 root.cramfs
u_fs=era bc540000 bc83ffff;cp.b 8A100000 BC540000 $(filesize)
test_tftp=tftp 8A100000 root.cramfs;run test_tftp
stdin=serial
stdout=serial
stderr=serial
ethact=Eth0 (10/100-M)

Environment size: 765/4092 bytes

В перечне выше видны различные настройки, такие как скорость UART-порта и некоторые интересные адреса в памяти. Данные адреса не относятся к флеш-памяти. Адресное пространство флеш-памяти занимает 3 байта: [0x00000000, 0x00FFFFFF].

И все же давайте рассмотрим некоторые из тех адресов. Как насчет kernel_addr=BFC40000?


Рисунок 12: Содержимое адресного пространства BFC40000 - BFC40100

Ничего интересного. Сообщение badd означает bad address (плохой адрес), которое жестко прописано в команде md с целью сообщить, что мы пытаемся получить доступ к некорректной области памяти. На самом деле, данные адреса корректны, но не доступны загрузчику Uboot.

Запустив CLI в загрузчике Uboot, мы остановили загрузку ядра в память и на данный момент имеем доступ к очень ограниченному объему памяти.


Рисунок 13: Адресное пространство, доступное из командного интерфейса в загрузчике

Мы можем найти отдельные куски информации в памяти (например, строку SPI Flash Image), но в целом этот путь тупиковый. Можно ознакомиться с архитектурой памяти, но не более того. Например, начиная с адреса 0x000d0000, видно явное изменение структуры:


Рисунок 14: Изменение структуры памяти на границе 0x000d0000

Что дальше?

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

Спасибо за внимание.

Тени в интернете всегда следят за вами

Станьте невидимкой – подключайтесь к нашему каналу.