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

В мире много чего происходит, у кого счастливое 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

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


  1. meps
    03.12.2015 16:06
    +9

    «Сделать этот мир лучше» гоняя порожняком гигабайты шума? Вот это вряд ли. Но все равно смешно.


  1. mcleod095
    03.12.2015 16:14
    -8

    Осталось добраться боднет до этого файла и задосить сервак.


    1. J_o_k_e_R
      03.12.2015 18:01
      +3

      Какой сервак? Чем задосить? Отдавая nginx'ом статику?


      1. mcleod095
        03.12.2015 18:08
        -3

        То есть при отдаче статики у нас не используются ресурсы сервера? Не остается отрытым коннект, не съедаются ресурсы на поддержание коннекта и тп?


        1. J_o_k_e_R
          03.12.2015 18:17
          +6

          Крайне мало ресурсов отъедается. Это не апач. Чтоб заддосить даже современный ноутбук таким образом надо привести ОЧЕНЬ большой ботнет, который будет стоить ОЧЕНЬ много денег. Проще будет заддосить на канал, а это другая история и не зависит от отдаваемого контента.


          1. ololoepepe
            04.12.2015 12:03
            -1

            Мне в 17к ботов положили сервер. Это весьма скромный ботнет, и стоит такой недорого.


            1. J_o_k_e_R
              04.12.2015 12:39

              Я один раз положил свой сервер, когда у меня ф5 залипла. Сервер был на малинке и очень кривой пхп скрипт в бэкнде.

              Но исходный тред начался про ботов, запрашивающих статику.


              1. ololoepepe
                04.12.2015 12:46

                Так у меня статика и была. nginx, 3.5 гб памяти, Xeon CPU E5-2673 v3 @ 2.40GHz.


                1. J_o_k_e_R
                  04.12.2015 12:49

                  Мне даже интересно стало, что Вы сделали не так. «Положили» — это в чем именно выражалось?


                  1. ololoepepe
                    04.12.2015 12:52

                    Очень просто: все процессорное время кушал nginx, отдавая эту самую статику, плюс закончился лимит открытых файлов. Ограничение на количество открытых файлов проблему не решило — достучаться до сервера все равно было невозможно.
                    К слову, сервер находился за CF, челленджи включены, парень их обошел (мы с ним потом пообщались немного).


                    1. J_o_k_e_R
                      04.12.2015 13:07

                      limit_req \ limit_con включали? У меня сервера без ссд, похожей конфигурации, отдающие статику и немного динамики (хороший бэкэнд) досы с подобным количеством ботов переживают легко, показывая только небольшое повышение LA (десятые доли на ядро).

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

                      Ккой у вас был rps во время ддоса?


                      1. ololoepepe
                        04.12.2015 14:00

                        Включал, но, видимо, неверные значения ставил. Вот вы сколько выставляете? rps честно не помню.


                        1. J_o_k_e_R
                          04.12.2015 16:12

                          Лимиты зависят как от приложения, так и от мощности сервера, канала, задач, прочего конфига nginx.

                          У меня стоит limit_conn на 10 соединений на ип. Но только динамика. Статику не лимитирую вообще, только иногда включаю aio и кеширую дескрипторы открытых файлов.


                          1. flyaway
                            04.12.2015 20:48
                            -2

                            Вы, видимо, еще не видели хорошего ddos. Например, когда прилетает сотня тысяч соединений на «статику» или просто заливается 100Гбит/c флуда так, что у ДЦ все каналы забиваются.
                            Тут не то что nginx, вообще ничего кроме глобальных cdn не поможет.


                            1. J_o_k_e_R
                              05.12.2015 01:27
                              +1

                              Читайте тред с начала, пожалуйста. Мы начали с того, что атака, которая будет специально «бить» в подобным образом выложенный файл и способная положить что-то, что более-менее «сервер» — экономически нецелесообразна. И еще я выразил сомнение в том, что описанный в статье способ как-то облегчит ДДоС. И я сразу открестился от атак в сотни тысяч соединений и 100Гбит/c флуда.

                              Когда приходит такое, Вы совершенно правильно заметили, средства борьбы другие, и отдаваемая с лимитированная скоростью отдачи статика — песчинка во вселенной.
                              Когда Вы становитесь мишенью подобных атак, когда они экономически осмысленны, у вас уже должен быть не один (десяток) сервер(ов); хорошая, умная балансировка и\или далеко не бесплатный тариф клаудфлеер.


                    1. 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 у них на платных тарифах.


                      1. ololoepepe
                        04.12.2015 14:01

                        Кеширование статики CF было отключено, да, потому что сайт активно допиливался, скрипты и стили часто менялись.


                        1. nikitasius
                          04.12.2015 14:08

                          То есть вас положили 3х часовое окно?


        1. nikitasius
          03.12.2015 18:28
          +1

          В случае канала, как правильно заметил J_o_k_e_R, это может сработать.
          Только вот в чем незадача:
          Оффициально мой канал составляет 200 Мбит. Неоффициально я могу выжать 800 Мбит на отдачу (проверял).
          У хостера сеть построена сеть на juniper'ах и, хочется верить, есть решения, чтобы отсекать паразитный траффик и различать «паразитов».
          Если же вдруг канал забит на столько, что нету и пары кбит для ssh, я зайду в панель хостера и запрошу посредством кликов мышкой доступ только себе. Далее, я просто переименую файл и все. Будет ответ 404.


          1. J_o_k_e_R
            03.12.2015 18:32
            +2

            Если продолжить фантазировать, что придет ботнет, который забьет канал отдаваемой статикой, то после переименования по старому локейшену лучше отдавать 444. Тогда даже на ответах 404 сэкономите.


  1. AndersonDunai
    03.12.2015 16:17
    +6

    Вы — чистое зло.
    В хорошем смысле.


  1. eyeless_watcher
    03.12.2015 16:33
    +13

    А не проще zip-бомбу отдавать?


    1. nikitasius
      03.12.2015 17:02
      +1

      У меня нету цели добиваться краха системы пользователя, даже в благих намерениях.


      1. baldr
        03.12.2015 17:09
        +7

        А напрасно. Хозяева зараженных хостов ботнета быстрее обнаружат проблему. А выделенные сервера на время выйдут из строя и таким образом перестанут сканировать других.
        Возьму на вооружение вариант с zip-бомбой.


        1. nikitasius
          03.12.2015 17:29

          Вот например добрый парень из провинции Цуаньчжоу качал это в течение суток, нещадно пытаясь открыть второй поток, как и янки из Лос Анжелеса. Зачем мне ломать их машины и, внимание, вопрос: сломаются ли они?

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

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

          Но смею заметить, что усовершенствованием к предложенному варианту будет вариант с max_ranges отличным от нуля. В этом случае пользователь скачает часть архива. Недоверчиво стопнет, затем увидит сигнатуру в hex редакторе и запустит докачку. Только несколько часов спустя докачка уже не будет работать (если у него к примеру инет разорвет), так как он превысит max_ranges при очередном запросе.


          1. baldr
            03.12.2015 17:38

            Аргументы резонные. Но почему не объединить варианты? Вначале — zip-бомба, а конец файла забить мусором. Навскидку не помню, но, по-моему, форматом не запрещено иметь мусор в конце файла.


          1. lubezniy
            03.12.2015 21:23

            В принципе и хорошо, что ловится антивирусами. Сработка при скачивании теоретически должна побудить ничего не подозревающего пользователя более глубоко проверить машинку (члена ботнета) на заразу.


          1. lubezniy
            03.12.2015 21:27

            Хотя вообще неплохо бы придумать какой-то менее вредный вариант — например, тестовый вирус, который безвреден и при этом ловится всеми антивирями.


            1. nikitasius
              03.12.2015 22:39

              Есть проблема в виде «черных списков».
              Портить репутацию домена — не очень умно. Правда я не знаю, будет ли что за тестовый вирус, но проверять не хочу:)


              1. lubezniy
                03.12.2015 22:44

                Если публичную ссылку на архив с вирусом (пусть будет EICAR) никуда не давать или как-то прописать неиндексирование (robots.txt ?) именно для этого архива, репутация в поисковках будет портиться?


                1. force
                  08.12.2015 11:49

                  Будет. Ссылка обязательно где-то всплывёт, антивирусы её просканируют, пометят сайт как подозрительный, пользователи придут на WOT, понизят сайту рейтинг, на WOT придут антивирусы, увидят, что у сайта низкий рейтинг, предупредят пользователя, он пойдёт на WOT… Такая вот петля смерти.
                  Они все умные сейчас стали, но о последствиях не думают, главное пользователей попугать. Мне мой сайт занесли в чёрный список, потому что у него была ссылка на другой сайт, на котором оказалась ссылка с вирусом. Такая вот транзитивная смерть от антивирусов.


              1. antonbatenev
                03.12.2015 22:47
                +2

                Есть «эталонный» тестовый вирус EICAR. Вот его содержимое:

                X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*


          1. madkite
            07.12.2015 13:05
            +3

            Так к тем 42кб в конец можно дописать гигабайт. Станет даже правдподобнее, когда не будет хватать памяти для распаковки. Можно даже предположить, что на той стороне могут не догадаться и станут пробовать разные разархиваторы и искать хардварные ресурсы. Разве не забавно?


        1. kloppspb
          03.12.2015 19:26

          Сомнительно. Для начала: как в будете отдавать архив, с каким Content-Type?


          1. nikitasius
            03.12.2015 19:33
            +1

            А в чем проблема Content-Type при отдаче файла с расширением zip?
            nginx сам правильный подставит. В моем случае у файла не было расширения, поэтому я ручками дописал default_type application/zip;.


            1. kloppspb
              03.12.2015 19:37
              -1

              Так о том и речь. Был бы я ботнетом — в первую очередь смотрел бы на CT. Нафига пытаться распаковывать какие-то зипы, если нужное в другом? Ну а если охоа за арживами именно — не проверить compression ratio и/или реальный объём, это нужно быть совсем долбанько.


  1. nogoody
    03.12.2015 16:44
    +7

    это божественно, прям до слез


  1. JerleShannara
    03.12.2015 17:50

    А может сделать на подобие UltimateXXXPornCollectionAllSex.zip (4.0 Tb)? Можно дорисовать какую-нить pseudofs которая будет эту лажу генерировать находу


    1. nikitasius
      03.12.2015 17:59

      Я хотел сделать безлимитный файл на основе urandom, только такое нельзя сделать в linux. Судя по google, я не был первым.
      Но мусор можно отдавать через динамику, очень долго, пока сокет открыт.


      1. snakeye
        03.12.2015 23:52

        Ну можно попробовать расширеньку для nginx сделать


      1. asm0dey
        04.12.2015 10:44

        А симлинк на /dev/urandom нельзя сделать?


  1. rhamdeew
    03.12.2015 17:58

    Вот можно было бы прямо с /dev/urandom бесконечный поток отдавать =) Да еще и с жестким лимитом по скорости скачивания.


  1. gre
    03.12.2015 18:00
    +4

    Добавьте еще wp-admin.php — осчастливьте и их.


    1. rhamdeew
      03.12.2015 18:02
      +4

      Когда-то давно возникала мысль запилить /wp-admin, /administrator, /admin и прочие хорошие штуки в виде простых форм всегда отдающих «Неправильный пароль». Но руки до запиливания не дошли )


      1. nikitasius
        03.12.2015 18:16
        +7

        Такая мысль меня посетила два года назад теплым июльским вечером:

        скриншот
        image


        1. thunderspb
          03.12.2015 19:11

          А зачем было столько создавать? Проще же rewrite сделать :)


          1. nikitasius
            03.12.2015 19:36

            Я тогда не хотел толком rewrite изучать, как и использование регулярок в nginx. Что в плюс мне не идет, конечно.
            Время проходит, люди учаться:)


            1. baldr
              03.12.2015 20:25
              +1

              [grammar-nazi]
              http://tsya.ru/
              [/grammar-nazi]


              1. nikitasius
                03.12.2015 21:53
                +4

                Хуже, когда я делаю ошибки в окончаниях прилагательных. Непроизвольно, причем за сочинения в школе на выпускном 5/5 было.
                Сказывается отсутствие русского языка в повседневной жизни. Несколько контактов из скайпа и вы, хабражители.


    1. JerleShannara
      03.12.2015 19:19
      +1

      Благодаря wp-admin я поимел огромный список халявных прокси серверов.


    1. JerleShannara
      07.12.2015 16:33

      Кстати, сейчас есть умные боты, которые умеют в javascript. Ищем админку, которую любят тыкать боты и оная содержит жабаскрипт, который надо выполнить, чтобы поюзать её и рисуем весёленький маленький скрипт, который будет дико тормозным и неэффективным, а ещё будет кушать тонну памяти…


  1. iscsi
    03.12.2015 18:36

    Раньше так pagefile.sys/vmlinuz/etc на bbs/fido/ed2k/etc отдавали, в виде архива с порно :)


    1. baldr
      03.12.2015 19:25
      +11

      с pagefile.sys поосторожнее — это вам не /dev/urandom


    1. kloppspb
      03.12.2015 19:29
      +1

      pagefile в ююках!


  1. Bal
    03.12.2015 20:43
    +5

    Лет 16-18 назад в узких кругах было популярно распространение троянцев «методом ленивого кота». На машину ставился открытый для анонимов FTP, в котором лежали файлы, типа «games/porno/tetris.exe» И народ исправно находил ftp при массовом поиске халявы, качал и запускал :)


    1. kloppspb
      03.12.2015 23:08
      +2

      Лет ещё больше назад и в PATH первой переменной вставляли что-то похожее на PROG, GAMES, TOOLS, NС, TOYS, UTIL т.д :-)


  1. memtew
    03.12.2015 22:45

    Для грустящих читателей вашей статьи могли бы тогда выложить небольшой кусочек лога, чтобы мы тоже могли порадоваться и узнать наших упорных героев :)


    1. kloppspb
      03.12.2015 23:22
      +1

      да наверняка стандарт. возьмите свой лог, грипните по 404 — получите то же самое.


  1. Speccyfan
    04.12.2015 08:59

    Ламер жив всегда,
    Он ко мне залез,
    Связь его крута,
    Аж сотни CPS.

    Имя шустро ввел,
    Лишь за пол-часа,
    Качает мне Винды NT,
    Выпучив глаза.


  1. flyaway
    04.12.2015 20:54

    Я вас, возможно, разочарую, но на том конце никто не сидит и не ждет окончания скачивания, и не страдает впоследствии — это ботнеты сканируют интернет в поисках наживы. У ботов, как известно, нет эмоций, им всё равно — 5 суток качать или 5 секунд.


    1. nikitasius
      04.12.2015 22:40
      +7

      image


  1. br3t
    07.12.2015 13:57

    А можно ли на архивчик повесить еще пароль символов на много?


    1. nikitasius
      08.12.2015 20:24

      А смысл? Это не не ZIP архив, а только утка, с 10 байтами ZIP архива.
      В принципе, если кто-то подскажет, что через dd надо добавить и куда, то пароль будет.


  1. ComodoHacker
    08.12.2015 14:11
    -4

    Что-то у вас с форматированием случилось. Так бывает, когда копипастят текст с другого ресурса.


    1. nikitasius
      08.12.2015 20:22
      +1

      Поделитесь ссылкой, пожалуйста. Хочу посмотреть.


      1. ComodoHacker
        08.12.2015 20:53
        -3

        Какой ссылкой?


        1. nikitasius
          08.12.2015 22:09
          +1

          Откуда я наглым образом скопипастил этот текст. С того самого «другогоресурса.com».


          1. ComodoHacker
            09.12.2015 22:01
            -4

            Я не утверждал, что вы скопипастили. Я сказал, что текст так выглядит.
            Беглый поиск дал только пару ресурсов, которые копипастят отсюда.
            И я вижу, вы уже кое-что подправили.


            1. nikitasius
              09.12.2015 23:26
              +1

              Я не утверждал, что вы скопипастили. Я сказал, что текст так выглядит.

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


              «Профессор, конечно, лопух, но аппаратура при нём-мм, при нём-мм! Как слышно?»
              Покажите, где есть хоть небольшое совпадение, хотя бы про яблочную самогонку, она была тут изначально и именно она сподвигла меня на написание материала.


  1. baldr
    08.12.2015 14:42
    +2

    Уже есть перевод этой статьи на украинский. SEOшники не дремлют…


    1. nikitasius
      08.12.2015 20:22
      +1

      Неожиданно!
      У них альфа версия, запятых не хватает :)


  1. nikitasius
    11.12.2015 17:40

    Комментарий для поддержки хабра на счет hsto. Тест картинки и hsto.

    ссылка на картинку без img
    1. nikitasius
      11.12.2015 17:42

      тест2
      image


      1. nikitasius
        11.12.2015 17:45

        картинка

        img без спойлера
        image


        1. nikitasius
          11.12.2015 17:45

          image


          1. nikitasius
            11.12.2015 17:46

            надеюсь для теста хватит.

            После прошу саппорт удалить это комментарии, ибо они к статье не относятся.


            1. nikitasius
              11.12.2015 17:49

              Картинка, которую хабр может скачать
              image

              И которую не может
              image


  1. nikitasius
    11.12.2015 17:43

    del (для саппорта)