Как я потерял и брутфорсил кодовое слово на сайте загранпаспортов МИДа РФ и автоматизировал получение загранпаспорта

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Планируя переезд в Грузию, я озаботился вопросом наличия двух загранпаспортов (нового и старого образца) еще за полгода до отъезда. Сделав один, я уже подался на второй, оплатил пошлину, мне его сделали, но я не успел его забрать и уехал на недельку отдыхать в Китай... где в самолете забыл свой единственный загранпаспорт. Но это история для отдельного поста. Вернувшись, мне пришлось отказаться от уже готового паспорта, и я так и не успел сделать загран нового образца, так что решил доделать всё уже в Тбилиси.

Это история о том, как я подался на получение загранпаспорта нового образца в консульство в Тбилиси, забыл кодовое слово для доступа к анкете на сайте zp.midpass.ru, перерыл весь код их фронтенда и вспомнил комбинаторику, чтобы восстановить это слово. А также готовый код для тех, кто попал в такую же беду и бот, который нажимает одну кнопку раз в день.

Что за кодовое слово?

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

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

Как на самом деле все устроено

Первое, что я попытался сделать, это посмотреть сохраненные данные сайта

Системы аккаунтов на сайте нет: заходишь, создаешь заявку, она сохраняется в браузере. Вся информация, не скрытая под кодовым словом (ФИО, дата создания, id) в чистом json, а вот в зашифрованном Request#[uuid вашей заявки] хранятся сами данные заявления. Очевидно, данные в формате base64, так что пробуем декодировать:

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

this.cryptoProvider.decryptData(itemJson.data, passPhrase) === 'DecryptTestMessage'

Эта строка кода расшифровывает то самое значение в base64 из localstorage, и если оно равно "DecryptTestMessage", значит кодовое слово правильное. Осталось найти cryptoProvider среди скомпилированного js.

Что здесь происходит? Задумка автора это или оптимизация компилятора – останется загадкой 						</div>

Источник: https://habr.com/ru/articles/826882/<br/><br/>




<div style=

Интересные статьи

Интересные статьи

В TypeScript 5.2 появится новое ключевое слово 'using', которое можно будет использовать для утилизации чего-либо с помощью функции Symbol.dispose, когда оно покидает область видимости.
Всем ведь приходилось заниматься улучшением производительности? Для игр особенно актуально, ну может какая-то три-в-ряд не страдает этим. Как обычно серебряной пули нет, начинаем со структур данных, а...
Не одно тысячелетие математиков интересовал вопрос существования нечётных совершенных чисел. В процессе его изучения они составили невероятный список ограничений для этих гипотетическ...
Тот, кто сталкивался с локализацией приложения, наверняка знает, что это процесс постоянный с большим количеством рутинных задач. Поэтому автоматизировать их — вполне логичное жел...
В .Net Core есть встроенный механизм Model Binding, позволяющий не просто принимать входные параметры в контроллерах, а получать сразу объекты с заполненными полями. Это позволяет встроить в тако...