Во время месячной атаки у нас были деньки передышки и мы умудрились сгонять на стартап-тусу от BloombergBeta. Хороший способ выпустить пар перед предстоящими бессонными ночами.
(Repl.it — сервис, который позволяет писать код на большинстве языков прямо в браузере, без установки дополнительного IDE)
Ввязываясь в стартапы, никто не говорит вам, что борьба с нехорошими хакерами — это часть работы. Самые сильные противники, с которыми нам приходилось бороться в Replit — это хакеры даркнета. Однажды мы столкнулись лицом к лицу с подпольной группой, которая делала очень плохие вещи на нашем сервисе. И вот как это было.
В ноябре 2018 года Replit был очень маленький, 4 человека, но использование продукта росло сверхэкспоненциально. Поскольку мы предоставляли бесплатные облачные вычисления, мы создали множество технологий для дешевой работы контейнеров. В канун Дня Благодарения я получил уведомление о том, что мы тратим 10 тысяч долларов в день, что в 20 раз превышало норму.
Все чрезвычайные ситуации, как правило, случаются в праздники — это совпадение? Я сел за свой компьютер и обнаружил, что Replit форкнулся 10 тысяч раз и отправлял безумное количество трафика. Я забанил пользователя и предупредил команду. В этом году у нас не будет Дня Благодарения.
Потом пришел еще один «дед мороз» и сделал то же самое, и еще, и еще — мы теряли кучу денег. Процесс был явно автоматизирован. Так что же они запускали в нашем сервисе? Прочекали содержимое, но там ничего не было. Что за фигня?
Работа под давлением — это навык, заработанный тяжелым трудом. Помогают годы соревнований по экстремальному программированию, когда вам приходится решать сложные задачи круглосуточно в течение 24 часов. Годы участия в киберспорте. Ну и конечно же реагирование на инциденты в стартапах, все это меня подготовило к тому моменту.
Как лидер, я должен был сохранять спокойствие и излучать уверенность. Моя команда — хакеры высшего класса, и я знал, что мы справимся. Хорошо, мы зарядили обоймы, стиснули зубы в тревоге и предвкушении того, что нас ждало впереди.
Первое, что мы должны были сделать — это… подождать. Нам нужно было дождаться следующей атаки, чтобы мы могли дебажить ее в реальном времени. По завершению атаки мы бы глянули на работающие контейнеры. Там был бинарник — как они его вставляли? Что-нибудь еще? Нет, ни исходного кода, ничего. Только бинарник.
Ладно, он что, отправлялся по сети? По UDP? Но у нас нет UDP. Проклятие.
Как раз к следующей атаке мы развернули ведение журнала UDP. Глядя на логи, мы выяснили, что «полезная нагрузка» прилетает с внешнего сервера. Этот сервер, возможно, являлся «command and control» сервером ботнета.
Отправляемое содержимое, вероятно, представляло собой работающий двоичный файл, который мы видели раньше. Мы запустили трассировку сети. IP-адрес внешнего сервера. Мог ли это быть «command and control» сервер, выполняющий атаки? Мы взяли IP-адрес и сопоставили его с другими логами. Опа, совпадение! Найс, найс.
Что делал сервер CnC? Реконструировали по логам: вычищает наши сайты, создает repl'ы и получает токены, подключается к repl'ам, отправляет им посылки. По сути, они зареверсинжинирили наш протокол, чтобы создать тысячи repl'ов, которые делали … что?
Окей, нам нужно было усложнить программное создание repl'ов. Но прежде чем мы смогли это сделать, взглянем на то, что мы можем узнали из их CnC-сервера. В информационной безопасности вы инстинктивно идете тушить пожары, но чтобы выиграть битву, нужно получить больше информации. Мы создали Honeypot.
nmap просканируем сервер на наличие открытых портов (особенно HTTP и telnet). Веб-сервер выглядел как пользовательский сервер. Может в нем были какие-то уязвимости? Другими словами мы поменялись ролями и перешли в наступление — мы хакнем их!
После нескольких попыток: их сервер был уязвим для хрестоматийного взлома HTTP.
Бинго!
HTTP-серверы были запрограммированы на отправку файлов из текущего каталога. Но что, если можно создать запрос на запрос файлов за пределами текущего каталога — практически откуда угодно?
Но сканирование всей их системы файлов заняло бы много времени — они могли узнать, что мы это делаем. Так что первый файл, который мы попытались заполучить, — это файл “locatedb”, кэшированный индекс всех файлов на хосте.
И бац, это сработало с первой попытки, и мы получили все файлы в системе.
Самые важные файлы, которые мы нашли:
— bot.c: исходник для бинарника
— server.js: исходник для этого сервера
Мы запросили эти файлы. Посмотрели на исходники. Сервак был настолько клоунский, что открывал reverse shell в telnet. Мы их PWNули. Изи.
Но оставался вопрос: «Что, черт возьми, они делали?»
«bot.c» дал подсказку. Они использовали инфраструктуру Replit в качестве массово распределённого ботнета. Да, наша инфраструктура была достаточно мощна для этого. Это было плохо не только для нас, но и для всех, кого они атаковали при помощи нас.
Это был большой финансовый удар по нам, это дестабилизировало нашу инфраструктуру, снизило качество наших услуг.
Но что хуже всего?
Наше программное обеспечение использовали во зло, чтобы причинить вред другим людям, это было совершенно недопустимо для нас.
Где хостили CnC? DigitalOcean. Мы сообщили им о проблеме, но на расследование у них могли уйти дни, а может недели (в конечном итоге с нашей помощью они сообщили о них властям). Однако в тот момент мы должны были сами о себе позаботиться. Как мы могли остановить атаки?
Это была игра в кошки-мышки. Мы пытались затыкать дыры в нашей системе, которая позволяла программно запускать реплы. А они пытались найти новые дыры. Но когда у нас появились все их файлы, возможно, мы могли бы узнать о них больше? Возможно, мы даже могли бы поговорить с ними?
Самое важное, что мы увидели, — это ссылки на их веб-сайт — что же это такое? Это веб-сайт, который продавал сетевые атаки за биткойны. Вы платите им, даете им IP-адрес, и они используют свои ботнеты для атаки на него. И они придумали, как использовать нас в качестве одного из своих ботнетов. Зашибись.
Мы нашли ссылку на их discord-сервер. Немного социальной инженерии: мы обратились как клиенты. И эти балбесы нам поверили. Изнутри мы начали получать полезную информацию для борьбы с ними. Когда мы устранили уязвимость, мы увидели, как их клиенты начали жаловаться, а злоумышленники пытались найти другую нашу уязвимость.
«Мы вернемся через 15 минут»
Черт возьми, они, должно быть, нашли еще одну нашу дыру. Мы быстро реагировали и пытались предотвратить их следующую атаку. Это продолжалось несколько дней. Было не до сна и еды. Просто несколько дней сражений за компьютером.
Прошёл месяц, а потом вдруг… они сдались. Они все закрыли и двинулись дальше. Мы создали безумное количество программного обеспечения для наблюдения, обнаружения и остановки атак за очень короткий промежуток времени. Мы победили. Мы не могли в это поверить.
Атака нехороших хакеров обошлась нам в крупную сумму. Но с другой стороны, это все равно что нанять пентестера, который помог усилить безопасность нашей системы. Неплохой результат. Replit стал в 1000 раз безопаснее.
Однажды я расскажу вам о том, как мы боролись и победили крипто-киддис.
Комментарии (15)
Vest
29.03.2022 11:02Занятный вывод: «Мы победили. Мы не могли в это поверить».
После того как они потеряли много денег и времени, я бы выразился, что они выстояли и пришло время для «lessons learned» и подсчета убытков.
Fox_exe
30.03.2022 16:30Ага. Победили в срадении, но ещё не выйграли войну - ведь враг лиш отступил. А "дырки", вероятно, ещё остались. Просто хацкерам надоело их искать и они решили переключитья на другую цель (попроще).
A-TA-TA
29.03.2022 19:07+1Офигенно, что digital ocean позволял им это делать не неделю-другую, пока "ведётся расследование", а целый месяц и хз сколько времени ещё бы они это делали, если бы им не надоело.
AdVv
30.03.2022 22:06Они отбились. В чем победа-то ?
Вот если бы удалось поймать и осудить злоумышленников - это было бы интересно.
acc0unt
Очередной кривой перевод. "Source" переведён как "источник", "the oldest HTTP hack in the book" вообще перевели как "самого старого взлома HTTP (как в книге ***)". С современными нейросетевыми переводчиками я не понимаю - гуглоперевод это или просто надмозг?
dikey_0ficial
но при этом "Найс, найс" и "Изи!"))
RigelNM
Извините, а как еще перевести source?
acc0unt
В контексте: очевидно, "исходник".
И вот это убивает. Потому что такой перевод значит, что либо в теме переводчик не ориентируется совсем, либо что он во время перевода лишний раз вообще не думал над материалом.
RigelNM
Совершенно не вижу для себя разницы между словами Источник и Исходник. Но видимо это арго, буду иметь ввиду.
PS минус не я ставил.
Wirena
Исходник - исходный код, код программы, сорс. Никогда не слышал, что бы его назвали источником, смыслы в контексте программирования у этих слов таки разные.
RigelNM
Буду знать. А к чему минусы? Наказываете за любознательность?
Wirena
Я минусы не ставил, у меня нет ни возможности, ни желания
usrsse2
nerlihmax
Гляньте на кривые вертикальные шрифты в правой панели, на то, как перевели другие вкладки того же меню, где располагается "источник" - Промт на лицо. "Packages rest... with warnings" забыли перевести, кстати, тоже.