09.02.2014

Безопасность IOS-приложений (часть 13) – загрузка собственного ram-диска при помощи утилит для защиты данных от компании Sogeti

image

В предыдущей статье мы научились выгружать данные из Keychain, используя утилиту Keychain-Dumper, а также научились анализировать взаимодействие приложения с хранилищем Keychain при помощи Snoop-it. В этой статье мы рассмотрим подключение неджейлбрейкового устройства, используя собственный ram-диск, и проанализируем содержимое этого устройства.

Автор: Пратик Джианчандани (Prateek Gianchandani)

В предыдущей статье мы научились выгружать данные из Keychain, используя утилиту Keychain-Dumper, а также научились анализировать взаимодействие приложения с хранилищем Keychain при помощи Snoop-it. В этой статье мы рассмотрим подключение неджейлбрейкового устройства, используя собственный ram-диск, и проанализируем содержимое этого устройства.

Однако для начала следует понять, зачем же может понадобиться подключение устройства при помощи ram-диска? Представьте себе ситуацию, когда у вас есть кратковременный доступ (скажем, в течение 30 минут) к устройству, и вы не можете произвести на нем джейлбрейк. За это время вы можете подключить устройство, используя собственный ram-диск, подобрать код-пароль (passcode), а затем сделать полную копию всей информацию для последующего анализа. Вся прелесть в том, что выполнить эти манипуляции возможно и без совершения джейлбрейка целевого устройства. Само собой, если на устройстве используется буквенно-цифровой пароль, то за столько короткое время подобрать пароль вы не сможете. Процесс подключения устройства при помощи ram-диска очень похож на подключение системы на платформе Windows при помощи Linux live CD с последующим монтированием раздела с Windows и использованием ОС Linux для доступа к содержимому жесткого диска. Однако есть и некоторые различия, поскольку для подключения устройства при помощи ram-диска необходим эксплоит для bootrom. Bootrom – первый значимый участок кода, который загружается на устройстве. Эксплоит для bootrom позволяет обходить проверки bootrom-подписи в низкоуровневом загрузчике, и, таким образом, мы можем подключить устройство, используя собственный ram-диск. Подобный эксплоит также мог бы также позволить пользователю запускать неподписанный код и, следовательно, реализовать непривязанный джейлбрейк (untethered jailbreak). C полным списком всех публично доступных эксплоитов для bootrom можно ознакомиться здесь. Одна из особенностей bootrom-эксплоита в том, что его нельзя пофиксить в новой версии IOS, а можно лишь пофиксить, выпустив новую аппаратную платформу. На момент написания этой статье не существовало bootrom-эксплоитов для устройств на базе чипа A5 (и более поздних версий). Тот bootrom-эксплоит, который мы будем использовать в этой статье, пригоден только для устройств на чипе A4 (в моем случае это iPod touch 4-го поколения). В этой статье мы будем рассматривать только подключение устройства при помощи ram-диска. Все последующие манипуляции с устройством будут рассмотрены в следующей статье.

Очень простой способ для автоматического создания ram-диска (вам понадобится также ssh-клиент) – использовать эту утилиту. На этом видео рассказано о том, как создать диск. Однако мы пойдем другим путем и будем использовать утилиты для защиты данных от компании Sogeti главным образом потому, что в их составе идут полезные python-скрипты, которыми мы также будем пользоваться.

Полный набор инструкций по загрузке при помощи собственного ram-диска можно найти здесь. Мы будем выполнять те же самые инструкции на системе с установленной Mac OSX 10.8.4.

Для начала следует установить систему управления версиями Mercurial.

Click to Enlarge

Рисунок 1: Установка Mercurial

Затем создайте новую директорию и зайдите в нее, после чего установите утилиту ldid, установите права на запуск и поместите файл в директорию /usr/bin.

Click to Enlarge

Рисунок 2: Создание директории и установка ldid

Теперь нам нужно создать некоторые символические ссылки. Обратите внимание, что во второй команде (см. рисунок ниже) мы создали символическую ссылку к папке Xcode.App. Если вы разрабатываете приложения для IOS и у вас несколько версий Xcode, то возможно в папке Application у вас несколько папок с именами Xcode-4.5.2 или Xcode-5.1 или нечто подобное. Если так и есть, то вторая команда, показанная на рисунке ниже, выполнится с ошибкой, и впоследствии всплывет ошибка с сообщением «iOS SDK not found». Чтобы избежать этой проблемы, переименуйте папку с Xcode.

Click to Enlarge

Рисунок 3: Создание символических ссылок

Далее необходимо установить утилиту OSXFuse, которая используется для создания файловых систем в OS X. Обратите внимание, что некоторые версии OSXFuse могут быть несовместимы с той версией операционной системы, которая запущена у вас. Я использовал версию 2.5.4, которая корректно работает в OS X 10.8.4.

Click to Enlarge

Рисунок 4: Загрузка образа и монтирование образа OSXFuse

