пятница, 21 января 2011 г.

[Из старого] Paros - инструмент для тестирования web-приложений


Перевёл: Кузьмин Антон
Дата: 17-02-2009

Домашняя страница: http://www.parosproxy.org/
Последняя версия на момент написания статьи: 3.2.13
Ограничения: Написан на Java. Для запуска требуется Java JRE/JDK версии 1.4.2 или выше.
ОС: Проект кросс-платформенный.


Введение.
Сейчас мы рассмотрим один интересный проект — Paros. Несмотря на то что сайт проекта с 2004 года не обновляется (могу ошибаться, но в авторских правах и истории развития указан 2004 год) данный инструмент до сих пор находит себе применение в области исследования веб-приложений на наличие в них изъянов. Paros представляет из себя смесь нескольких инструментов ориентированных на анализ веб-приложений. Вот их список:
  1. Crawler (поисковый паук)
  2. Сканнер уязвимостей
  3. Фильтр данных
  4. Перехватчик запросов/ответов в режиме «on-the-fly»
  5. Иной малозначительный, но полезный в некоторых ситуациях функционал.
На ряду с этим Paros при любых операциях используется как прокси-сервер, в чём Вы убедитесь далее. Для всего описанного ниже нужно настроить свой браузер на работу с прокси-сервером по адресу 127.0.0.1, порт 8080 (настройки Paros по умолчанию).

0. Строение интерфейса Paros.
Начнём с самого основного, что бы дальше Вы смогли свободно ориентироваться в написанном. Первая часть окна, находящаяся слева сверху, - это древо структуры сайта. При переходах по сайту туда добавляются директории и файлы к которым Вы обращаетесь. Это, можно сказать, основная часть Paros`a. Справа от неё имеется небольшое окно разбитое на 2 части и содержащее 3 закладки — «request», «response» и «trap». Если Вы в древе структуры сайта выделите какой-либо файл то на вкладке «request» Вы увидите содержимое Вашего запроса к нему. На вкладке «response» отображается ответ сервера. Причём и в том и в том случаях в верхней части окна отображается содержимое заголовка http-пакета, а в нижнем — тело. Закладка же «trap» используется перехватчиком запросов и её мы обсудим ниже. В самой нижней части окна находится панель с 4 закладками - «History», «Spider», «Alerts», «Output». Закладка «History» содержит историю запросов браузера, «Spider» - результаты действия поискового паука, «Alerts» - сообщения сканнера уязвимостей, а «Output» - данные из фильтров. Всё это сейчас будет нами рассмотрено.

1. Crawler (поисковый паук)
Данный инструмент представляет собой подобие поискового паука. Он бродит по указанному сайту и перебирает все ссылки, параллельно ведя их запись. В хакинге такой инструмент может быть использован в том случае если нужно получить представление о всех доступных скриптах на сайте. Что сейчас делает большинство взломщиков когда им надо узнать имена всех php/pl/asp и т.д. скриптов на сайте для последующего их анализа? Правильно, идут в Google. Если спрашивать у Google что ни будь типа «site:[имя сайта] filetype:php» то он выдаст множество повторов так как будет показывать ссылки с различными параметрами. В итоге на то что бы понять сколько именно и каких скриптов есть на сайте уходит много времени. А данный инструмент Paros`а решает эту проблему пусть не так быстро как Google, но очень эффективно, потому что он на это и ориентирован.
Рассмотрим действие поискового паука на примере свежеустановленного движка «e107». Поставьте на какой-либо хост данную CMS (у меня этот хост назван «e107», далее по тексту я буду обозначать экспериментальный хост именно этим названием) и сразу после установки запустите Paros. В левом верхнем углу находится список сайтов который на данный момент пуст. Для того что-бы туда занести нужный Вам сайт требуется обратится к нему браузером используя Paros как прокси-сервер. Набрав в браузере «e107» и увидив главую страницу разверните Paros. В списке должен появится только-что набранный адрес:


В списке появилось 2 лишних адреса из-за того что на главной имеются вставки с этих адресов, в частности баннеры слева внизу. Что бы паук во время сканирования не перекинулся на эти хосты их следует удалить. Для этого выделите их, кликните правой кнопкой мыши и выберите пункт «Delete» или «Purge».
Выделите оставшийся хост, пройдите в меню «Analyse» и выберите пункт «Spider» (аналог — выделить хост, кликнуть правой кнопкой мыши и выбрать в появившемся меню пункт «Spider..»). Вы увидите окно всего с 2 кнопками из которых активна лишь одна - «Start». Это окно паука. Как видите — ничего сложного оно из себя не представляет. Жмём «Start» и сканирование начинается. После его окончания в папке нашего хоста появятся имена скриптов и директорий которые паук смог обнаружить:


Как мы уже говорили - поисковики при запросах типа вышеописанного выдают множество ссылок в которых скрипты одинаковы а параметры разные, что только мешает исследователю, а Paros сразу собирает их в список удаляя повторы.
В низу окна программы существует ещё 2 раздела - «URI found during crawl» (URI найденные во время сканирования) и «URI found but out of crawl scope» (URI найдены, но вынесены за пределы сканирования). В первом разделе хранится вообще все ссылки найденные на сайте. Во втором — ссылки которые просканированы небыли. Если Вы просмотрите этот список то увидите что это ссылки на почту или на внешние ресурсы. Обратите внимание ещё на один важный фактор — сканнеру попались папки индексирование которых запрещено в robots.txt. Если Вы обратитесь к этому файлу то увидите что директории «e107_admin» и «e107_files», которые Paros обнаружил и проиндексировал, запрещены к индексации:

User-agent: *
Disallow: /e107_admin/
Disallow: /e107_plugins/
Disallow: /e107_languages/
Disallow: /e107_images/
Disallow: /e107_themes/
Disallow: /e107_files/
Disallow: /e107_docs/
Disallow: /e107_handlers/
Disallow: /e107_install/

Дальше Вы можете по очереди перебирать папки указанные в robots.txt и сканировать их Paros`ом. Например crawler сам не нашёл папку «e107_plugins». Пройдём по адресу http://e107/e107_plugins/ что бы нужная нам папка появилась в списке директорий Paros`a и просканируем её вышеуказанным образом (правой кнопкой мыши или через меню «Analyse»). Обратите внимание вот на что. Для того что бы папка «e107_plugins» появилась среди структуры сайта нужно не просто в неё зайти браузером, а пройти в какую-либо директорию находящуюся в ней. После сканирования в результат работы добавится огромный список содержимого интересующей нас директории. Вот так можно работать с теми местами сайта до которых паук сам добраться не в состоянии.
Отдельно рассмотрим варианты записей файлов в структуре сайта которую выстраивает Paros. Примеры:
«GET:index.php» — в сканируемой папке есть файл index.php к которому на сайте обращаются с помощью метода GET. Если какой-то скритп принимает данные от формы методом POST то Paros, обнаружив его, так и напишет «POST:script.php»
«GET:script.php(C)» — на сайте имеется скрипт script.php которому в ссылках передаётся параметр «C». То есть этот вариант Paros запишет если обнаружит ссылку script.php?C=1
«GET:script.php(C,id,name)» — скрипту script.php в некоторых ссылках передаются параметры «С», «id» и «name», например script.php?C=1&name=about&id=3
Если эти параметры будут передаваться в трёх разных ссылках:
script.php?C=1
script.php?name=about
script.php?id=3
то он так и запишет:
«GET:script.php(C)»
«GET:script.php(name)»
«GET:script.php(id)»
Ссылки, по которым проходил Paros во время сканирования, Вы можете посмотреть в правом верхнем окне (закладка «Request»). При клике на любую ссылку там отображается полный запрос. Например кликнем на строку «GET:alt_news.php(C)», которая имеется в структуре папки «e107_plugins», и посмотрим тело запроса:

GET http://e107/e107_plugins/alt_news/?C=D;O=D HTTP/1.1
Host: e107
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;) Paros/3.2.13
Pragma: no-cache
Content-Type: application/x-www-form-urlencoded
Referer: http://e107/e107_plugins/alt_news/?C=D;O=A
Content-length: 0

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

