Все началось с простого вопроса из названия. Мне было известно, что настольное приложение связывается с телефоном после первоначального рукопожатия (та часть, где вы должны сканировать QrCode, чтобы он знал, что это вы, а не кто-то другой, пытающийся прочитать ваши разговоры), но я хотел точно знать, какая информация была рассылается.

Отказ от ответственности: я хотел сначала отправить это в facebook, но чтобы сообщить о чем-то, вам понадобится учетная запись facebook, которой у меня нет. Тогда я подумал ... об этом не стоит сообщать, они должны знать об этом и посчитали, что это стоит игнорировать.

Сначала я начал смотреть на отправляемые / получаемые вызовы xhr, но их было немного, я потерял интерес и забыл об этом. Теперь, пару месяцев спустя, мне стало скучно иметь свободное время после того, как я уволился с работы и когда моя девушка путешествовала по другой стороне планеты, интерес как бы вернулся. Как именно они передают данные, и какие данные легко читать и изменять с настольного сайта.

ПРИМЕЧАНИЕ. Если у вас есть правильные настройки конфиденциальности, это не позволит кому-либо еще видеть ваше изображение или последнее посещение. Вот почему я говорю «свободно доступные данные», а не что-то вроде получения доступа к личным данным.

Есть удивительный технический документ по безопасности, используемый для шифрования / дешифрования всех этапов процесса, доступный от самих создателей, и терминология выходит мне на ум, но она есть, если вы хотите прочитать Это.

Вы что-то сказали про батарею

Первоначально мое внимание привлек аккумулятор, потому что, когда у вас низкий уровень заряда, вы получаете предупреждение на рабочем столе / веб-клиенте, сообщающее, что устройство приближается к отходу ко сну.

Когда я нашел источник информации, он не зашифрован, так как Whatsapp обменивается данными с самим собой, я обнаружил гораздо больше, чем ожидал. Настольный клиент знает марку и модель устройства, независимо от того, подключено оно или нет, версию операционной системы, на которой оно запущено, сборку и еще несколько вещей, таких как токены и ваш идентификатор, который, очевидно, соответствует формату [email protected].

...
"wid": "[email protected]",     
"battery": 99,
"plugged": false,
"platform": "android",
”phone”: {
   “wa_version”: “2.18.191”,
   “mcc”: “214”,
   “mnc”: “003”,
   “os_version”: “8.0.0”,
   “device_manufacturer”: “HUAWEI”,
   “device_model”: “HWVTR”,
   “os_build_number”: “VTR-L09 8.0.0.370(C432)”
 }
...

Мне больше нечего делать с этой информацией, поэтому я начал изучать другие отправляемые и получаемые текстовые сообщения.

Как мы можем повеселиться

Сначала я решил немного поиграть с изменением данных, которые представляют что-то, что я понял, например номер телефона или статус, и посмотреть, как это повлияет на мое настольное приложение. Конечно, вы можете изменить ответ сервера, но что в этом интересного? Первое, что я добился, - это получить чье-то изображение профиля, не добавляя его в свою адресную книгу. Если мы перехватим исходящий вызов для profilePicThumb и изменим номер, мы получим ответ от сервера, который будет содержать URL-адрес изображения профиля этого пользователя.

554. — 377,,[“query”,”ProfilePicThumb”,”[email protected]”]

В данном случае пользователь - это испанский номер телефона с префиксом 34. Обратите внимание: я не могу гарантировать, что у всех будет одинаковый суффикс после @. Первые разделы исходящего сообщения, кажется, игнорируются, причем один из них представляет собой автоматически увеличивающееся количество сообщений, а другой иногда является меткой времени, иногда ... Я не знаю, что такое 554.

Но все должно было быть зашифровано!

Что ж, одноранговые сообщения зашифрованы, групповые сообщения зашифрованы, но все же есть некоторые простые текстовые запросы от устройства, которые читаются человеком.

Интересный запрос, сделанный через Websocket, - это вызов resumePic, который отправляет массив идентификаторов, для которых вы хотите получить их изображения. Проблема в том, что вы можете добавить кого угодно в свою телефонную книгу, а Whatsapp даже не проверяет их в вашей телефонной книге, потому что вы можете быть тем, кто получает сообщение, или быть частью группы с людьми, которых вы не добавили, но все еще хотите увидеть их изображение.

