выебано
December 2, 2022

Рега mail.ru на запросеках и без номера

Моё ебало, под конец всего прекола

Но обо всём по порядку..

Подготовка

Проведём поверхностный прочек запросов реги (развед очка)

Заполняем форму базовой инфой
Получем капчу с картинкой. На скрине выделен запрос отправки ответа на капчу

Уу, блять, кукисы какие-то, хотя.. вроде, выглядят не страшно.

Спойлер: самое интересное подчеркнуто зелененьким, но я тогда этого еще не знал. Как я был наивен, думая что все будет просто..

Отправка данных чтоб в ответ получить разрешение на регу (Заголовки запроса)

Так, для апрува мы шлем фингер, что уже немного неприятно, но не прям страшна.

Отправка данных чтоб в ответ получить разрешение на регу (Параметры запроса)

Почекаем, что шлет запрос апрува капчи.

Отправка ответа на капчу (Заголовки запроса)
Отправка ответа на капчу (Параметры запроса)

Ладненько, начинаем потихоньку собирать запрос на регу, чекаем от куда берутся куки.

Не удивительно, что нужен запрос самой страницы реги.

Кукисы в ответ на запрос страницы

Ну, запрос пикселя тоже звучит банально..

Запрос пикселя

Так нахуй, а вот это уже интересно. Запрос VID кукиса тянется из ответа на запрос статки, но..

Страная кука VID в запросе на регу

Этот запрос получает эту куку в ответ на другой запрос статки, который.. делает то же самое, но с другим запросом статки.

Кука тянется из ответа другого запроса статки
Я уже начинаю что-то подозревать
Кука опять тянется из ответа другого запроса статки
Негодование

Ну что ж, пройдемся тогда по всем запросекам статки. Сделал скрин, чтоб видно было сколько их в bts.

Запросик в статку №1 и фулл запросеки

А теперь, пойдем по порядку.

Запросик в статку №1

Начинаем чекать отличия, уже видим меняется id, добавляется opt.

Запросик в статку №2

Передается список ids и новый параметр e (тип события, наверное)

Запросик в статку №3

Параметры detect и e не выглядят страшно, в отличие от nt и забегая вперед скажу, что это вполне оправдано.

Запросик в статку №4

Опять поменялись знакомые id и opt.

Запросик в статку №5

Опять id и опять e, но уже с другим значением.

Запросик в статку №6

Банально..

Запросик в статку №7

Банально..

Запросик в статку №8

О, поменялся e, похоже действительно реагирует на event.

Запросик в статку №9

Хэдеры тоже до кучи буду передавать и парсить с фингера, раз фингер тоже нужен при реге.

Во всех запросеках есть заглы с инфой об устройстве

Или нет..?

Обдумываю взлом жопы

Сначала может показаться: нахуя ты все это рассказываешь?

Наверное, можно просто без всяких куков хуюков там обойтись?

Спойлер: не сойдет

Ну что ж, проведем банальную провер очку. Блочим домен, на который сайт шлет запросы статки.

Залочим запрос подгрузки кода для сбора статки

Получается пососака

Не апрув реги

Перезагружаю страницу, ввожу в форму те же самые данные и рега проходит

Апрув реги

Отлично, думаю теперь базару зиро.

Чудесно, с введением покончено.

Ёбань с плясками начинается

Похуярили

Начинаем чекать со стека вызовов первого запроса.

База

Ставлю брекпоинт на xb. Да, номер строки поменялся, тк я отформатировал код.

Мэджик кнопочка, если кто не знал

Перезагружаем страницу и ловим запрос.

Отловил запрос

Пройдемся по стеку вызовов имея на руках данные.

Ищем дальше

Отлишна, видим что запрос проходит через функцию I, от куда выходит уже сформированным.

Начинаю по тихоньку разматывать клубок
Вся (ну или почти вся) магия запрятана в этой функции

Ну, собственно сама наша нужная функция.

Окей, ну туперь все очевидно, тут видно как формируется вся хуйня
Ну а хули и да

Начнем разбор с первого запросека статки

Окей, опять перезагружаю страницу (за время написания софта я делал это ооочень много раз) и начинаю дебажить.

Поставил брек в начало, тк тут какая-то мутная функция

Оки, на вход мы получается передали id типа задачи и инкрементим какую-то z с параметром id через функцию Ba. Почекаем значения переменных в нашем контексте.

