Решаем hcaptcha (Продолжение)

Alexandr Sokolov
3 min readJun 13, 2021

--

Photo by Pete Willis on Unsplash

Обновлю итог прошлых расследований. Cloudflare попытались спрятать колбек-функцию и теперь, чтобы до нее добраться, нужно выполнить скрипт, а выполнить его нужно до того как отработает hcaptcha-challenge.js.

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

content_scripts

"content_scripts": [
{
"matches": ["*://*.mozilla.org/*"],
"js": ["borderify.js"]
}
]

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

Я долго провозился со встраиваемыми скриптами, пока переваривал следующее из документации

Background scripts can access all the WebExtension JavaScript APIs, but they can’t directly access the content of web pages. So if your extension needs to do that, you need content scripts.

Content scripts can access and modify the page’s DOM, just like normal page scripts can. They can also see any changes that were made to the DOM by page scripts.

However, content scripts get a “clean view of the DOM”. This means:

* content scripts cannot see JavaScript variables defined by page scripts

* if a page script redefines a built-in DOM property, the content script will see the original version of the property, not the redefined version.

Поэтому переходим к фоновым скриптам

Background scripts

Отличие в том, что фоновые скрипты запускаются один раз и живут всю сессию. А еще они can access all the WebExtension JavaScript APIs, что позволяет, например, управлять ответами.

Поэтому логика теперь будет такая. При получении ответа в main_frame делаем поиск с заменой. <head> заменяем на <script src="URL"></script><head.

Да, получится слегка поломанный html, но современные браузеры в состоянии приводить его в правильный вид. Поэтому в итоге тег <script> окажется сразу после открывающего тега <head>. А это значит что скрип будет загружен раньше всех и выполнен раньше всех. Что и было нужно.

URL разумеется должен быть прямой и с gists у меня не срослось. Зато у меня есть свой hastebin и итоговый background.js выгядит так

Структура каталогов

~/FirefoxProjects/hcaptcha_interceptor ⌚ 8:15:40
$ tree
.
├── icon.png
├── manifest.json
└── src
├── backgroung.js
└── payload.js
1 directory, 4 files

`backgroung.js` скрипт будет выполнять инъекцию скрипта `payload.js` в каждую загружаемую страницу. А `payload.js` будет выковыривать callback функцию.

Тело `payload.js` известно из прошлой статьи, именно его и гружу по ссылке.

Теперь нужно открыть окно отладки дополнений about:debugging#/runtime/this-firefox, нажать кнопку “Загрузить временное дополнение” и выбрать файл с манифестом.

Итог

В итоге вот оригинальный head

Который можно увидеть в инспекторе запросов.

А вот после инъекции

Это уже видно в инспекторе страницы.

А в контексте страницы теперь доступен объект widgetInfo

Код дополнения https://github.com/alexsok-bit/hcaptcha_interceptor

--

--