Представляю вашему вниманию очередную часть перевода OWASP Testing Guide. В данной статье речь пойдет об определении фреймворка веб-приложения.

Предыдущие статьи:

  1. Тестирование: введение и задачи
  2. Сбор информации с помощью поисковых систем
  3. Определение веб-сервера
  4. Поиск информации в метафайлах веб-сервера
  5. Определение веб-приложений на сервере
  6. Поиск утечек информации в комментариях и метаданных
  7. Определение точек входа веб-приложения
  8. Составление карты веб-приложения

Определение фреймворка веб-приложения
Резюме

Определение фреймворка[*] веб-приложения — это важная задача сбора информации. Зная фреймворк, мы получаем огромные преимущества, особенно если ранее фреймворк уже тестировался пентестерами. Данный процесс крайне важен, ведь мы не только узнаем о существующих уязвимостях в устаревших версиях, но и узнаем о наиболее часто встречаемых ошибках в настройке фреймворка и структуру его файлов.

Сейчас наиболее широко используются фреймворки от различных производителей и их различные версии. Информация о фреймворке не только упрощает тестирование, но и может полностью изменить его курс. Подобную информацию можно получить тщательно изучив веб-приложение. Большинство фреймворков содержат маркеры, благодаря которым можно определить какой именно фреймворк используется. Определить используемый фреймворк можно также с помощью различных автоматизированных инструментов — они находят маркеры и сравнивают их с содержащимися в базе. Для большей точности лучше использовать несколько маркеров.

[*]Пожалуйста, обратите внимание на то, что данная статья не различает Web Application Frameworks и Content Management Systems, это сделано для того чтобы объединить их определение в один раздел.

Поставленные задачи

Определить фреймворк веб-приложения.

Как тестировать
Тестирование по методу черного ящика

Маркеры могут содержаться в различных местах:

  • HTTP заголовки
  • куки
  • исходный код страниц
  • определенные файлы и каталоги

HTTP заголовки

Наиболее простой способ определения фреймворка — это изучить HTTP заголовок X-Powered-By в ответе сервера. Для данной задачи можно использовать различные инструменты, наиболее простым из которых является netcat.

Рассмотрим следующий HTTP запрос-ответ:


$ nc 127.0.0.1 80
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Sat, 07 Sep 2013 08:19:15 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: close
Vary: Accept-Encoding
X-Powered-By: Mono

Из приведенного выше примера видно, что наиболее вероятно фреймворком веб-приложения является Mono. Однако, хотя данный подход является простым и быстрым, он не работает в 100 % случаев. Довольно легко при определенной настройке отключить заголовок X-Powered-By. Также существуют различные техники, позволяющие обфусцировать HTTP заголовки.

Поэтому иногда в ответах сервера заголовок X-Powered-By может попросту отсутствовать или же иметь следующий вид:


HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Sat, 07 Sep 2013 08:19:15 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: close
Vary: Accept-Encoding
X-Powered-By: Blood, sweat and tears

Иногда, в ответе сервера присутствуют несколько заголовков, указывающих на фреймворк. В следующем примере, согласно заголовку X-Powered-By приложение написано на PHP. Однако, заголовок X-Generator указывает на то, что фреймворком веб-приложения на самом деле является Swiftlet, зная это, пентестер может значительно расширить вектора атаки. Определяя фреймворк, стоит тщательно изучать каждый HTTP заголовок ради подобных утечек.


HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Sat, 07 Sep 2013 09:22:52 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.16-1~dotdeb.1
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Generator: Swiftlet

Также стоит ознакомится с следующим проектом: https://www.owasp.org/index.php/Web-metadata

Куки

Более точным и надежным методом определения фреймворка веб-приложения является изучение куки.

Рассмотрим следующий HTTP запрос:

Cakephp_cookie

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


/**
* The name of CakePHP's session cookie.
*
* Note the guidelines for Session names states: "The session name references
* the session id in cookies and URLs. It should contain only alphanumeric
* characters."
* @link http://php.net/session_name
*/
Configure::write('Session.cookie', 'CAKEPHP');

Однако, подобные изменения менее вероятны, чем изменение заголовка X-Powered-By, именно поэтому данный метод считается более надежным.

Исходный код страниц

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

Одним из наиболее распространенных маркеров являются комментарии, которые могут напрямую раскрыть используемый фреймворк. Более часто можно обнаружить пути, характерные для определенного фреймворка, например, css файлы и/или js каталоги. Различные специфичные имена переменных в скриптах также позволяют опеределить фреймворк веб-приложения.

В скриншоте, расположенном ниже,сразу можно определить используемый фреймворк и его версию по рассмотренным ранее маркерам: комментарий, характерные пути и имена переменных в скрипте позволяют быстро определить что используемым веб-приложением фреймворком является ZK.

ZK_html_source

Довольно часто информация об используемом фреймворке размещается в теге meta или же внизу страницы. Тем не менее, рекомендуется полностью изучить исходный код страницы, так как в нем могут содержаться полезные комментарии и скрытые поля для ввода. Иногда, веб-разработчики даже не пытаются скрыть информацию об используемом фреймворке. Все еще возможно наткнуться на нечто подобное внизу страницы:


Распространенные фреймворки
Куки