Чек глобалок

Оки, вполне очевидно, что мы инкрементим "tmr_reqNum", получается это глобалка, которая считает номера запросов в статку.

Пруфы озвученных ранее слов
Переменная, которая хранит ключевые значения

Получается, ранее они объявляют эти переменные, а потом уже юзают.

Объявление глобальных переменных

Проспидраним функцию, раскидав бреки в интересных (на самом деле рандомных) местах.

Сработал брек, видно что чекает таймзону, еще колдует чет с инфой об экране
Видим как формируется урла для запросека
Тут, как потом станет ясно, дергается время старта загрузки страницы
Видим как формируется урла для запросека
Видим как собирает строку s из таймзоны и Intl
Готовый урл запроса, со всей хуйей. Есть лишний параметр userid, но я его выкинул, просто потому что он появился тк ак уже зареган, а я при этом уже хуй знает сколько раз перезагружал страницу
Запросик в статку №1

По итогу получаем что-то вроде этого:

13;id=3118422;u=https://account.mail.ru/signup?from=main_m_touch;st=1669708190882;title=Регистрация;s=1366*768;vp=150*657;touch=0;hds=1;frame=0;flash=;sid=5f81d249a2af34ae;ver=60.3.0;tz=-180/Europe/Moscow;ni=1.1//4g/250/0/;detect=0;lvid=1669667590746:1669710757923:24:74086a4a5cb2695ab8499083f76c0ebb;visible=true;_=0.6545837795068763

Окей, а теперь разберем всю эту хуйню. Где:

13; - дефолт

id=3118422; - айди задачи

u=https://account.mail.ru/signup?from=main_m_touc; - ссылка на текущую страницу

st=1669708190882; - время старта загрузки страницы

Про всю эту хуеверть расскажу чуть позже

title=Регистрация; - заголовок страницы

s=1366*768; и vp=150*657; - инфа о размере экрана

Судя по замыканию, в k у нас лежит window.document, а в l просто window

Поэтому, для s дергаем фулл размер страницы

Для vp чекаем видимую область экрана

touch=0; hds=1; frame=0; flash=;

Не стоит также забывать, что O у нас это Navigator

sid=5f81d249a2af34ae; - уник айди

Это у нас

Учтём, что Qa просто генератор уник строки, по сути, который срабатывает при старте

ver=60.3.0; - дефолт

tz=-180/Europe/Moscow; - сборная инфа о часовом поясе

Интернационализация (Intl.DateTimeFormat) дока примерчеки и пояснения

ni=1.1//4g/250/0/; - инфа о интернет соединении

NetworkInformation дока по connection, дока по effectiveType

detect=0; - добавляется просто там где надо (указано в параметрах вызова функции)

lvid=1669667590746:1669710757923:24:74086a4a5cb2695ab8499083f76c0ebb; - сборный параметр

tmr_lvidTS - время старта передачи статки

tmr_reqNum - счетчик запросов

tmr_lvid, где Qa просто генератор уник строки при старте

visible=true; - добавляется где надо

=0.6545837795068763 - рандом значение

Наверное кто-то мог подумать, что это всё, но..

:)

Второй запросек статки

Запросик в статку №2

id - айди задания

opts - добавляется к заданиям, которые имеют айди не "3118422"

Видим, что сравнивают текущий айди запроса с "3118422"

Третий запросек статки

Запросик в статку №3

Тут вообще нихуя интересного, просто добавляется параметр e и ids (айди всех видов запросов статки)

Четвертый запросек статки

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

Запросик в статку №4

По итогу получаем что-то вроде этого:

"/tracker?js=13;id=3118422;u=https://account.mail.ru/signup?from=main_m_touch;st=1669722687102;title=Регистрация;s=1366*768;vp=133*657;touch=0;hds=1;frame=0;flash=;sid=301b4aa8b512f023;ver=60.3.0;tz=-180/Europe/Moscow;nt=1/0/1669722679322/1546/1547///56/172/282/282/610/476/641/1198/3150/1832/7780/7780/7783/2425088/2425088/;ni=0.5//4g/150/0/;detect=0;lvid=1669667590746:1669725855956:27:74086a4a5cb2695ab8499083f76c0ebb;visible=true;_=0.6594543808481805"

Если чекать по скрину, то:

e - опять тип события

et - отметка текущего времени

detect=0 - добавляется там где надо, но

Он чекает наличие в куках tmr_detect

