В пятницу, 2 октября, в 09:35 утра 333 заражённых выходных узла Tor одновременно начали перехватывать SSH-подключения и собирать как можно больше незашифрованных данных.
Для масштаба: во всей сети Tor около 3000 выходных узлов, то есть атакующие контролировали примерно каждый десятый.
Доступ к серверам у них был ещё с августа, за два месяца до атаки. Всё это время на машинах тихо лежал Ebury 1.8.3 — бэкдор для OpenSSH и похититель учётных данных под Linux.
Атака
Судя по всему, у атаки было две главные цели:
собрать как можно больше незашифрованного почтового трафика;
перехватывать SSH-подключения (MITM).
Атакующие закрыли на своих выходных узлах часть портов, так что через них шла только почта без шифрования. Одна из жертв, оператор узлов Tor с большим стажем, подробно разобрала эту часть в рассылке tor-relays.
Я же расскажу о второй атаке, перехвате SSH. Если ваша цепочка выходит в интернет через один из 333 заражённых узлов, сначала вы ничего не заметите. Зашифрованный веб-трафик проходит как обычно, но стоит подключиться по SSH на порт 22, и вас незаметно перенаправляют на один из 12 серверов-перехватчиков.

Именно это случилось со мной в ту пятницу утром. Моё SSH-подключение перенаправили, и меня встретило вот такое предупреждение:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ED25519 key sent by the remote host is SHA256:6baCZCPsl+AfQuujUS81fMEE/C7UeJ+AwjrImqmDB3E. Please contact your system administrator.
Если же проигнорировать предупреждение и всё-таки войти, атакующий делает три вещи:
крадёт ваш пароль;
открывает своё подключение к вашему серверу и видит каждую команду, которую вы набираете (MITM);
открывает второе подключение к серверу и заражает его Ebury.
Как их сняли
В пятницу вечером я отправил свои находки команде Tor Project, которая следит за здоровьем сети. Там подтвердили, что столкнулись с чем-то новым, и начали связываться с операторами заражённых узлов.
«Атаку такого рода мы раньше не видели». — команда Tor Network Health

Пт, 2 октября: начался перехват.
Вс, 4 октября: команда опубликовала объявление для операторов, и те начали выключать свои выходные узлы.
Вс, 4 октября: узлам поставили флаг BadExit, и клиенты перестали выпускать через них трафик.
Пн, 5 октября: атакующие снова подняли многие узлы, но с уже выставленными флагами они годились только в промежуточные.
Пн, 5 октября: все заражённые серверы были выключены — частью операторами, частью самими атакующими.
В объявлении команда описала закономерность:
«Похоже, атакующий получает доступ к машинам на Linux и, если на них работает не выходной узел, правит файл torrc и превращает его в выходной, чтобы проводить атаку на SSH». — Tor Network Health, в объявлении
Отключение 333 выходных узлов хорошо видно на metrics.torproject.org: 4 октября там явный провал, и с тех пор число выходных узлов так и не восстановилось.

Можете поднять свой узел: community.torproject.org/relay/setup/
Техническая часть: как я их нашёл
Теперь подробно о том, как я нашёл все заражённые выходные узлы.
На основе exitmap я написал простой скрипт. Он закреплял в цепочке конкретный выходной узел и открывал через него SSH-подключение с моего сервера A на мой сервер B:
сервер A проверял, получил ли он правильный отпечаток ключа сервера B;
сервер B проверял, откуда пришло подключение: с закреплённого выходного узла или с одного из 12 серверов-перехватчиков.
Я прогнал скрипт по каждому из ~3000 выходных узлов. Около дюжины отдали поддельный отпечаток, а больше 300 ничего не подменяли, но пропускали подключение через те же серверы-перехватчики. Одного такого перенаправления хватало, чтобы считать узел заражённым.
Дальше я поставил ловушку на sshesame. Когда MITM удалось заманить в эту приманку и он залогинился, стало видно, что атакующие используют paramiko (библиотеку SSH для Python) и как они пытаются установить Ebury через Perl:
> echo "U=$(id -u) S=$(command -v sudo >/dev/null 2>&1 && (sudo -n true 2>/dev/null && echo nopass || echo maybe) || echo none)" > sudo bash -c 'echo <base64> | base64 -d | perl'
Сначала проверить права, потом выполнить команду, закодированную в base64.
Открытые вопросы
Главный вопрос до сих пор без ответа: как они попали на все эти серверы. Одна версия — взломали саму хостинговую компанию (это обсуждали в рассылке). Но это лишь гипотеза. Правды не знает никто.
Второй вопрос — кто за этим стоит. Ebury и массовый сбор незашифрованных данных указывают на преступную группу, которая работает ради денег. Хотя и это тоже догадки.
«Учитывая, на скольких серверах стоял Ebury с 2009 по 2023 год (400 000!), в сети, скорее всего, есть и другие скомпрометированные узлы Tor». — Marc-Etienne M. Léveillé (tor-relays)
Подозреваю, что атаку намеренно начали в пятницу в расчёте, что никому не захочется портить себе выходные разбирательством. Тем больше уважения команде Tor за то, как быстро они среагировали.
Вывод
Вывод всё тот же: дополнительная защита окупается. Отключите вход по паролю и пользуйтесь SSH-ключами. Я, например, сегодня же иду покупать аппаратные ключи :-)
«В конечном счёте к узлам и мостам надо относиться как к продакшн-машинам, активно подвергающимся целенаправленным атакам». — George (tor-relays)