Хакінг роутера - частина третя

Опубліковано 29.03.2025, 14:14 в категорії YouTube

Дисклеймер: Розбираючи роутер, ви втрачаєте гарантію, а також можете пошкодити роутер. Сприймайте всю інформацію зі статті виключно як інформацію для ознайомлення. Вся відповідальність за ваші дії буде лежати виключно на вас.

Ось нарешті довгоочікувана фінальна частина в серії відео/статей про хардварний хакінг або ж реверсінжиніринг роутера. Нагадаю що в попередній частині ми отримали доступ до UART шини роутера, а також зробили дамп прошивки роутера. Все це допоможе нам в досягненні сьогоднішньої мети - а саме апгрейді оперативної пам'яті, та збірці актуальної версії OpenWrt.

Одразу скажу що я переоцінив свої сили в цей раз, тому, не дивлячись на те що все вийшло, місцями більше схоже на інструкцію як робити не треба. Але маємо що маємо.

Перш ніж щось робити, раджу вам зберегти логи запуску роутера через picocom за допомогою наступної команди:

picocom /dev/ttyUSB0 —baud 115200 -g kyivstar_boot.txt

Вона створить файл, kyivstar_boot.txt, в який запише все, що було отримано по UART. Деяка інформація звідси буде корисною в подальшому. Тепер можна рухатись далі.

Апгрейд пам'яті

Для того щоб збільшити об'єм оперативної пам'яті роутера, нам треба замінити ось цю мікросхему.

"Мікросхема ОЗП"

Це DDR1 пам'ять, перше покоління так званої Double Data Rate пам'яті. Не дивлячись на те, що їй вже 27 років, зустріти її можна насправді багато де. Наприклад в платах від жорстких дисків. Але в мене, в єдиній донорській платі, стоїть букавльно такий самий чіп як і в роутері.

"Чіп пам'яті роутера (зліва) та чіп пам'яті жорсткого диску (справа)"

Благо після виходу другої частини в цій серії відео, мені написав мій знайомий, Штефан, і відправив ось таку крутезну планку оперативної пам'яті, за що я йому дуже вдячний.

"Планка пам'яті DDR1"

Штефан до речі теж займається електронікою, і іншими крутими штуками. В нього навіть є свій телеграм канал, де він хоч і не часто, але публікує різні цікавинки. А також він адмініструє ось цей крутий канал з мемами по лінуксу і всякому такому, тож раджу вам підписатись. А якщо ви не використовуєте телеграм, то ви молодець, і для вас є дзеркало каналу в Mastodon, і не тільки.

Ітак, перед вам планка пам'яті ДДР1 на 512 MB.

"Наліпка"

Шляхом дуже складних арифметичних операцій, можна дізнатись що кожний з чіпів містить в собі 64 Мб пам'яті:

$$ \frac{Обсяг \space пам'яті}{Кількість \space чіпів} = \frac{512}{8} = 64 MB $$

Тобто аж вдвічі більше, ніж в чіпі який зараз встановлено в роутер. Звісно можна пошукати чіпи і на 128 MB пам'яті, але мені, для експерименту вистачить і цього.

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

"Відпайка чіпу"

Тепер складніше - треба зняти чіп пам'яті з плати роутера. Дана задача ускладнюється за рахунок наявності поруч дуже малих SMD компонентів.

"SMD компоненти поруч"

Якщо випадково збити конденсатор - дуже вірогідно що погіршиться стабільність роботи роутера. Якщо резистор - то роутер взагалі перестане працювати, адже розірветься одна з ліній даних між процесором та оперативною пам'яттю.

"Лінії даних"

Тому, щоб компоненти не улетіли, я спробував захистити їх каптоновим скотчем, після чого наніс флюс, і почав випаювати мікросхему. Але вже через пару секунд виявилось, що подібні температури для наявного в мене скотчу занадто великі, тим паче фен дує прямо на нього, тому він просто почав плавитись. Щож, буду знати))000

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

"Зняття чіпу з роутера"

