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

Опубліковано 12.02.2025, 11:59 в категорії YouTube

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

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

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

"SPI флешка на платі"

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

"25Q64"

Це енергонезалежна пам'ять, яка використовує шину SPI у якості шини даних. Окрім SPI ще може використовуватись I2C, розрізнити їх можна за префіксом в назві мікросхеми:

  • 25 - SPI (наприклад 25Q64)
  • 24 - I2C (наприклад 24C64)

З назви мікросхеми також можна дізнатись об'єм пам'яті мікросхеми, ось він - 25Q64. Можна подумати що це 64 Мегабайти, але ні, насправді це Мегабіти, а так як байт складається з 8 бітів, треба 64 розділити 8 і ми отримаємо 8, тобто об'єм мікросхеми - 8 Мегабайт. Це актуально і для мікросхем з I2C, але там замість Мегабітів - Кілобіти.

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

Зчитати такі мікросхеми можна за допомогою спеціальних програматорів для мікросхем пам'яті. В мене є ось такий програматор Mini Programment на мікросхемі CH341A.

"CH341A"

Хоч він не дуже дорогий, ще й підтримує як мікросхеми 25-ї серії, так і 24-ї, ще й може використовуватись як UART адаптер, рекомендувати до придбання його я не став би. Справа в тому що він працює лише з 5V логікою, в той час як більшість SPI мікросхем працюють з 3.3V. Окрім цього, при розводці плати китайці допустили ще декілька помилок, які в нових партіях виправляти чомусь не збираються.

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

"SPI флешка на ThinkPad-і"

Особисто я переробив його, щоб він працював з 3.3V логікою. І хоч навіть без переробки я записував та зчитував ним безліч мікросхем, з роутерів, материнських плат, і тд, не можна виключати того що якась мікросхема не витримає 5V, тому, робіть все на свій страх і ризик.

Демонтаж мікросхеми

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

"Демонтаж мікросхеми"

Тепер мікросхему треба під'єднати до програматора, для цього в комплекті був такий ось чудовий перехідник. До нього звісно цю мікросхему можна і припаяти, але особисто я просто притискаю її за допомогою біндеру для паперу. Хоча варто мабуть використовувати щось з діелектрика, щоб випадково нічого не закоротити. Тут важливо правильно розмістити мікросхему. Ключ на мікросхемі, (крапка біля ніжки), показує першу ніжку мікросхеми, відповідно треба щоб вона співпадала з першою ніжкою на перехіднику.

"Мікросхема на перехіднику"

А як розмістити вже сам перехідник, показано на програматорі. Залежно від серії мікросхеми, міняється місце.

Зчитуємо дані

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

flashprog -p ch341a_spi

"Програматор побачив мікросхему"

Чудово, програматор бачить мікросхему, тому можна зчитати її, додавши флаг -r, та назву файлу в який буде записано зміст мікросхеми. Також можна додати флаг --progress:

flashprog -p ch341a_spi -r firmware.bin --progress

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

Що тепер?

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

binwalk firmware.bin

"Зміст firmware.bin"

Більше всього нас цікавить Squashfs filesystem.

SquashFS це швидка та компактна файлова система для Linux, тому її використовують на роутерах, адже роутери дуже обмежені в плані кількості пам'яті. Binwalk допоможе нам не лише дізнатись що є в файлі, а й витягнути все це. Додавши флаг -e, binwalk створить нову директорію, куди й витягне всі файли.

binwalk -e firmware.bin

Поки проігноруємо помилки і підемо в новостворену директорію. Binwalk також розархівував SquashFS, тому можемо відкрити наступну директорію, і ті хто стикався з Linux зараз точно побачили знайому картину.

"Root директорія роутера"

Так, це root директорія того самого Linux-а, який крутиться на роутері. Відповідно все те що актуально для, скажімо так, великого Linux, актуально і тут - директорія з бінарниками, директорія з конфігами, директорія з бібліотеками та модулями ядра, і так далі. Відповідно саме так я дізнався пароль від Root Shell, за ось цим шляхом etc/, як і на звичайному Linux, лежить файлик shadow в якому лежить хеш пароля:

cat etc/shadow

"Хеш пароля роутера"

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

Ну і таким чином я дізнався пароль, потім запаяв флешку назад, і дописав першу статтю.

Тепер у вас є і дамп, за допомогою якого якщо що можна відновити пристрій і розархівований SquashFS, де можна аналізувати різні аспекти роботи пристрою.

Модифікуємо прошивку

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

Але перед цим треба розархівувати SquashFS трішки по іншому. По перше треба запустити binwalk через Root:

sudo binwalk -e firmware.bin --run-as=root

По друге, так як в файловій системі присутні посилання, які після разархівації будуть вести за межі цієї файлової системи, прямо в нашу систему, binwalk перенаправляє їх в /dev/null задля безпеки. Їх треба відновити.

Тепер можна модифікувати файли. Я взяв картинку з логотипом Rиївстар, і додав туди Shikanoko.

"nyan"

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

unsquashfs -s 120000.squashfs

"Вивід команди unsquashfs"

Дивимось тут на метод стиснення, на розмір блоку, а також на деякі інші параметри. Конкретно в моєму випадку для створення нового SquashFS вийшла ось така команда:

sudo mksquashfs squashfs-root/ new_squashfs -comp lzma -b 131072 -always-use-fragments -all-root
  • squashfs-root/ це я вказав шлях до директорії, в яку було розархівовано SquashFS, і де я модифікував файли.

  • new_squashfs - це назва нового SquashFS який буде створено

  • -comp lzma це метод стиснення, compresion, в даному випадку це lzma

  • -b це block size

Ну і також ще декілька флагів:

  • -always-use-fragments бо так було в оригінальному SquashFS

  • -all-root на випадок якщо якийсь з файів чомусь створився не від імені рута.

Трішки чекаємо, і отримуємо новий SquashFS. І тепер за допомогою команди dd можна пропатчити раніше отриманий дамп. Для цього я копіював його, щоб патчити копію і не втратити оригінал. Ось так в мене виглядає команда:

dd if=_firmware.bin.extracted/new_squashfs of=new_firmware.bin conv=notrunc seek=11792648 bs=1
  • if це input file, тобто в даному випадку новостворений SquashFS

  • of - це output file, тобто копія дампу, куди ми будемо записувати новий SquashFS.

  • conv=notrunc потрібно вказати, так як ми змінюємо лише частину файлу, і не хочемо щоб утиліта dd вирізала все, що йде після новозаписаного SquashFS

  • seek це позиція, на якій починається SquashFS. Цю інформацію можна отримати з binwalk

  • bs=1 розмір блоку. Якщо не знаєте шо це значить, залишайте одиницею. Я от не знаю, тому так і залишаю))00

Ііі після виконання даної команди, ми отримаємо пропатчений bin файл, в якому находиться новий SquashFS, з внесеними в нього змінами.

Тестуємо

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

flashprog -p ch341a_spi -w new_firmware.bin --progress

"nyan"

Прекрасно!

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

Але тут головне інше - нам вдалось:

  • здампити прошивку
  • розкласти її на составні
  • модифікувати її файли
  • зібрати все це назад
  • записати на флешку
  • запаяти її назад

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

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

Це все одно краще ніж стокова прошивка, але не настільки краще, наскільки могло би бути. Тому я думаю урізноманітнити цей процес, і провести апгрейд мікросхем пам'яті, замінити флеш пам'ять та ОЗП, і зібрати під цього франкенштейна актуальну версію OpenWrt. Чи доцільно це? Ну, мабуть ні, особливо якщо мова йде про ваш основний роутер - легше просто купити новий роутер з нормальним обсягом пам'яті, та і все.

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

Post Scriptum

Це текстова версія мого відео на YouTube. Раджу подивитись відео, так як там все більш детально показано. Зробити це можна за ось цим посиланням.