Регулярка для чека
Результат работы регулярки
Возврат значеня detect

Из необычного тут только параметр nt.

Вся ебля туть. Куча таймингов.
Код для пропарса и сборки таймингов в массив
Переменная, где хранятся тайминги
Переменная с массивом параметров таймингов, которые мы чекаем
Кусок хуйни, где видно как мы устанавливаем эту глобалку со спиской нужных таймингов
Пример перебора значений. На каждом этапе оно вычитается их стартового, результат вычитания и вертает.
Группировка полученных разниц таймингов

Как я их генерировал? Наверное я провел сложный статистический анализ? Или быть может заебенил рандом? Оба варианта и да и нет.

Короче, я насобирал десяток запросов и сидел ручками сравнивал отклонения, высчитывая диапазоны.

Дрочево

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

Кусок кода для генерации поебистики с цифрами для имитации загрузки страницы

В остальных запросах все банально и там ничего нового или интересного.

Немного особенных параметров

На самом деле, тут онли метрика.

Параметры запроса
Сборка парметра

Они подготавливают массив с регулярочками для перебора всех объектов окна с целью прочекать метрики. На скрине ниже код словил яндекс метрику.

Словил яндекс метрику

Ну а тут виден фулл кусок кода для перебора объектов.

Фул код чека метрики
Кусок кода метрики в странице сайта

Да, их (особенных параметров) было всего 1.

Жиза

Кусочек итоговой функции генерации урла - URLGenerator

URLGenerator

А теперь про заголовки, отпечаток, прокси и..

Заголовки

sec-ch-ua, да, те самые, которые "можно не передавать, всем на них обычно похуй". Но мне не похуй, поэтому хуярим дальше..

Заголовки ua в запросе реги
  • Sec-CH-UA: имя браузера и основная/значительная версия
  • Sec-CH-UA-Mobile: логическое значение, указывающее мобильное устройство
  • Sec-CH-UA-Platform: название операционной системы
Как их почекать в браузере

А вот где они хранятся в отпечатке баса 23.2.2.

Ua заголовки в фингере баса

Для тех у кого вопрос "шо за хуйня этот ваш defineProperty?" линк на доку

  • User-agent: содержит информацию о названии браузера, версии и платформе
User-agent в фингере баса

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

Жесц

Статья от гугла с пояснением всей хуйни по этому вопросу

Дока

Почему Chrome использует sec-ch-ua: "\"Not\\A;Brand";v="99"?

Отпечаток

Ну, коли есть фингер, будем парсить. Имеем в объекте фингера 3 объекта:

screen

screen

navigator

navigator

flash

flash

Почти всю хуйню дергаем из attr в фингере баса.

Инфа из фингера

Прокси и заголовок языка

Я сидел кумекал "как подставлять в фингер и в заголовок гео прокси без левых запросов?", оказалось в бас есть модуль "Часовой пояс".

Модуль для чека гео прокси
Фулл список возможностей действия

Тоесть мы можем получить в том числе вот эту инфу:

Хуйня из дебага (Intl)
Заебенил кодом для кастомной обработки, чтоб не плодить лишних переменных

Парс ютм меток

Вдохновился вот этим куском кода из статьи.

Тест кода парса utm меток

Перенес в бас и чуть переделал под себя.

Перенес в бас

x-request-id

Во многих запросах был x-request-id - это банальный uuid v4. По сути рандом строка, только с правилами.

Из кода mail.ru
Перенес в бас

Отлично, подготовка окончена

Теперь пройдемся еще раз по ключевым запросам.

Запрос signup

Урл запроса signup
Заголовки ответа signup
Заголовки запроса signup
Ответ на запрос signup
Перенес signup в бас

Запрос RS

Урл запроса rs
Заголовки ответа rs
Заголовки запроса rs
Ответ на запрос rs

Запрос countries

Урл запроса countries
Заголовки ответа countries
Заголовки запроса countries
Полезная нагрузка countries
Ответ на запрос countries

Запрос exists

Урл запроса exists
Заголовки ответа exists
Заголовки запроса
Полезная нагрузка exists
Ответ на запрос exists
Перенес exists в бас

Запрос strength

Урл запроса strength
Заголовки ответа strength
Заголовки запроса strength
Полезная нагрузка strength
Ответ на запрос strength
Перенес strength в бас

Запрос signup