За допомогою флюсу та паяльної пасти я підготував контакти до запаювання нової мікросхеми, після чого почистив все за допомогою спирту. Ну і найвідповідальніший етап - запайка нового чипу. Знову додавши флюс, я прийнявся запаювати мікросхему. Коли вона запаялась, я почистив все за допомогою спирту, і проконтролював пайку, адже дуже важливо щоб ніжки між собою не злиплись. Відстань між ніжками в таких мікросхемах вкрай мала, тому неозброєним оком якусь проблему з пайкою можна навіть не помітити.

"Ніжки мікросхеми"

Виглядає непогано.

Але лише виглядає, адже роутер перестав включатись D: Просто горять всі світлодіоди і все, навіть логів по UART немає. За кадром я перепробував багато чого:

  • Спробував модифікувати прошивку, замінивши бутлоадер.
  • Спробував повернути старий чіп пам'яті.
  • Ну і спробував повернути старий дамп прошивки.

Але поведінка роутера не мінялась. Хоч я і не чіпав процесор, мені вже здавалось шо я якимось чином вбив його, адже пайка пам'яті виглядала досить непогано, плюс я продзвонив лінії даних, і наче все доходило до процесора. Продзвонювати дуже зручно до речі по узгоджувальним резисторам, вони мають доволі маленький опір, тому мультиметр пищить на них. Головне продзвонювати саме ніжку мікросхеми, а не пад на який вона йде. А про банальні речі типу наявності потрібних напруг годі й говорити, це я все теж перевірив.

І тут я згадав що в мене взагалі то є осцилограф.

Використовуючи осцилограф, я все таки зміг впевнитись шо процесор живий - в момент подачі живлення, на SPI флешку приходив коротенький clock сигнал, а отже процесор мабуть намагається щось зчитати.

"Clock сигнал"

Скоріше за все він зчитує бутлоадер, після чого він намагається помістити його в оперативну пам'ять, і саме на цьому етапі скоріше за все роутер і застряє, тому і немає логів. Перегріти феном і вбити чип пам'яті звучить доволі реалістично, тому я вирішив спробувати ще раз. Благо, дякуючи Штефану, чіпів в мене вдосталь :D

На цей раз я додав нового припою на ніжки чіпу, щоб понизити температуру випаювання, адже з заводу там стоїть безсвинцевий припій, який доволі важко розплавити.

"Зняття мікросхеми"

Обов'язково треба прибрати залишки припою. Головне не жаліти флюсу.

На цей раз я запаював мікросхему вже паяльником а не феном. Роутер знову не включився, але на цей раз, продзвонюючи лінії даних, я помітив що пара ліній не дзвониться. Я пропаяв їх паяльником, і нарешті, роутер включився! Більш того, він навіть автоматично, без модифікацій прошивки, правильно визначив новий чіп пам'яті.

"Логи по UART"

Тепер пам'яті в роутері достатньо для нормального функціонування нових версій OpenWrt. Конкретно цей TP-Link WR840 відрізняється від звичайного тим, що мабуть завдяки Київстару тут вже встановлена флешка на 8 MB. Тому міняти її я не буду, але розповім на що слід звернути увагу, якщо ви все таки будете.

Компілюємо OpenWrt

І так, для того щоб скомпілювати OpenWrt, перш за все потрібно встановити купку залежностей. На різних Лінукс дистрибутивах пакети називаються по різному, але благо OpenWrt детально розписали що де і як робити.

Далі необхідно клонувати репозиторій з вихідним кодом OpenWrt. Я клонував одразу гілку з останньою версією:

git clone —single-branch —branch openwrt-24.10 https://github.com/openwrt/openwrt

Після цього треба запустити скрипт feeds в директорії scripts, який підтягне та встановить основні пакети:

cd openwrt/scripts
./feeds update -a && ./feeds install -a

Він також перевірить наявність залежностей. Тепер можна налаштовувати і компілювати OpenWrt. Але я нагадаю, що наш роутер вже як мінімум 3 роки офіційно не підтримується OpenWrt, тому нам треба підготувати так званий Device Tree Source, або ж dts. Це файл, в якому розписані основні моменти стосовно нашого девайса - в даному випадку це куди підключені кнопки, світлодіоди, де що знаходиться в пам'яті, і тд. Але, зазвичай можна просто взяти dts від схожого роутера, і підлаштувати його під себе, щоб не писати його з нуля. Я взяв dts файл від роутера TP-Link TL-WR841HP v3. В нього такий самий процесор, і такі самі обсяги пам'яті:

