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


leak


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


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


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


+-- HEAD
+-- branches
+-- config
+-- description
+-- hooks
¦ +-- pre-commit.sample
¦ +-- pre-push.sample
¦ L-- ...
+-- info
¦ L-- exclude
+-- objects
¦ +-- info
¦ L-- pack
L-- refs
 +-- heads
 L-- 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
}

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


  1. BuriK666
    13.09.2018 14:43
    +2

    Прошло 9 лет, а ничего не поменялось. habr.com/post/70330


    1. cl0ne
      13.09.2018 14:53
      +2

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


    1. mapron
      13.09.2018 17:02

      Кто-то всерьез воспринял комментарий из прошлого поста

      Мораль — юзайте git =)


      1. Porohovnik
        13.09.2018 23:09

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


  1. Zjoba
    13.09.2018 15:51

    Шел 2018 год, а так ничего и не изменилось :D


  1. vics001
    13.09.2018 17:02

    Если код сайта Open-Source, то дыры нет (все github-pages like не проблема)?


  1. AstarothAst
    13.09.2018 18:36
    +1

    А что репозиторий делает на боевом сервере? Извиняюсь за глупый вопрос…


    1. TheGodfather
      13.09.2018 18:46

      Чтобы обновлять не через множество скриптов странных, а `git pull` и готово? Я думаю, для 95% сайтов в Интернете этого более чем достаточно.


      1. AstarothAst
        13.09.2018 18:59

        Но… как же… сборка… докер… 2018…
        image


        1. TheGodfather
          13.09.2018 19:13

          Для оставшихся 5%, конечно.


        1. vics001
          14.09.2018 02:21

          Чтобы раздавать статические файлы...?


        1. Arik
          14.09.2018 08:32

          У панели Plesk есть модуль Git и можно даже на обычные хостинге деплоить, вернее поставить на автомат чтоб тянул с какого репозитория настроив web-хуки


    1. DimaTiunov
      13.09.2018 20:07

      Что делает репозиторий?
      (кродётся)


      1. scifinder
        14.09.2018 06:49
        +1

        Вы мягкий знак пропустили.


    1. Suvitruf
      14.09.2018 02:27

      Лежит.


    1. helg1978
      15.09.2018 01:09

      что б отслеживать через status появление новых подозрительных php файлов например.
      хотя есть более удобные утилиты для этого конечно.
      А если уж Git, то лучше его держать на уровень выше DocumentRoot


  1. arkharis
    14.09.2018 14:23

    А почему при починке уязвимости блокируется доступ к .well-known (папка Letsencrypt), а не к .git .svn .hg (папки репозитариев)?


    1. iMrDron
      14.09.2018 15:12
      +1

      Эта регулярка как раз заблокирует доступ ко всем ресурсам путь которых начинается с точки, за исключением папки .well-known.


      1. arkharis
        14.09.2018 15:39

        Спасибо, в глаза бросилось well-known, а отрицание проглядел.