Binwalk как пользоваться
Перейти к содержимому

Binwalk как пользоваться

  • автор:

Binwalk — инструмент для анализа прошивок и различных контейнеров.

https://t.me/hacker_sanctuary
В случае заимствования данной информации, указывайте авторство — Telegram-канал «Убежище Хакера».

В данном посте рассмотрим инструмент для анализа прошивок и различных контейнеров — binwalk.

Теория.

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

Работает данный инструмент на основе сигнатурного поиска, задаваемого через регулярные выражения (можно почитать исходный код на github’e проекта — https://github.com/ReFirmLabs/binwalk).

Часто binwalk используют, чтобы примерно определить, какие файлы находятся в некотором контейнере или просто бинарном файле, который сложно отнести к какому-либо известному формату. Binwalk сможет определить склейку двух файлов в один, отобразив сигнатуры обоих форматов файлов. Также, он сможет распаковать найденные файлы (нужно добавить ключ -e). Описывать все функции достаточно муторно и бессмысленно, главное, чтобы было понятно основное назначение, а про все функции можно почитать в «help» или на гитхабе. Поэтому перейдём к практике и рассмотрим пару примеров.

Практика.

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

Исполняемый файл под Linux.

Ничего интересного, нашёл заголовок формата ELF и строчку с копирайтом.

Попробуем запустить binwalk на прошивку роутера. Возьмём прошивку для Dlink Dir 300 (ссылка на прошивку — тык)

Видим, что был обнаружен алгоритм сжатия данных — достаточно типично для прошивок. Попробуем распаковать с помощью ключа «-e».

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

Видим 2 файла и директорию (она пуста), посмотрим что из себя представляют данные файлы.

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

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

binwalk также может находить другую различную важную и полезную информацию для исследователя или ревёрсера. Он достаточно прост в освоении и очень удобен для ряда задач. Также его можно достаточно тонко настроить благодаря Python API, но это уже тема для другого поста.

Итог.

Данный инструмент достаточно прост и полезен для анализа контейнеров, прошивок. Будет не лишним в арсенале ревёрс-инженера, специалиста по компьютерной криминалистики и исследователя различного встраиваемого ПО.

Если у вас остались вопросы по данному посту или в целом по хакингу, то напишите в бот-ответчик — @hackersanctuary_bot

Команда binwalk: опции, ключи и примеры использования

Общие команды – Общие команды, присущие различным операционным системам.

binwalk

  • Scan a binary file:
  • Extract files from a binary, specifying the output directory:
  • Recursively extract files from a binary limiting the recursion depth to 2:
  • Extract files from a binary with the specified file signature:
  • Analyze the entropy of a binary, saving the plot with the same name as the binary and .png extension appended:
  • Combine entropy, signature and opcodes analysis in a single command:

binwalk —entropy —signature —opcodes >

Изображение Выучи 10 хороших привычек для работы в UNIX от IBM

Примеры кода, демонстрирующие общие подходы в программировании или же решающие небольшие прикладные задачи. Языки программирования и библиотеки, позволяющие эффективно решать задачи разработки. Объектно-ориентированное программирование, функциональное программирование и прочие подходы и …

Фото Код

Трюки Bash

Полезные заметки по работе с командной строкой: bash и прочие *sh. Однострочники, скрипты, позволяющие решать большие и малые задачи администрирования и настройки Юникс систем. Zsh для современного MacOS, Bash для …

Фото Трюки Bash

Заметки о настройке различных IT-штуковин. Настройка, допиливание, полировка. Конфигурируем приложения и тюнингуем сервера. Полезные параметры и ключи запуска программ. Увеличиваем скорость, уменьшаем отклик, ускоряем работу и улучшаем результаты работы. Объясняем …

Фото Настройки

Терминал/Консоль

Команды и инструкции терминала (консоли) Linux, MacOS, Windows и прочих операционных систем. Трюки и особенности командных оболочек, скрипты для администрирования Unix. Программирование и скриптование Windows и Linux, тонкая настройка Macos. …

Фото Терминал/Консоль

Также может быть вам интересно:

  • Как получить дерево директорий на Bash одним однострочником
  • Python: Функции
  • Python: Встроенные типы данных (list, set, dict, etc)
  • Python: типы данных, переменные, логическое ветвление и циклы
  • Как сделать свою middleware в Django (с примерами)

Свежее на «Цифре»
MessageId или как дебажить систему с минимумом проблем
Программы, 50 дней назад
Проверочный список для выпуска промышленных приложений с иллюстрациями
Работа и управление, 91 день назад
В Google Pixel и Windows Snipping Tool есть возможность восстановления обрезанных изображений
Новости, 23.03.2023
Два подарка «под ёлочку» от Heroes of Might and Magic
Новости, 25.12.2022
Вышел Pulsar – редактор кода на основе Atom
Новости, 25.12.2022
Ленивый backup PostgreSQL
Программы, 17.12.2022
Google анонсировала OSV-Scanner: сканер уязвимостей в программных проектах
Новости, 16.12.2022

Фото Gitea запускает коммерческую версию, а недовольные – форк Forĝejo

Gitea запускает коммерческую версию, а недовольные – форк Forĝejo

На днях группа бывших разработчиков Gitea решили создать на базе хостинга кода Gitea свою версию проекта – «Forgejo». Причиной тому …

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django — своя регистрация на сайте

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

Фото Новый синтаксис старой команды with в Python 3.10

Новый синтаксис старой команды with в Python 3.10

Как же долго моё чувство прекрасного страдало… Но в Python 3.10 появился новый парсер синтаксических конструкций Python!

Фото Добавляем постраничную пагинацию на Django сайт

Добавляем постраничную пагинацию на Django сайт

На сайтах часто встречаются многостраничные объекты: список товаров, список заметок и т.д. Поэтому важно уметь добавить навигацию по страницам на …

Фото Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

Фото Нет слов, одни. однострочники

Нет слов, одни. однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если …

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать …

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система …

Инструменты Kali Linux

Список инструментов для тестирования на проникновение и их описание

Binwalk

Описание Binwalk

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

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

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

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

Binwalk умеет вычислять энтропию участков файла и строит график энтропии — это может помочь не упустить интересный участок если поиск по сигнатурам пропустил его.

Автор: Craig Heffner, ReFirmLabs

Справка по Binwalk

binwalk [ОПЦИИ] [ФАЙЛ1] [ФАЙЛ2] [ФАЙЛ3] .
Опции сканирования с дизассемблированием: -Y, --disasm Определить архитектуру ЦП файла с помощью дизассемблера Capstone -T, --minsn=ЧИСЛО Минимальное количество последовательных инструкций, чтобы результат считался действительным (по умолчанию: 500) -k, --continue Не останавливаться после первого совпадения Опции сканирования по сигнатурам: -B, --signature Сканировать целевой файл(ы) в поисках сигнатур популярных типов файлов -R, --raw=СТРОКА Сканировать целевой файл(ы) в поисках указанной последовательности байтов -A, --opcodes Сканировать целевой файл(ы) в поисках сигнатур популярных исполнимых опкодов -m, --magic=ФАЙЛ Указать файл для использования в качестве источника сигнатур -b, --dumb Отключить умные ключевые слова сигнатур -I, --invalid Показать результаты, которые отмечены как невалидные -x, --exclude=СТРОКА Исключить результаты, которые совпадают со СТРОКОЙ -y, --include=СТРОКА Показать только результаты, которые совпадают со СТРОКОЙ Опции извлечения: -e, --extract Автоматически извлекать известные типы файлов -D, --dd=ТИП[:РАСШИРЕНИЕ[:КОМАНДА]] Извлекать ТИПЫ сигнатур (регулярное выражение), дать фалу РАСШИРЕНИЕ и выполнить КОМАНДУ -M, --matryoshka Рекурсивно сканировать извлечённые файлы -d, --depth=ЧИСЛО Ограничить глубину рекурсии матрешки (по умолчанию: 8 уровней) -C, --directory=СТРОКА Извлечь файлы/папки в указанный каталог (по умолчанию: текущий рабочий каталог) -j, --size=ЧИСЛО Ограничить размер каждого извлечённого файла -n, --count=ЧИСЛО Ограничить количество извлекаемых файлов -r, --rm Удалить пустые и неправильные файлы после извлечения -z, --carve Вырезать данные из файлов, но не запускать утилиты извлечения -V, --subdirs Извлечь в поддиректорию, в качестве имени берётся сдвиг Опции энтропии: -E, --entropy Вычислить энтропию файла -F, --fast Использовать более мыстрый, но менее детальный анализ энтропии -J, --save Сохранить график в PNG -Q, --nlegend Убрать легенду с графика энтропии -N, --nplot Не генерировать график энтропии -H, --high= Устанавливает восходящий уровень порогового уровня энтропии. (по умолчанию: 0.95) -L, --low= Устанавливает нисходящий уровень порогового уровня энтропии. (по умолчанию: 0.85) Опции сравнения бинарных данных: -W, --hexdump Показать шестнадцатеричный дамп и выполнить сравнение с файлом или файлами -G, --green Показывать только строки, содержащие одинаковые байты для всех файлов -i, --red Показывать только строки, содержащие байты, различающиеся во всех файлах -U, --blue Показывать только строки, содержащие байты, которые в некоторых файлах различаются -u, --similar Отображать только одинаковые строки во всех файлах -w, --terse Выполнить сравнение всех файлов, но отобразить шестнадцатеричный дамп только первого файла Опции необработанного сжатия: -X, --deflate Сканирование потоков необработанного сжатия с дефляцией -Z, --lzma Сканирование необработанных потоков сжатия LZMA -P, --partial Выполните поверхностное, но более быстрое сканирование -S, --stop Остановитесь после первого результата Общие опции: -l, --length=ЧИСЛО Количество байтов для сканирования -o, --offset=ЧИСЛО Начать сканирование с этого смещения файла -O, --base=ЧИСЛО Добавьте базовый адрес ко всем напечатанным смещениям -K, --block=ЧИСЛО Установить размер блока файла -g, --swap=ЧИСЛО Реверз каждые n байтов перед сканированием -f, --log=ФАЙЛ Записывать результаты в файл -c, --csv Сохранять результаты в файл в формате CSV -t, --term Форматировать вывод так, чтобы он подходил под окно терминала -q, --quiet Подавить вывод на стандартный вывод -v, --verbose Включить подробный вывод -h, --help Показать вывод справки -a, --finclude=СТРОКА Проверять только файлы, имена которых соответствуют этому регулярному выражению -p, --fexclude=СТРОКА Не сканировать файлы, имена которых соответствуют этому регулярному выражению -s, --status=ЧИСЛО Включить сервер состояния на указанном порту

Руководство по Binwalk

Страница man отсутствует.

-B, —signature

Выполняется сигнатурный анализ указанных файлов; если другие параметры анализа не указаны, это значение по умолчанию.

Используйте эту опцию, если хотите объединить сигнатурный анализ с дополнительными анализаторами, такими как —entropy:

binwalk --signature firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3797616 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 13644032 bytes; big endian size: 3264512 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3264162 bytes, 1866 inodes, blocksize: 65536 bytes, created: Tue Apr 3 04:12:22 2012

-R, —raw=СТРОКА

Это позволяет вам искать в файле (файлах) указанную строку. Строка для поиска может включать в себя восьмеричные и/или шестнадцатеричные значения с экранированием.

Используйте эту опцию, когда вам нужно найти определённую последовательность сырых байтов:

binwalk -R "\x00\x01\x02\x03\x04" firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 377654 0x5C336 Raw string signature

-A, —opcodes

Эта опция инструктирует binwalk искать в указанном файле (файлах) исполняемых кодов операций (opcode), общих для различных архитектур ЦП. Обратите внимание, что некоторые сигнатуры опкодов короткие и поэтому могут давать ложноположительные результаты.

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

binwalk -A firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 268 0x10C MIPS instructions, function prologue 412 0x19C MIPS instructions, function prologue 636 0x27C MIPS instructions, function prologue 812 0x32C MIPS instructions, function epilogue 920 0x398 MIPS instructions, function epilogue 948 0x3B4 MIPS instructions, function prologue 1056 0x420 MIPS instructions, function epilogue 1080 0x438 MIPS instructions, function prologue 1356 0x54C MIPS instructions, function epilogue 1392 0x570 MIPS instructions, function prologue 1836 0x72C MIPS instructions, function epilogue 2012 0x7DC MIPS instructions, function prologue 2260 0x8D4 MIPS instructions, function epilogue 2512 0x9D0 MIPS instructions, function prologue 2552 0x9F8 MIPS instructions, function epilogue

-m, —magic=ФАЙЛ

Загрузить альтернативный файл с набором сигнатур вместо файла по умолчанию.

Используйте это, если у вас есть собственный файл сигнатур, содержащий подписи, которые вы хотите найти:

binwalk -m ./foobar.mgc firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 268 0x10C Foobar 412 0x19C Foobar 636 0x27C Foobar

-b, —dumb

Отключает «умное» сопоставление подписей.

Полезно, когда ключевые слова умной подписи в ложноположительных подписях вызывают пропуск других действительных подписей (например, через ключевое слово jump-to-offset):

binwalk -b firmware.bin

-I, —invalid

Отображает все результаты, даже отмеченные как неверные.

Полезно, если вы считаете, что binwalk обрабатывает верный файл как неверный, но эта опция может выводить много мусора:

binwalk -I firmware.bin

-x, —exclude=ФИЛЬТР

Исключает подписи, соответствующие указанному фильтру исключения. Фильтры — это регулярные выражения в нижнем регистре; можно указать несколько фильтров.

Магические подписи, первая строка которых соответствует заданному фильтру, не загружаются вообще; таким образом, использование этого фильтра может помочь сократить время сканирования сигнатур.

Полезно для исключения ненужных или неинтересных результатов:

Исключить подписи вычислителя HP и OSX mach-o:

binwalk -x 'mach-o' -x '^hp' firmware.bin

-y, —include=ФИЛЬТР

Включает только подписи, соответствующие указанному фильтру включения. Фильтры — это регулярные выражения в нижнем регистре; можно указать несколько фильтров.

Будут загружены только магические подписи, первая строка которых соответствует указанному фильтру; таким образом, использование этого фильтра может помочь сократить время сканирования сигнатур.

Полезно при поиске только определённых подписей или типов подписей:

Искать только сигнатуры файловой системы:

binwalk -y 'filesystem' firmware.bin

-Y, —disasm

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

Указание —verbose для этого сканирования дополнительно распечатает дизассемблированные инструкции.

Обычно более надёжен, чем простой анализ сигнатур, выполняемый —opcodes, но поддерживает меньшее количество архитектур:

binwalk --disasm firmware.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 750 valid instructions

-T, —minsn

Установит минимальное количество последовательных инструкций, чтобы результат —disasm считался действительным. По умолчанию 500 инструкций:

binwalk --minsn=1200 -Y firmware.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions

-k, —continue

Даёт команду —disasm не останавливаться на первом результате:

binwalk --continue -Y firmware.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions 1048576 0x100000 MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions

-E, —entropy

Выполняет энтропийный анализ входных файлов, печатает сырые данные энтропии и генерирует энтропийные графики.

Энтропийный анализ можно комбинировать с —signature, —raw или —opcodes для лучшего понимания целевого файла(ов).

Полезно для определения частей интересных данных, которые могли быть пропущены сканированием сигнатур:

binwalk -E firmware.bin DECIMAL HEXADECIMAL ENTROPY -------------------------------------------------------------------------------- 0 0x0 Rising entropy edge (0.983751) 1155072 0x11A000 Falling entropy edge (0.000000) 1181696 0x120800 Rising entropy edge (0.990546) 3780608 0x39B000 Falling entropy edge (0.000000)

В сочетании с параметром —verbose выводится необработанная энтропия, рассчитанная для каждого блока данных:

binwalk -E --verbose firmware.bin DECIMAL HEX ENTROPY ANALYSIS -------------------------------------------------------------------------------- 0 0x0 0.964914 1024 0x400 0.978591 2048 0x800 0.973048 3072 0xC00 0.976195 4096 0x1000 0.976072 5120 0x1400 0.976734 6144 0x1800 0.976861 7168 0x1C00 0.972385 8192 0x2000 0.972518

ПРЕДУПРЕЖДЕНИЕ API PYTHON: модуль построения графиков, используемый binwalk (pyqtgraph), по завершении вызывает os._exit; это очевидно необходимо для решения различных проблем QT. При запуске binwalk из командной строки энтропийный анализ всегда выполняется в последнюю очередь, что не вызывает беспокойства. Однако при вызове энтропийного анализа через API обязательно отключите построение графиков (—nplot), чтобы предотвратить преждевременный выход из скрипта.

-J, —save

Автоматически сохраняет график энтропии, созданный с помощью —entropy, в файл PNG вместо его отображения.

binwalk --save -E firmware.bin

-Q, —nlegend

Опускает легенду из графиков энтропии, созданных с помощью —entropy:

binwalk --entropy -Q firmware.bin

-N, —nplot

Отключает графические графики энтропии для сканирования —entropy.

binwalk --entropy -N firmware.bin

-H, —high=ЧИСЛО_С_ПЛАВАЮЩЕЙ_ЗАПЯТОЙ

Устанавливает восходящий уровень порогового уровня энтропии. Действительно только при использовании с —entropy. Указанное значение должно быть от 0 до 1:

binwalk --entropy -H .9 firmware.bin

-L, —low=ЧИСЛО_С_ПЛАВАЮЩЕЙ_ЗАПЯТОЙ

Устанавливает нисходящий уровень порогового уровня энтропии. Действительно только при использовании с —entropy. Указанное значение должно быть от 0 до 1:

binwalk --entropy -L .3 firmware.bin

-W, —hexdump

Выполняет шестнадцатеричный дамп входных файлов и цветовую кодировку байтов следующим образом:

  • Зелёный — эти байты были одинаковыми во всех файлах.
  • Красный — эти байты были разными во всех файлах
  • Синий — эти байты были разными только в некоторых файлах.

Можно искать различия в любом произвольном количестве файлов; дополнительные полезные параметры —block, —offset, —length и —terse:

binwalk -W --block=8 --length=64 firmware1.bin firmware2.bin firmware3.bin

Примечание: если вам нужно разбить вывод на страницы, установите утилиту most, так как она лучше поддерживает разбиение на страницы цветного вывода.

-G, —green

Отображать только строки, содержащие зелёные (одинаковые во всех файлах) байты во время —hexdump:

binwalk -W --green firmware1.bin firmware2.bin firmware3.bin

-i, —red

Отображать только строки, содержащие красные (разные во всех файлах) байты во время —hexdump:

binwalk -W --red firmware1.bin firmware2.bin firmware3.bin

-U, —blue

Отображать только строки, содержащие синие (разные в некоторых файлах) байты во время —hexdump:

binwalk -W --blue firmware1.bin firmware2.bin firmware3.bin

-w, —terse

При выполнении —hexdump отображать только шестнадцатеричный дамп первого файла.

Полезно при просмотре большого количества файлов, которые не помещаются на экране:

binwalk -W --terse firmware1.bin firmware2.bin firmware3.bin

-e, —extract

Загружает общие правила извлечения —dd из предопределённого файла и пользовательские правила из ~/.config/binwalk/config/extract.conf.

binwalk -e firmware.bin

Извлекает файлы, идентифицированные во время сканирования —signature. Можно указать несколько параметров —dd.

  • type — это строка *в нижнем регистре*, содержащаяся в описании подписи (поддерживаются регулярные выражения)
  • ext — это расширение файла, которое следует использовать при сохранении диска с данными (по умолчанию нет)
  • cmd — это необязательная команда для выполнения после сохранения данных на диск

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

В следующем примере демонстрируется указание правила извлечения с помощью параметра —dd, который будет извлекать любую подпись, содержащую строку «zip archive» с расширением файла «zip», а затем выполнять команду «unzip». Кроме того, изображения PNG извлекаются «как есть» с расширением файла «PNG».

Обратите внимание на использование заполнителя «%e». Этот заполнитель будет заменён относительным путём к извлечённому файлу при выполнении команды unzip:

binwalk -D 'zip archive:zip:unzip %e' -D 'png image:png' firmware.bin

-M, —matryoshka

Эта опция будет рекурсивно сканировать извлечённые файлы во время сканирования —signature. Допустимо только при использовании с —extract или —dd.

binwalk -e -M firmware.bin

-C, —directory=СТРОКА

Устанавливает выходной каталог для извлечённых данных (по умолчанию: текущий рабочий каталог).

Применимо только при использовании с параметрами —extract или —dd:

binwalk -e --directory=/tmp firmware.bin

-d, —depth=ЦЕЛОЕ_ЧИСЛО

Ограничивает глубину рекурсии —matryoshka. По умолчанию глубина установлена на 8.

Применимо только при использовании с параметром —matryoshka:

binwalk -Me -d 5 firmware.bin

-j, —size=ЦЕЛОЕ_ЧИСЛО

Ограничивает размер данных, вырезанных из целевого файла(ов). По умолчанию ограничений по размеру нет.

Допустимо только при использовании с —extract или —dd.

Обратите внимание, что этот параметр не ограничивает размер данных, извлекаемых/распаковываемых внешними утилитами извлечения.

Полезно при вырезании или извлечении данных из больших файлов при ограниченном дисковым пространстве:

binwalk -e --size=0x100000 firmware.bin

-r, —rm

Очищает файлы нулевого размера и файлы, которые не могли быть обработаны утилитами извлечения во время извлечения.

Допустимо только при использовании с —extract или —dd.

Полезно для очистки ложноположительных файлов, скопированных из целевого файла(ов) во время извлечения:

binwalk -e -r firmware.bin

-z, —carve

Выполняет только вырезание данных, не запускает внешние утилиты извлечения.

Допустимо только при использовании с —extract или —dd.

Полезно, когда вы хотите просто вырезать данные из целевого файла(ов), но не извлекать/распаковывать эти данные автоматически:

binwalk -e --carve firmware.bin

-X, —deflate

Определяет вероятные потоки необработанных сжатых сжатых данных методом грубой силы.

Полезно для восстановления данных из файлов с повреждёнными/изменёнными/отсутствующими заголовками. Можно комбинировать с —lzma.

Это сканирование может быть медленным, поэтому полезно ограничить область сканирования с помощью —offset и/или —length:

binwalk --deflate -o 0x100 -l 10000 firmware.bin

-Z, —lzma

Определяет возможные потоки необработанных сжатых данных LZMA методом грубой силы.

Полезно для восстановления данных из файлов с повреждёнными/изменёнными/отсутствующими заголовками. Можно комбинировать с —deflate.

Из-за различного количества опций сжатия LZMA это сканирование может быть очень медленным, поэтому полезно ограничить сканируемую область с помощью —offset и/или —length:

binwalk --lzma -o 0x100 -l 10000 firmware.bin

-P, —partial

Искать только сжатые потоки использующие популярные параметры сжатия. Может значительно повысить скорость сканирования —lzma:

binwalk --partial -Z -o 0x100 -l 10000 firmware.bin

-S, —stop

При использовании с параметрами —lzma и/или —deflate сканирование будет остановлено после отображения первого результата:

binwalk --stop -Z firmware.bin

-l, —length=ЦЕЛОЕ_ЧИСЛО

Устанавливает количество байтов для анализа в целевом файле:

binwalk --length=0x100 firmware.bin

-o, —offset=ЦЕЛОЕ_ЧИСЛО

Устанавливает начальное смещение, с которого следует начать анализ целевого файла. Также можно указать отрицательное смещение (расстояние от конца файла):

binwalk --offset=0x100 firmware.bin

-O, —base=ЦЕЛОЕ_ЧИСЛО

Устанавливает базовый адрес для всех печатаемых смещений. Это значение будет добавлено к смещению исходного файла для всех распечатанных результатов:

binwalk --base=0x80001000 firmware.bin

-K, —block=ЦЕЛОЕ_ЧИСЛО

Устанавливает размер блока в байтах, используемого во время анализа.

При использовании с —entropy это определяет размер каждого блока, анализируемого во время энтропийного анализа.

При использовании с —hexdump это устанавливает количество байтов, отображаемых на строку в шестнадцатеричном выводе.

binwalk --diff -K 8 firmware1.bin firmware2.bin

-g, —swap=ЦЕЛОЕ_ЧИСЛО

Возвращается на каждые n байтов перед их сканированием:

binwalk --swap=2 firmware.bin

-f, —log=ФАЙЛ

Записывать результаты сканирования в указанный файл.

Данные, сохранённые в файле журнала, будут идентичны данным, отображаемым в терминале, если не указан параметр —csv.

Данные будут сохраняться в файл журнала, даже если указан параметр —quiet:

binwalk --log=binwalk.log firmware.bin

-c, —csv

Сохраняет данные журнала в формате CSV. Эта опция игнорируется, если используется с —cast или —hexdump.

Действует только в сочетании с параметром —log:

binwalk --log=binwalk.log --csv firmware.bin

-t, —term

Форматирует вывод в соответствии с текущей шириной окна терминала.

Полезно для повышения читабельности вывода с переносом длинной строки:

binwalk --term firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3805904 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 15741184 bytes; big endian size: 3272704 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3268870 bytes, 1860 inodes, blocksize: 65536 bytes, created: Mon Apr 22 04:56:42 2013

-q, —quiet

Отключает вывод на стандартный вывод.

Наиболее удобно при использовании с —log или подробным сканированием, например —entropy:

binwalk --quiet -f binwalk.log firmware.bin

-v, —verbose

Включает подробный вывод, включая MD5 целевого файла и временную метку сканирования.

Если указано дважды, то будет отображаться вывод внешних утилит извлечения, если также была указана опция —extract:

binwalk --verbose firmware.bin Scan Time: 2013-11-10 21:04:04 Signatures: 265 Target File: firmware.bin MD5 Checksum: 6b91cdff1b4f0134b24b7041e079dd3e DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3805904 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 15741184 bytes; big endian size: 3272704 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3268870 bytes, 1860 inodes, blocksize: 65536 bytes, created: Mon Apr 22 04:56:42 2013

-h, —help

Отображает вывод справки по binwalk:

binwalk --help

-a, —finclude=СТРОКА

Проверять только файлы, имена которых соответствуют заданной строке регулярного выражения. Особенно полезно в сочетании с —matryoshka и —extract.

binwalk -M -e --finclude='\.bin$' firmware.bin

-p, —fexclude=СТРОКА

Не проверять файлы, имена которых соответствуют заданной строке регулярного выражения. Особенно полезно в сочетании с —matryoshka и —extract.

binwalk -M -e --fexclude='\.pdf$' firmware_archive.zip

-s, —status=ЦЕЛОЕ_ЧИСЛО

Включите сервер состояния на указанном номере порта. Сервер состояния слушает только localhost и распечатывает удобочитаемые данные ASCII, относящиеся к текущему состоянию сканирования. Вы можете подключиться к нему с помощью telnet, netcat и так далее.

binwalk --status=8080 firmware_archive.zip

Примеры запуска Binwalk

Сканирование прошивки

Основная – и, безусловно, самая популярная – функция binwalk – это сканирование по сигнатурам.

Binwalk может сканировать образ прошивки на предмет множества различных встроенных типов файлов и файловых систем; просто дайте ему список файлов для сканирования:

binwalk firmware.bin
DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3797616 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 13644032 bytes; big endian size: 3264512 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3264162 bytes, 1866 inodes, blocksize: 65536 bytes, created: Tue Apr 3 04:12:22 2012

Извлечение файлов

С помощью параметра -e вы можете указать binwalk извлечь любые файлы, которые он найдёт в образе прошивки:

binwalk -e firmware.bin

Binwalk даже может рекурсивно сканировать файлы при их извлечении, если вы также укажете опцию -M:

binwalk -Me firmware.bin

И если указана опция -r, любые сигнатуры файлов, которые не удалось извлечь или которые привели к файлам нулевого размера, будут автоматически удалены:

binwalk -Mre firmware.bin

Чтобы извлечь файлы по одному конкретному типу сигнатуры, укажите одну или несколько опций -D:

binwalk -D 'png image:png' firmware.bin

Анализ энтропии

Что произойдёт, если binwalk не сообщит ни о каких найденных сигнатурах? Или как узнать, что binwalk не пропустил ничего интересного?

Анализ энтропии может помочь выявить интересные разделы данных внутри образа прошивки:

binwalk -E firmware.bin

СОВЕТ: Вы можете комбинировать другие сканирования со сканированием энтропии. Например, вы можете объединить сканирование по сигнатурам со сканированием энтропии:

binwalk -B -E firmware.bin
DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 36625 0x8F11 Zlib header, default compression

Установка Binwalk

Установка в Kali Linux

Программа предустановлена в Kali Linux.

Для установки в минимальные сборки выполните:

sudo apt install binwalk

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

wget https://raw.githubusercontent.com/ReFirmLabs/binwalk/master/deps.sh sudo bash deps.sh --yes

Если предыдущая команда завершилась ошибкой, то выполните команду:

sudo apt install git locales build-essential qtbase5-dev mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract util-linux firmware-mod-kit cramfsswap squashfs-tools zlib1g-dev liblzma-dev liblzo2-dev sleuthkit default-jdk lzop cpio

Установка в BlackArch

Программа предустановлена в BlackArch.

Для установки в минимальные сборки выполните:

sudo pacman -S binwalk

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

sudo pacman -S python-opengl python-capstone arj cabextract cpio gzip mtd-utils p7zip squashfs-tools tar bzip2 unrar xz lhasa sleuthkit

Установка в Debian, Linux Mint, Ubuntu

sudo apt update wget https://github.com/ReFirmLabs/binwalk/archive/master.zip unzip master.zip cd binwalk-master sudo python setup.py uninstall sudo python setup.py install

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

sudo bash deps.sh --yes

Если предыдущая команда завершилась ошибкой, то выполните команду:

sudo apt install git locales build-essential qtbase5-dev mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract util-linux firmware-mod-kit cramfsswap squashfs-tools zlib1g-dev liblzma-dev liblzo2-dev sleuthkit default-jdk lzop cpio

Информация об установке в другие операционные системы будет добавлена позже.

Скриншоты Binwalk

Инструкции по Binwalk

  • Анализ и разбивка составных файлов (прошивки, образы дисков)
  • Как узнать что за тип файла без расширения (в Windows и Linux)
  • Онлайн сервис «Определение типа файла без расширения»

Ковыряем Часть 1

Двенадцатого мая 2020 года в логах веб-сервера была обнаружена попытка удаленного выполнения команды ОС. Стоит отметить, что веб-сервер не содержал уязвимой функциональности, а атака скорее всего носила массовый характер. На записи access.log ниже присутствует полезная нагрузка в параметре username скрипта weblogin.cgi.

170.247.127.186 - - [12/May/2020:16:15:33 0000] "GET /adv,/cgi-bin/weblogin.cgi?username=admin';ls #&password=asdf HTTP/1.1" 404 397 "-" "Mozilla/5.0" 

Первичный поиск информации указывал, что уязвимость затрагивает сетевое хранилище Zyxel NAS326, использующий версию прошивки ниже V5.21(AAZF.7)C0 . Как выяснилось позже, уязвимость получила идентификатор CVE-2020-9054 и присутствует в гораздо большем перечне продуктов и версий прошивок. Более подробную информацию можно узнать в заявлении на официальном сайте производителя.

Загрузка прошивки, распаковка

В качестве объекта исследования мы возьмем исправленную версию прошивки Firmware V5.21(AAZF.7)C0. После распаковки архива NAS326_V5.21(AAZF.7)C0 мы получим три файла:

Файл Содержимое
521AAZF7C0.bin Файл прошивки
521AAZF7C0.pdf Информация о релизах
NAS326_V5.21(AAZF.7)C0-foss.pdf Лицензионное соглашение

Базовый анализ

В качестве базовой утилиты для анализа прошивки я буду использовать binwalk. Binwalk использует сигнатурный анализ файлов на предмет наличия содержимого различных форматов, позволяет распаковывать и исследовать данные: архивы, файловые системы, исполняемые файлы. Посмотрим на содержимое файла 521AAZF7C0.bin. Анализ энтропии свидетельствует о том, что файл вероятнее всего не зашифрован и содержит архивы данных, использующие какие-либо алгоритмы сжатия. Чаще всего можно встретить следующие:

kalosof@ubuntu:~/rev/nas326$ binwalk -E 521AAZF7C0.bin 

Entropy

Выполним поиск сигнатур, не распаковывая файла прошивки.

kalosof@ubuntu:~/rev/nas326$ binwalk --term --signature 521AAZF7C0.bin DECIMAL HEXADECIMAL DESCRIPTION ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 318 0x13E Linux kernel ARM boot executable zImage (little-endian) 26842 0x68DA gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date) 7557414 0x735126 Flattened device tree, size: 12339 bytes, version: 17 7569753 0x738159 gzip compressed data, maximum compression, from Unix, last modified: 2020-02-21 05:49:42 33135921 0x1F99D31 MySQL MISAM index file Version 1 40366232 0x267F098 MySQL ISAM index file Version 5 47941000 0x2DB8588 Zip archive data, at least v2.0 to extract, compressed size: 1968, uncompressed size: 6556, name: setuptools/archive_util.py 47943024 0x2DB8D70 Zip archive data, at least v2.0 to extract, compressed size: 35966, uncompressed size: 65536, name: setuptools/cli-32.exe 47995533 0x2DC5A8D Zip archive data, at least v2.0 to extract, compressed size: 39173, uncompressed size: 74752, name: setuptools/cli-64.exe 48082022 0x2DDAC66 Zip archive data, at least v2.0 to extract, compressed size: 35966, uncompressed size: 65536, name: setuptools/cli.exe 48167487 0x2DEFA3F Zip archive data, at least v2.0 to extract, compressed size: 39307, uncompressed size: 75264, name: setuptools/gui-64.exe 48275922 0x2E0A1D2 Zip archive data, at least v2.0 to extract, compressed size: 37227, uncompressed size: 69120, name: setuptools/gui-arm-32.exe 48313209 0x2E13379 Zip archive data, at least v2.0 to extract, compressed size: 36047, uncompressed size: 65536, name: setuptools/gui.exe 48570299 0x2E51FBB Zip archive data, at least v2.0 to extract, compressed size: 45934, uncompressed size: 91136, name: pip/_vendor/distlib/t32.exe 48616295 0x2E5D367 Zip archive data, at least v2.0 to extract, compressed size: 46052, uncompressed size: 94720, name: pip/_vendor/distlib/t64.exe 48793674 0x2E8884A Zip archive data, at least v2.0 to extract, compressed size: 45176, uncompressed size: 91648, name: pip/_vendor/distlib/w64.exe 49000017 0x2EBAE51 Zip archive data, at least v2.0 to extract, compressed size: 1957, uncompressed size: 6123, name: pip/_vendor/requests/auth.py 49002032 0x2EBB630 Zip archive data, at least v2.0 to extract, compressed size: 162124, uncompressed size: 308434, name: pip/_vendor/requests/cacert.pem 59491286 0x38BC3D6 Executable script, shebang: "/bin/sh" 59491400 0x38BC448 Executable script, shebang: "/bin/sh" 59491519 0x38BC4BF Unix path: /etc/zyxel/upnp.db "select service from upnpinfo where service='SSH'"` 59491670 0x38BC556 Unix path: /etc/zyxel/upnp.db "insert into upnpinfo values('SSH',22,-1)" 59491792 0x38BC5D0 Unix path: /etc/zyxel/webdav/dav.flag" ] && [ $(cat /firmware/mnt/info/revision) -lt 48502 ]; then 59491890 0x38BC632 Unix path: /etc/zyxel/webdav 59491915 0x38BC64B Unix path: /etc/zyxel/webdav/dav.flag 

В результате выполнения команды мы можем видеть несколько интересных позиций:

  • Прошивка содержит код загрузчика по смещению 0x13e , который имеет ARM архитектуру (little endian). Загрузчик отвечает за инициализацию hardware-компонентов и передает управление ядру операционной системы.
  • По смещению 0x738159 находится архив, в который были внесены изменения 21 февраля 2020 года. Напомню, что релиз исправленной версии состоялся 24 февраля. Возможно, это как раз та область, в которую был внесен патч. Поиск различий между уязвимой и исправленной версией прошивки мог бы пролить свет на подробности патча, но я пока проигнорирую эту информацию.

Распакуем содержимое и откроем директорию _521AAZF7C0.bin.extracted

kalosof@ubuntu:~/rev/nas326$ binwalk -e 521AAZF7C0.bin kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted$ tree -r . . ├── setuptools │ ├── cli-32.exe │ └── archive_util.py ├── 738159 ├── 68DA └── 2DB8588.zip 

Наибольший интерес представляет файловая система ядра Linux ext2, которая находилась по смещению 0x738159 .

kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted$ file 738159 738159: Linux rev 1.0 ext2 filesystem data, UUID=cf8698fa-0b06-4a57-9208-bae6eb424ee8 

Файловая система ext2 по-прежнему используется на флеш-картах и твердотельных накопителях (SSD), так как отсутствие журналирования является преимуществом при работе с накопителями, имеющими ограничение на количество циклов записи. Примонтируем раздел на Linux-машине.

kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted$ mkdir /mnt/nas326 && sudo mount -t ext2 738159 /mnt/nas326 kalosof@ubuntu:/mnt/nas326$ ls bin etc lib lost+found sbin tmp.tar.gz usr var 

Grep и бэкдор

При анализе файловой системы стоит уделить внимание поиску следующей информации:

  • Незашифрованные учетные данные
  • Бэкдоры
  • URL’s
  • Токены
  • API и ключи шифрования
  • Алгоримы шифрования
  • Информация о используемых технологиях
  • Механизмы аутентификации и авторизации

Самым простым способом поиска чувствительной информации являются стандартные для Linux-машин утилиты strings и grep. Степень вовлеченности в процесс зависит от самого исследователя. Зачастую файловая система представляет большой объем данных, содержащий как стандартный набор файлов и утилит, специфичных для Linux, так и сторонние библиотеки и ПО.

kalosof@ubuntu:/mnt/nas326$ grep -ri "backdoor" . Binary file ./usr/lib/python2.7/hmac.pyc matches Binary file ./usr/local/apache/cgi-bin/remote_help-cgi matches ./usr/local/btn/open_back_door.sh:BACKDOOR_KEY=`/sbin/makekey` ./usr/local/btn/open_back_door.sh:BACKDOOR_PWD=`/sbin/makepwd $BACKDOOR_KEY` ./usr/local/btn/open_back_door.sh:echo $BACKDOOR_PWD | sed -e 's/\//\\\//g' > /tmp/wkdhfwe0f9e9fujfkef ./usr/local/btn/open_back_door.sh:BACKDOOR_PWD=`cat /tmp/wkdhfwe0f9e9fujfkef` ./usr/local/btn/open_back_door.sh:cat /etc/shadow.bak | sed -e 's/^NsaRescueAngel\:[^\:]*\:/NsaRescueAngel:'$BACKDOOR_PWD':/g'> /etc/shadow ./usr/local/btn/open_back_door.sh: echo "[BackdoorOpen] telnet daemon is NOT running." ./usr/local/btn/open_back_door.sh: echo "[BackdoorOpen] telnet daemon is running." ./usr/local/btn/open_back_door.sh: echo "[BackdoorOpen] backdoor monitor daemon is NOT running." ./usr/local/btn/open_back_door.sh: echo "[BackdoorOpen] backdoor monitor daemon is running." grep: ./lost+found: Permission denied ./etc/init.d/rcS2:#sshd backdoor 

Поиск по ключевому слову “backdoor” вернул несколько совпадений. Откроем скрипт ./usr/local/btn/open_back_door.sh в текстовом редакторе.

#!/bin/sh BACKDOOR_KEY=`/sbin/makekey` BACKDOOR_PWD=`/sbin/makepwd $BACKDOOR_KEY` echo $BACKDOOR_PWD | sed -e 's/\//\\\//g' > /tmp/wkdhfwe0f9e9fujfkef BACKDOOR_PWD=`cat /tmp/wkdhfwe0f9e9fujfkef` IS_SERVERBOX=`mrd_fbits | grep ^"D9 01"` IS_STG220=`mrd_fbits | grep ^"DE 01"` cp /etc/shadow /etc/shadow.bak cat /etc/shadow.bak | sed -e 's/^NsaRescueAngel\:[^\:]*\:/NsaRescueAngel:'$BACKDOOR_PWD':/g'> /etc/shadow rm -f /etc/shadow.bak #sshd if [ "$1>" == "sshd" ]; then chmod 0700 /etc/ssh/* start-stop-daemon -b -S -N 5 -x /sbin/sshd -- -p 22 exit 0 fi DaemonRunning=`ps | grep "/sbin/telnetd" | grep -v "grep"` if [ "$DaemonRunning>" == "" ]; then echo "[BackdoorOpen] telnet daemon is NOT running." /sbin/telnetd else echo "[BackdoorOpen] telnet daemon is running." fi DaemonRunning=`ps | grep "/sbin/monitord" | grep -v "grep"` if [ "$DaemonRunning>" == "" ]; then echo "[BackdoorOpen] backdoor monitor daemon is NOT running." /sbin/start-stop-daemon -b -S -N 5 -x /sbin/monitord else echo "[BackdoorOpen] backdoor monitor daemon is running." fi 

В результате работы скрипта происходит следующее (детали опущены для краткости):

  • Утилита /sbin/makekey возвращает ключ шифрования и сохраняет его в переменной BACKDOOR_KEY
  • Переменная BACKDOOR_PWD формируется из результата выполнения утилиты /sbin/makepwd с ключем BACKDOOR_KEY в качестве параметра.
  • Пароль сохраняется в файле директории /tmp/wkdhfwe0f9e9fujfkef , переменная BACKDOOR_PWD переопределяется с этим значеним
  • Для пользователя NsaRescueAngel перезаписывается хэш пароля в файле /etc/shadow
  • Если сервис /sbin/telnetd отсутствует в списке запущенных процессов, то происходит его запуск.
  • Если сервис /sbin/monotord отсутствует в списке запущенных процессов, то происходит его запуск

Здесь наибольший интерес представляют утилиты, отвечающие за генерацию ключа и хэша пароля для доступа к шеллу по протоколу telnet. Зачастую для /etc/shadow используется алгоритм sha512, но также могут быть использованы md5, Blowfish, sha256.

Название утилиты makepwd похоже на makepasswd, которую можно установить через пакетный менеджер в Linux. Возможно, мы имеем дело с ее урезанной версией. Описание утилиты makekey можно найти на сайте проекта opennet.

Update

Уже после того, как я запустил дизассемблер, то решил еще немного “покопать” и наткнулся на интересную информацию об этом “бэкдоре”.

Документ подробно описывает алгоритм, который совпадает с тем, что мы видели в исходном коде. Скрипт бэкдора запускается через веб-интерфейс (требует права администратора), makekey генерирует пароль от MAC-адреса устройства и возвращает его пользователю. Пользователь подключается по telnet с этим паролем под учетной записью NsaRescueAngel , который имеет root-права. Встает вопрос, можем ли мы узнать пароль, если знаем MAC-адрес устройства, и получить контроль над устройством? К сожалению, я не располагаю физическим устройством, чтобы проверить доступность этой функциональности на последних версиях прошивки. Динамический анализ исполняемых файлов ARM-архитектуры при помощи qemu я оставлю для последующих частей.

Также я обнаружил еще одну файловую систему, которая находилась по смещению 0x68DA , которую binwalk идентифицировал как gzip-архив. После распаковки содержимого мы можем видеть типичную для Linux иерархию файлов (rootfs).

kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted$ ls 84013B 84013B.7z 845958.cpio cpio-root E79ECF E79ECF.7z kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted$ cd cpio-root/ kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted/cpio-root$ ls bin dev e-data etc firmware home i-data init lib linuxrc mnt proc ram_bin root sbin sys tmp usr var kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted/cpio-root$ 

Файл /etc/shadow содержит зашифрованные пароли пользователей. В данном случае root и admin имеют одинаковые хэши и пароли соответственно. Также присутствует пользователь NsaRescueAngel, который пока что не имеет пароля и не может быть использован для подключения по telnet.

kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted/cpio-root$ cat etc/shadow root:$1$$iC.dUsGpxNNJGeOm1dFio/:13013:0:99999:7. NsaRescueAngel. 13493:0:99999:7. bin:*:13013:0:99999:7. daemon:*:13013:0:99999:7. adm:*:13013:0:99999:7. lp:*:13013:0:99999:7. sync:*:13013:0:99999:7. shutdown:*:13013:0:99999:7. halt:*:13013:0:99999:7. mail:*:13013:0:99999:7. news:*:13013:0:99999:7. uucp:*:13013:0:99999:7. operator:*:13013:0:99999:7. games:*:13013:0:99999:7. gopher:*:13013:0:99999:7. ftp:*:13013:0:99999:7. nobody:*:13013:0:99999:7. rpc. 13013:0:99999:7. rpcuser. 13013:0:99999:7. nfsnobody. 13013:0:99999:7. pcap. 13013:0:99999:7. apache. 13013:0:99999:7. xfs. 13013:0:99999:7. ntp. 13013:0:99999:7. nut. 13013:0:99999:7. ldap. 13013:0:99999:7. mysql. 13013:0:99999:7. sysinit. 13013:0:99999:7. avahi. 13013:0:99999:7. admin:$1$$iC.dUsGpxNNJGeOm1dFio/:13013:0:99999:7. password. 5044:0:99999:7. pc-guest:*:13013:0:99999:7. anonymous-ftp:*:13013:0:99999:7. sshd. 13013:0:99999:7. 

John быстро справился с подбором паролей для пользователей root и admin. Учетная запись admin:1234 является дефолтной для доступа к панели администратора устройства.

kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted/cpio-root$ john --fork=4 etc/shadow Loaded 2 password hashes with no different salts (md5crypt [MD5 32/64 X2]) Node numbers 1-4 of 4 (fork) Press 'q' or Ctrl-C to abort, almost any other key for status 1234 (admin) 1234 (root) kalosof@ubuntu:~/rev/nas326/_521AAZF7C0.bin.extracted/_68DA.extracted/cpio-root$ john --show etc/shadow root:1234:13013:0:99999:7. admin:1234:13013:0:99999:7. 2 password hashes cracked, 0 left 

Итог

В версии прошивки NAS326_V5.21(AAZF.9)C0 скрипт бэкдора был удален. Забавно, что в релизе функциональность была обозначена как баг, а не уязвимость, хотя налицо LPE от непревилигированного пользователя до пользователя с root-привилегиями. Здесь я опускаю сам факт наличия подобной функциональности, хотя это может быть и полезно для отладочных целей.

На мое сообщение, указывающее на небезопасное использование функции sprintf внимания, судя по всему, не обратили, поэтому в последней версии прошивки код по-прежнему присутствует.

sprintf

Кроме того, weblogin.cgi содержит вызовы функции strcmp, где в качестве параметров передаются логин и пароль пользователя в незашифрованном виде.

creds

Также вспомним, что пароли в shadow хранятся как md5-хэши без соли, что является плохой практикой в настоящее время.

Update 2

6 августа в твиттере появилась информация, что уязвимости присвоили CVE-2020-13364, CVE-2020-13365, а на сайте Zyxel вышло обращение с указанием ряда продуктов, имеющих уязвимость в прошивке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *