Как стать автором
Обновить
Sportmaster Lab
Рассказываем про ИТ в «Спортмастере»

Отправляем спамеров в парольное чистилище

Время на прочтение 6 мин
Количество просмотров 15K
Автор оригинала: Troy Hunt

Как лучше всего наказывать спамеров? Я очень долго думал над этой темой, потому что потратил кучу времени на фильтрацию бесконечного хлама, который они мне присылали. И тут меня озарило: наказание должно соответствовать преступлению — краже моего времени. То есть я, в свою очередь, должен красть их время. Разумеется, с минимальными затратами моего времени. Поэтому в начале этого года я создал Password Purgatory («Парольное чистилище») с единственной целью — провести спамеров через всего круги ада выбора пароля, удовлетворяющего ужасно сложным критериям. И когда я говорю "ужасно сложные критерии", это значит, что они гораздо хуже, чем то, что вы когда-либо видели. Я выложил проект в открытый доступ, принял несколько PR, создал API, задающий всё более сложные требования к паролям, и на этом остановился. Пока, наконец, не выпустил готовый проект. Он жив, работает и при этом дьявольски прекрасен.

Шаг первый: получаем спам


Это самое простое — на этом шаге мне вообще не надо ничего делать! Но позвольте мне познакомить вас с контекстом и привести пример из жизни:


М-да. Неприятная штука, достойная отправления в ад. Всё начинается с отправки спама в специальную папку «Send Spammer to Password Purgatory» («Отправить спамера в парольное чистилище»):


Именно такого количества усилий достаточно для каждого спам-сообщения. Но давайте раскроем подробности о том, что же происходит дальше.

Шаг второй: запускаем поток Microsoft Power Automate


Microsoft Power Automate (ранее «Microsoft Flow») — это очень удобный способ запуска последовательности действий на основании события; в этом ПО есть куча встроенных коннекторов, сильно упрощающих жизнь. Упрощающих жизнь нам, разработчикам, но не спамерам, потому что после отправления письма в вышеупомянутую папку происходит следующее:


Благодаря встроенному коннектору с моим аккаунтом электронной почты Microsoft 365 наличие нового письма в этой папке запускает новый экземпляр потока. Далее я добавил коннектор «HTTP», позволяющий мне выполнить исходящий запрос:


Этот запрос лишь выполняет POST к API в Password Purgatory под названием «create-hell». Он передаёт ключ API, потому что я не хочу, чтобы кто угодно мог создавать эти запросы, ведь он создаёт данные, сохраняемые в Cloudflare. Кстати, давайте теперь посмотрим, что происходит там.

Шаг третий: вызываем Cloudflare Worker и создаём запись в KV


Позвольте мне начать с небольшой истории: в не таком уж далёком прошлом Cloudflare не был хостом, а просто выполнял запросы обратных прокси через исходные сервисы и по пути делал с ними всякие интересные штуки. Благодаря этому мы легко могли добавить HTTPS к любому сайту (бесплатно), использовать кучу удобных функций WAF и расширить возможности кэширования. Но всё это выполнялось в процессе передачи, а вся логика приложений, данные и основная часть кодовой базы находились на исходном сайте. Cloudflare Worker начали менять ситуацию, и внезапно код оказался на периферии, работая в сотнях узлов по всему свету, удобно и близко к нашим посетителям. Тогда ли Cloudflare начал превращаться в «хост»? Хм… но сами данные по-прежнему находились на исходном сервисе (если не учитывать промежуточное кэширование). Перенесёмся в настоящее: сегодня есть множество вариантов хранения данных на периферии Cloudflare, в том числе сервис R2 (находящийся в бета-версии), Durable Objects, (будущая) база данных D1 SQL и самое важное для нашего поста — Workers KV. Делает ли это сервис хостом, ведь теперь мы можем собирать целые приложения в его окружении? Возможно, но пока давайте не будем спорить о названиях и сосредоточимся на коде.

Весь код, на который я буду здесь ссылаться, выложен с открытыми исходниками и доступен в публичном репозитории Password Purgatory Logger на Github. Почти в самом начале файла index.js, выполняющего всю работу, вы увидите функцию createHell, вызываемую при выполнении представленного выше шага потока. Этот код создаёт GUID, затем сохраняет его в KV, после чего я могу легко просмотреть его в дэшборде Cloudflare:


Значения пока нет, есть только ключ, возвращаемый в JSON-ответе в свойстве kvKey. Чтобы считать его обратно в поток, мне нужен шаг «Parse JSON» со схемой, которую я сгенерировал из примера:


Итак, теперь у меня есть уникальный ID в постоянном хранилище, доступный из потока, то есть далее можно отправить спамеру электронное письмо.

Шаг 4: приглашаем спамера в ад


Так как оставлять письмо без ответа грубо, я бы хотел отправить спамеру сообщение и пригласить его в мою особую форму регистрации. Для этого я использую коннектор «Reply to email» и передаю через гиперссылку kvKey:


Это HTML-письмо с ключом, скрытым в тэге гиперссылки, чтобы оно не выглядело слишком странным. Благодаря использованию коннектора при отправке письма оно будет выглядеть именно так, как я создал его:


Теперь весь поток исполняется полностью, поэтому мы можем просмотреть историю каждого шага и увидеть, как между ними перемещаются данные:


Далее нам нужно сидеть и ждать поклёва.

Шаг 5: логируем мучения спамера


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

Итак, перейдя по ссылке, спамер оказывается здесь (можете пройти по ссылке и поиграться):


Через строку запроса передаётся kvKey, и страница предлагает спамеру начать процесс заключения партнёрского соглашения. Ему достаточно оставить адрес электронной почты… и пароль. Затем эта страница встраивает два скрипта с веб-сайта Password Purgatory. Оба скрипта можно найти в опенсорсном публичном репозитории Github, который я создал для оригинала статьи. Каждая попытка создания аккаунта отправляет только пароль в исходный Password Purgatory API, который я создал несколько месяцев назад, после чего страница отвечает новым набором критериев. При этом каждая попытка также отправляет отображённый критерий (при первой попытке он пуст, при каждой последующей попытке он становится всё более странным), пароль, который отправил спамер для соответствия критериям, и kvKey, чтобы всех их можно было связать вместе. Это значит, что ранее созданная запись Cloudflare Workers KV постепенно разрастается следующим образом:


В код встроена пара небольших условий:

  1. Если в запросе лога передан несуществующий на Cloudflare kvKey, то возвращается HTTP 404. Это нужно для того, чтобы случайные посетители не отправляли в KV мусорные логи.
  2. После логирования первого пароля есть окно в 15 минут, в течение которого можно логировать все дальнейшие пароли. Это сделано по двум причинам: во-первых, я не хотел публиковать попытки спамеров, пока не буду уверен, что новые пароли не будут логированы, если они будут отправлять персональные данные или что-то другое неподходящее. Во-вторых, после того, как пользователь, не являющийся спамером, узнает значение kvKey, он мог бы начать отправлять логи (например, когда я позже опубликую значение в Twitter или в посте).

И это всё, что нужно для привлечения спамеров и фиксации их мучений, а теперь самое весёлое.

Шаг 6: упиваемся мучениями спамера


При первом логировании попытки подбора пароля спамером Cloudflare Worker отправляет мне письмо, сообщающее о том, что на крючок попался ещё один спамер (эту возможность при MailChannels реализовали только в этом году):


Ощущения от получения первого письма вчера было потрясающим, я как будто в буквальном смысле поймал рыбу на крючок! Этой ссылкой я могу поделиться, чтобы весь мир мог насладиться мучениями спамера. Это стало возможным благодаря ещё одному пути Cloudflare, который просто получает логи для указанного kvKey и красиво форматирует их в HTML-ответе:


Ах, какое же удовольствие! Я указал потраченное спамером время, чтобы в будущем совершенствовать критерии сложности пароля и чтобы он дольше оставался на крючке. Например, не является ли требование почтового индекса США в пароле слишком привязанным к местоположению? Время покажет, а пока я от всего сердца приглашаю вас отправлять соответствующие PR в исходный репозиторий Password Purgatory API.

Для повышения популярности моего сервиса я создал красивую Twitter-карточку, в которой указаны те самые последние критерии и пароль, наконец-то сломившие дух спамера и вынудившие его сдаться:


Подведём итог


Очевидно, я получил большое удовольствие от мучений спамеров и надеюсь, что вы тоже повеселитесь. Нужно сказать честно — я никогда так не радовался, изучая папку спама! Но удовольствие я получил и от создания этой системы при помощи Power Automate и Workers KV. Очень здорово, что сегодня можно создать приложение просто из сочетания конфигурации на основе браузера, кода и хранилища, работающего непосредственно на сотнях распределённых по миру периферийных узлов. Надеюсь, спамеры оценят изящество всей этой схемы!
Теги:
Хабы:
+35
Комментарии 20
Комментарии Комментарии 20

Публикации

Информация

Сайт
smlab.digital
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия
Представитель
Алина Айсина