В мире много чего происходит, у кого счастливое 200, кто-то недоуменно смотрит на 301, кто-то царапает похабщину на 403.
Но самый ценных мех — это исследователи. Это те, кто открывает новый для себя мир на основе своих знаний путем проб и 404.
Вот о 404 и пойдет речь. Это статья не то, чтобы не о чем. Она о безопасности.
С каждым днем все больше и больше людей разного возраста, религии, пола и установленной системы выбирают себе дорогу ИТ-опасника, чтобы потом стать ИТ-безопасником с хороших плохим послужным списком списком.
Такие креативные ребята и девчата денно и нощно посылают запросы об эксплоитах, которые отдаются им в виде 403 и 404, но это потом.
Все начинают с грубой аналитики поиска
backup.zip
, которые должен быть в корне сайта. Многие уходят за рамки backup.zip
, и упираются в стенку archive.zip
. Кто-то, поставив первую в своей жизни MySQL 3.0 ищет dump.zip
, mysql.zip
и, компьютерныхбоже алилуйя, home.zip
. О .7z
или .tar.gz
даже мыслей нет!Каждый раз, когда я вижу 404 в логе напротив очередного head, или того хуже get, мое сердце сжимается от боли, которую они чувствуют, читая ошибку с экрана, как вы читаете эту статью.
В один прекрасный день, я сказал себе — «Довольно, %username%! Ты жесток! Ты не даешь им шанса, так нельзя, это не по-человечески».
Я возразил, что жизнь вообще такая штука, нельзя им подать на блюде файл, да еще и с каемочкой. Третий голос молвил «моя преелесссть..», я не понял к чему, но рука потянулась в карман.
В итоге, после сделки с совестью и железным супергероем, которые есть почти в каждом из нас и из вас, я написал вот это:
location ~* "^/(archive|auth|backup|clients|com|dat|dump|engine|files|home|html|index|master|media|my|mysql|old|site|sql|website|wordpress)\.zip$" {
access_log /usr/local/nginx/logs/dummy.log;
default_type application/zip;
root /usr/local/nginx/html/dummy;
rewrite ^(.*)$ /mydummy break;
max_ranges 0;
limit_rate 4k;
include param/zone1rs;
}
max_ranges 0;
— запрещает «докачку»limit_rate 4k;
— ограничивает скорость скачиванияinclude param/zone1rs;
— Зона, где разрешен 1 коннект на 1 ип. В разных версиях nginx свой листинг. Главное — limit_conn one 1;
, где one
это имя вашей зоны.mydummy
получается очень просто:dd bs=1024 count=1572864 </dev/urandom >mydummy
Затем нужно показать недоверчивым, что это zip архив:
echo -ne \\x50\\x4b\\x03\\x04\\x14\\x00\\x00\\x00\\x08\\x00 | dd conv=notrunc bs=1 count=10 of=mydummy
Теперь даже плохая погода мне нипочем! Ежели на дворе печальная осень, или мертвая зима, я бережно сдуваю хлебные крошки с консоли, вызываю:
tail -n 16 /usr/local/nginx/logs/dummy.log
… и на моем лице появляется улыбка! Я счастлив за будущее человечества, я горд за тех
adsl
или cablenet
, кто целеустремленно, в течение пяти суток, бережно скачивает этот архив, этот маленький билетик в жизнь, весом в 1.5 гигабайта и ценой 5 дней этой же самой жизни. Я счастлив, что я могу сделать этот мир лучше и подарить неполную неделю счастья и практически рождественского ожидания подарка из моего правого носка.Комментарии (78)
mcleod095
03.12.2015 16:14-8Осталось добраться боднет до этого файла и задосить сервак.
J_o_k_e_R
03.12.2015 18:01+3Какой сервак? Чем задосить? Отдавая nginx'ом статику?
mcleod095
03.12.2015 18:08-3То есть при отдаче статики у нас не используются ресурсы сервера? Не остается отрытым коннект, не съедаются ресурсы на поддержание коннекта и тп?
J_o_k_e_R
03.12.2015 18:17+6Крайне мало ресурсов отъедается. Это не апач. Чтоб заддосить даже современный ноутбук таким образом надо привести ОЧЕНЬ большой ботнет, который будет стоить ОЧЕНЬ много денег. Проще будет заддосить на канал, а это другая история и не зависит от отдаваемого контента.
ololoepepe
04.12.2015 12:03-1Мне в 17к ботов положили сервер. Это весьма скромный ботнет, и стоит такой недорого.
J_o_k_e_R
04.12.2015 12:39Я один раз положил свой сервер, когда у меня ф5 залипла. Сервер был на малинке и очень кривой пхп скрипт в бэкнде.
Но исходный тред начался про ботов, запрашивающих статику.ololoepepe
04.12.2015 12:46Так у меня статика и была. nginx, 3.5 гб памяти, Xeon CPU E5-2673 v3 @ 2.40GHz.
J_o_k_e_R
04.12.2015 12:49Мне даже интересно стало, что Вы сделали не так. «Положили» — это в чем именно выражалось?
ololoepepe
04.12.2015 12:52Очень просто: все процессорное время кушал nginx, отдавая эту самую статику, плюс закончился лимит открытых файлов. Ограничение на количество открытых файлов проблему не решило — достучаться до сервера все равно было невозможно.
К слову, сервер находился за CF, челленджи включены, парень их обошел (мы с ним потом пообщались немного).J_o_k_e_R
04.12.2015 13:07limit_req \ limit_con включали? У меня сервера без ссд, похожей конфигурации, отдающие статику и немного динамики (хороший бэкэнд) досы с подобным количеством ботов переживают легко, показывая только небольшое повышение LA (десятые доли на ядро).
Клаудфлеер вообще не использую.
Ккой у вас был rps во время ддоса?ololoepepe
04.12.2015 14:00Включал, но, видимо, неверные значения ставил. Вот вы сколько выставляете? rps честно не помню.
J_o_k_e_R
04.12.2015 16:12Лимиты зависят как от приложения, так и от мощности сервера, канала, задач, прочего конфига nginx.
У меня стоит limit_conn на 10 соединений на ип. Но только динамика. Статику не лимитирую вообще, только иногда включаю aio и кеширую дескрипторы открытых файлов.flyaway
04.12.2015 20:48-2Вы, видимо, еще не видели хорошего ddos. Например, когда прилетает сотня тысяч соединений на «статику» или просто заливается 100Гбит/c флуда так, что у ДЦ все каналы забиваются.
Тут не то что nginx, вообще ничего кроме глобальных cdn не поможет.J_o_k_e_R
05.12.2015 01:27+1Читайте тред с начала, пожалуйста. Мы начали с того, что атака, которая будет специально «бить» в подобным образом выложенный файл и способная положить что-то, что более-менее «сервер» — экономически нецелесообразна. И еще я выразил сомнение в том, что описанный в статье способ как-то облегчит ДДоС. И я сразу открестился от атак в сотни тысяч соединений и 100Гбит/c флуда.
Когда приходит такое, Вы совершенно правильно заметили, средства борьбы другие, и отдаваемая с лимитированная скоростью отдачи статика — песчинка во вселенной.
Когда Вы становитесь мишенью подобных атак, когда они экономически осмысленны, у вас уже должен быть не один (десяток) сервер(ов); хорошая, умная балансировка и\или далеко не бесплатный тариф клаудфлеер.
nikitasius
04.12.2015 13:30+1Давайте вместе размышлять:
- у CF на данный момент 42 точки забора контента
- тьма точек раздачи
Уже значит, что 17к пользователей размажется в 42 клиента, если у вас соотв. правило в nginx добавлено и запрещены все клиенты, кроме CF и самого сервера.
Теперь роль играет принцип кеширования (полное, игнор агрументов, читы на стороне сервера) и, как заметил J_o_k_e_R, limit'ы в конфиге nginx. Хотя у меня стоит очень большой лимит для серверов CF, но я контролирую запросы через регулярки и аргументы.
CF могут отдавать контент очень быстро, запрашивать тоже. Если контент актуален, и стоит respect server headers в кастомном page rules, то они будут его хранить и 10 лет, но, при условии, что он запрашивается регулярно.
Я почему-то уверен, что у вас стоял standart на статику.
И, наконец, CF это коммерческий продукт, и защита от layer 7 у них на платных тарифах.ololoepepe
04.12.2015 14:01Кеширование статики CF было отключено, да, потому что сайт активно допиливался, скрипты и стили часто менялись.
nikitasius
03.12.2015 18:28+1В случае канала, как правильно заметил J_o_k_e_R, это может сработать.
Только вот в чем незадача:
Оффициально мой канал составляет 200 Мбит. Неоффициально я могу выжать 800 Мбит на отдачу (проверял).
У хостера сеть построена сеть на juniper'ах и, хочется верить, есть решения, чтобы отсекать паразитный траффик и различать «паразитов».
Если же вдруг канал забит на столько, что нету и пары кбит для ssh, я зайду в панель хостера и запрошу посредством кликов мышкой доступ только себе. Далее, я просто переименую файл и все. Будет ответ 404.J_o_k_e_R
03.12.2015 18:32+2Если продолжить фантазировать, что придет ботнет, который забьет канал отдаваемой статикой, то после переименования по старому локейшену лучше отдавать 444. Тогда даже на ответах 404 сэкономите.
eyeless_watcher
03.12.2015 16:33+13А не проще zip-бомбу отдавать?
nikitasius
03.12.2015 17:02+1У меня нету цели добиваться краха системы пользователя, даже в благих намерениях.
baldr
03.12.2015 17:09+7А напрасно. Хозяева зараженных хостов ботнета быстрее обнаружат проблему. А выделенные сервера на время выйдут из строя и таким образом перестанут сканировать других.
Возьму на вооружение вариант с zip-бомбой.nikitasius
03.12.2015 17:29Вот например добрый парень из провинции Цуаньчжоу качал это в течение суток, нещадно пытаясь открыть второй поток, как и янки из Лос Анжелеса. Зачем мне ломать их машины и, внимание, вопрос: сломаются ли они?
Получив бомбу в архиве бот не будет ее открывать, он ее передаст на мастерхост (это такой «не хостинг»). Который её и откроет, и, скорее всего, ручками. Так же эта бомба ловится антивирусами.
Но даже, если антивируса нету — какой может быть бекап в 42 кб и в корне сайта?
Мне очень слабо верится. Но я верю в бекапы размером в гиг в корне простого сайта, вполне себе 8-10 гигов в распакованном виде.
Так что zip бомба никому не насолит. Да и не о вреде этот материал, а скорее о том, как занять руки.
Но смею заметить, что усовершенствованием к предложенному варианту будет вариант сmax_ranges
отличным от нуля. В этом случае пользователь скачает часть архива. Недоверчиво стопнет, затем увидит сигнатуру в hex редакторе и запустит докачку. Только несколько часов спустя докачка уже не будет работать (если у него к примеру инет разорвет), так как он превыситmax_ranges
при очередном запросе.baldr
03.12.2015 17:38Аргументы резонные. Но почему не объединить варианты? Вначале — zip-бомба, а конец файла забить мусором. Навскидку не помню, но, по-моему, форматом не запрещено иметь мусор в конце файла.
lubezniy
03.12.2015 21:23В принципе и хорошо, что ловится антивирусами. Сработка при скачивании теоретически должна побудить ничего не подозревающего пользователя более глубоко проверить машинку (члена ботнета) на заразу.
lubezniy
03.12.2015 21:27Хотя вообще неплохо бы придумать какой-то менее вредный вариант — например, тестовый вирус, который безвреден и при этом ловится всеми антивирями.
nikitasius
03.12.2015 22:39Есть проблема в виде «черных списков».
Портить репутацию домена — не очень умно. Правда я не знаю, будет ли что за тестовый вирус, но проверять не хочу:)lubezniy
03.12.2015 22:44Если публичную ссылку на архив с вирусом (пусть будет EICAR) никуда не давать или как-то прописать неиндексирование (robots.txt ?) именно для этого архива, репутация в поисковках будет портиться?
force
08.12.2015 11:49Будет. Ссылка обязательно где-то всплывёт, антивирусы её просканируют, пометят сайт как подозрительный, пользователи придут на WOT, понизят сайту рейтинг, на WOT придут антивирусы, увидят, что у сайта низкий рейтинг, предупредят пользователя, он пойдёт на WOT… Такая вот петля смерти.
Они все умные сейчас стали, но о последствиях не думают, главное пользователей попугать. Мне мой сайт занесли в чёрный список, потому что у него была ссылка на другой сайт, на котором оказалась ссылка с вирусом. Такая вот транзитивная смерть от антивирусов.
antonbatenev
03.12.2015 22:47+2Есть «эталонный» тестовый вирус EICAR. Вот его содержимое:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
madkite
07.12.2015 13:05+3Так к тем 42кб в конец можно дописать гигабайт. Станет даже правдподобнее, когда не будет хватать памяти для распаковки. Можно даже предположить, что на той стороне могут не догадаться и станут пробовать разные разархиваторы и искать хардварные ресурсы. Разве не забавно?
kloppspb
03.12.2015 19:26Сомнительно. Для начала: как в будете отдавать архив, с каким Content-Type?
nikitasius
03.12.2015 19:33+1А в чем проблема Content-Type при отдаче файла с расширением zip?
nginx сам правильный подставит. В моем случае у файла не было расширения, поэтому я ручками дописалdefault_type application/zip;
.kloppspb
03.12.2015 19:37-1Так о том и речь. Был бы я ботнетом — в первую очередь смотрел бы на CT. Нафига пытаться распаковывать какие-то зипы, если нужное в другом? Ну а если охоа за арживами именно — не проверить compression ratio и/или реальный объём, это нужно быть совсем долбанько.
JerleShannara
03.12.2015 17:50А может сделать на подобие UltimateXXXPornCollectionAllSex.zip (4.0 Tb)? Можно дорисовать какую-нить pseudofs которая будет эту лажу генерировать находу
nikitasius
03.12.2015 17:59Я хотел сделать безлимитный файл на основе urandom, только такое нельзя сделать в linux. Судя по google, я не был первым.
Но мусор можно отдавать через динамику, очень долго, пока сокет открыт.
rhamdeew
03.12.2015 17:58Вот можно было бы прямо с /dev/urandom бесконечный поток отдавать =) Да еще и с жестким лимитом по скорости скачивания.
gre
03.12.2015 18:00+4Добавьте еще wp-admin.php — осчастливьте и их.
rhamdeew
03.12.2015 18:02+4Когда-то давно возникала мысль запилить /wp-admin, /administrator, /admin и прочие хорошие штуки в виде простых форм всегда отдающих «Неправильный пароль». Но руки до запиливания не дошли )
nikitasius
03.12.2015 18:16+7Такая мысль меня посетила два года назад теплым июльским вечером:
скриншотthunderspb
03.12.2015 19:11А зачем было столько создавать? Проще же rewrite сделать :)
nikitasius
03.12.2015 19:36Я тогда не хотел толком rewrite изучать, как и использование регулярок в nginx. Что в плюс мне не идет, конечно.
Время проходит, люди учаться:)baldr
03.12.2015 20:25+1[grammar-nazi]
http://tsya.ru/
[/grammar-nazi]nikitasius
03.12.2015 21:53+4Хуже, когда я делаю ошибки в окончаниях прилагательных. Непроизвольно, причем за сочинения в школе на выпускном 5/5 было.
Сказывается отсутствие русского языка в повседневной жизни. Несколько контактов из скайпа и вы, хабражители.
JerleShannara
03.12.2015 19:19+1Благодаря wp-admin я поимел огромный список халявных прокси серверов.
JerleShannara
07.12.2015 16:33Кстати, сейчас есть умные боты, которые умеют в javascript. Ищем админку, которую любят тыкать боты и оная содержит жабаскрипт, который надо выполнить, чтобы поюзать её и рисуем весёленький маленький скрипт, который будет дико тормозным и неэффективным, а ещё будет кушать тонну памяти…
Bal
03.12.2015 20:43+5Лет 16-18 назад в узких кругах было популярно распространение троянцев «методом ленивого кота». На машину ставился открытый для анонимов FTP, в котором лежали файлы, типа «games/porno/tetris.exe» И народ исправно находил ftp при массовом поиске халявы, качал и запускал :)
kloppspb
03.12.2015 23:08+2Лет ещё больше назад и в PATH первой переменной вставляли что-то похожее на PROG, GAMES, TOOLS, NС, TOYS, UTIL т.д :-)
Speccyfan
04.12.2015 08:59Ламер жив всегда,
Он ко мне залез,
Связь его крута,
Аж сотни CPS.
Имя шустро ввел,
Лишь за пол-часа,
Качает мне Винды NT,
Выпучив глаза.
…
flyaway
04.12.2015 20:54Я вас, возможно, разочарую, но на том конце никто не сидит и не ждет окончания скачивания, и не страдает впоследствии — это ботнеты сканируют интернет в поисках наживы. У ботов, как известно, нет эмоций, им всё равно — 5 суток качать или 5 секунд.
br3t
07.12.2015 13:57А можно ли на архивчик повесить еще пароль символов на много?
nikitasius
08.12.2015 20:24А смысл? Это не не ZIP архив, а только утка, с 10 байтами ZIP архива.
В принципе, если кто-то подскажет, что черезdd
надо добавить и куда, то пароль будет.
ComodoHacker
08.12.2015 14:11-4Что-то у вас с форматированием случилось. Так бывает, когда копипастят текст с другого ресурса.
nikitasius
08.12.2015 20:22+1Поделитесь ссылкой, пожалуйста. Хочу посмотреть.
ComodoHacker
08.12.2015 20:53-3Какой ссылкой?
nikitasius
08.12.2015 22:09+1Откуда я наглым образом скопипастил этот текст. С того самого «другогоресурса.com».
ComodoHacker
09.12.2015 22:01-4Я не утверждал, что вы скопипастили. Я сказал, что текст так выглядит.
Беглый поиск дал только пару ресурсов, которые копипастят отсюда.
И я вижу, вы уже кое-что подправили.nikitasius
09.12.2015 23:26+1Я не утверждал, что вы скопипастили. Я сказал, что текст так выглядит.
И я вижу, вы уже кое-что подправили.
«Профессор, конечно, лопух, но аппаратура при нём-мм, при нём-мм! Как слышно?»
Покажите, где есть хоть небольшое совпадение, хотя бы про яблочную самогонку, она была тут изначально и именно она сподвигла меня на написание материала.
nikitasius
11.12.2015 17:40Комментарий для поддержки хабра на счет hsto. Тест картинки и hsto.
ссылка на картинку без imgnikitasius
11.12.2015 17:42тест2
nikitasius
11.12.2015 17:45картинка
img без спойлера
nikitasius
11.12.2015 17:45nikitasius
11.12.2015 17:46надеюсь для теста хватит.
После прошу саппорт удалить это комментарии, ибо они к статье не относятся.
meps
«Сделать этот мир лучше» гоняя порожняком гигабайты шума? Вот это вряд ли. Но все равно смешно.