Click to Enlarge

Рисунок 5: Установка OSXFuse

Затем необходимо установить некоторые модули python.

Click to Enlarge

Рисунок 6: Установка модулей python

Следующий шаг – создание ram-диска и ядра. Чтобы сделать это, для начала нам необходимо клонировать репозиторий с утилитами для создания ram-диска.

Click to Enlarge

Рисунок 7: Клонирование репозитория с утилитами для создания ram-диска

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

Click to Enlarge

Рисунок 8: Запуск команды для создания файловой системы

Теперь мы загружаем архив от redsn0w и копируем файл Keys.plist в текущую директорию.

Click to Enlarge

Рисунок 9: Загрузка архива от redsn0w и копирование файла Keys.plist в текущую директорию

Теперь вам необходимо загрузить файл IPSW для любой версии IOS 5. Не имеет значения, какая операционная система работает на целевом устройстве. Вы можете загрузить файлы IPSW отсюда (в зависимости от того, какое у вас устройство). Как только файл IPSW загружен, скопируйте его в текущую директорию, а затем используйте команду, показанную на рисунке ниже, для патчинга ядра. В качестве аргумента скрипта также укажите имя только что загруженного файла.

Click to Enlarge

Рисунок 10: Патчинг ядра

Создастся файл .sh, который мы будем использовать для создания ram-диска. Запускаем скрипт.

Click to Enlarge

Рисунок 11: Запуск скрипта для создания ram-диска

Как только ram-диск создан, вы увидите команду, которую необходимо использовать для загрузки ram-диска.

Click to Enlarge

Рисунок 12: Команда для загрузки ram-диска (выделена синим)

Теперь мы будем использовать эту команду для загрузки при помощи нашего ram-диска и пропатченного ядра. Обратите внимание на то, что команда немного изменилась, и мы прописали путь к бинарному файлу redsn0w.

Click to Enlarge

Рисунок 13: Команда для загрузки при помощи ram-диска

После запуска команды, показанной на рисунке выше, откроется окно redsn0w.

Рисунок 14: Стартовое окно, появляющееся при запуске redsn0w

Сейчас мой iPod подсоединен к устройству, но не выключен. Я выключаю iPod, как того требует redsn0w. Как только iPod выключен, становится активна кнопка Next. Кликните на кнопку Next, после чего redsn0w попросит вас перевести устройство в режим DFU.

Рисунок 15: Инструкция по переводу устройства в режим DFU

  1. Удерживайте кнопку Power (в углу) в течение нескольких секунд (пока первый пункт станет неактивным).
  2. Не отпуская кнопку Power, удерживайте кнопку Home (снизу в центре) в течение нескольких секунд (пока второй пункт станет неактивным).
  3. Не отпуская кнопку Home, отпустите кнопку Power, но СОХРАНЯЙТЕ НАЖАТОЙ кнопку HOME в течение нескольких секунд (пока кнопка Next не станет активной).

Как только устройство переведено в режим DFU, вы увидите, что redsn0w начал процедуру внедрения эксплоита.

Рисунок 16: Внедрение эксплоита

Затем устройство будет перезагружено.

Рисунок 17: Перезагрузка устройства

На рисунке ниже показан внешний вид устройства во время перезагрузки. Через некоторое время вы увидите слово OK на устройстве, что подтверждает успешное внедрение эксплоита и успешный старт ram-диска.

Рисунок 18: Внешний вид устройства, во время перезагрузки

В комплекте утилит для создания ram-диска есть утилита на python с именем usbmux, который мы сейчас можем использовать для доступа к устройству через ssh. Также мы устанавливаем перенаправление при помощи скрипта tcprelay.

Click to Enlarge

Рисунок 19: Подключение к устройству через ssh и установка перенаправления с локального порта 2222 на удаленный порт 22

Сейчас в отдельной вкладке мы можем подключиться через ssh к localhost на порт 2222 и скрипт usbmux перенаправит это соединение на удаленное устройство, подсоединенное через USB, на порт 22. Обратите внимание, что ваше устройство должно быть подключено к компьютеру через разъем USB для того, чтобы это сработало. Затем введите команду ls.

Click to Enlarge

Рисунок 20: Подключение через ssh на порт 2222 к localhost

В списке файлов мы видим shell-скрипт mount_partitions. Будем использовать его для подключения разделов. Зайдем в корневую директорию, где мы увидим два раздела mnt1 и mnt2. Зайдя в эти разделы, мы сможем просматривать файловую систему.

Click to Enlarge

Рисунок 21: Монтирование разделов и обзор файловой системы

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

Заключение

В этой статье мы научились подключать устройство при помощи собственного ram-диска и просматривать файловую систему устройства. В следующей статье мы продолжим знакомство с утилитами от компании Sogeti и научимся подбирать пароль, выгружать информацию из keychain и делать резервную копию файловой системы.

Ссылки

или введите имя

CAPTCHA