390k. вебсайтов с открытой папкой .git

    В июле исследователь безопасности Владимир Смитка решил проверить интернет на предмет наличия открытых папок .git после того, как недавно был проведен подобный аудит для интернет доменов Чехии и Словакии.


    leak


    Как говорится: «никогда такого не было, и вот опять». Напомню, 9 лет назад точно такая же история была с российским сегментом интернета пораженным синдромом открытой .svn. Далее представлены результаты кропотливой работы чешского исследователя, инструментарий и методы.


    Причины наличия уязвимости


    Злоумышленник может почерпнуть довольно много критически важной для безопасности сайта информации из директории .git. Так выглядит дерево типичного проекта.


    ├── HEAD
    ├── branches
    ├── config
    ├── description
    ├── hooks
    │ ├── pre-commit.sample
    │ ├── pre-push.sample
    │ └── ...
    ├── info
    │ └── exclude
    ├── objects
    │ ├── info
    │ └── pack
    └── refs
     ├── heads
     └── tags

    Там могут хранится пароли и ключи доступа к различным API, базам данных и вынесенным в облако службам.


    Часто, как и положено, попытка открыть папку .git выдает HTTP ошибку 403, но причина всего лишь в отсутствии index.html / index.php и прав автоматической индексации папки, в то время как отдельные файлы все еще доступны. Для того, чтобы удостовериться в том, что сайт не подвержен уязвимости следует открыть страницу домен/.git/HEAD.


    Этот файл содержит ссылку на текущую ветку проекта.


    $ cat .git/HEAD
    ref: refs/heads/master

    Даже если автоматическая индексация директорий запрещена, можно легко восстановить всю папку .git, скачивая отдельные файлы и определяя зависимости обработчиком регулярных выражений, благодаря тому, что структура.git ясно определена. Есть также специальный инструмент — GitTools, который автоматически проделает все необходимые действия.


    Средства производства


    Не смотря на всю сложность и амбициозность задачи, затраты в денежном эквиваленте оказались скромными. На все, про все ушло 250 долл. США.


    Сервера


    Смитка арендовал для проекта 18 VPS и 4 физических сервера. По его словам, его выбор не пал на AWS по той причине, что полная стоимость услуги с учетом ожидаемых гигантских объемов трафика, значительного дискового пространства и высоких нагрузок на CPU, не поддавалась простой калькуляции. Цена же арендованных VPS была фиксирована известна наперед.


    Список доменов


    В основу списка легли текстовые логи проекта OpenData Rapid7 в формате JSON.


    Схема базы данных Forward DNS
    {
      "$id": "https://opendata.rapid7.com/sonar.fdns_v2/",
      "type": "object",
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "additionalProperties": false,
      "properties": {
        "timestamp": {
          "$id": "/properties/timestamp",
          "type": "string",
          "description": "The time when this response was received in seconds since the epoch"
        },
        "name": {
          "$id": "/properties/name",
          "type": "string",
          "description": "The record name"
        },
        "type": {
          "$id": "/properties/type",
          "type": "string",
          "description": "The record type"
        },
        "value": {
          "$id": "/properties/value",
          "type": "string",
          "description": "The response received for a record of the given name and type"
        }
      }
    }

    После некоторой фильтрации TLD и доменов второго уровня в списке все еще оставалось более 230 миллионов записей.


    Далее базу данных разделили на блоки по 2 миллиона записей и распределили нагрузку по различным серверам с помощью PHP приложения.


    Софт


    В качестве рабочей лошадки выступил Python обвешанный библиотеками асинхронной связи asyncio с aiohttp. Попытка использования для этих целей Requests и Urllib3 успехом не увенчалась, из которых первый вполне мог бы сгодиться, но исследователь не разобрался с тайм-аутами в документации. Второй же неважно справлялся с перенаправлением доменов и из-за этого довольно скоро исчерпал на серверах память.


    Для опознания платформы, профиля уязвимых сайтов Смитка использовал утилиту WAD, основанной на базе данных Wappalyzer — расширение для веб браузера, позволяющее определять используемые на странице технологии.


    Также были использованы простые утилиты командной строки вроде GNU Parallels для того, чтобы ускорить время исполнения обработчика и предотвратить остановку сценария из-за одного зависания.


    cat sites.txt | parallel --bar --tmpdir ./wad --files wad -u {} -f csv

    Результаты


    Сканирование продолжалось 2 недели, в итоге исследователь:


    • обнаружил 390 тыс. уязвимых веб сайтов;
    • собрал 290 тыс. адресов электронной почты;
    • оповестил 90 тыс. адресатов о найденной уязвимости.

    В ответ на свои старания Смитка получил:


    • 18 тыс. ошибок доставки сообщения;
      • около 2000 благодарственных писем;
      • 30 ложных срабатывай с honeypot систем;
      • 1 угроза позвонить в полицию Канады;

    platform


    Самым популярным языком программирования оказался PHP. Однако, если нормализовать результат относительной доле того или иного ЯП, то PHP уступает лидерство Python и Node.js. Впрочем непонятно насколько достоверной может быть такая статистика определения доли рынка данного языка программирования.


    Список популярности веб серверов возглавляет Apache, на втором месте Nginx, а китайский клон Nginx Tengine внезапно оказался на третьем месте.


    Самой популярной ОС оказалась Ubuntu, далее Debian, а CentOS на третьем месте.


    OS


    Номинация CMS практически оказалась театром одного актера, и этим актером является WordPress с 85% долей всех обнаруженных платформ.


    Что же дальше


    Починить уязвимость несложно.


    .htaccess


    RewriteRule "(^|/)\.(?!well-known\/)" - [F]

    .nginx


    location ~ /\.(?!well-known\/) {
        deny all;
    }

    apache22.conf


    <Directory ~ "/\.(?!well-known\/)">
        Order deny,allow
        Deny from all
    </Directory>

    apache24.conf


    <Directory ~ "/\.(?!well-known\/)">
        Require all denied
    </Directory>

    Caddyfile


    status 403 /blockdot
    rewrite {
        r /\.(?!well-known\/)
        to /blockdot
    }
    Поделиться публикацией
    Комментарии 20
      +6
      Прошло 9 лет, а ничего не поменялось. habr.com/post/70330
        +5
        Думаю, у многих после прочтения заголовка вспомнились доступные из веба .svn
          +3
          Кто-то всерьез воспринял комментарий из прошлого поста
          Мораль — юзайте git =)
            –1

            Мне больше нравится продолжение той ветки:

          0
          Шел 2018 год, а так ничего и не изменилось :D
            0
            Если код сайта Open-Source, то дыры нет (все github-pages like не проблема)?
              +2
              А что репозиторий делает на боевом сервере? Извиняюсь за глупый вопрос…
                +4
                Чтобы обновлять не через множество скриптов странных, а `git pull` и готово? Я думаю, для 95% сайтов в Интернете этого более чем достаточно.
                  +3
                  Но… как же… сборка… докер… 2018…
                  image
                    +1
                    Для оставшихся 5%, конечно.
                      0
                      Чтобы раздавать статические файлы...?
                        +1
                        У панели Plesk есть модуль Git и можно даже на обычные хостинге деплоить, вернее поставить на автомат чтоб тянул с какого репозитория настроив web-хуки
                      +3
                      Что делает репозиторий?
                      (кродётся)
                        +1
                        Вы мягкий знак пропустили.
                        0
                        Лежит.
                          0
                          что б отслеживать через status появление новых подозрительных php файлов например.
                          хотя есть более удобные утилиты для этого конечно.
                          А если уж Git, то лучше его держать на уровень выше DocumentRoot
                          0
                          А почему при починке уязвимости блокируется доступ к .well-known (папка Letsencrypt), а не к .git .svn .hg (папки репозитариев)?
                            +1
                            Эта регулярка как раз заблокирует доступ ко всем ресурсам путь которых начинается с точки, за исключением папки .well-known.
                              +1
                              Спасибо, в глаза бросилось well-known, а отрицание проглядел.
                            0
                            Условия:
                            1. Основной язык — PHP.
                            2. Основной движок — WordPress.

                            Результат:
                            Папка .git открыта.

                            Почему я не удивлен? :)
                            На самом деле интересно было бы узнать, какие позиции в рейтингах занимают уязвимые сайты.
                            Потому что, судя по результатам анализа (включая популярность китайского веб-сервера) мы все всё понимаем о квалификации админов этих ресурсов.

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

                            Самое читаемое