"Характеристики схожого роутера"

DTS файли для цього роутера лежать за ось цим шляхом: openwrt/target/linux/ath79/dts

Я копіював файл роутера WR841HP і перейменував його:

cp qca9533_tplink_tl-wr841hp-v3.dts qca9533_tplink_tl-wr840n-v2.dts

Тепер необхідно відредагувати цей файл будь яким зручним для вас способом, я використовував vim. Перше що треба зробити, це замінити модель роутера на відповідну:

/ {
    compatible = "tplink,tl-wr840n-v2", "qca,qca9533";
    model = "TP-Link TL-WR840N v2";

Після цього треба налаштувати до яких GPIO підключені світлодіоди. В даній ситуації мені пощастило, і я просто взяв ці піни з файлу mach-tl-wr841n-v9.c, з гілки OpenWrt-18.06, де цей роутер ще підтримувався. Зайві світлодіоди я прибрав. Наприклад:

leds {
        compatible = "gpio-leds";

        wifi {
            label = "green:wifi";
            gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
            linux,default-trigger = "phy0tpt";
        };

Наступний етап - кнопки. В цього роутера всього лише одна кнопка, яка відповідає за Reset та WPS. Її GPIO пін теж прописаний в файлі з якого я взяв GPIO світлодіодів.На неї я прописав лише функцію Reset, але за бажанням туди можна взагалі щось своє повісити. Інші зайві кнопки я теж прибрав.

    keys {
        compatible = "gpio-keys";

        reset {
            label = "Reset button";
            linux,code = <KEY_RESTART>;
            gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
            debounce-interval = <60>;
        };

    };

Ну і найцікавіше - SPI флешка, &spi. Тут прописано де на флешці в OpenWrt знаходиться наприклад бутлоадер:

            uboot: partition@0 {
                label = "u-boot";

або SquashFS:

            partition@20000 {
                compatible = "tplink,firmware";

або так званий розділ ART:

            partition@7f0000 {
                label = "art";

ART Розділ

ART, або ж Atheros Radio Test, це дуже важливий розділ, в якому знаходяться калібрувальні дані, унікальні для кожного окремого роутера. Без них, не буде працювати WiFi. Тому якщо ви втратите цей розділ, можете забути про бездротове з'єднання. Звісно можна взяти дамп прошивки з такого ж роутера, і витягнути ART розділ звідти, але як я й казав, цей розділ унікальний для кожного роутера, тому з таким розділом ваш роутер буде працювати не зовсім правильно. Перевірено на власному досвіді)))00

В звичайних умовах, коли ви будете встановлювати OpenWrt через режим Recovery або просто через оновлення прошивки, стосовно ART розділу можна не перейматись. Але при зміні розміру флешки доведеться вручну подбати про розміщення ART розділу в необхідне місце, але про це згодом.

В даному DTS файлі прописані розділи під флешку 8 MB, тому мені не треба нічого змінювати. Якщо ви будете ставити флешку 16 MB, то треба буде розширити SquashFS розділ, а також перемістити ART. Можете взяти DTS файл якогось роутера з флешкою на 16 MB як приклад.

Тепер DTS файл готовий, але щоб конфігуратор OpenWrt його побачив, треба ще відредагувати файл tiny-tp-link.mk за шляхом openwrt/target/linux/ath79/image/tiny-tp-link.mk. Тут необхідно просто зробити новий define, де вказати шаблон для пам'яті, назву процесора, ну і там всякі моделі, вендори, і тд. Знову ж таки, це легко зробити опираючись на вже існуючі дефайни. Я додав в кінець файлу ось це:

define Device/tplink_tl-wr840n-v2
  $(Device/tplink-8mlzma)
  SOC := qca9533
  DEVICE_VENDOR := TP-Link
  DEVICE_MODEL := TL-WR840N
  DEVICE_VARIANT := v2
  SUPPORTED_DEVICES := tl-wr840n-v2
endef
TARGET_DEVICES += tplink_tl-wr840n-v2

Після цього зберігаємо файл і можна повернутись в кореневу директорію репозиторію і виконати команду make menuconfig. З'явиться менюшка яка точно знайома тим, хто компілював ядро Linux. Тут можна конфігурувати різні аспекти OpenWrt перед компіляцією.

"make menuconfig"

Але для початку треба правильно обрати основні параметри:

  • ATH79 в якості Target System.

  • Devices with mall flash в якості Subtarget

  • Ну і в Target Profile обираємо наш роутер, TP Link WR840N V2, який тепер тут присутній завдяки модифікованим файлам.

"Обрані налаштування"

На додачу слід включити вебінтерфейс - LuCI. Всі інші налаштування вже обираються в залежності від ваших потреб. Можете погортати і подивитись шо тут є, а натискаючи кнопку h - відкриється віконце, в якому можна дізнатись більше про той чи інший пункт меню. Наприклад можна одразу додати якісь пакети, нехай це буде rsync для передачі файлів по ssh.

"rsync"

Додаючи пакети на етапі компіляції OpenWrt, ви суттєво зменшуєте їх розмір в порівнянні з тим, якби ви встановили їх вже після встановлення OpenWrt на роутер. Це відбувається за рахунок того, що на етапі компіляції, компілятор стисне пакети, і помістить їх в SquashFS, в той час як при звичайному встановленні, ви кладете їх в так званий OverlayFS, поруч з SquashFS без стиснення.

Завершивши конфігурування OpenWrt, зберігаємо все це в файл .config і виходимо.

Тепер за допомогою команди make можна скомпілювати прошивку. Можна також додати фалг -j, після якого вказати кількість потоків процесора які ви хочете віддати під цю задачу. Наприклад в мене процесор має 8 потоків, тому:

make -j8

Це доволі довгий процес, тому можете піти зайнятись своїми справами. Головне час від часу дивитись, чи не вилізла там якась помилки. Також будьте готові виділити десь приблизно 20 гігабайт вільного місця, бо в процесі компіляції розмір репозиторію стрімко збільшиться. На моєму ноутбуці (i5-1035G1) процес компіляції зайняв приблизно 70 хвилин.

По завершенню процесу, за шляхом openwrt/bin/targets/ath79/tiny/ буде лежати купка файлів. Нас цікавить бінарник який в своїй назві має слово factory.

"Результат компіляції"

Якщо ви не змінювали розмір флешки, то можна просто через Recovery зашити цей файлик, і все, на вашому роутері з'явиться OpenWrt. Але я розповім що робити далі, якщо ви все таки змінили розмір флешки. Для зручності я копіював бінарник factory в іншу директорію, де також знаходиться оригінальний дамп прошивки роутера, який ми зробили в другій частині.

Перш за все, через зміну розміру флешки, треба скачати якийсь інший бутлоадер, наприклад Breed Bootloader. Переходимо на сайт, і бачимо перед собою актуальні версії бутлоадера для різних процесорів. Але особисто в мене чомусь не вийшло подружити їх з OpenWrt. Методом тика я виявив, що старіша версія, а саме r1286 працює без проблем, тому качаємо її, в нашому випадку це процесор QCA9533, файл breed-qca953x.bin

Тепер у нас в директорії 3 файли - dump, openwrt, та bootloader. Для зручності я їх так і перейменував.

Перш за все, треба з дампу витягти ART розділ, про який я казав раніше. Зазвичай він знаходиться в самому кінці дампа, але впевнитись в цьому нам допоможуть раніше збережені логи запуску роутера. Відкриваємо їх, і шукаємо інформацію про MTD розділи, і впевнюємось що ART розділ дійсно знаходиться в кінці флешки:

Creating 5 MTD partitions on "ath-nor0":
0x000000000000-0x000000020000 : "u-boot"
0x000000020000-0x000000120000 : "kernel"
0x000000120000-0x0000007e0000 : "rootfs"
0x0000007e0000-0x0000007f0000 : "config"
0x0000007f0000-0x000000800000 : "art"

Конвертуємо шістнадцяткову систему в десяткову, і вирізаємо ART розділ за допомогою ось такої ось команди:

dd bs=1 skip=8323072 if=dump.bin of=art.bin

Звісно витягти цей розділ можна і без дампу, наприклад через UART або SSH, але особисто цей роутер з заводу дуже урізаний, на ньому нема ні dd, ні mtd, не інших корисних штук, тому особисто мені легше взяти цей розділ з дампу. Тепер, маючи новий бутлоадер, новоскомпільований OpenWrt, та ART розділ, можна об'єднати все це, і записати на SPI флешку роутера.

Для цього, треба спочатку створити пустий файл, шаблон, куди ми по черзі і запишемо все необхідне - спочатку бутлоадер, потім openwrt, потім калібрувальні дані. Зробити це можна за допомогою ось такої команди. Розмір блоку, bs, тут треба змінити на ваш розмір флешки:

dd if=/dev/zero bs=8M count=1 | tr "\000" "\377" > test_firmware.bin

dd візьме з /dev/zero NULL файлів на 8 MB, а tr перетворить їх на прийнятні для SPI флешки 0xFF байти.

Тепер ми маємо пустий файл, в який можна записати все що треба. Перш за все, запишемо в початок файлу бутлоадер, за допомогою ось такої команди:

dd conv=notrunc if=bootlodaer.bin of=test_firmware.bin

Далі дивимось в нашому DTS файлі, де починається розділ зі SquashFS, тобто так званий firmware, конвертуємо в десяткову, і записуємо на це місце скомпільований openwrt:

            partition@20000 {
                compatible = "tplink,firmware";
                label = "firmware";
                reg = <0x020000 0x7d0000>;

Початок на 0x020000. В десятковій це 131072:

dd conv=notrunc bs=1 seek=131072 if=openwrt.bin of=test_firmware.bin

Так само робимо і з ART розділом:

            partition@7f0000 {
                label = "art";
                reg = <0x7f0000 0x010000>;
                read-only;

Початок на 0x7f0000. В десятковій це 8323072:

dd conv=notrunc bs=1 seek=8323072 if=art.bin of=test_firmware.bin

Звісно бажано ще в певне місце прописати мак адрес, бо без цього він буде виглядати приблизно ось так FF:FF:FF:FF:FF:FF, але це можна потім і через вебінтерфейс опенврт зробити.

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

Тепер включаємо роутер, і дивимось по UART, чи запускається він.

"Логи запуску"

Чудово! Знали б ви насправді скільки я часу та нервів витратив на все це. Але не дивлячись на все це, роутер все ще працює, ба більш того, нам таки вдалось портувати на нього свіжу версію OpenWrt!Щоправда з розпіновкою світлодіодів мені таки не пощастило, чомусь працює лише два світлодіоди. Мабуть таки версія роутера від Київстар має якісь відмінності. Ну але тут я цього виправляти вже не буду, тим паче там нічого цікавого - встановити пакет для керування GPIO, знайти до яких GPIO підключені світлодіоди, або просто продзвонити, і знаючи де висить потрібний світлодіод - переписати DTS файл.

Разом з OpenWrt ми на додачу записали ще й крутий бутлоадер, який при невдалому запуску основної операційної системи, наприклад після невдалого оновлення чи ще чогось, підіймає вебінтерфейс, через який його можна легко прошити. Щоправда є одна проблемка - англійської мови тут нема, є лише китайська. Тому доводиться використовувати перекладач. Але, дякую і на цьому.

Стаття вийшла затягнутою, перенасиченою інформацією, та і не дуже цікавою насправді. Але, якщо ви дочитали аж до цього моменту, дякую вам! Я намагався тут розкрити всі моменти, які в мене викликали питання, коли я тільки починав цим займатись.

До речі я зробив форк OpenWrt, можете відкрити там гілку з 24-ю версією, і подивитись комміти, щоб більш детально оглянути модифіковані файли. Також я залив туди скомпільовані бінарники OpenWrt, а також дамп, який можна залити програматором на флешку, можливо комусь буде корисно. Хоча сумніваюсь, що хтось ще буде цим займатись з конкретно цим роутером.

Звісно деякі моменти довелось опустити, ну і для повторення процесу вам потрібно мати базові знання в роботі з Linux системами.

Ще раз вдячний Штефану за оперативну пам'ять, бо якби не він, не знаю коли б це відео взагалі вийшло. Тож можете йому подякувати від мене, і підписатись на його канали!

Post Scriptum

Це текстова версія мого відео. Переглянути його можна за посиланням.