Модификация файловой системы Ubiquiti Nanostation M2 на примере прошивки версии 5.5.4

Модификация файловой системы Ubiquiti Nanostation M2 на примере прошивки версии 5.5.4

Все работы проводились в виртуальной машине (на ней был установлен arch linux).

Цель: добавление произвольного файла в готовую прошивку.
Результат: был успешно добавлен и запущен исполняемый файл

Все работы проводились в виртуальной машине (на ней был установлен arch linux). Файл прошивки XM-v5.5.4.build16501.bin, основная информация о строении прошивки была получена отсюда. Собрать свою прошивку из SDK у меня не получилось. Итак, вот что показывает binwalk

Тут надо отметить, что binwalk немного неправильно показывает смещения заголовков разделов (Ubiquiti partition header). К этим смещениям необходимо добавить 8 байт (4 байта crc32 предыдущей части и 4 байта дополнение 0х00000000). То есть смещение первого partition header’a будет не 260, а 268, соответственно второй parition header расположен по смещению 1232900. Из скриншота видно, что размер файловой системы, в данном случае, составляет 5391801 байт, прибавив к этому размеру смещение ф.с. в файле получим 6624757 (1232956+5391801), однако следующая секция (gzip compressed data) начинается со смещения 6869116. Значит между squashfs и gzip compressed data имеются еще какие-то данные. Как потом оказалось, эти данные важны для построения модифицированной прошивки. Опираясь на ссылку выше, а так же эксперименты были найдены следующие смещения:

1232956-6624757 – squashfs
6624757-6869052 – dead code (область заполненная 0x0 с иногда встречающимися 0xdead 0xc0de)
6869052-6869056 – crc32 2-го partition header’a, squashfs и dead code
6869056-6869060 – 0x00000000
6869060-6869116 – заголовок Exec script
6869116-6896729 – gzip compressed data
6896729-6896733 – “END.” (видимо окончание firmware header)
6896733-6896737 – crc32 сегмента со смещением 0 по смещение 6896729 включительно
6896737-6896741 – 0х00000000.

Для создания полноценной и рабочей прошивки необходимо еще одно число. Как выяснилось расположено оно в partition header.

 

Это размер секции. В данном случае он равен размеру squashfs + размер dead code.
Приступим к разбору оригинального файла. Из файла было получено несколько частей:

header  (0-1232900) – часть остается неизменной


partition_header (1232900-1232956) – заголовок для секции squashfs + dead code

fs.img (1232956-6624757) – непосредственно squashfs

dead_code (6624757-6869052) – dead code

gzip_data (6869060-6896729) – gzip данные остаются неизменными

Теперь приступим к распаковке файловой системы

После выполнения  этой команды появился каталог squashfs-root.
Да, для работы со squashfs в arch'e нужно поставить пакет squashfs-tools.

Далее скомпилировал “hello world” под платформу MIPS и скопировал получившийся файл hello в каталог squashfs-root/bin/. Для теста достаточно, можно приступать к сборке прошивки.

Запаковываем обратно файловую систему

Меняем размер секции в partition_header

Новый размер=размер myfs+размер dead_code=5455727+244295=5700022=0x56f9b6

Склеиваем вместе partition_header, myfs и dead_code. Вычисляем crc32 секции и записываем в конец с дополняющими нулями.

Теперь склеиваем header, final_part и gzip_data, так же считаем crc32 и записываем хвостовую часть в итоговую прошивку

Заходим по ssh на устройство и выполняем hello

Как видно, файл успешно отработал в модифицированной прошивке.  А теперь ложка дегтя: судя по всему последние 4 байта в partition_header указывают на максимальный размер секции squasfsh+dead_code, соответственно в данную прошивку мы можем запихнуть не более 1Мб своих данных. Хотя эта информация не проверялась.

310K
долларов
до 18 лет
Антипов жжет
Ребёнок как убыточный
актив. Считаем честно.
Почему рожают меньше те, кто умеет считать на десять лет вперёд.

FREE
100%
Кибербезопасность · Обучение
УЧИСЬ!
ИЛИ
ВЗЛОМАЮТ
Лучшие ИБ-мероприятия
и вебинары — в одном месте
ПОДПИШИСЬ
T.ME/SECWEBINARS