У любого пользователя WhatsApp можно отобрать аккаунт. Для этого не нужно быть хакером
В WhatsApp скрывается брешь, которая позволяет злоумышленникам с нулевыми навыками взлома и программирования навсегда заблокировать учетную запись любого пользователя, Им нужно знать лишь его номер телефона, и больше ничего, и защититься от потенциальной блокировки невозможно. Разработчики WhatsApp не спешат устранять проблему.
Новая брешь в WhatsApp
Каждый пользователь WhatsApp может в любую секунду лишиться своего профиля с минимальными шанса восстановление. Как пишет Forbes, защититься от этого попросту невозможно, и злоумышленнику даже не нужно будет взламывать гаджет – ему достаточно лишь знать номер телефона пользователя, после чего он может инициировать процедуру его блокировки без возможности повторной авторизации в системе.
Возможность лишить любого человека пользоваться WhatsApp – это следствие гигантской уязвимости, обнаруженной в мессенджере специалистами по информационной безопасности Луисом Картинтеро (Luis Carpintero) и Эрнесто Перенья (Ernesto Canales Pereña). Они уведомили разработчиков WhatsApp о своей находке, но те пока не выпустили патч, устраняющий брешь, тем самым оставив 2 млрд пользователей под угрозой потери аккаунта.
WhatsApp – это самый популярный мессенджер в мире. По данным Statista.com, по числу ежемесячно активных пользователей на январь 2021 г. он со своими более чем 2 млрд опережал Facebook Messenger (1,3 млрд) и китайские WeChat (1,21 млрд) вместе с QQ (617 млн). С февраля 2014 г. WhatsApp принадлежит Facebook.
Как работает уязвимость
Уязвимость в WhatsApp позволяет добиться полной блокировки аккаунта жертвы и осуществляется в два очень простых этапа, на каждом из которых исполнителю даже не потребуются навыки хакинга или социальной инженерии – он вообще не будет контактировать с владельцем профиля.
На первом этапе злоумышленнику нужно просто установить WhatsApp на смартфон и попытаться залогиниться под нужным номером телефона. Мессенджер направит на него SMS с кодом подтверждения, и здесь идет расчет на то, что владелец номера будет игнорировать их. После нескольких таких попыток приложение на устройстве злоумышленника сообщит о слишком частых попытках авторизации и позволит произвести следующую лишь через 12 часов. При этом WhatsApp на устройстве жертвы пока продолжит работать, как и прежде.
На втором этапе злоумышленник регистрирует новый адрес электронной почты и пишет письмо в техподдержку WhatsApp, в котором говорит, что его учетная запись была утеряна или украдена. Он просит отключить ее и указывает номер жертвы. WhatsApp может отправить автоматическое письмо с просьбой написать номер еще раз, и атакующий сделает это.
Далее WhatsApp, никак не удостоверившись в том, что в техподдержку написал подлинный владелец аккаунта, инициирует процедуру блокировки. Примерно через час мессенджер внезапно перестанет работать на устройстве жертвы – она увидит сообщение, что ее номер больше не зарегистрирован в системе. «Это могло случиться потому, что вы зарегистрировали его на другом телефоне. Если вы этого не сделали, подтвердите свой номер телефона, чтобы снова войти в свою учетную запись» – будет сказано в уведомлении.
Все это сработает, даже если пользователь активировал двухфакторную авторизацию. Попытка запросить новый код будет провалена – WhatsApp разрешит сделать это лишь через 12 часов.
Бонусный этап и полная блокировка
Если злоумышленник решит остановиться на втором этапе, то все закончится всего лишь невозможностью пользователю в течение нескольких часов подключиться к WhatsApp со своим номером. Максимум через 12 часов пользователь сможет восстановить контроль над своей учетной записью и продолжить работать в мессенджере ровно до тех пор, пока кто-нибудь не захочет повторить «трюк» с блокировкой.
Но на деле есть дополнительный, третий этап, приводящий к полной блокировки учетки.
Этот этап на деле может стать вторым – злоумышленнику вовсе не обязательно отправлять письмо в поддержку WhatsApp, он может просто подождать 12 часов, после чего вновь сделать несколько попыток зарегистрировать чужой номер в своем телефоне. После третьей по счету 12-часовой блокировки WhatsApp сломается, и вместо таймера, отсчитывающего время до следующей попытки авторизации он будет показывать «-1 секунду», притом постоянно. Это сбой в работе мессенджера, который невозможно обойти.
Эта картина будет наблюдаться как на устройстве хакера, так и на смартфоне жертвы, и в итоге больше никто не сможет авторизоваться в мессенджере под этим номером телефона. Единственное, что останется – это пытаться связаться с техподдержкой WhatsApp и искать пути решения проблемы.
WhatsApp не решает проблему
Статья в Forbes, проливающая свет на новую проблему в WhatsApp была опубликована 10 апреля 2021 г. К 13 апреля 2021 г. разработчики так и не выпустили устраняющее ее обновление и не назначили сроки ее релиза.
Вместо этого они занимаются подготовкой к внедрению новой политики конфиденциальности, согласно которой мессенджер будет автоматически передавать гигантские массивы персональных данных пользователей в Facebook для лучшего таргетинга рекламы.
Эту политику WhatsApp намеревался ввести еще 8 февраля 2021 г., но был вынужден временно отказаться от этой идеи из-за шквала критики. Новая дата вступления ее в силу – 15 мая 2021 г., и всем тем, кто не собирается соглашаться с ней, уготовано весьма серьезное наказание.
В феврале 2021 г. CNews писал, что несогласные с новой политикой конфиденциальности WhatsApp больше не смогут отправлять и получать текстовые сообщения. Разработчики оставят им лишь голосовые вызовы. Более того, профили тех пользователей, которые перестанут пользоваться WhatsApp и перейдут в другие мессенджеры, гарантированно ждет полное удаление.
Другие проблемы WhatsApp
WhatsApp известен не только тем, что им пользуются миллиарды человек, но и тем, что своих пользователей он если и ценит, то далеко не всегда. Так, например, в июне 2020 г. стало известно, что некоторые номера телефонов, привязанных к пользовательским профилям в WhatsApp, в течение длительного времени находились в открытом доступе и даже попали в поисковую выдачу Google. В общей сложности при помощи Google можно было найти до номера около 300 тыс. пользователей мессенджера, и эта проблема носила глобальный характер.
В ноябре 2019 г. CNews сообщал, что пользователей WhatsApp стали автоматически навечно блокировать за участие в безобидных групповых чатах. Попасть под санкции оказалось возможным за смену названия чата на что-то, что покажется модераторам сервиса чем-то зловещим, незаконным или злонамеренным.
При этом WhatsApp совершенно не спешил устранять данный сбой. На все запросы пострадавших о причинах блокировки сотрудники мессенджера отвечали, что пользователи сами нарушили правила сервиса, и вина в блокировке лежит исключительно на них. В результате людям приходилось либо менять номер телефона для регистрации нового профиля, либо уходить в другие сервисы – Telegram, Viber, Signal и другие.
Set Up and Debug Your Network
This document provides information for setting up your network and debugging potential problems.
The WhatsApp Business API client has certain network requirements for connecting to the WhatsApp servers. If your business cannot do the below, we unfortunately cannot support your WhatsApp integration.
We understand that different businesses have different network configurations and security concerns Contact Direct Support if this document is not sufficient for your setup because of any special connectivity or security requirements you may have.
The WhatsApp Business API client requires a long-lived TCP connection. Occasional requests will be made so the connection does not stay idle. However, you will have to ensure that your firewall, router, security, etc. do not terminate the long-lived TCP connections.
Ports
There are two ports used for outgoing traffic:
They are not listening or used for incoming traffic. Your business’s firewall can still protect from incoming traffic as normal.
It is recommended that you open both ports and allow all outgoing traffic.
Protocols
The WhatsApp Business API client uses two types of protocols:
WhatsApp uses HTTPS during registration and it is necessary for restarts. We do not recommend blocking HTTPS after registration because you never know when you will have to re-register or restart your application.
IP Addresses
WhatsApp uses a wide range of IP addresses for its servers. You can try to allow all of the IP addresses. However, it is best to just allow all outgoing traffic and connections from the above ports.
Hostnames
You can add the WhatsApp servers to your allow list by hostname rather than IP address.
The WhatsApp server hostnames that the WhatsApp Business API client requires connectivity to are:
Docker Container Images
You will also need to allow access to our repository in JFrog where we host the Docker container images in order to download them.
You must use hostnames in your allow list for JFrog as IP addresses cannot be provided.
The necessary JFrog hostnames are:
Firewalls
Depending on your firewall and how it functions, adding the hostnames to an allow list may not work and you will need to add all the IP addresses to an allow list instead.
Examples of firewall behavior that will not work with just the hostnames on an allow list are:
In the event that your firewall exhibits one of these behaviors please proceed to use the IP addresses in an allow list.
Proxies
Configure network proxies by setting the following environmental variables to the proxy you are using, then pass them to the Coreapp:
Testing with WADebug
The WADebug tool can help quickly check whether the Coreapp container has access to all the required WhatsApp servers. With WADebug installed, simply run:
Да, подключение TCP обязательно. Если вы не можете использовать дополнительные порты, воспользуйтесь дешифрованным протоколом SSL.
Подробнее см. в статье Требования к сети.
Нет. Клиент API WhatsApp Business открывает исходящее TCP-подключение к порту 5222 или 443 на серверах WhatsApp. Трафик TCP передается через это долговременное подключение. В брандмауэрах он обычно классифицируется как исходящий и подтвержденный трафик. Конечно, пакеты будут передаваться в обе стороны, но подключение исходит из клиента API WhatsApp Business, поэтому правило, разрешающее входящие подключения, не требуется.
Требования зависят от нагрузки и ситуации. Это решение будет работать на любом устройстве, если оно подключено к Интернету и на нем работает платформа Docker. Например, простое тестирование можно выполнить на обычном ноутбуке.
Минимальные требования к рабочему серверу с одним экземпляром: твердотельный накопитель емкостью 250 ГБ, 16 ГБ ОЗУ, четырехъядерный ЦП. Использовать обычные жесткие диски не рекомендуется из-за низкой скорости ввода-вывода: при высокой нагрузке это будет мешать работе.
Минимальные требования к рабочему серверу с распределением нагрузки: твердотельный накопитель емкостью 50 ГБ, 4ГБ ОЗУ, двухъядерный ЦП для каждого контейнера Coreapp, Master или Webapp.
В общем случае база данных должна работать на отдельном физическом сервере (не на том, где размещены контейнеры Coreapp и Webapp). Допустимая задержка при передаче данных между этим сервером и компьютером — не более нескольких миллисекунд.
Такая конфигурация поддерживает отправку примерно 20 сообщений в секунду.
Как избежать блокировки в WhatsApp для того чтобы…
… чтобы отправлять сообщения каждые 30 секунд (120 сообщений в час).
Надеюсь что мистер Цукерберг не заходит на этот ресурс.
WhatsApp – самый популярный в мире мессенджер (свыше 1.3 миллиарда пользователей), но почему нельзя общаться с большим количеством пользователей в этом приложении?
WhatsApp похож на чрезмерно опекающую своих детей мамашу, которая не хочет расстраивать своих пользователей спамом и рассылками и поэтому банит направо и налево все подряд, что хоть как-то отдаленно напоминает спам.
И если у вас много пользователей и вы ведете бизнес в WhatsApp, то это может быть большой проблемой.
С точки зрения WhatsApp, боты – это нормально, но вы должны только отвечать на сообщения, но никогда не начинать общение первым.
Но у вас нет выбора, вы должны все-таки начинать общение первым и если вам знакома эта проблема, то надеюсь что эта статья будет для вас полезна.
Самый простой путь – вышлите обычное СМС вашим пользователям со ссылкой, чтобы они могли начать общаться с вами или с вашим ботом первыми.
После этого вы должны вести беседу как реальный человек и тогда будет все нормально.
Но если это невозможно, то вам остается один путь – играть с WhatsApp по его правилам.
Не спамьте и следуйте следующим правилам, которые я вывел после огромного количества забаненных аккаунтов.
Что можно и чего нельзя делать:
1. Высылайте интересный контент, опросы показывают что пользователи нормально к этому относятся по сравнению с рекламой, даже если они получают сообщения в субботу вечером.
2. Добавляйте каждый контакт, которому вы шлете сообщения, в свой контакт лист.
3. Высылайте каждый раз как бы разные сообщения, можно сделать скрипт, который бы рандомно ставил пробелы в сообщения и вставлял бы имя получателя.
4. После отправки первого сообщения используйте рандомный таймаут (от 30 до 60 секунд) перед отправкой следующего сообщения.
5. WhatsApp ожидает что вы пользуетесь его вебверсией на десктопе в той же самой сети, что и ваш телефон.
Поэтому если вы запустили WhatsApp на реальном телефоне, а вебверсию где-то на хостинге, то вы будете заблочены.
6. Если вы не знаете как хакнуть валидацию регистрации (в сети много туториалов по этому вопросу), то лучше использовать реальный телефон, а не эмулятор.
7. Прокси маст хэв, удостоверьтесь что реальный телефон и бот имеют одинаковые IP адреса и эти адреса привязаны к той же стране, номера которой у вас в контакт листе.
8. Старайтесь группировать контакты по коду страны или региона, WhatsApp ожидает что реальный пользователь в основном общается в пределах одной страны или региона, совпадающего с регионом регистрации вашего номера и регионом большинства контактов.
9. Используйте какую-нибудь картинку в профиле, это не относится к Whatsapp Bots Catcher, просто люди могут пометить контакт без фото как спам.
10. Не надо продолжать слать сообщения тем пользователям, которые уже вас заблокировали, я предлагаю делать проверку на блокировку перед отправкой сообщения контакту.
11. Хотя вы можете пытаться отправить сообщения тем у кого нет WhatsApp, крайне не рекомендую это делать.
Всегда проверяйте имеет ли контакт WhatsApp аккаунт или нет.
13. Не позволяйте своему скрипту делать запросы туда, куда не делает их обычный клиент Whatsapp Web – все логи таких ошибок сохраняются.
14. Всегда шлите уведомление “прочитано” после принятия сообщения или выключите это уведомление в настройках.
15. Не отвечайте мгновенно на сообщение – нормальный таймаут ответа – 5-10 секунд.
16. Хорошая практика ответа на сообщение – открыть чат, выслать нотификацию “прочитано”, затем выслать статус «typing…», потом подождать несколько секунд и отправить сообщение.
17. Очищайте кэш в браузере всякий раз, когда вы открываете Whatsapp Web, да это головная боль каждый раз вводить новый QR код, но без этого ваш бот нормально не перезагрузится.
18. Избегайте высылать ссылки, которые уже были помечены кем-то как спам и избегайте слать ссылки без https. Хорошая идея – использовать сокращатели ссылок.
19. Важно: Плохая идея слать сообщения 24/7 без перерыва.
Рандомной задержки недостаточно, шлите разумное количество сообщений – например шлите максимум 4 сообщения в час каждому контакту кто ответил вам, затем перерыв на час и затем опять.
20. В начале разговора шлите только одно короткое сообщение, не нужно слать длинный текст или несколько сообщений без реакции пользователя на них.
21. Если вам нужно ответить несколькими сообщениями, вышлите сначала одно, потом подождите несколько секунд и затем вышлите второе.
Но даже если вы ответили несколькими сообщениями с паузами, вы все равно можете оказаться заблокированными, поэтому пытайтесь отвечать одним сообщением.
22. Не шлите разным людям разные сообщения одновременно, шлите такие сообщения по очереди.
23. Избегайте использования префиксов в сообщениях.
24. Не используйте yowsup-cli
25. Ставьте пометку online при отправке сообщения.
1. Каждый человек, кому вы отправляете сообщение и у которого вы не находитесь в контактах, будет спрошен на предмет спама.
Если вас выделят как спам 5-10 раз, вы будете заблокированы.
2. Помните – WhatsApp записывает каждое движение, которое вы делаете, чтобы проверить это вышлите письмо в их суппорт – они могут выслать логи.
Поэтому – ведите себя как человек.
3. Не замечено никаких банов когда вы проверяете есть тот или иной контакт в вацапе или когда вы скачиваете фото профайлов и т.д.
Это можно делать без таймаутов.
4. Использовать приложения которые дублируют вацап – тоже плохая идея – вацап это видит и блокирует.
5. Старайтесь вовлекать в чат с собеседника и если сразу вас не пометили как спам, то все ок и можно продолжать. Чем чаще отвечают вам люди тем меньше шансов у вас попасть под бан.
6. Думайте об этом как о балльной системе – если вас внесли в список контактов, то вы получили 1 балл, если пометили как спам – вы потеряли 1 балл и т.д.
7. Не позволяйте вашему боту быть запущенным долго – время от времени выключите WhatsApp Web, откройте вацап на телефоне, потом снова запустите вебверсию и т.д.
8. Виртуальные номера в некоторых странах знакомы вацапу, поэтому вы не сможете там зарегистрироваться, вы получите сообщение “Not a valid number for country XX”
9. Если вацап по каким то причинам стал недоступен на телефоне, а Whatsapp Web этого не заметил, то вы еще можете отправлять какие-то команды, но будете забанены, т.о. избегайте пользоваться Whatsapp Web если ваш телефон не в сети.
10. Если у вас несколько вацап аккаунтов под одним IP адресом и вы заметили что один из них заблокирован, немедленно закройте другие аккаунты, иначе они тоже будут заблокированы.
11. Если ваш контент – чистый спам, то неважно как вы отправляете сообщения – вы будете
заблокированы.
Если вас все-таки заблокировали, но вы не хотите сдаваться
1. Удалите вацап и все что с ним связано.
2. Сделайте сброс к заводским настройкам, если это возможно.
3. Подключитесь с новым IP адресом
5. Первые сообщения сделайте с тем номером, который давно имеет вацап – например с вашим собственным телефоном.
6. Некоторые люди говорят что нужно ждать 12-36 часов после первого сообщения, другие говорят что если вы не шлете сообщения в течении дня, то после первого сообщения вы будете забанены – я делаю так – регистрируюсь, шлю первое сообщение, потому жду несколько часов и затем уже шлю сообщения как обычно.
Что будет если вы напишете в суппорт WhatsApp с вопросом о причинах блокировки?
Есть небольшой шанс быть разбаненным, у меня было несколько случаев разблокировки через 1 день и несколько случаев блокировок с прошедшими месяцами после письма и до сих пор неразблокированными.
Отвечают быстро, но всегда одно и тоже:
## — WhatsApp Support — ##
Hello,
Thanks for getting in touch with us!
Your WhatsApp account has been disabled because you have violated our Terms of Service when using an unauthorized app or an unsupported device.
Please remove the application and install an authorized version on a compatible device at: www.whatsapp.com/download
Please keep in mind that we do not allow support for unofficial or jailbroken / rooted clients (including emulators) and unsupported devices.
To use WhatsApp on your computer, visit our website from your computer’s browser. Then open WhatsApp and scan the QR code using the WhatsApp application on your phone (look for WhatsApp Web in the WhatsApp settings on your device). WhatsApp can only be installed on your computer if you are using Windows operating systems 8.0 and higher or Mac OSX.9 and above. If you are experiencing problems installing WhatsApp on a supported operating system, disable your anti-virus and try again.
You have the option to access WhatsApp through your browser here if you are using non-compatible operating systems.
Your account will be permanently disabled, and without the possibility of appeal if you continue to violate our Terms of Service.
WhatsApp Support Team
Take a look at our FAQ.
Финальные соображения и заключения
После нескольких месяцев тестирования различных способов отправки сообщений могу сказать одно – нужно следовать Whatsapp’s policy, не слать спам, не начинать первым разговор и через обычную СМС высылать им ссылку для чата, чтобы они ответили первыми.
Note: Я не использую API для рассылки спама или маркетинговых предложний и не люблю тех кто это делает.
Я всегда пишу только тем, кто подтвердил желание общаться со мной, но на самом деле WhatsAppу плевать на это.
Все описанное выше может перестать работать завтра и никто не знает когда вацап начнет жестко банить всех кто не платит им за их официальное API.
Но если вы не следовали всем советам и у вас все работает, это означает что вы шлете мало сообщений и вацап не замечает этого.
WhatsApp, что внутри?

