July 9, 2022

Как проверить наличие onion-сайта за 1 секунду

Не так давно наши товарищи из отдела паранормальных разработок представили бота-скриншотера для тора. Тор быстрый, бот тоже... но, как говорил, товарищ Чапаев, есть один нюанс: при несуществующем onion-домене бот впадает в прострацию секунд этак на 10 и постигает дзен.

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

А как работает то?

Вообще, onion сайты называются скрытосервисами (hidden service, HS) и работают довольно просто. Когда вы хотите поднять скрытосервис, вы выбираете парочку релеев тора побыть точками входа (introduction points). Когда все вопросики с релеями обкашлены, вы берёте и создаёте описание (decriptor) как с вами связаться, и подписываете его. А потом раздаёте всем этот самый дескриптор.

Хотя погодите, мы же не в лунтике и говорить всем "я родился" не очень безопасно и не очень практично. Поэтому вы раздаёте свой дескриптор только некоторым, специально доверенным каталогам скрытосервисов.

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

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

Ботовозня

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

Но нам на такие мелочи пофиг, можно спросить первый попавшийся. Есть дескриптор? Хорошо. Нет? Для скорости мы можем предположить, что никакого скрытосервиса и нет. И ждать по минуте для этого не надо.

Осталось дело за малым — реализацией. Для любителей питона есть хорошая новость: всё за нас уже почти сделано. У самого тора есть библиотека stem — готовенькая реализация общения питона с тором. А в ней есть не менее прекрасный метод get_hidden_service_descriptor, который делает в точности что нам надо. Там правда пишут что адреса v3 не поддерживаются, но фактически они поддерживаются.

Парам пам пам