- PVSM.RU - https://www.pvsm.ru -
В июле исследователь безопасности Владимир Смитка решил проверить интернет [1] на предмет наличия открытых папок .git после того, как недавно был проведен подобный аудит для интернет доменов Чехии и Словакии.

Как говорится: «никогда такого не было, и вот опять». Напомню, 9 лет назад точно такая же история [2] была с российским сегментом интернета пораженным синдромом открытой .svn. Далее представлены результаты кропотливой работы чешского исследователя, инструментарий и методы.
Злоумышленник может почерпнуть довольно много критически важной для безопасности сайта информации из директории [3] .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 [4], который автоматически проделает все необходимые действия.
Не смотря на всю сложность и амбициозность задачи, затраты в денежном эквиваленте оказались скромными. На все, про все ушло 250 долл. США.
Смитка арендовал для проекта 18 и 4 физических сервера. По его словам, его выбор не пал на AWS по той причине, что полная стоимость услуги с учетом ожидаемых гигантских объемов трафика, значительного дискового пространства и высоких нагрузок на CPU, не поддавалась простой калькуляции. Цена же арендованных
В основу списка легли текстовые логи проекта OpenData Rapid7 [6] в формате JSON.
{
"$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 [7] с aiohttp [8]. Попытка использования для этих целей Requests [9] и Urllib3 [10] успехом не увенчалась, из которых первый вполне мог бы сгодиться, но исследователь не разобрался с тайм-аутами в документации. Второй же неважно справлялся с перенаправлением доменов и из-за этого довольно скоро исчерпал на серверах память.
Для опознания платформы, профиля уязвимых сайтов Смитка использовал утилиту WAD [11], основанной на базе данных Wappalyzer [12] — расширение для веб браузера, позволяющее определять используемые на странице технологии.
Также были использованы простые утилиты командной строки вроде GNU Parallels для того, чтобы ускорить время исполнения обработчика и предотвратить остановку сценария из-за одного зависания.
cat sites.txt | parallel --bar --tmpdir ./wad --files wad -u {} -f csv
Сканирование продолжалось 2 недели, в итоге исследователь:
В ответ на свои старания Смитка получил:

Самым популярным языком программирования оказался PHP. Однако, если нормализовать результат относительной доле того или иного ЯП, то PHP уступает лидерство Python и Node.js. Впрочем непонятно насколько достоверной может быть такая статистика определения доли рынка данного языка программирования.
Список популярности веб серверов возглавляет Apache, на втором месте Nginx, а китайский клон Nginx Tengine [13] внезапно оказался на третьем месте.
Самой популярной ОС оказалась Ubuntu, далее Debian, а CentOS на третьем месте.

Номинация CMS практически оказалась театром одного актера, и этим актером является WordPress с 85% долей всех обнаруженных платформ.
Починить уязвимость несложно.
RewriteRule "(^|/).(?!well-known/)" - [F]
location ~ /.(?!well-known/) {
deny all;
}
<Directory ~ "/.(?!well-known/)">
Order deny,allow
Deny from all
</Directory>
<Directory ~ "/.(?!well-known/)">
Require all denied
</Directory>
status 403 /blockdot
rewrite {
r /.(?!well-known/)
to /blockdot
}
Автор: temujin
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/292456
Ссылки в тексте:
[1] проверить интернет: https://lynt.cz/blog/global-scan-exposed-git
[2] точно такая же история: https://habr.com/post/70330/
[3] директории: https://habr.com/post/143079/
[4] GitTools: https://github.com/internetwache/GitTools
[5] VPS: https://www.reg.ru/?rlink=reflink-717
[6] OpenData Rapid7: https://opendata.rapid7.com/
[7] asyncio: https://docs.python.org/3/library/asyncio.html
[8] aiohttp: https://aiohttp.readthedocs.io/en/stable/
[9] Requests: http://docs.python-requests.org/en/master/
[10] Urllib3: https://urllib3.readthedocs.io/en/latest/
[11] WAD: https://github.com/CERN-CERT/WAD
[12] Wappalyzer: https://github.com/AliasIO/Wappalyzer
[13] Tengine: http://tengine.taobao.org/
[14] Источник: https://habr.com/post/422725/?utm_campaign=422725
Нажмите здесь для печати.