Java разработчик, SQL фетишист и фанат nginx
0,0
рейтинг
3 декабря 2015 в 15:35

Разработка → Вы все еще храните 404backup.zip на сервере? Я на 200ДА recovery mode

Сумеречными зимними вечерами под песнь вьюги, укутавшись в овечий плед с бокальчиком «яблочной самогонки», я люблю почитывать логи на сервере. Авторизация по ключам упрощает сие, так что если в публичное помещение меня и не пустят, то сервер всегда рад приютить, старый чертяга.

В мире много чего происходит, у кого счастливое 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 дней этой же самой жизни. Я счастлив, что я могу сделать этот мир лучше и подарить неполную неделю счастья и практически рождественского ожидания подарка из моего правого носка.

image
@nikitasius
карма
38,7
рейтинг 0,0
Java разработчик, SQL фетишист и фанат nginx
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (79)

  • +9
    «Сделать этот мир лучше» гоняя порожняком гигабайты шума? Вот это вряд ли. Но все равно смешно.
  • –8
    Осталось добраться боднет до этого файла и задосить сервак.
    • +3
      Какой сервак? Чем задосить? Отдавая nginx'ом статику?
      • –3
        То есть при отдаче статики у нас не используются ресурсы сервера? Не остается отрытым коннект, не съедаются ресурсы на поддержание коннекта и тп?
        • +6
          Крайне мало ресурсов отъедается. Это не апач. Чтоб заддосить даже современный ноутбук таким образом надо привести ОЧЕНЬ большой ботнет, который будет стоить ОЧЕНЬ много денег. Проще будет заддосить на канал, а это другая история и не зависит от отдаваемого контента.
          • –1
            Мне в 17к ботов положили сервер. Это весьма скромный ботнет, и стоит такой недорого.
            • 0
              Я один раз положил свой сервер, когда у меня ф5 залипла. Сервер был на малинке и очень кривой пхп скрипт в бэкнде.

              Но исходный тред начался про ботов, запрашивающих статику.
              • 0
                Так у меня статика и была. nginx, 3.5 гб памяти, Xeon CPU E5-2673 v3 @ 2.40GHz.
                • 0
                  Мне даже интересно стало, что Вы сделали не так. «Положили» — это в чем именно выражалось?
                  • 0
                    Очень просто: все процессорное время кушал nginx, отдавая эту самую статику, плюс закончился лимит открытых файлов. Ограничение на количество открытых файлов проблему не решило — достучаться до сервера все равно было невозможно.
                    К слову, сервер находился за CF, челленджи включены, парень их обошел (мы с ним потом пообщались немного).
                    • 0
                      limit_req \ limit_con включали? У меня сервера без ссд, похожей конфигурации, отдающие статику и немного динамики (хороший бэкэнд) досы с подобным количеством ботов переживают легко, показывая только небольшое повышение LA (десятые доли на ядро).

                      Клаудфлеер вообще не использую.

                      Ккой у вас был rps во время ддоса?
                      • 0
                        Включал, но, видимо, неверные значения ставил. Вот вы сколько выставляете? rps честно не помню.
                        • 0
                          Лимиты зависят как от приложения, так и от мощности сервера, канала, задач, прочего конфига nginx.

                          У меня стоит limit_conn на 10 соединений на ип. Но только динамика. Статику не лимитирую вообще, только иногда включаю aio и кеширую дескрипторы открытых файлов.
                          • –2
                            Вы, видимо, еще не видели хорошего ddos. Например, когда прилетает сотня тысяч соединений на «статику» или просто заливается 100Гбит/c флуда так, что у ДЦ все каналы забиваются.
                            Тут не то что nginx, вообще ничего кроме глобальных cdn не поможет.
                            • +1
                              Читайте тред с начала, пожалуйста. Мы начали с того, что атака, которая будет специально «бить» в подобным образом выложенный файл и способная положить что-то, что более-менее «сервер» — экономически нецелесообразна. И еще я выразил сомнение в том, что описанный в статье способ как-то облегчит ДДоС. И я сразу открестился от атак в сотни тысяч соединений и 100Гбит/c флуда.

                              Когда приходит такое, Вы совершенно правильно заметили, средства борьбы другие, и отдаваемая с лимитированная скоростью отдачи статика — песчинка во вселенной.
                              Когда Вы становитесь мишенью подобных атак, когда они экономически осмысленны, у вас уже должен быть не один (десяток) сервер(ов); хорошая, умная балансировка и\или далеко не бесплатный тариф клаудфлеер.
                    • +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 у них на платных тарифах.
                      • 0
                        Кеширование статики CF было отключено, да, потому что сайт активно допиливался, скрипты и стили часто менялись.
                        • 0
                          То есть вас положили 3х часовое окно?
        • +1
          В случае канала, как правильно заметил J_o_k_e_R, это может сработать.
          Только вот в чем незадача:
          Оффициально мой канал составляет 200 Мбит. Неоффициально я могу выжать 800 Мбит на отдачу (проверял).
          У хостера сеть построена сеть на juniper'ах и, хочется верить, есть решения, чтобы отсекать паразитный траффик и различать «паразитов».
          Если же вдруг канал забит на столько, что нету и пары кбит для ssh, я зайду в панель хостера и запрошу посредством кликов мышкой доступ только себе. Далее, я просто переименую файл и все. Будет ответ 404.
          • +2
            Если продолжить фантазировать, что придет ботнет, который забьет канал отдаваемой статикой, то после переименования по старому локейшену лучше отдавать 444. Тогда даже на ответах 404 сэкономите.
  • +6
    Вы — чистое зло.
    В хорошем смысле.
  • +13
    А не проще zip-бомбу отдавать?
    • +1
      У меня нету цели добиваться краха системы пользователя, даже в благих намерениях.
      • +7
        А напрасно. Хозяева зараженных хостов ботнета быстрее обнаружат проблему. А выделенные сервера на время выйдут из строя и таким образом перестанут сканировать других.
        Возьму на вооружение вариант с zip-бомбой.
        • 0
          Вот например добрый парень из провинции Цуаньчжоу качал это в течение суток, нещадно пытаясь открыть второй поток, как и янки из Лос Анжелеса. Зачем мне ломать их машины и, внимание, вопрос: сломаются ли они?

          Получив бомбу в архиве бот не будет ее открывать, он ее передаст на мастерхост (это такой «не хостинг»). Который её и откроет, и, скорее всего, ручками. Так же эта бомба ловится антивирусами.
          Но даже, если антивируса нету — какой может быть бекап в 42 кб и в корне сайта?
          Мне очень слабо верится. Но я верю в бекапы размером в гиг в корне простого сайта, вполне себе 8-10 гигов в распакованном виде.

          Так что zip бомба никому не насолит. Да и не о вреде этот материал, а скорее о том, как занять руки.

          Но смею заметить, что усовершенствованием к предложенному варианту будет вариант с max_ranges отличным от нуля. В этом случае пользователь скачает часть архива. Недоверчиво стопнет, затем увидит сигнатуру в hex редакторе и запустит докачку. Только несколько часов спустя докачка уже не будет работать (если у него к примеру инет разорвет), так как он превысит max_ranges при очередном запросе.
          • 0
            Аргументы резонные. Но почему не объединить варианты? Вначале — zip-бомба, а конец файла забить мусором. Навскидку не помню, но, по-моему, форматом не запрещено иметь мусор в конце файла.
          • 0
            В принципе и хорошо, что ловится антивирусами. Сработка при скачивании теоретически должна побудить ничего не подозревающего пользователя более глубоко проверить машинку (члена ботнета) на заразу.
          • 0
            Хотя вообще неплохо бы придумать какой-то менее вредный вариант — например, тестовый вирус, который безвреден и при этом ловится всеми антивирями.
            • 0
              Есть проблема в виде «черных списков».
              Портить репутацию домена — не очень умно. Правда я не знаю, будет ли что за тестовый вирус, но проверять не хочу:)
              • 0
                Если публичную ссылку на архив с вирусом (пусть будет EICAR) никуда не давать или как-то прописать неиндексирование (robots.txt ?) именно для этого архива, репутация в поисковках будет портиться?
                • 0
                  Будет. Ссылка обязательно где-то всплывёт, антивирусы её просканируют, пометят сайт как подозрительный, пользователи придут на WOT, понизят сайту рейтинг, на WOT придут антивирусы, увидят, что у сайта низкий рейтинг, предупредят пользователя, он пойдёт на WOT… Такая вот петля смерти.
                  Они все умные сейчас стали, но о последствиях не думают, главное пользователей попугать. Мне мой сайт занесли в чёрный список, потому что у него была ссылка на другой сайт, на котором оказалась ссылка с вирусом. Такая вот транзитивная смерть от антивирусов.
              • +2
                Есть «эталонный» тестовый вирус EICAR. Вот его содержимое:

                X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
          • +3
            Так к тем 42кб в конец можно дописать гигабайт. Станет даже правдподобнее, когда не будет хватать памяти для распаковки. Можно даже предположить, что на той стороне могут не догадаться и станут пробовать разные разархиваторы и искать хардварные ресурсы. Разве не забавно?
        • 0
          Сомнительно. Для начала: как в будете отдавать архив, с каким Content-Type?
          • +1
            А в чем проблема Content-Type при отдаче файла с расширением zip?
            nginx сам правильный подставит. В моем случае у файла не было расширения, поэтому я ручками дописал default_type application/zip;.
            • –1
              Так о том и речь. Был бы я ботнетом — в первую очередь смотрел бы на CT. Нафига пытаться распаковывать какие-то зипы, если нужное в другом? Ну а если охоа за арживами именно — не проверить compression ratio и/или реальный объём, это нужно быть совсем долбанько.
  • +7
    это божественно, прям до слез
  • 0
    А может сделать на подобие UltimateXXXPornCollectionAllSex.zip (4.0 Tb)? Можно дорисовать какую-нить pseudofs которая будет эту лажу генерировать находу
    • 0
      Я хотел сделать безлимитный файл на основе urandom, только такое нельзя сделать в linux. Судя по google, я не был первым.
      Но мусор можно отдавать через динамику, очень долго, пока сокет открыт.
      • 0
        Ну можно попробовать расширеньку для nginx сделать
      • 0
        А симлинк на /dev/urandom нельзя сделать?
  • 0
    Вот можно было бы прямо с /dev/urandom бесконечный поток отдавать =) Да еще и с жестким лимитом по скорости скачивания.
  • +4
    Добавьте еще wp-admin.php — осчастливьте и их.
    • +4
      Когда-то давно возникала мысль запилить /wp-admin, /administrator, /admin и прочие хорошие штуки в виде простых форм всегда отдающих «Неправильный пароль». Но руки до запиливания не дошли )
      • +7
        Такая мысль меня посетила два года назад теплым июльским вечером:
        скриншот
        image


        Там я сделал там настоящую структуру из папок, html'ок и финала на старой доброй ASCII для тех, кто прошел квест:
        финал
        image


        Но сие чудо, к счастью, только на одном домене:)
        • 0
          А зачем было столько создавать? Проще же rewrite сделать :)
          • 0
            Я тогда не хотел толком rewrite изучать, как и использование регулярок в nginx. Что в плюс мне не идет, конечно.
            Время проходит, люди учаться:)
            • +1
              [grammar-nazi]
              http://tsya.ru/
              [/grammar-nazi]
              • +4
                Хуже, когда я делаю ошибки в окончаниях прилагательных. Непроизвольно, причем за сочинения в школе на выпускном 5/5 было.
                Сказывается отсутствие русского языка в повседневной жизни. Несколько контактов из скайпа и вы, хабражители.
    • +1
      Благодаря wp-admin я поимел огромный список халявных прокси серверов.
    • 0
      Кстати, сейчас есть умные боты, которые умеют в javascript. Ищем админку, которую любят тыкать боты и оная содержит жабаскрипт, который надо выполнить, чтобы поюзать её и рисуем весёленький маленький скрипт, который будет дико тормозным и неэффективным, а ещё будет кушать тонну памяти…
  • 0
    Раньше так pagefile.sys/vmlinuz/etc на bbs/fido/ed2k/etc отдавали, в виде архива с порно :)
    • +11
      с pagefile.sys поосторожнее — это вам не /dev/urandom
    • +1
      pagefile в ююках!
    • 0
      Да, да. Своп от полуоси на холд положить, святое дело! ;)
  • +5
    Лет 16-18 назад в узких кругах было популярно распространение троянцев «методом ленивого кота». На машину ставился открытый для анонимов FTP, в котором лежали файлы, типа «games/porno/tetris.exe» И народ исправно находил ftp при массовом поиске халявы, качал и запускал :)
    • +2
      Лет ещё больше назад и в PATH первой переменной вставляли что-то похожее на PROG, GAMES, TOOLS, NС, TOYS, UTIL т.д :-)
  • 0
    Для грустящих читателей вашей статьи могли бы тогда выложить небольшой кусочек лога, чтобы мы тоже могли порадоваться и узнать наших упорных героев :)
    • +1
      да наверняка стандарт. возьмите свой лог, грипните по 404 — получите то же самое.
  • 0
    Ламер жив всегда,
    Он ко мне залез,
    Связь его крута,
    Аж сотни CPS.

    Имя шустро ввел,
    Лишь за пол-часа,
    Качает мне Винды NT,
    Выпучив глаза.
  • 0
    Я вас, возможно, разочарую, но на том конце никто не сидит и не ждет окончания скачивания, и не страдает впоследствии — это ботнеты сканируют интернет в поисках наживы. У ботов, как известно, нет эмоций, им всё равно — 5 суток качать или 5 секунд.
  • 0
    А можно ли на архивчик повесить еще пароль символов на много?
    • 0
      А смысл? Это не не ZIP архив, а только утка, с 10 байтами ZIP архива.
      В принципе, если кто-то подскажет, что через dd надо добавить и куда, то пароль будет.
  • –4
    Что-то у вас с форматированием случилось. Так бывает, когда копипастят текст с другого ресурса.
    • +1
      Поделитесь ссылкой, пожалуйста. Хочу посмотреть.
      • –3
        Какой ссылкой?
        • +1
          Откуда я наглым образом скопипастил этот текст. С того самого «другогоресурса.com».
          • –4
            Я не утверждал, что вы скопипастили. Я сказал, что текст так выглядит.
            Беглый поиск дал только пару ресурсов, которые копипастят отсюда.
            И я вижу, вы уже кое-что подправили.
            • +1
              Я не утверждал, что вы скопипастили. Я сказал, что текст так выглядит.

              И я вижу, вы уже кое-что подправили.


              «Профессор, конечно, лопух, но аппаратура при нём-мм, при нём-мм! Как слышно?»
              Покажите, где есть хоть небольшое совпадение, хотя бы про яблочную самогонку, она была тут изначально и именно она сподвигла меня на написание материала.
  • +2
    Уже есть перевод этой статьи на украинский. SEOшники не дремлют…
    • +1
      Неожиданно!
      У них альфа версия, запятых не хватает :)
  • 0
    Комментарий для поддержки хабра на счет hsto. Тест картинки и hsto.


    та же картинку в img после обработки hsto
    image
    • 0
      тест
      image
      • 0
        картинка

        img без спойлера
        image
        • 0
          image
          • 0
            надеюсь для теста хватит.

            После прошу саппорт удалить это комментарии, ибо они к статье не относятся.
            • 0
              Картинка, которую хабр может скачать
              image

              И которую не может
              image
  • 0
    del (для саппорта)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.