##Sample input
165. — 125,, 
[
   "query", 
   "resumePic", 
   [
      {
         "id": "[email protected]",
      }, 
      {
         "id": "[email protected]"
      }
      ...
   ]
]
##Sample response
[
   {
       "id": "[email protected]",
       "tag": "1531075970",
       "eurl": "https://pps.whatsapp.net/v/phone1.jpg"
   }, 
   {
       "id": "phone2@c.us",
       "tag": "1442427544",
       "eurl": "https://pps.whatsapp.net/v/phone2.jpg"
}

Хотя поначалу это может показаться безобидным, чем больше я думаю об этом, тем больше меня беспокоит. Я могу получить информацию о людях, которых я даже не добавил в свою телефонную книгу. Если мне вернут только id, я предполагаю, что у этого номера нет связанной учетной записи. Однако tag - это отметка времени последнего посещения, которое мы видим под именем контакта на экране чата.

Я вижу, что это используется спамерами для сбора большого количества людей и, позвольте мне быть параноиком, получения некоторой пикантной информации. Программный мониторинг статуса, времени последнего посещения и изображений большого числа пользователей может принести прибыль тому, кто знает, что делать с этой информацией.

Есть ли ограничение на количество запросов, которые вы можете сделать к серверу в количественном выражении? Давай попробуем с чем-нибудь глупым, я чувствую себя щедрым, учитывая, что никто, черт возьми, это все равно не читает.

Откройте консоль браузера, создайте массив из сотен чисел и экспортируйте его в строку JSON, чтобы еще немного поиграть в Burp. Полученный массив можно вставить в синтаксис предыдущего вызова.

JSON.stringify(
   [...Array(99||0)].map(
        (v,i)=>({id:("346651345"+i).substr(0,11)+"@c.us"})
    )
)

Я был немного напуган тем, что инженеры WhatsApp могли предотвратить это и забанить меня за злоупотребление их услугами, к счастью для меня, у них, похоже, есть какая-то система дросселирования, поскольку приложение вернуло только 26 результатов, ни один из них не был недействительным. Дальнейшие тесты с разными числами достигли 35 результатов. Все они имеют прямую ссылку на изображение профиля и время их последнего посещения, все они люди, о которых я понятия не имею. Хотя есть много фотографий собак, что приятно.

Подождите! Почему 26, а затем 35? Я не знал !. Я знал, что разница в 9 возникла потому, что я не удостоверился, что в номере достаточно цифр, но это все еще не объясняло, почему 35, а не 91.

Итак, я снова звоню с тысячей номеров

Я получил 392 результата. Я ожидал максимум 256, так как это предел участников в группе, так что, может быть, дросселя нет, может, нет предела, может, это не такая мелочь. Что я могу сделать, так это сделать небольшой коллаж из изображений, поскольку они общедоступны, но я добавлю немного размытия, чтобы скрыть свою спину. curl $(printf ' -O %s' $(<urls.txt)), чтобы мгновенно загрузить все URL-адреса.

Я также проанализировал все последние просмотренные данные и не смог прийти к какому-либо выводу: есть много пользователей, которые были активны за последние 24 часа, и много пользователей, которые больше не пользуются сервисом. В конце концов, это данные.

Что все это значит

Для меня просто немного веселья. Для кого-то злонамеренного, хорошая информация, возможно, может быть, это достигнет кого-то, кто сможет предотвратить это, добавив простой дроссель или запретив идентификатору пользователя запрашивать уйму изображений. Наверное, нет, но мечтать можно.

https://pps.whatsapp.net/v/t61.11540-24/16488300_382216242151672_1005176703817203712_n.jpg?oe=5B468759&oh=a9f538f348acc056c4d874f1793f7c89

Предыдущий URL изменен, чтобы не показывать чью-либо фотографию.

Анализируя URL-адреса, мы видим два параметра, oe и oh, которые представляют метку времени в шестнадцатеричном формате, например 5B468759 (несколько дней в будущем, так что, возможно, это метка времени действительности, но я все еще могу получить доступ к изображениям более чем через 12 часов после запроса) и подпись для этого URL-адреса в виде шестнадцатеричной строки из 32 символов, что упрощает их команде определение того, кто использует их данные.

На самом URL-адресе https://pps.whatsapp.net/v/t61.11540-24 кажется неизменным.

Я уверен, что это только верхушка айсберга, когда дело доходит до доступных данных, я не хотел слишком много следить за данными для этого поста, если он получит какой-либо прием, я мог бы продолжить этот путь, если нет… я повеселился !.

Дополнительно к статусу пользователей

Таким же образом мы можем перехватить исходящее сообщение и изменить запрос к серверу, чтобы получить всю предыдущую информацию, мы также можем получить статус номера, который не связан с нами путем отправки.

#Input
170.--254,,[“query”,”Status”,”[email protected]”]
#Response
170.--254,{"status":"At work"}

Я оставил это на потом, потому что самой захватывающей, если ее можно так назвать, частью статьи был коллаж из изображений и график времени последнего просмотра. Это более… приземленное.