Целью программно-технической экспертизы (ПТЭ, forensics) iPhone является извлечение данных и артефактов из iPhone без изменения информации на устройстве.
Целью программно-технической экспертизы (ПТЭ, forensics) iPhone является извлечение данных и артефактов из iPhone без изменения информации на устройстве.
ПТЭ iPhone может быть выполнена на резервных копиях, создаваемых iTunes (атака на доверительно хранимые ключи), или прямо на работающем устройстве. Данная статья объясняет технические процедуры и проблемы, связанные с извлечением данных с работающего iPhone.
Для ПТЭ использовалась GSM-модель iPhone 4 c iOS 5.
Исследователи из Sogeti Labs выпустили инструменты с открытым кодом для ПТЭ (с поддержкой iOS 5), позволяющие выполнять восстановление низкоуровневых данных с iPhone. Приведенная ниже информация дает общее представление об их исследовании и использовании инструментов ПТЭ для iPhone.
Этапы ПТЭ iPhone:
Представьте себе компьютер, защищенный паролем на уровне операционной системы. В этом случае мы можем получить доступ к данным на его жестком диске, загрузившись с live CD, или путем извлечения диска и подключения его к другой машине. В случае iPhone роль диска играет встроенное устройство. Поэтому будет нелегко вытащить чипы (жесткий диск) и манипулировать их данными. Чтобы выполнить ПТЭ iPhone, мы используем подход с live CD. Поскольку iPhone имеет лишь один последовательный порт, для доступа к диску устройства мы загрузим свою операционную систему (ОС) через USB. Однако здесь возникает проблема, потому что iPhone загружает только подписанные Apple прошивки.
Чтобы создать и загрузить инструмент для ПТЭ, нам прежде всего нужно разобраться с функциями iPhone на уровне ОС. iOS (известная прежде как iPhone OS) – это операционная система, которая установлена на всех устройствах Apple, то есть iPhone, iPod, Apple TV и iPad. iOS упакована в zip-файл (поставляется с расширением .ipsw), который содержит загрузчики, ядро, системное ПО, разделяемые библиотеки и встроенные приложения.
В процессе загрузки iPhone проходит через цепочку доверия (показана на рисунке ниже), которая состоит из упорядоченной последовательности проверок RSA-подписей компонентов ПО.
Рисунок 1. Цепочка доверия в Нормальном режиме
BootRom – это постоянное запоминающее устройство (ПЗУ, ROM) и первый этап загрузки устройства, работающего под iOS. BootRom содержит все корневые сертификаты для проверки подписей на следующем этапе.
iPhone может работать в трех режимах: Нормальном Режиме, Режиме Восстановления и Режиме DFU.
В Нормальном Режиме BootRom выполняет некоторую инициализацию и загружает низкоуровневый загрузчик (LLB), проверяя его подпись. Подпись LLB позволяет проверить и загрузить загрузчик второго уровня (iBoot). Подпись iBoot позволяет проверить ядро и дерево устройств. Подпись ядра позволяет проверять все пользовательские приложения.
В режиме DFU процесс загрузки iPhone связан с прохождением последовательности проверок, показанной ниже. Подпись BootRom позволяет проверить загрузчики второго уровня (iBSS, iBEC). Подпись загрузчика второго уровня проверяет ядро, а подпись ядра проверяет Ramdisk.
Рисунок 2. Цепочка доверия в режиме DFU
В ходе обновления iOS Ramdisk загружается в оперативную память и загружает все остальные компоненты ОС. В ходе ПТЭ мы создадим свой Ramdisk со всеми нашими инструментами и загрузим его в энергозависимую память iPhone. Проверки подписей, реализованные на различных этапах загрузки, не позволяют нам загрузить наш собственный Ramdisk напрямую. Чтобы загрузить его, нам понадобится обойти все эти проверки. Если мы сможем скомпрометировать одно звено в цепочке доверенной загрузки, то сможем полностью контролировать все следующие за ним этапы. Сообщество хакеров нашло несколько уязвимостей в BootRom, которые позволяют нам запустить свой собственный загрузчик и контролировать все дальнейшие проверки подписей. Помимо проверки подписей, на каждом этапе используеися шифрование. Соответствующие ключи шифрования можно извлечь инструментами джейлбрейка.
Сначала мы создадим свой ramdisk, содержащий все наши инструменты для ПТЭ, и наложим на ядро патч, изменяющий процедуру проверки Ramdisk. Позднее мы используем джейлбрейк, чтобы загрузить наше пропатченное ядро за счет исправления проверок подписей в BootRom.
С помощью инструмента ПТЭ, выпущенного Sogeti Labs, мы сможем построить Ramdisk только в Mac OS X. Инструмент состоит из скриптов на Питоне, нескольких исполняемых файлов и нескольких скриптов командной оболочки.
Чтобы запустить инструменты, сначала нам нужно установить необходимые зависимости (используйте в OS X терминале приведенные ниже команды).
Загрузите ldid, выдайте права на выполнение и переместите его в директорию /usr/bin.
curl -O http://networkpx.googlecode.com/files/ldid chmod +x ldid sudo mv ldid /usr/bin/
Загрузите и установите OSXFuse.
curl -O -L https://github.com/downloads/osxfuse/osxfuse/OSXFUSE-2.3.4.dmg hdiutil mount OSXFUSE-2.3.4.dmg sudo installer -pkg /Volumes/FUSE\ for\ OS\ X/Install\ OSXFUSE\ 2.3.pkg -target / hdiutil eject /Volumes/FUSE\ for\ OS\ X/
Загрузите и установите модули Питона: pycrypto, M2crypto, construct и progressbar.
sudo ARCHFLAGS='-arch i386 -arch x86_64' easy_install pycrypto sudo easy_install M2crypto construct progressbar
Загрузите и установите Mercurial (http://mercurial.selenic.com/), чтобы получить следующий исходный код из репозитория.
hg clone https://code.google.com/p/iphone-dataprotection/ cd iphone-dataprotection make -C img3fs/
Загрузите redsn0w для получения ключей шифрования, необходимых для расшифровки Ramdisk и ядра.
curl -O -L https://sites.google.com/a/iphone-dev.com/files/home/redsn0w_mac_0.9.9b8.zip unzip redsn0w_mac_0.9.9b5.zip cp redsn0w_mac_0.9.9b5/redsn0w.app/Contents/MacOS/Keys.plist .
Чтобы исправить проверки сигнатур в ядре, передайте в качестве параметра ipsw-файл вашей iOS 5 скрипту kernel_patcher.py.
python python_scripts/kernel_patcher.py IOS5_IPSW_FOR_YOUR_DEVICE
Указанный выше скрипт создает пропатченное ядро и скрипт командной оболочки для создания Ramdisk
sh ./make_ramdisk_n88ap.sh
После запуска данный скрипт командной оболочки загрузит инструменты для ПТЭ и добавит их на Ramdisk. Образ Ramdisk использует обычную файловую систему HFS+, родную для Mac, поэтому будет довольно просто добавить туда файлы. Все вышеупомянутые шаги создадут пропатченное ядро и специальный Ramdisk с инструментами для ПТЭ. Замечание: я уже создал пропатченное ядро и специальный Ramdisk для iPhone 4. Вы можете напрямую загрузить эти файлы и пропустить все указанные выше шаги.
Ссылка для скачивания - http://www.4shared.com/folder/dKmG68Im/iPhone_Forensics.html
Чтобы загрузить инструменты для ПТЭ, передайте ipsw-файл iOS 5, пропатченное ядро и созданный Ramdisk на вход утилите redsn0w. Соедините устройство с компьютером с помощью USB-кабеля и запустите указанную ниже команду. Следуйте указаниям redsn0w, чтобы загрузить устройство в режиме DFU. В этом режиме redsn0w эксплуатирует уязвимость BootRom и загружает пропатченное ядро и специальный Ramdisk на устройство.
./redsn0w_mac_0.9.9b5/redsn0w.app/Contents/MacOS/redsn0w -i iOS5_IPSW_FOR_YOUR_DEVICE -r myramdisk.dmg -k kernelcache.release.n88.patched
Если процесс завершится неудачно с ошибкой "No identifying data fetched", убедитесь, что компьютер подключен к Интернет. После завершения работы redsn0w Ramdisk загрузится в подробном режиме.
После загрузки Ramdisk возможности сетевого взаимодействия (например, Wi-Fi) по умолчанию отключены. Поэтому для взаимодействия устройства с компьютером мы выберем иной путь, который Apple использует в iTunes. USBMUX – протокол, используемый iTunes для связи с загруженным iPhone и координирования доступа других приложений к своим службам. Технология USB-мультиплексирования позволяет устанавливать TCP-подобное соединение через порт USB по протоколу SSL. Данный канал iTunes использует в сервисе AFC для передачи файлов. Однако, в нашем случае мы установим по этому каналу SSH-соединение для запуска на устройстве командной оболочки.
SSH работает на порту 22. Скрипт Tcprelay.py перенаправляет трафик с порта 22 на порт 2222.
python usbmuxd-python-client/tcprelay.py -t 22:2222 1999:1999
Теперь SSH доступен по адресу localhost:2222.
ssh -p 2222 root@localhost password: alpine
Теперь мы получим доступ к файловой системе. Задачу усложняет то, что каждый файл зашифрован на своем уникальном ключе, привязанном к конкретному iOS-устройству. Кроме того, механизм защиты данных, появившийся в iOS 4, добавляет еще один слой шифрования, который не позволяет получить доступ к защищенным файлам и элементам цепочки ключей, когда устройство заблокировано. Защита данных достигается комбинацией аппаратного шифрования и программного ключа. Каждый iPhone (>3gs) содержит чип (AES-процессор), который осуществляет шифрование с помощью набора жестко зашитых ключей (UID, GID). ОС устройства не может прочитать эти ключи, но может использовать сгенерированные на основе UID (0x835 и 0x89B) ключи для шифрования и расшифрования. Программный ключ защищен паролем и используется для снятия блокировки устройства каждый раз, когда у пользователя появляется в том потребность. Итак, чтобы получить доступ к защищенным файлам, нам сначала нужно обойти парольную защиту.
Раньше (при версии iOS < 4), пароль хранился в файле, который можно было удалить напрямую по SSH. После введения технологии защиты данных (начиная с iOS 4), пароль используется для зашифрования защищенных файлов и элементов цепочки ключей устройства. Итак, чтобы расшифровать данные, нам нужно предоставить верный пароль.
Проверка пароля производится на двух уровнях: на уровне приложения springboard и на уровне ядра. Атака полным перебором, производимая на уровне springboard, приводит к блокировке устройства, задержкам отклика, а иногда даже к гарантированному удалению данных устройства. Тем не менее, эти защитные механизмы не применимы на уровне ядра (метод AppleKeyStore) и это открывает путь для атак перебором. Чтобы сделать такие атаки менее практичными, парольный ключ, вырабатываемый из пользовательского пароля, привязан к аппаратному UID ключу. Итак, атака полным перебором может быть проведена только непосредственно на устройстве, поскольку невозможно заготовить предвычисленные значения (вроде радужных таблиц) в оффлайн-режиме.
python python_scripts/demo_bruteforce.py
Порт 1999, открытый с помощью tcprelay.py, используется скриптом, перебирающим пароли. Скрипт соединяется с запущенным с Ramdisk демоном restored_external, собирает основную информацию об устройстве (серийный номер, UDID, и. т. д.), уникальные ключи устройства (0x835 и 0x89B), загружает системную "сумку с ключами" (keybag) и пытается подобрать пароль (из 4 цифр).
Представленная ниже таблица показывает среднее время, необходимое на подбор пароля полным перебором для паролей разной сложности.
Сложность пароля | Время подбора |
4 цифры | 18 минут |
4 цифры/буквы | 51 часов |
5 цифр/букв | 8 лет |
8 цифр/букв | 13,000 лет |
После успешного подбора пароля скрипт автоматически загрузит связку ключей. Связка ключей – база данных Sqlite, которая хранит конфиденциальную информацию вашего устройства. Связка ключей зашифрована аппаратным ключом. Связка ключей также определяет то, какие приложения могут получать доступ к тем или иным данным. Каждое приложение на вашем устройстве имеет уникальный идентификатор приложения (называемый также entitlement). Сервис связки ключей на основе идентификатора определяет, к каким данным приложение может получить доступ. По умолчанию приложение может обращаться только к данным, ассоциированным с идентификатором этого приложения. Позднее Apple ввела понятие групп связки ключей. Теперь приложения, которые принадлежат к одной группе, могут разделять элементы связки ключей. Существует два пути получения доступа ко всем элементам связки ключей. Первый состоит в написании приложения и включении его во все группы. Второй путь состоит в написании приложения и выдачи ему entitlement-а com.apple.keystore.access-keychain-keys.
Содержимое базы данных связки ключей можно получить с помощью скрипта keychain_tool.py
python python_scripts/keychain_tool.py -d [UDID]/keychain-2.db [UDID]/[DATAVOLUMEID].plist
Чтобы сделать дамп файловой системы, запустите скрипт командной оболочки dump_data_partition
./dump_data_partition.sh
Скрипт считывает с устройства файловую систему и копирует ее в директорию UDID в виде файла образа (.dmg). Этот файл образа можно открыть с помощью модифицированного HFSExplorer, который умеет расшифровывать файлы на лету. Чтобы расшифровать их раз и навсегда, можно использовать скрипт emf_decrypter.py.
python python_scripts/emf_decrypter.py [UDID]/[data_DATE].dmg
Скрипт расшифровывает все файлы из файла образа файловой системы. Чтобы посмотреть расшифрованные файлы, смонтируйте файловую систему следующей командой.
Hdituil mount [UDID]/[data_DATE].dmg
Как только файловая система будет расшифрована, станут доступными представляющие интерес с точки зрения расследования файлы, например, базы данных SMS и почты, история местоположений и т. д.
Удаление файла на iPhone приводит лишь к удалению ссылки на него. Поэтому удаленные файлы можно восстановить. Чтобы восстановить удаленный файл, запустите скрипт emf_undelete.py.
python python_scripts/emf_undelete.py [UDID]/[data_DATE].dmg
Данная техника позволяет восстанавливать ценную информацию вроде истории звонков, удаленных изображений, SMS, контактов, голосовых и почтовых сообщений.
http://www.youtube.com/watch?v=2Fs6ee1yeq4&context=C32aee7aADOEgsToPDskLQueZ3j9YDdlXdGSYdCN26
Ладно, не доказали. Но мы работаем над этим