Урл запроса signup
Заголовки ответа signup
Заголовки запроса signup
Полезная нагрузка signup
Не валид ответ signup
Валид ответ signup
Перенес signup в бас

Запрос confirm

Урл запроса confirm
Заголовки ответа confirm
Заголовки запроса confirm
Полезная нагрузка confirm
Не валид ответ confirm
Валид ответ confirm
Перенес confirm в бас

Про капчу

Урл запроса капчи
Заголовки ответа капчи
Заголовки запроса капчи
Ответ капчи

Но как же запросить капчу?

По сути оно просто передает текущее время в 36 системе исчисления на урлу и фсе, а цепляется капча по идее к куке mrcu.

Урл капчи
Установка айди капчи
Генерация айди капчи (перевод времени в 36 систему)

Я долго ебался и не мог понять "а какого хуя у меня в бас получается одна строка, а в ноде другая?". Оказалось, дело в округлении, челы из ноды поменяли просто округление, ну а в бас старая нода просто.

Причина - версия движка
Фул инфа: https://github.com/nodejs/node/issues/13858

Фича округления

Я тестил всякие варианты шифрования и дешифрования.

Вот, если кому понадобится перекодировать в float обратно.
https://groups.google.com/g/comp.lang.javascript/c/bPdQPSIXzkI/m/AGTQvk9Yh6IJ

Кусок кода для колдунства с ситемами исчисления

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

В целом, получается штука не критичная, если ее как строку не обрабатывать после перекодирования, тк обратно оно ее декодит без проблем.

Немного особенных параметров на запросах реги

Работа с utm метками была разобрана уже ранее, а тут появляется client. Сначала я не догадался, но оказалось просто, оно реагирует на ширину видимой области экрана.

Особенные параметры в запрсое реги

Ну собственно пруф - кусок кода, который чекает ширину экрана.

Чек ширины экрана
Установка tuch при ширине меньше 768

Получение писем

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

Фича octavius в куках
Страница в приемлемом виде
Токен на странице в приемлемом виде

А у меня выдавало вот это:

Страница в неприемлемом виде

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

Токен на странице в неприемлемом виде

Запрос письма на пк фингере (folder)

Урл folder

Заголовки folder
Ответ folder

Однако, при передаче мобильного redirect_uri, таки появлялась возможность работать с апи touch.mail.ru, в котором уже страница приходила нормальная, но токен я парсил отдельным запросом. Отвечу наперед, нет, этот запрос не ворк на куках с пк авториза.

redirect_uri на моб фингере

Напомню, вот обычный

redirect_uri на пк фингере

Запрос токена на моб фингере (tokens)

Урл tokens
Заголовки tokens
Ответ tokens

Запрос письма на моб фингере (folders)

Урл folders
Заголовки folders
Полезная нагрузка folders
Ответ folders

Преколы

Листал код, наткнулся, что есть еще и dev домен, помимо обычного. Но регнуть мыло на него у меня не получилось.

dev домен

Прогуглил, нашел всего 2 валид ссылки через яндекс, а также авториз в какой-то кабинет вк:

https://es.vkcorporate.com/
https://private.infra.devmail.ru/
https://leaders-prod.devmail.ru/

Помимо этого, были еще всякие заметки и статьи с урлом на дев домен, но это не то.

Вернемся к началу: а можно было проще?

Кароче, оказалось что я долбаеб. Можно было таки обойтись без запросов в статку..

Рега с запросами в статку
Рега без запросов в статку

Я, который потратил на это дохуя времени:

Мм, выгодная инвестиция времени

Результаты

Тем не менее, все работает, вот результаты:

Отчет работы
Лог скрипта

Формат результатов

[[LOGIN]]@[[DOMAIN]]:[[PASSWORD]]:[[TOKEN]]|[[FIRST]]:[[LAST]]|[[DAY]].[[MONTH]].[[YEAR]]|[[PROXY]]|[[PROXY_LANG]]|[[HEADER_UA]]|[[SAVED_COOKIES_BASE64]]

Возможно, по ходу прочтения, у тебя в голове возникал вопрос:

А нахуя вот это вот все? Зачем ты делал вот эту вот всю дичь?

Отвечаю:

Полезные ссылки:

https://regex101.com/

https://xpather.com/

https://beautifier.io/

https://www.programiz.com/javascript/online-compiler/

https://jsonformatter.org/

https://meyerweb.com/eric/tools/dencoder/