Фреймворк Имя куки
Zope zope3
CakePHP cakephp
Kohana kohanasession
Laravel laravel_session

Исходный код страниц
Общие маркеры

%framework_name%
powered by
built upon
running

Специфичные маркеры

Фреймворк Ключевые слова
Adobe ColdFusion <!—START headerTags.cfm
Microsoft ASP.NET __VIEWSTATE
ZK <!— ZK
Business Catalyst <!— BC_OBNW —>
Indexhibit ndxz-studio

Определенные файлы и каталоги

Файлы и каталоги различны для каждого фреймворка. Рекомендуется установить соответствующий фреймворк во время проведения пентеста для того, чтобы лучше понимать его инфраструктуру и определить файлы, которые могли остаться на сервере. Существуют различные словари файлов, одни из лучших словарей можно найти в FuzzDB, раздел predictable files/folders (http://code.google.com/p/fuzzdb/).

Инструменты

Ниже приведены несколько часто используемых инструментов при опередении фреймворка веб-приложения.

WhatWeb

Сайт: http://www.morningstarsecurity.com/research/whatweb

На данный момент один из лучших инструментов. Входит в состав Kali линукс по-умолчанию. Написан на Ruby, для определения использует:

  • текстовые строки (чувствителен к регистру)
  • регулярные выражения
  • гугл дорки (ограниченное число ключевых слов)
  • хеши MD5
  • урлы
  • паттерны HTML тегов
  • кастомный Ruby код для пассивного и активного определения

На скриншоте показан пример работы


BlindElephant

Сайт: https://community.qualys.com/community/blindelephant

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

Пример работы


pentester$ python BlindElephant.py http://my_target drupal
Loaded /Library/Python/2.7/site-packages/blindelephant/dbs/drupal.pkl with 145 versions, 478 differentiating paths, and 434 version groups.
Starting BlindElephant fingerprint for version of drupal at http://my_target

Hit http://my_target/CHANGELOG.txt
File produced no match. Error: Retrieved file doesn’t match known fingerprint. 527b085a3717bd691d47713dff74acf4

Hit http://my_target/INSTALL.txt
File produced no match. Error: Retrieved file doesn’t match known fingerprint. 14dfc133e4101be6f0ef5c64566da4a4

Hit http://my_target/misc/drupal.js
Possible versions based on result: 7.12, 7.13, 7.14

Hit http://my_target/MAINTAINERS.txt
File produced no match. Error: Retrieved file doesn’t match known fingerprint. 36b740941a19912f3fdbfcca7caa08ca

Hit http://my_target/themes/garland/style.css
Possible versions based on result: 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 7.10, 7.11, 7.12, 7.13, 7.14

Fingerprinting resulted in:
7.14

Best Guess: 7.14

Wappalyzer

Сайт: http://wappalyzer.com

Wappalyzer — это плагин для Firefox или Chrome. Для определения использует только регулярные выражения, чтобы он заработал нужно просто загрузить страницу в браузере. Работает полностью в браузере и выдает результаты в виде иконок. Иногда он выдает ложные результаты, но все же полезно узнать о технологиях, используемых веб-приложением сразу после его загрузки.

Пример работы


Desenmascara.me

Сайт: http://desenmascara.me

Целью данного инструмента является увеличение грамматности в области информационной безопасности среди владельцев веб-сайтов.

О инструменте: http://desenmascara.me/english

Справочные материалы

Противодействие атакующему

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

HTTP заголовки

Проверьте конфигурацию и отключите или обфусцируйте все заголовки, раскрывающие информацию об используемых технологиях. Вот интересная статья об обфускации HTTP заголовков используя Netscaler: http://grahamhosking.blogspot.ru/2013/07/obfuscating-http-header-using-netscaler.html

Куки

Рекомендуется изменить все имена куки, отредактировав соответствующие конфигурационные файлы.

Исходный код страниц

Просмотрите исходный код страниц и удалите все, что явно указывает на фреймворк.

Общие рекомендации:

  • убедитесь, что нет визуальных маркеров, раскрывающих фреймворк
  • удалите все ненужные комментарии (информация об авторских правах, информация о багах, комментарии характерные для фреймворка)
  • удалите в теге META аттрибут generator
  • используйте свои собственные css и js файлы, также не сохраняйте их в директориях созданных фреймворком
  • не используйте скрипты по-умолчанию и обфусцируйте их,если вам все же нужно их использовать

Определенные файлы и каталоги

Общие рекомендации:

  • удалите все неиспользуемые и ненужные файлы. Это также относится к текстовым файлам, раскрывающим версию фреймворка или любую другую важную информацию
  • запретите доступ к другим файлам, необходимо выдавать 404 ошибку при доступе из вне. Это можно сделать, например, с помощью файла htaccess, добавив в него RewriteCond или RewriteRule. Ниже приведен пример запрета двух распространенных в WordPress директорий:


RewriteCond %{REQUEST_URI} /wp-login\.php$ [OR]
RewriteCond %{REQUEST_URI} /wp-admin/$
RewriteRule $ /http://your_website [R=404,L]

Однако, это не единственный способ запрета доступа. В некоторых фреймворках существуют плагины для автоматизации этого процесса, например, в WordPress —  StealthLogin (http://wordpress.org/plugins/stealth-login-page).

Дополнительные подходы

Общие рекомендации

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