Имплантация Cisco. Модифицирование прошивки маршрутизатораЕвгений «ShadOS» Хабаров (shados@mail.ru) Приветствую, дорогой друг! Сегодня мы будем дарить вторую молодость (а может даже и жизнь) старым маршрутизаторам Cisco, практически не нарушая лицензионного соглашения. Пусть этот хакерский метод достаточно прост, но от этого он не становится менее интересным. Имя ему – «бинарный патчинг».
Сразу к делу. Исходные данные следующие: старенькая кошка Cisco 2611 с двумя Ethernet-портами, 64 Мб RAM и 16 Мб на Flash. Это максимально возможные параметры, поддерживаемые платформой (читай – увеличить объем DRAM памяти и flash не получится из-за отсутствия в природе комплектующих больших объемов). Исходя из данных Cisco IOS Feature Navigator (tools.cisco.com/ITDIT/CFN/jsp/index.jsp), последней версией IOS для этого маршрутизатора является 12.3(26) – вполне естественно для столь старого продукта (End-of-Sale - апрель 2003, End-of-Life – апрель 2008). Хочется получить только все самое последнее и новое, а все самое новое и вкусное доступно только в версии 12.4 (точнее 12.4T). Посыл номер два, или дополнительные исходные данные таковы: если внимательно следить за модельным рядом маршрутизаторов Cisco или просто ознакомиться с информацией о продуктах на официальном сайте, то можно обнаружить, что серия 2600 включает в себя, например, маршрутизаторы 2611XM. Отличается эта серия от своего предшественника незначительно:
Для такой кошки Cisco IOS Feature Navigator сообщит, что последний IOS имеет версию 12.4(23). Системные требования для IOS 12.4(21) с набором Enterprise Base или Advanced Security составляют 128 MB DRAM и 32 MB flash. Конечно, у нас нет 128 MB памяти, но попытка не пытка, да и пропускная способность портов у нас невысокая. Это позволяет сделать предположение, что ОС можно запустить на моем устройстве. Осталось превратить теорию в практику. Extended, или Что хотим получитьИдея проста - загнать бинарный образ операционной системы Cisco IOS 12.4(21) с набором фьючерсов Enterprise Base на старенький маршрутизатор 2611 с исходными данными, представленными выше. В дальнейшем – использовать как тестовый стенд, ибо 10-мегабитные интерфейсы ограничивают его применение в дикой природе, или, как говорится, in production. С тем же успехом устройство может надежно служить файрволом корпоративной сети взамен какого-нибудь PIX (если, конечно, достаточно пропускной способности в 10 Мбит), но тогда встает вопрос — а есть ли такой функционал, который может потребоваться в IOS 12.4, но которого нет в 12.3? За подсказкой вновь отправляю к Cisco IOS Feature Navigator (tools.cisco.com/ITDIT/CFN/Dispatch). Утилита сравнения образов тебе в помощь, но ответ, скорее всего, - «нет». Отсюда вывод — не стоит меня корить в малой практичности, так как изначально статья в большей степени исследовательская (just for fun). Что делать? Бежать!Решения здесь может быть два – либо грузиться с tftp, что не всегда удобно, либо же взломать образ так, чтобы размер стал меньше. Грубо говоря, перепаковать его (собственно, это и было отчасти сделано). Посылом номер три стал эмулятор Dynamips. Причем он тут? Именно он натолкнул меня на мысль о перепаковке образа. Если взглянуть на раздел «How to use?» на официальном сайте проекта (www.ipflow.utc.fr/index.php/Cisco_7200_Simulator), то можно обнаружить, что эмулятор использует распакованные образы для ускорения загрузки:
Если есть запакованный образ, то можно попытаться использовать более оптимальные параметры сжатия, которые позволят поместить образ на флеш. Обращаю внимание на важную деталь — так как мы не собираемся переписывать самораспаковывающийся код, то есть заниматься дизассемблированием (да и ассемблер под 32-битные процессоры PowerPC я не знаю), то сам алгоритм сжатия менять мы не сможем. Самораспаковывающаяся часть просто не сможет распаковать архивы, сжатые другими методами. По поводу используемого в образе алгоритма сжатия – можно взглянуть вот сюда: Cisco IOS Configuration Fundamentals Configuration Guide, Release 12.4 - Loading and Managing System Images, пункт Image Naming Conventions. Поле «тип» в имени образа как раз отвечает за его характеристики:
В нашем случае образ имеет тип mz – работает в памяти и запакован как раз в zip-архив. Убедиться в этом просто — большинство архиваторов (WinZIP, WinRAR, 7zip) с легкостью открывают его и распаковывают. УпаковкаНе мудрствуя лукаво, пытаемся перепаковать архив заново с максимально возможной степенью сжатия. Сразу же отмечаем, что используемый метод — deflate и изменить его не получится. Я использовал четыре архиватора, чтобы сравнить их и получил такой результат: 7-zip 4.65 со следующими параметрами:
В результате был получен архив: 15,7 MB (16 489 764 bytes). WinZIP 11.2 при использовании улучшенного метода Deflate выдал файл размером 16,0 MB (16 803 634 bytes). WinRAR 3.80 формат архива — zip с наилучшими параметрами сжатия: 16,3 MB (17131 353 bytes). PKZIP 9.00 от создателей формата совсем подвел, и по методу Deflate с максимальным сжатием произвел файл размером 16,3 MB (17 094 474 bytes). Итогом моего небольшого сравнительного тестирования стал выбор для экспериментов архива, как нетрудно догадаться, созданного 7zip. Теория (интеграции нового архива)Далее требуется сей архив поместить вместо оригинального образа. Чтобы проделать это, нам понадобится шестнадцатеричный редактор типа WinHex, HT Editor или hview. Я предпочитаю WinHex, но понадобится еще и HT, чуть позже объясню почему. Как ты можешь видеть на скриншоте, бинарный образ IOS, скорее всего, есть не что иное, как исполняемый файл в формате ELF (Executable and Linkable Formate). ELF-формат является основным исполняемым файлом в *nix-like системах, поэтому неудивительно встретить его здесь. По ELF-формату существует четкая спецификация, последняя версия которой 1.2, однако для наших целей будет достаточно, например, заголовочного файла из состава libc - elf.h. Обычный бинарный ELF-файл представляет собой структуру вида:
Не углубляясь в описание (и дабы не повторяться), отправляю тебя к спецификации. Так как весь процесс исследования я проводил в MS Windows, то пришлось искать замену утилите readelf из состава binutils. Подходящим вариантом оказался шестнадцатеричный редактор HT (hte.sf.net), который умеет читать и модифицировать структуры данных исполняемых файлов ELF. При попытке открыть подопытный образ c2600-entbasek9-mz.124-9.T1.bin, HT сразу меня обругал, что и привлекло мое внимание. Обратимся к elf.h. Структура данных, отвечающая за ELF-заголовок, выглядит так:
В нашем случае поле e_machine имеет значение 0x002b или 43, что соответствует процессору SPARC v9:
Но нам известно, что маршрутизатор 2611 использует процессор Motorolla MPC860, значит, поле должно иметь значение 0x0014, – что соответствует:
Скорее всего, это простейшая защита от дизассемблирования образа. Нам это не сильно помешает. С помощью F6 открываем режим просмотра elf/header. Из него становятся известны следующие подробности:
Что, в сумме, дает размер 52+32+6*40=324 или 0x144, то есть, в файле всего 6 секций (соответственно, 6 заголовков секций) и 1 заголовок программы. Вероятнее всего, одна из секций предназначена для хранения архива с исполняемым образом IOS. Эту секцию можно вычислить либо по размеру (логично, что ее размер должен быть максимальным), либо по типу секции. Заголовок таблицы секций можно просмотреть, нажав <F6> и выбрав elf/section headers, но для начала обратимся к описанию секции:
Поле sh_type и будет отвечать за искомый тип. К сожалению, здесь меня ждал облом, – большинство секций имело тип SHT_PROGBITS, предназначенный для секций, значение которых определяется самой программой. Однако четвертая секция имела тип, отличный от предыдущих, и значение 0x00000007 (секция предназначена для каких-то программных заметок). Первая (нулевая) секция также имеет отличный от предыдущих тип (SHT_NULL). Исходя из этого, ясно, что она пустая и ни с чем не ассоциирована. В итоге, приходится искать секцию с максимальным размером (поле sh_size). Это – секция за номером пять, ее размер 0x1070e7c или 17239676 байт. Вернемся к hex-виду (<F6> - hex) и перейдем по смещению (поле sh_offset) с помощью <F5>. Что же мы здесь видим? Где наш архив, который должен начинаться с сигнатуры PK, а точнее, если следовать спецификации PKZIP-формата (pkware.com/documents/casestudies/APPNOTE.TXT), – с 0x04034b50 в обратном порядке? Как ни странно, эта сигнатура обнаруживается на 22 байта позже. А если хорошо присмотреться, то отказывается, что сразу за значением 0xFEEDFACE идет размер распакованного образа 0x02AED904. Внимательно поискав в Сети, можно наткнуться на информацию из книги Cisco Networks Hacking Exposed издательства McGraw Hill/Osborne. Наши русские парни Andrew A. Vladimirov, Konstantin V. Gavrilenko, Janis N. Vizulis and Andrei A. Mikhailovsky еще в 2006 году занимались разработкой бинарного патчинга IOS 12.3(6). Им удалось выяснить, что после магического значения 0xFEEDFACE идут последовательно uncompressed image size, compressed image size, compressed image checksum, uncompressed image checksum. Товарищам также стало известно, что алгоритм вычисления контрольной суммы представляет собой модифицированный алгоритм контрольной суммы в интернете. К счастью, нам не придется ничего вычислять — проверено на практике, что маршрутизатор сам скажет, какое значение должно иметь это поле, если, конечно, подсчитанная контрольная сумма и записанная в соответствующем поле не совпадут:
Практика (интеграции нового архива)Перейдем к активным действиям. Для начала вырезаем из файла старую четвертую секцию, содержащую zip-архив, – за исключением 20 байт, начиная с магического значения 0xFEEDFACE до сигнатуры zip (то есть, со смещения 0x44F8 по смещение 0x1075360 + 0x44F8). Затем по смещению 0x44F8 вставляем новый архив.
Новые значения после магической записи 0xFEEDFACE:
Новую контрольную сумму, как я уже говорил, сообщит сам маршрутизатор. После всех манипуляций конечный образ был получен, но его размер меня не впечатлил. По сравнению с изначальным размером 16,4 MB (17257364 bytes) я получил всего лишь 15,7 MB (16507472 bytes). Разница, которую я уже посчитал выше, составила 749912 байт. Конечно, это позволит загрузить образ на flash, но, скорее всего, придется применять опцию /no-squeeze-reserve-space. Когда при копировании маршрутизатор запросит повторное стирание flash, подтверждать действие не нужно. Естественно, такая ситуация была бы только в том случае, если образ был бы сформирован правильно. Поэтому я не стал спешить и для загрузки образа зашел в режим rommon по Ctrl+Break. И – со своего компьютера загрузил образ по tftp напрямую в RAM:
После загрузки маршрутизатор я сказал:
Оказалось, что при редактировании размера 5й секции я ошибся на 2 байта (те самые 20 байт с 0xFEEDFACE + 2). После второй попытки загрузки выяснилось, что контрольная сумма запакованного образа — 0xB0257B0D:
Корректируем соответствующее поле после 0xFEEDFACE (загружаем файл в HT по <F3>, переходим по смещению с помощью <F5> и редактируем по <F4>, не забывая сохраняться по <F2>). Затем снова грузимся.
Дальше все нормально, однако затем IOS вываливается и отказывается работать по причине недостатка памяти: Никогда не сдавайсяЯ не расстроился и решил взяться за другой образ — c2600-advsecurityk9-mz.124-21.bin. После аналогичных манипуляций с байтами, даже при использовании 128-битного слова в 7zip, размер составил 15947076 (против изначальных 16635336), что позволило загрузить его во flash. Помимо прочего, этот образ уже не ругался на недостаток памяти RAM и прекрасно чувствовал себя на этой платформе:
Остается еще одна небольшая проблема. Если запустить проверку:
– маршрутизатор обругает нас, сообщив, что Embedded hash и Calculated hash не совпадают. Исправить это очень просто — 16 байт контрольной суммы находится в самом конце бинарного файла образа. После исправления маршрутизатор сообщает, что контрольная сумма успешно подсчитана и совпадает:
Логическое заключениеНовый образ готов и правильно сформирован. Усвоив эту статью, ты получишь опыт:
Кроме того, готов задел для дальнейших извращений над маршрутизаторами. Для общего развития можно поковырять распакованные образы в IDA, изучить вирусы в *nix-like системах, чтобы проинфицировать образ своим бекдором, ну и собственно, написать бекдор. A мои изыскания здесь успешно заканчиваются. Все вопросы, пожелания и, в особенности, идеи, мой дорогой друг, я готов получить по электронной почте. С радостью отвечу и помогу по мере сил. Удачи в бинарном патчинге... и не только. |