2. Сканнер уязвимостей
Данный сканнер ориентирован на поиск простейших уязвимостей в теле сайта основываясь на результате работы поискового паука (структуры сайта в левой части окна программы). То есть чем больше информации пропустит через себя паук тем больше шансов что сканнер уязвимостей что ни будь найдёт. Поэтому мы немного попрактикуемся и с помощью вышеописанного способа просканируем пауком все директории указанные в файле «robots.txt» которые ещё не затронуты. Почему сканирование происходит именно на основе результатов работы crawler`a? Потому что некоторые места сканнер сам может не найти, а Вы пауку можете подсказать (как мы это сделали с директорией e107_plugins). Или же некоторые ссылки могут появляться только после прохождения авторизации(Paros ведь сохраняет тела запросов, следовательно после Вашего входа на сайт он будет уже имитировать вошедшего пользователя).
Теперь пора перейти непосредственно к сканированию на уязвимости. Список уязвимостей Вы можете увидеть пройдя в меню «Analyse» и выбрав пункт «Scan policy». Перед Вами откроется окно настроек сканирования. Здесь происходит управление всевозможными частями проверки на уязвимости.


Первый пункт - «Information gathering» (раскрытие информации, сбор информации). Сюда относятся тесты:
  1. «Obsolete file» и «Obsolete file extended check» — Поиск устаревших файлов. Я встречал всего 2 вида поиска таких файлов — с расширением «bak» и «old». В документации по Paros указаны только «*.bak файлы», хотя он нашёл оба варианта резервных копий. Алгоритм их поиска прост — например как только найден скрипт index.php сканнер сразу проверяет наличие index.php.bak. Если такой файл есть то сканнер пишет что найдена старая резервная копия index.php.
  2. Раскрытие IP-адреса. Этот тест занимается определением настоящего IP-адреса веб-сервера в том случае если все запросы к нему идут через брэндмауэр.
  3. Session ID in URI rewrite — подстановка идентификатора сессии при обращении к различным скриптам. Видимо это что-то похожее на подделку сессии. К сожалению эта функция в документации тоже не описана.
Второй пункт - «Client browser». К сожалению с этими тестами я не смог разобраться. Плохо то что ещё и официальные разработчики на мои запросы по этому поводу не отвечают.
Следующий пункт - «Server security». Здесь находятся тесты которые связаны с веб-сервером. Список их таков:
  1. Directory browsing — поиск директорий листинг которых можно посмотреть
  2. IIS default file — поиск стандартных файлов IIS
  3. Cold Fusion default file — поиск стандартных файлов Cold Fusion
  4. Macromedia JRun default file — поиск стандартных файлов Macromedia JRun
  5. Tomcat sources default file — поиск стандартных файлов Tomcat
  6. BEA WebLogic default file — поиск стандартных файлов BEA WebLogic
  7. IBM WebSphere default file — поиск стандартных файлов IBM WebSphere
  8. Lotus Domino default file — поиск стандартных файлов Lotus Domino
Как видите — большинство тестов этого раздела ориентировано на определение типа веб-сервера. Здесь есть 2 плохих момента — отсутствие Apache (видимо при разработке Paros он ещё не был столь популярен, хотя наврятли) и наличие проверок малоизвестных или уже не развивающихся веб-серверов. Но это лишь след того что разработка сканнера была давным давно закончена.
Следующим идёт пункт «Miscellenous» - смешанные уязвимости. Эта закладка пуста, видимо авторы не успели написать плагинов к подобным уязвимостям.
И последний пункт - «Injection». Это инъекционные уязвимости. Думаю они в объяснении не нуждаются потому что названия пунктов итак до боли всем знакомы.
После выбора нужных Вам тестов на уязвимости выделяйте интересующий Вас сайт и жмите
«analyse»->«scan» (или «Scan all» если Вам нужно просканировать все сайты имеющиеся в древе). Данные сканирования будут размещены в нижней панели, в закладке «Alerts».

3. Фильтр данных
Данная функция занимается различными операциями с информацией которая уходит от браузера или приходит к нему. Что бы долго не мучиться с объяснениями перейдём к практическим примерам из которых Вам сразу всё станет понятно. Для открытия настроек фильтра зайдите в меню «Tools»->«Filter...». В основной части появившегося окна располагается список фильтров и их состояний (включён/выключен).
Начнём с самого первого фильтра.
1. Avoid browser cache (strip off IfModiliedSince). Данный фильтр модифицирует заголовок таким образом что браузер перестаёт использовать кэширование.
2. Log unique GET queries into file (filter/get.xsl). При включении этого фильтра Paros начинает логировать все GET-запросы в файл filter/get.xsl, который находится в его установочной директории.
3. Log unique POST queries into file (filter/post.xsl). При включении этого фильтра Paros начинает логировать все POST-запросы в файл filter/post.xsl, который находится в его установочной директории.
4. Log request and response into file (filter/messages.txt). Данный фильтр логирует все запросы и ответы сервера в файл filter/messages.txt, который находится в установочной директории Paros`a. Запись осуществляется в следующем формате:

========== номер запроса =========
Содержимое заголовка запроса
Содержимое тела запроса (если есть)

содержимое заголовка ответа
содержимое тела ответа