В этой статье мы подробно посмотрим как можно изучать протокол работы мессенджера, ответим на вопрос «может ли WhatsApp читать нашу переписку?» и приложу весь необходимый код на языке PHP.
Общая информация
В качестве формата сообщений WhatsApp использует доработанную версию протокола XMPP. Все сообщения сжимаются посредством замены часто используемых слов на 1 или 2 байтные токены (например вместо «message» — записываем байт 0x5f), таким образом получается то, что названо FunXMPP.
Некоторые пакеты могут быть дополнительно сжаты zlib. Полученный пакет шифруется AES GCM 256-бит и передаётся на сервер.
Для получения ключей шифрования клиент выполняет хэндшейк noise protocol. Вот здесь хорошо описано. От воплощения в коде все разработчики открытых реализаций почему-то отказались и повесили плашку «end of support», мы это поправим.
При первом подключении выполняется полный хэндшейк. После успешного подключения к серверу каждый раз выдаётся новый ключ для следующей сессии, при помощи которого в дальнейшем выполняется подключение без обмена ключами.
WhatsApp поддерживает сквозное шифрование с использованием libaxolotl (Signal Protocol), в коде реализованы две версии — сначала они просто сделали шифрование, а потом добавили выравнивание и назвали это v2. Тут есть только одна проблема — т.к. это централизованная система, то и передача ключей идёт через сервера WhatsApp, так что чисто технически нет никаких препятствий для разработчиков мессенджера передать подставные ключи шифрования и полностью читать переписку. Но это не имеет обратной силы, — прочитать сообщения задним числом не получится.
Кстати, при получении сообщения от не авторизованного контакта — в мессенджере отображается кнопка «пожаловаться на спам», нажав на неё мы не только заблокируем контакт, но и перешлём по защищенному каналу (уже в открытом виде!), текст сообщения. Без изучения кода приложения целиком нет возможности гарантировать, что этот функционал не используется в каких-либо других случаях.
Для проверки аутентичности ключей шифрования в приложении WhatsApp можно зайти в карточку контакта, выбрать пункт «Шифрование», после чего приложение предложит просканировать QR-код на устройстве получателя. Таким образом, кстати, можно сделать кастомное приложение на базе протокола WhatsApp, которое будет постоянно следить за статусом ключей шифрования и выдавать красивые плашки «АНБ следит за вами» или «Вы в безопасности»: учитывая многообразие мессенджеров, — заменить один из них на такое приложение будет даже полезно.
Алгоритм работы можно предположить следующий: устройство отображающее QR-код кодирует в него свой публичный ключ, устройство считывающее QR-код сверяет ключ с имеющемся в своей базе данных. Это безопасный способ верификации ключа, но только при отсутствии закладок в приложении.
При отправке мультимедиа файлы загружаются на сервера WhatsApp, мы не проводили дополнительные исследования шифруются ли они там. Скорее всего не шифруются, т.к. разработчик приложения себе доверяет, а ссылка на файл передаётся по защищенному сквозным шифрованием каналу.
Регистрация учетной записи
Регистрация проходит в три https-запроса на домен v.whatsapp.net (их можно подсмотреть любым известным способом, например burp или mitmproxy, в приложении используется certificate pinning, который обходится при помощи ssl kill switch).
v.whatsapp.net/v2/exists?cc=код_страны&in=телефон&id=id_устройства&lg=en&lc=zz
не делает ничего полезного, раньше, скорее всего, служил для проверки не зарегистрирован ли уже этот номер (скорее всего до момента, пока кто-то не стал перебирать их базу)
v.whatsapp.net/v2/code?method=sms&cc=код_страны&in=телефон&token=токен&sim_mcc=mcc&sim_mnc=mnc&id=id_устройства&lg=en&lc=zz&параметры_сквозного_шифрования
Собственно запрашивает код sms активации. Так же может использоваться аналогичный запрос для получения звонка. Параметры сквозного шифрования не обязательны, — их можно настроить при дальнейшем подключении. Токен получается так:
Первая строка — это зашифрованная строка landscape, что бы это не значило. Версию приложения (21752) можно подставить любую (самые любопытные могут попробовать зарегистрироваться ещё не вышедшей версией), в самом коде приложения хэш от версии зашит готовый, но что-то похожее на md5-хэш довольно быстро подбирается.
v.whatsapp.net/v2/register?cc=код_страны&in=телефон&code=код_из_смс&id=id_устройства&lg=en&lc=zz
Этот запрос, соответственно, подтверждает регистрацию с кодом полученным по смс или звонку.
Всё это известно не первый день, — есть несколько реализаций протокола WA16 (Chat-API, Yowsup), от текущего WA20 отличие заключается по-сути только в Noise Protocol. Обладая этой информацией мы можем разработать локальный MITM для просмотра расшифрованного трафика приложения. Т.к. изначально протокол приложения XMPP — то всё что там происходит будет вполне понятно сразу из расшифрованного трафика, поэтому погружаться в дебри дизассемблера особой нужды нет.
Для запуска MITM — мы представимся настоящим сервером WhatsApp, выполним полный хэндшейк, после чего наше приложение будет прослушивать трафик перенаправляя его на оригинальный сервер whatsapp и обратно. Для этого нам понадобится изменить оригинальное приложение:
Все операции проводятся в следующей конфигурации: iPhone 4, iOS 7.1.2, IDA 7, WhatsApp 2.17.52.
Патчим приложение
В регистре R0 как раз хранится serverStaticPublicKey и при его отсутствии выполняется переход к FullHandshake. А мы сделаем этот переход безусловным. Для этого заменим два байта
В декомпиляторе видим, что одна из веток условия стала недостижимой и не отображается.
Нам необходимо чтобы функция всегда возвращала единицу. Сейчас результат проверки сертификата из регистра R6 кладется в R0.
Сделаем так чтобы в R0 записывалась единица
В результате получаем
Приложение собрано со всей отладочной информацией, поэтому дополнительно выполнять переименования, описывать структуры и вообще выполнять процесс реверсинга — при создании патча фактически не требуется. Изображения приведены сразу после запуска декомпилятора, без дополнительной обработки.
iOS 7.1.2 не проверяет аутентичность бинарных файлов приложений, поэтому все изменения можно сделать прямо в файле приложения. В более поздних версиях iOS можно сделать эти же изменения в памяти запущенного приложения.
Пишем код.
Далее при помощи IDA и долгих кропотливых усилий подготавливаем код успешно выполняющий NoiseHandshake на серверах WhatsApp. Затем реализуем фейковый сервер — делаем все те же операции шифрования, но в обратном порядке (звучит просто, но если не занимаешься этим каждый день — та ещё головная боль). Готовый код лежит здесь.
Скачиваем на компьютер приложение MITM полученное по ссылке выше. Устанавливаем PHP 5.6 (подойдёт и другая версия, в моей конфигурации использовалась именно эта версия). Так же понадобится ещё две библиотеки:
— первая
— вторая
Перехватываем соединение
Остаётся только заставить приложение подключаться к нашему серверу, вместо настоящего. Приложение выполняет подключение к одному из серверов e%d.whatsapp.net (где %d — число от 1 до 16, например e5.whatsapp.net), каждый из которых резолвится на несколько IP-адресов, каждый раз — разных, в сумме больше 300 серверов. Проще всего будет подменить DNS-ответ сервера и направить его на наш компьютер с MITM.
Для этого помещаем телефон и компьютер в одну сеть (буквально любой маршрутизатор wifi подойдёт), на телефоне выставляем DNS на наш компьютер на котором устанавливаем bind9 со следующим хостом:
Смотрим трафик
Далее отредактируем mitm.php — нужно подставить свой номер телефона в поле username и содержимое файла cck.dat (находится в директории с приложением) в поле password.
Запускаем php mitm.php. Запускаем приложение WhatsApp и видим следующую картинку:
На скриншоте видно два пакета от сервера — сообщение об успешной авторизации и какие-то настройки. Таким образом выглядит абсолютно весь трафик приложения, — всё читабельно и дополнительно разбирать приложение, в большинстве случаев, не требуется.
Алгоритм превращения FunXMPP в читаемый текст есть во всех библиотеках работы с WhatsApp. Внутри простейшая машина состояний, дополнительно расписывать его здесь не буду.
Выводы
Приложение сделано качественно, использует современные протоколы шифрования, однако глубоко внутри лежит XMPP оставшийся от изначально используемого ejabberd. Использовать protobuf, судя по текущему вектору развития приложения, — было бы логичнее, однако историческое наследие слишком дорого.
Сервис долгое время сильно страдал от массовых рассылок, — код открытых проектов широко этому способствовал. На данный момент уже давно не приходило никаких рассылок, — разработчики ввели ограничение на количество отправляемых сообщений не авторизованным контактам. Именно это дополнение (технически реализуемое полностью на стороне сервера), на мой взгляд, решительно поставило точку в противостоянии любителей рассылок и работников отдела по борьбе с рассылками (если у них такой есть).
Чисто технически нет ничего сложного в таком алгоритме, разработчикам других мессенджеров (привет, Viber, — получаю спам не реже раза в месяц), — стоит взять этот приём на заметку.
Спасибо за прочтение, надеюсь читать про это было так же весело и интересно, как и проводить исследование.











