Как разбить айфон и запустить сервис для 15 млн пользователей
Летом 2014-го мы с друзьями были на прогулке, и случилось историческое событие. Во время съемки видео, внезапно, iPhone 5C выпал с рук моей жены и разбился об бетонный пол.
Это на тот момент мне казалось печальной ситуацией. Но именно это стало толчком для запуска сервера, который сейчас обслуживает более 15 млн пользователей.
При чем тут iPhone? Что за сервис? Как все это связано? Ответы под катом!
Предисловие
В этой статье я хочу с вами поделиться событиями, которые начались в 2014 году. Расскажу все как было, пока моя память свежа, а также поделюсь информацией, которая до сих пор нигде не публиковалась.
Ремонт
Как и любой, кто ощутил на себе горечь разбитого стекла любимого гаджета, я хотел, как можно быстрее это исправить. Сам дисплей оказался не поврежден, и ремонт — просто замена стекла тач-скрина. Знакомый порекомендовал СЦ в Киеве, и я отправил туда телефон. Его переклеили и отправили мне обратно. Я не мог дождаться, когда получу телефон почтой.
Как только я его получил, меня ждало еще одно разочарование. Тач-скрин был заменен, но по краях дисплея были желтые пятна. В СЦ мне пообещали это исправить, или заменить на оригинал вместе с дисплеем. Так как под стеклом я еще нашел царапины, то решился на полную замену дисплея.
Через неделю я получил телефон обратно, оказалось, что дисплей не оригинальный. Даже на самой поверхности было видно, что он находится под углом к корпусу. Да и цвета были тусклее, что явно отличало дисплей от оригинала. Оказалось, что оригинальные дисплеи для iPhone сложно найти. Я решил смириться с данной ситуацией, и когда-то в будущем поменять iPhone на более новую модель.
Прошло несколько дней, я потихоньку привыкал к китайскому дисплею. Я сидел на кресле и телефон выскользнул из кармана. Он упал на деревянный пол, стекло опять треснуло. Телефон с оригинальным стеклом падал много раз, но не разбивался аж до бетонной схватки. Но китайское, криво склеенное стекло, разбилось с первой попытки.
Осознание того, что оригинальное стекло купить не получится, навело меня на мысль найти донор. Я начал искать iPhone что продают на olx под запчасти. Оказалось, там много тех, у которых возникла проблема с iCloud функцией Find My iPhone. Такие телефоны нельзя активировать, и они остаются в повисшем состоянии до тех пор, пока не ввести Apple ID владельца, или если владелец удалит телефон из своего аккаунта.
Я нашел донор, iPhone 5C в отличном состоянии, заблокирован под оператора и под iCloud. Дисплей успешно подошел к моему телефону, и наконец-то все стало на свои места. Зеленый iPhone решил оставить себе, на случай чего, как донор. Наконец то я смог успокоиться и забыть о этой проблеме.
Что дальше?
Прошло несколько недель, зеленый iPhone 5C у меня так и валялся на столе под монитором. Но время от времени я вспоминал о нем, так как по привычке я не люблю чтобы вещи валялись без дела. Телефон итак был привязан к неизвестному оператору, да и еще с разбитым стеклом, толку от отвязки iCloud не было. Но мысли о том, что телефон в теории можно разблокировать, до сих пор неизвестным способом, меня не покидали.
doulCi
В общем начал гуглить, читать форумы. Нашел информацию о doulCi (название не странное, а это почти задом наперед iCloud). Это была команда энтузиастов что запустили сервер для обхода FMI для ранних прошивок iOS 7. Они запустили MITM и поменяли местами пакеты от разблокированного iPhone в заблокированный. В общем на то время Apple не делали проверок на соответствие пакетов к Serial/IMEI и doulCi успешно этим воспользовались. Их сервер проработал он не долго, но они успели разблокировать где-то 70 тыс. устройств. Те, кто успели подключиться к их серверу, получили рабочее устройство, в котором не работала SIM карта. Потом один из их команды слил исходники в интернет, и Apple успешно пропатчили такую дыру. На этом этапе их команда распалась, и все пошли разными путями. Больше их сервер не работал.
Конечно я об этом тогда не знал. Я заходил на их официальный сайт, и видел там таймеры, мол «ждите до 16:00 пятницу, тогда запустим сервера бесплатно разблокируем». И еще были всюду поля для ввода IMEI и регистрация. В общем я решил ждать этот час. Как только приходило время, я ставил будильник чтобы не пропустить, держал USB кабель наготове. Наступало время, я заходил на их сайт, а там все работает новое время запуска сервера. Попробовал подождать еще, и все оказалось рекламной заманухой. Это меня изрядно доставало, но останавливаться я не собирался.
Proxy сервера
Позже начали появляться новости о прокси серверах, мол подключившись к ним можно зайти на веб страницу.
В странице, которую выдает Apple
Нажав на «Помощь в активации» пользователь попадал на страницу с текстом. Но разработчики Apple упустили маленькую деталь, ссылка вела не на HTTPS, а на HTTP адрес.http://static.ips.apple.com/deviceservices/buddy/barney_activation_help_en_us.buddyml
Это позволяло перехватить и подменить трафик, так как он был не зашифрован.
Сервера постоянно падали, лучшим что я нашел был сервер niltpH. Но и он постоянно менял порты, то ли чтобы пользователи чаще заходили на его сайт, то ли сервер не выдерживал и так он снимал нагрузку.
Я постоянно задавался вопросом, зачем делать прокси если можно переадресовать DNS запросы?
Не будет большой нагрузки, и сервер всегда будет онлайн. Но были только proxy сервера.
Дальше началась волна мошенников, они начали массово делать прокси сервера.
Показывая страницы с оплатой несуществующего полного обхода много народу пострадало от таких фальшивых сервисов. Прокси сервера позволяли получить полный контроль над трафиком. Таким образом плохие дядьки крали пароли и кредитные карты, а пользователи верили, что это сработает так как любое изменение в их устройстве вызывало доверие.
Apple ничего не делали чтобы изменить ситуацию, но у меня получилось. В результате моих дальнейших действий больше никто не мог найти прокси сервера мошенников в поисковике.
Первый сервер iCloud DNS Bypass
Решено, я запущу свой сервер. Одним зимним вечером декабря я приступил к разработке. Для реализации моей задумки нужен был один HTTP и один DNS сервер. Я решил написать оба сервиса на С++ используя Visual Studio 2010. Работа с сокетами напрямую байт за байтом без сторонних библиотек.
DNS протокол не сложный, на один UDP запрос, один ответ, с одинаковой структурой каждый раз. За пару часов я написал простой DNS сервер, он отвечал статическим ІР адресом на static.ips.apple.com, а остальные брал с DNS от Google.
Дальше я приступил к написанию HTTP сервера. Первый этап был просто выдавать HTML страницу. Она при запуске программы загружалась в память, и потом выдавалась готовым пакетам каждому кто пришлет запрос на 80 порт. Так что моя программа выдавала страницу всем, кто прислал запрос, не зависимо от указанного хоста. В браузере все работало, но прописав DNS в настройки Wi-Fi iOS, нажав на «Помощь в активации» я получал ошибку в телефоне.
Проанализировав трафик выяснилось, что Apple использует XML файлы, генерируя по них удаленный интерфейс.
Пример кода можно увидеть по ссылке помощи по активации:
static.ips.apple.com/deviceservices/buddy/barney_activation_help_en_us.buddyml
И вот ответ от сервера с запросом пароля на заблокированном устройстве:
Изучив исходник можно понять что в коде есть JavaScript, и работает он внутри тэгов …
И на тот момент существующие прокси сервера использовали единственную страницу с HTML кодом.
Тут код HTML страницы