5. Replace HTTP request header using defined pattern — замена текста в заголовке запроса по указанному регулярному выражению. Для активации данного фильтра сначала нажмите на кнопку с многоточием и Вы увидите окно ввода реулярного выражения состоящее из двух полей — что искать и на что заменить.


Не будем сильно мучиться и введём замену news.xml на news.txt. Это самый обычный пример работы такого фильтра. Сейчас обратитесь браузером к news.xml (полная ссылка http://e107/e107_files/backend/news.xml) и Paros, перехватив ответ, заменит в адресе запроса news.xml на news.txt. Убрав фильтр и снова обратившись по этому адресу Вы увидите другой результат.
6. Replace HTTP request body using defined pattern — поиск и замена текста по регулярному выражению в теле запроса.
7. Replace HTTP response header using defined pattern — поиск и замена текста по регулярному выражению в заголовке ответа.
8. Replace HTTP response body using defined pattern — поиск и замена текста по регулярному выражению в теле ответа.
9. Detect insecure or potentially maliciouse content in HTTP-response. Обнаружает небезопасный или потенциально опасный материал в содержимом HTTP-ответов.
10. Log cookie sent by browser. По сути смысл этого фильтра в записи cookies передаваемых браузером на сервер. Запись отловленных данных производится не в файл, а в нижнюю панель «Output».
11. Detect and alert 'Set-Cookie' attemp in HTTP-response for modification. Данный фильтр сообщает Вам какие cookies и как хочет изменить сервер. Вот пример того что мне было выдано Paros`ом при выходе с сайта e170:


12. Change user agent to other browsers. При включении этого фильтра поле «User agent» в запросах будет заменятся на то что Вы можете выбрать из списка фильтра.


4. Перехватчик запросов/ответов в режиме «on-the-fly»(на лету)
Эта функция пожалуй самая интересная для исследователей веб-приложений, особенно когда в приложении используется AJAX или имеется много форм передающих данные методом POST. Суть этого инструмента в следующем. При передаче пакета от клиента к серверу, или наоборот, Paros останавливает его и даёт Вам возможность посмотреть что в нём лежит, а так же отредактировать его содержимое. И только после Вашего разрешения пакет пойдёт дальше.
Рассмотрим всё на практике. Перейдите на закладку «Trap» правой части окна. Это окно перехватчика. В нижней его части имеется два поля для галочек — «Trap request» (Перехват запроса) и «Trap response» (Перехват ответа). Поставим галочку в первом поле и обратимся к нашему сайту. После введения URI в браузере окно Paros`a замигает. Открыв его Вы увидите содержимое запроса который был отослан на сервер.


Теперь Вы можете подредактировать содержимое заголовка запроса, и нажав «Continue» отправить его дальше. Нажатие же кнопки «Drop» уничтожит пакет и он так и не дойдёт до адресата. С перехватом ответов всё точно так же только галочка стоит в поле «Trap response». Одновременно Вы можете настроить Paros на перехват и запросов и ответов.

5. Дополнительный функционал
Сюда относится вспомогательный функционал который может быть иногда полезен.
1) Поиск в информации текущего сеанса по регулярному выражению. Эта функция используется для поиска во всех данных которые содержатся в запросах и ответах сервера, прошедших через Paros. Для открытия панели поиска пройдите в меню «Edit», пункт «Extarct pattern in session».


В верхнем списке выбираются различные готовые регулярные выражения, это: поиск всех cookies-заголовков, всех server-заголовков, вооще всех запросов к серверу, всех запросов к php-файлам, всех POST-запросов к серверу.
В поле «Search Pattern» находится текущее регулярное выражение. Вы можете его редактировать вне зависимости от того что выбрано в верхней строке. На скриншоте видно что у меня стоит выражение «http.*», которое ищет все запросы начинающиеся с «http». Правее этого поля находится два пункта поиска — в запросах (request) и в ответах сервера (response).
Самое нижнее поле - «Search Result» содержит результаты поиска по введённому регулярному выражению.
Рассмотрим меню «View». Первый пункт в нём «Enable Image in history». Данный пункт включает отображение запросов к изображениям в истории запросов (закладка History в нижней части окна). Как Вы все знаете после получения кода страницы начинается загрузка дополнительного контента — стилей, скриптов, картинок и т.д. Сейчас на сайтах очень много изображений, поэтому при включенной этой опции история сильно захламляется запросами к ним. Но иногда это может быть полезно. Следующие 2 пункта - «Filter history by Request...» и «Filter history by Response...». Эти пункты отвечают за фильтрацию истории по регулярным выражениям, применяемым к запросу и ответу соответственно. После выбора одного из этих пунктов Вы увидите следующее окно:


Здесь Вам предлагается ввести либо жётское выражение, совпадение с которым будет искаться в запросах или ответах, либо регулярное выражение.
Следующее что мы рассмотрим — пункт «Encoder/Hash» в меню «Tools». Это простейший инструмент для быстрого кодирования информации. 

 
 
В верхнее текстовое поле Вы вводите нужное выражение и справа выбираете операцию. После преобразования результат отобразится в нижнем текстовом поле.
Далее рассмотрим пункт «Manual Request Editor». Это примитивный редактор создания запросов.


Окно делится на 2 закладки — Request и Response. Так же окно разделено на 2 части — заголовок пакета и его тело. Здесь Вы можете спокойно формировать нужные Вам запросы, которые по нажатии кнопки «Send» отправятся к серверу. После получения ответа автоматически включится закладка «Response» в которой будет его содержимое.
Ну и под конец хотелось бы рассмотреть настройки (то же меню, пункт «Options») которые могут Вам пригодится при использовании Paros. Первый пункт настроек «Connection». Здесь Вы можете указать прокси-сервер к которому запрос пойдёт после Paros`a. Так же можно указать и авторизационные данные для прокси-сервера. Пункт «Local proxy» хранит настройки самого Paros`a — имя его хоста и порт. Пункт «Authentication» содержит таблицу в которую вносятся данные для http-авторизации (если исследуемый хост ею защищён). Пункт «Certificate» отвечает за использование клиентского сертификата. Если исследуемое Вами приложение его требует то можете включить его использование и указать путь к нему. Пункт «View» имеет всего одну галочку - «Process Images in http requests /responses» - обрабатывать изображения в запросах/ответах. Пункт «Trap» содержит опции перехвата. Данная закладка разделена на 2 части — перехват только тех сообщений которые соответствуют регулярному выражению и перехват тех сообщений которые не соответсвуют введённому выражению. Для каждой части есть своё текстовое поле для ввода регулярных выражений. Сами же выражения(если у Вас их несколько) разделяются точкой с запятой (';'). Следующая закладка — настройки поискового паука. В самом верху находится регулятор «Maximum depth to crawl», он отвечает за глубину поиска. Например если его установить в значение «3» то по ссылкам типа http://e107/one/two/three/four/ он уже проходить не будет потому что в данной ссылке 4 директории. Следующий регулятор — количество потоков сканирования. Далее идёт текстовое поле «URIs to be skipped». Сюда заносятся те URI которые не должны быть просканированы. Можно например запретить сканирование директории где установлен форум так как в большинстве случаев это лишь отнимет множество времени. К сожалению зачем нужно поле «Domain suffix included in spider» я не знаю. Галочку в последнем пункте («POST forms») можно ставить когда Вы не против того что бы паук отправлял формы на сайте. И в самой последней закладке - «Scanner» - содержится лишь 2 регулятора — максимальное количество одновременно сканируемых хостов и количество потоков сканирования на 1 хост.


Недоработки Paros:
К сожалению разработчики окончив разработку проекта не исправили в нём некоторые важные недоработки в области функционала. Ограничусь лишь их перечислением что бы в случае чего Вы не пострадали от них.
1. Поисковый паук не всегда правильно определяет директорию для сканирования. В частности замечено что если в ссылке указан относительный путь (например href='pages/1/') то паук запрашивает такую ссылку относительно корня хоста, в какой бы директории она не находилась. Естественно это ведёт к ответу 404 и дальнейшему пропуску ссылки.
2. Сканер уязвимостей зависает на документах не текстового содержания (например картинки или pdf-документы).
3. Не работают сохранения сессий. При сохранении, после указания имени файла, файл создаётся, но данные в него не записываются.
4. Не работает некоторый не очень важный функционал. Например многопоточность.
5. При долгой работе с перехватчиком сессия зависает и может произойти такая ситуация когда запрос от браузера ушёл, а в Paros`е его нет. В этом случае лучше просто перезапустить Paros.
6. Слабая документация. Большинство того что я здесь описал либо вообще не описано в официальной документации, либо описано но не подробно.

Все эти недоработки были обнаружены под ОС WinXP SP2. Возможно некоторые их них не проявляются в других ОС.

Заключение.
Paros — очень хороший инструмент ориентированный на анализ веб-приложений. Даже со всеми недоработками и ограничениями он может принести не мало пользы. Если бы не свёртывание его разработки то он со 100%-ной вероятностью стал обязательным софтом в наборе начинающих pen-тестеров.

1 комментарий: