Для отработки навыков взлома IoT-устройств автор купил за $10 роутер TP-Link TL-841N(EU) на Facebook Marketplace. План был такой: вскрыть корпус, найти UART, получить root-шелл, снять прошивку двумя способами и покопаться в файловой системе в поисках уязвимостей.
Вскрытие проблем не составило. UART-порты на плате оказались подписаны, для проверки TX-пина автор использовал мультиметр — на нём при загрузке должно плавать напряжение. Подключив китайский USB-to-UART адаптер (3.3V/5V), припаяв GND, RX и TX, автор запустил picocom -b 115200. Роутер сразу дал root-шелл.
Первый способ снять прошивку — через UART и TFTP. На роутере посмотрели разделы в /proc/mtd, подняли на Mac tftp-now сервер и по очереди передали образы mtd0-mtd6 командой tftp -p -l /var/partition.bin. Метод рабочий, но муторный — пришлось писать файлы в RAM-раздел /var и сразу удалять.
Второй способ — выпайка не нужна. На обратной стороне платы нашёлся чип флеш-памяти GD25Q64CSIG (25 означает SPI, напряжение 3.3V). Автор прицепил программатор CH341A и через flashrom --programmer ch341a_spi -r modem.bin снял полный дамп. Затем с помощью dd и адресов из /proc/mtd дамп разобрали на те же mtd-секции. binwalk сам не смог корректно определить U-Boot — оказалось, это кастомная версия Ralink UBoot Version. Rootfs (SquashFS) на Mac не распаковался через sasquatch, поэтому автор вручную вырезал mtd2 через dd и запустил unsquashfs -no-xattrs. Оба метода дали почти одинаковые образы.
Дальше пошли искать интересное. strings из mtd3-config.bin показал хардкод-WPS-пароль, который напечатан на корпусе роутера. Там же нашлись учётные данные PPPoE от провайдера Unitiair — похоже, оставшиеся от прошлого владельца. Самое неприятное: после полного сброса кнопкой RESET (10 секунд, проверено по логам) эти PPPoE-креды всё ещё лежат в конфиг-разделе флеша. То есть factory reset не стирает настройки, которые внёс провайдер. Это перекликается со старой CVE-2026-4346, только там говорили про «слабую аутентификацию» на serial-интерфейсе, хотя аутентификации там нет вообще.
В rootfs нашлись стандартные admin/admin для веб-интерфейса и бессолевой MD5-хэш пароля пользователя admin. Hashcat с словариком справился за несколько секунд: пароль оказался admin:1234. Так что роутер отдаёт кучу секретов любому, у кого есть физический доступ.