Как работает TOR?
The Onion Router, более известный как Tor — браузер, который работает по технологии луковой маршрутизации. Им пользуются те, кому нужна приватность или обход цензуры. Иногда это оппозиционные политические силы, которые противостоят диктатурам. Иногда это наркокартели из даркнета.
Пользователям Tor нужны 4 вещи: стабильность работы, анонимность, безопасность и скорость. Даёт ли это браузер? И как он вообще работает? Давайте разбираться вместе.
Краткая история Tor
Tor работает на основе луковой маршрутизации. Впервые эту идею начали реализовывать в 1995 году в Центре высокопроизводительных вычислительных систем Исследовательской лаборатории ВМС США в рамках проекта Free Haven. В 1997 году свои финансы внесло DARPA, а после этого инвесторов у проекта становилось всё больше. Дошло до того, что донаты для Tor собирали на reddit.
Исходный код современной версии Tor открыли в октябре 2003 года. Почему современной? Потому, что это уже 3-е поколение луковой маршрутизации — технологии, которая шифрует трафик слоями, как в луковице. Это помогает защитить данные и оставить анонимными получателя с отправителем.
Основы Tor
Какой принцип работы Tor? Всего у него есть несколько уровней работы. На высшем уровне Tor пропускает трафик с вашего компьютера через посредников или ретрансляторов (relay), после чего они попадают на целевой компьютер.

Сейчас трафик передают больше 6000 маршрутизаторов по всему миру. Волонтёры отдают часть своего трафика, чтобы обеспечить работу луковой сети. Большая часть из этих узлов работает с помощью ПО Tor без дополнительного харда и софта.
Чем больше узлов в луковой сети, тем лучше она работает: у одного узла пропускная способность меньше, чем у многих, и отследить трафик по одному узлу гораздо проще.
Типы узлов
По умолчанию Tor пропускает трафик по 3-м узлам, и у каждого из них своя задача.

Входной узел так называется потому (внезапно!), что через него трафик входит в сеть. Ими становятся стабильные и быстрые узлы, которые давно работают и хорошо себя зарекомендовали. Промежуточный узел запутывает следы между предыдущим и следующим, чтобы они ничего не знали.Выходной узел уже отправляет трафик непосредственно получателю.
Чаще всего входной и промежуточный узлы запускают через виртуальные сервера. При такой конфигурации операторы серверов видят только зашифрованные пакеты. Но главная ответственность — на выходном узле. Он — последняя точка соприкосновения с получателем, поэтому отвечает за содержание трафика. “FBI, open up!” придёт именно к нему, если трафик нарушил закон.
Почему лук? (капустная сеть звучит лучше)
Окей, теперь мы знаем маршрут трафика по узлам. Но можем ли мы доверять такому соединению? Уверены ли мы, что никто не взломает канал и не украдёт все данные? Спойлер: и да, и нет 😃
Луковая сеть работает так, чтобы узлам можно было доверять минимально — всё благодаря шифрованию. Помните про луковицу? Давайте детальнее разберёмся в шифровании трафика в такой сети.
Исходные данные шифруются для дешифровки выходным узлом. Уже зашифрованные данные сверху шифруются для промежуточного узла, а на следующем этапе — для сторожевого.
Проще объяснить наглядно:

Финально зашифрованные данные похожи на луковицу. Особенно будет похоже, если промежуточных узлов будет много. У каждого из них есть только та информация, которая ему нужна для работы с данными и переправки дальше. Чем полезно такое шифрование? Трафик скрыт + узлы не несут ответственности за содержимое данных (кроме выходного узла).
Проблема с узлами
При запуске на компьютере Tor получает список всех узлов в цепочке. Самое интересное — полный список узлов абсолютно открыт, и из этого исходит одна большая проблема.
Представьте, что есть диктатор, который хочет заблокировать луковую сеть — она помогает обходить цензуру, а авторитарным режимам такое не нравится. Есть два способа блокировки Tor:
- блокировка входящих в луковую сеть;
- блокировка выходящих из луковой сети.
Первый вариант возможен даже как свободный выбор владельца сайта или маршрутизатора: достаточно заблокировать трафик от всех выходных узлов Tor.
Второй вариант — очень плохой для луковой сети. Если блок выходящего из сети трафика делает недоступным конкретный ресурс или устройство, то блок входящего трафика делает бесполезной сеть. И если бы в Tor были только узлы, то диктатор мог бы сказать список входных узлов и всех их перебанить.
Но всё не так просто.
Мосты
Мост — непубличный узел. Если в вашей стране цензура или вы участвуете в ОПГ, то вам лучше зайти в сеть через них. Список мостов непубличный: пользователи получают лишь несколько мостов, чтобы присоединиться к сети. Так как все они неизвестны, наш диктатор не сможет заблокировать все из них.
Как найти все мосты?
Полный список мостов засекречен, чтобы никто не мог полностью заблокировать Tor. Команда разработчиков сети исследовала пути получения списка всех мостов, и мы рассмотрим те, с помощью которых это получилось сделать.
В первом случае разработчики просмотрели все адреса IPv4 сканером портов ZMap и нашли 79-86% мостов. Это не сломало сеть, но критически снизило её возможности.
Во втором случае нужно было запустить промежуточный узел Tor с отслеживанием входящих в него запросов. К нему обращались только входящие узлы и мосты, а если такого узла нет в публичном списке, то это — мост. Так можно выявить все мосты и полностью сломать сеть.
Чтобы избежать такого сценария, сеть нужно делать максимально анонимной.
Консенсус
Как работает Tor глубже? Мы уже выяснили, что луковая сеть состоит из узлов и мостов, и есть их публичные и непубличные списки. Но кто их составитель?
Каждый клиент Tor имеет сведения о 10 крупных узлах, которые сопровождают добровольцы. Их задача — мониторинг состояния сети, их название — управляющие списками (DA, directory authorities).
И люди, и узлы разбросаны по всему миру. Именно они отвечают за обновления списка узлов; выбирают, когда и с какими узлами работать. 9 из 10 DA работают со списками узлов, а 10-ый — списком мостов.
Как работает консенсус?
Состояние узлов прописывается в консенсусе — специальном документе. DA голосуют, а потом обновляют его каждый час. Процедура выглядит так
- DA создаёт список известных узлов;
- потом идёт подсчёт данных: вес трафика, флаги узла, etc;
- все DA голосуют за статус;
- создатель списка получает голоса остальных;
- потом складывает и подписывает параметры голосов;
- отправляет подписанные данные остальным;
- DA должны достичь консенсуса большинством;
- выработанный консенсус публикуется каждым DA.
Анатомия консенсуса
Просто так разобраться в консенсусе сложно. Действительно сложно, это не шутка. Выглядит он вот так:
Что будет, если узел играет не по правилам?
Главный интерес тут — выходные узлы. Они последние в цепи, поэтому могут видеть трафик таким, как он выглядел при отправке с устройства. В таких условиях доверие к выходным узлам должно быть высоким, и обычно оно оправдано. Но всегда бывают исключения.
Пассивное прослушивание
Каждый выходной узел — “человек посередине”. Все незашифрованные протоколы (HTTP, etc) могут быть прочитаны. То есть, куки, логины/пароли, файлы на закачке и т.п.
Что мы можем с этим сделать? По сути — ничего, только использовать зашифрованные протоколы. Сниффинг не ресурсоёмокий, поэтому остаётся помнить о проблеме и не передавать важные данные в незашифрованном виде.
Выжимаем все соки
Оператор выходного узла ответственен за неизменность трафика, который проходит через узел. Но есть способы на этот трафик повлиять.
SSL MiTM & sslstrip
Атакующие часто в курсе, что многие сайты не смогли нормально реализовать SSL. Благодаря этому можно провести пользователя по незашифрованному соединению. Эксплуатировать такие уязвимости можно через sslstrip: достаточно пропустить трафик сквозь инструмент. Хотя можно и просто самому подписать сертификат, этого достаточно.
Подсадим браузеры на BeEF
Если мы можем перехватить трафик, то можем напакостить посильнее. Например, воспользоваться BeEF и управлять браузерами. Потом мы можем использовать функцию Metasploit “browser autopwn” и скомпрометировать хост, чтобы выполнять там команды. Вуаля.
Бинарные файлы с бэкдором
Если через подконтрольный нам узел качают софт или обновления на него, то достаточно добавить туда бэкдор с помощью, например, The Backdoor Factory. Как только софт будет запущен в конечной точке, хост скомпрометируется. Готово.
Поймать нарушителя на горячем
Операторы выходных узлов обычно вправду ответственные люди, но исключения бывали. Все примеры выше уже случались на практике, это не теория. Но разработчики стараются предупредить пользователей о недобросовестных выходных узла. Делают они это флагом в консенсусе с названием BadExit.
Ловит вредителей за руку система exitmap: модуль на Python запускается для выходного узла и записывает данные о трафике, который можно подменить. В 2013 году из порядка 1000 выходных узлов меняли трафик 65. Не так и много, но всё же. exitmap работает бесперебойно и по сей день, чтобы отследить “испорченные луковицы”.
Есть ещё кейс, когда энтузиаст создал страницу-подделку, где он логинился через каждый выходной узел, а потом смотрел HTTP-логи сервера. Узлы, которые пробовали попасть на сайт по логину/паролю энтузиаста, попадали в BadExit.
Проблема всех сетей
Небезопасное соединение бывает повсюду. Выход — шифровать всё, что сможете, ведь то, что нельзя распознать, нельзя и изменить. А тем операторам узлов, которые добропорядочно делают свою роботу, остаётся сказать спасибо за взятую на себя ответственность во благо свободного Интернета.