
Сканер безопасности веб-приложений, созданный lcamtuf для Google - Неофициальное зеркало
http://code.google.com/p/skipfish/
Написан и сопровождается:
Michal Zalewski [email protected] Niels Heinen [email protected] Sebastian Roschke [email protected]
Авторские права 2009–2012 Google Inc, все права защищены.
Выпущен на условиях Apache License, версии 2.0.
Skipfish — это активный инструмент разведки безопасности веб-приложений. Он строит интерактивную карту сайта (sitemap) для целевого ресурса, выполняя рекурсивный обход и словарные проверки. Затем полученная карта аннотируется результатами ряда активных (но, хочется надеяться, неразрушающих) проверок безопасности. Итоговый отчёт, формируемый инструментом, предназначен служить основой для профессиональной оценки безопасности веб-приложений.
Существует множество коммерческих и open source инструментов с аналогичной функциональностью (например, Nikto, Nessus); выбирайте тот, который лучше всего подходит вам. Тем не менее skipfish пытается решить некоторые распространённые проблемы веб-сканеров безопасности. К конкретным преимуществам относятся:
Высокая производительность: наблюдалось 500+ запросов в секунду к отзывчивым интернет-целям, 2000+ запросов в секунду в сетях LAN/MAN и 7000+ запросов к локальным экземплярам, при очень скромном потреблении CPU, сети и памяти. Это объясняется:
Мультиплексирующая однопоточная, полностью асинхронная модель сетевого ввода-вывода и обработки данных, которая устраняет неэффективность управления памятью, планирования и межпроцессного взаимодействия, присущую некоторым многопоточным клиентам.
Продвинутые возможности HTTP/1.1, такие как range-запросы, сжатие контента и keep-alive соединения, а также принудительное ограничение размера ответов для контроля сетевых накладных расходов.
Для минимизации лишнего трафика используются интеллектуальное кэширование ответов и продвинутые эвристики поведения сервера.
Ориентированная на производительность реализация на чистом C, включая собственный HTTP-стек.
Простота использования: skipfish отличается высокой адаптивностью и надёжностью. Сканер включает:
Эвристическое распознавание неочевидных схем обработки параметров в пути и в строке запроса.
Корректная обработка сайтов на нескольких фреймворках, где одни пути подчиняются совершенно иной семантике или разным правилам фильтрации.
Автоматическое построение словарей на основе анализа содержимого сайта.
Вероятностные режимы сканирования, позволяющие проводить периодические ограниченные по времени оценки сколь угодно сложных сайтов.
Продуманные проверки безопасности: инструмент предназначен для получения точных и значимых результатов:
Тщательно подобранные словари обеспечивают отличное покрытие и позволяют проводить полное тестирование $keyword.$extension за разумное время.
Для обнаружения уязвимостей предпочтение отдаётся трёхэтапным дифференциальным проверкам, а не сигнатурным.
Для выявления тонких проблем безопасности используется логика в стиле ratproxy: межсайтовая подделка запросов (CSRF), включение межсайтовых скриптов, смешанный контент, несоответствия MIME и кодировки, неверные директивы кэширования и т.д.
Встроенные проверки безопасности рассчитаны на сложные сценарии: сохранённый XSS (путь, параметры, заголовки), слепое SQL- или XML-инъекции, слепую инъекцию shell-команд.
Сигнатуры контента в стиле Snort, которые подсвечивают серверные ошибки, утечки информации или потенциально опасные веб-приложения.
Постобработка отчёта значительно снижает шум от остаточных ложных срабатываний или серверных ухищрений за счёт выявления повторяющихся закономерностей.
При этом skipfish не является серебряной пулей и может не подходить для некоторых целей. Например, он не удовлетворяет большинству требований, изложенных в критериях оценки сканеров безопасности веб-приложений WASC (часть из них — намеренно, часть — в силу необходимости). И в отличие от большинства других проектов такого рода, он не поставляется с обширной базой известных уязвимостей для проверок по баннерам.
Ниже приведён общий список проверок безопасности, предлагаемых инструментом.
Уязвимости высокого риска (потенциально ведущие к компрометации системы):
Уязвимости среднего риска (потенциально ведущие к компрометации данных):
Проблемы низкого риска (ограниченное воздействие или низкая специфичность):
Внутренние предупреждения:
Наряду со списком выявленных проблем, skipfish также предоставляет сводные обзоры найденных типов документов и типов проблем, а также интерактивную карту сайта, где узлы, обнаруженные с помощью перебора, обозначены особым образом.
ПРИМЕЧАНИЕ: Осознанным проектным решением skipfish не будет излишне сообщать о крайне неспецифичных проблемах, включая, но не ограничиваясь:
Большинство этих аспектов при желании легко проверить в отчёте — например, все HTML-формы перечисляются отдельно, так же как новые cookie или интересные HTTP-заголовки — и ожидается, что аудитор при необходимости сможет дать определённые рекомендации по дизайну на основе этих данных. Тем не менее эти случаи не выделяются как конкретная уязвимость безопасности.
Прежде всего, пожалуйста, не будьте злонамеренны. Используйте skipfish только против сервисов, которыми вы владеете или на тестирование которых у вас есть разрешение.
Имейте в виду, что любые виды тестирования безопасности могут быть разрушительными. Хотя сканер не предназначен для проведения вредоносных атак, он может случайно нарушить работу сайта. Вы должны принять этот риск и действовать соответственно. По возможности запускайте сканер на тестовых экземплярах и будьте готовы разбираться с последствиями, если что-то пойдёт не так.
Также обратите внимание, что инструмент предназначен для профессиональных специалистов по безопасности и носит экспериментальный характер. Он может давать ложные срабатывания или пропускать очевидные проблемы безопасности — и даже при идеальной работе он не является приложением типа «укажи и щёлкни». Не воспринимайте его выводы как истину в последней инстанции.
Запуск инструмента на демонстрационных сайтах, предоставленных вендорами, — не лучший способ оценки, поскольку они обычно очень неточно моделируют уязвимости; мы не прикладывали усилий для поддержки таких случаев.
Наконец, сканер просто не рассчитан на работу с недобросовестными и некорректно ведущими себя HTTP-серверами — и не даёт никаких гарантий безопасного (или вменяемого) поведения в таких условиях.
Чтобы собрать его, просто распакуйте архив и попробуйте make. Скорее всего, сначала вам потребуется установить libidn.
Далее необходимо прочитать инструкции в doc/dictionaries.txt, чтобы выбрать подходящий файл словаря и правильно его настроить. Этот шаг оказывает огромное влияние на качество результатов сканирования, поэтому не пропускайте его.
После выбора словаря вы можете использовать -S для его загрузки и -W для указания изначально пустого файла для новых выученных специфичных для сайта ключевых слов (которые пригодятся при будущих оценках):
$ touch new_dict.wl
$ ./skipfish -o output_dir -S existing_dictionary.wl -W new_dict.wl \
http://www.example.com/some/starting/path.txt
Вы можете использовать -W-, если не хотите нигде сохранять автоматически выученные ключевые слова.
Обратите внимание, что при желании можно указать несколько стартовых URL; все они будут обойдены. Также можно читать URL из файла, используя следующий синтаксис:
$ ./skipfish [...other options...] @../path/to/url_list.txt
Во время сканирования инструмент будет показывать полезную статистику. Также можно переключиться на список выполняемых HTTP-запросов, нажав Enter.
В приведённом выше примере skipfish просканирует весь www.example.com (включая сервисы на других портах, если на них есть ссылки с главной страницы) и запишет отчёт в output_dir/index.html. Затем вы можете просмотреть этот отчёт в любимом браузере (должен быть включён JavaScript; а из-за недавних улучшений безопасности file:/// в некоторых браузерах результаты, возможно, придётся открывать через HTTP). Файл index.html статичен; сами результаты хранятся в виде иерархии JSON-файлов, пригодных для машинной обработки или альтернативных интерфейсов отображения, если потребуется. Кроме того, список всех обнаруженных URL будет сохранён в отдельный файл pivots.txt для удобной постобработки.
Простой вспомогательный скрипт sfscandiff можно использовать для вычисления дельты между двумя сканированиями одного и того же объекта с одинаковыми флагами. Более новый отчёт будет без разрушения аннотирован: красным фоном помечаются все новые или изменённые узлы, а синим — все новые или изменённые проблемы.
Некоторые сайты могут требовать аутентификации; наша поддержка этого описана в doc/authentication.txt. В большинстве случаев вам стоит использовать метод аутентификации через форму, который способен обнаруживать повреждённые сессии и повторно выполнять аутентификацию.
После аутентификации некоторые URL сайта могут завершать вашу сессию. С этим можно бороться двумя способами: с помощью опции -N, которая заставляет сканер отклонять попытки установить или удалить cookie; или с помощью параметра -X, который предотвращает загрузку соответствующих URL:
$ ./skipfish -X /logout/logout.aspx ...other parameters...
Опция -X также полезна для ускорения сканирования: она исключает /icons/, /doc/, /manuals/ и другие стандартные, заурядные разделы. В целом с помощью -X и -I (обход только URL, содержащих заданную подстроку) можно ограничить область сканирования как угодно — в том числе только конкретным протоколом и портом:
$ ./skipfish -I http://example.com:1234/ ...other parameters...
Близкая по смыслу функция -K позволяет указать имена параметров, которые не нужно фаззить (полезна для приложений, помещающих идентификаторы сессий в URL, чтобы уменьшить шум).
Ещё одна полезная опция ограничения области — -D: она позволяет указать дополнительные хосты или домены, которые следует считать входящими в область тестирования. По умолчанию в список добавляются все хосты из URL командной строки, но с помощью -D можно расширить эти правила, например:
$ ./skipfish -D test2.example.com -o output-dir http://test1.example.com/
...или для сопоставления по домену с подстановочным знаком используйте:
$ ./skipfish -D .example.com -o output-dir http://test1.example.com/
В некоторых случаях вы не хотите фактически обходить сторонний домен, но достаточно доверяете его владельцу, чтобы не беспокоиться о включении кросс-доменного контента с этого адреса. Чтобы подавить предупреждения, можно использовать опцию -B, например:
$ ./skipfish -B .google-analytics.com -B .googleapis.com ...other
parameters...
По умолчанию skipfish отправляет минималистичные HTTP-заголовки, чтобы уменьшить объём передаваемых данных; однако некоторые сайты проверяют строки User-Agent или порядок заголовков и отклоняют неподдерживаемых клиентов. В таком случае можно использовать -b ie, -b ffox или -b phone, чтобы имитировать один из двух популярных браузеров (или iPhone).
Что касается настройки HTTP-запросов, вы также можете использовать опцию -H для добавления любых дополнительных нестандартных заголовков; или -F для определения собственного соответствия между хостом и IP (в обход резолвера). Последняя возможность особенно полезна для ещё не запущенных или устаревших сервисов.
Некоторые сайты могут быть слишком велики для сканирования за разумное время. Если на сайте есть чётко выраженные «тарпиты» — например, 100 000 почти одинаковых профилей пользователей в соцсети — эти конкретные разделы можно исключить с помощью -X или -S. В других случаях, возможно, придётся прибегнуть к иным настройкам: -d ограничивает глубину обхода заданным числом подкаталогов; -c ограничивает число потомков каждого каталога; -x ограничивает общее число потомков на ветвь дерева обхода; а -r ограничивает общее количество запросов за сканирование.
Для повторных оценок доступна интересная опция -p. Указав процент от 1 до 100%, можно поручить краулеру переходить не по всем ссылкам и перебирать не все словарные записи. Это, естественно, ограничивает полноту сканирования, но, в отличие от большинства других настроек, делает это сбалансированным, недетерминированным образом. Это чрезвычайно полезно при организации периодических оценок инфраструктуры с ограничением по времени. Другая связанная опция — -q, которая задаёт начальное случайное зерно краулера. Это позволяет точно воспроизвести предыдущее сканирование для сравнения результатов. Случайность наиболее активно используется в режиме -p, но также применяется в некоторых других решениях по управлению сканированием.
Некоторые особенно сложные (или неработающие) сервисы могут содержать очень большое количество одинаковых или почти одинаковых страниц. Хотя такие случаи по умолчанию выделяются серым в отчёте, они всё равно занимают место на экране и требуют времени на обработку на уровне JavaScript. В таких крайних случаях можно использовать опцию -Q, чтобы полностью подавить отображение дублирующихся узлов ещё до записи отчёта. Это может дать менее полное представление о структуре сайта, но не влияет на полноту тестирования.
При некоторых быстрых оценках вас может не интересовать заявленная функциональность сайта — вы надеетесь найти только скрытые (не связанные ссылками) секреты. В таком случае можно указать -P, чтобы отключить разбор HTML. Это ограничивает покрытие и лишает сканер возможности изучать новые ключевые слова по HTML, но значительно ускоряет тест. Другая аналогично ограничивающая опция, снижающая риск устойчивых последствий сканирования, — -O, которая отключает разбор и отправку всех форм.
Некоторые сайты, работающие с чувствительными пользовательскими данными, заботятся об SSL — и о том, чтобы всё было правильно настроено. Skipfish может по желанию помочь разобраться с проблемным смешанным контентом или сценариями отправки паролей — для этого используйте опцию -M. Сканер будет сообщать о таких ситуациях, как загрузка скриптов по http:// на страницах https://, но игнорировать сценарии без риска, например изображения.
Точно так же некоторые дотошные сайты могут обращать внимание на случаи, когда кэширование ограничено на уровне HTTP/1.1, но не задаётся явная директива кэширования HTTP/1.0; указание -E в командной строке заставляет skipfish тщательно регистрировать все такие случаи.
В некоторых случаях вы хотите ограничить число запросов в секунду, чтобы снизить нагрузку на целевой сервер (или, возможно, обойти защиту от DoS). Флаг -l позволяет задать этот лимит; указанное значение — это максимальное количество запросов в секунду, которое должен выполнять skipfish.
Сканирование обычно не должно занимать недели. Во многих случаях вы, вероятно, захотите ограничить продолжительность сканирования, чтобы оно укладывалось в определённое время. Это можно сделать с помощью флага -k, который позволяет указать количество часов, минут и секунд в формате Ч:М:С. Использование этого флага может повлиять на полноту сканирования, если тайм-аут наступит до проверки всех страниц.
Наконец, при оценках автономных сайтов без обширного пользовательского контента аудитору могут быть интересны замеченные внешние e-mail или HTTP-ссылки, даже если они не имеют непосредственного влияния на безопасность. Используйте опцию -U, чтобы они записывались в журнал.
Управление словарями — особая тема и, как уже упоминалось, более подробно рассматривается в doc/dictionaries.txt. Пожалуйста, прочтите этот файл, прежде чем продолжить. К числу соответствующих опций относятся -S и -W (рассмотрены выше), -L для отключения автоматического обучения, -G для ограничения размера набора угадываемых ключевых слов, -R для удаления старых записей словаря и -Y для отключения дорогостоящего фаззинга $keyword.$extension.
Skipfish также имеет механизм автозаполнения форм для максимального покрытия сканирования. Значения должны быть безвредными, поскольку они предназначены не для проверок безопасности, а для прохождения логики валидации ввода. Вы можете задать дополнительные правила или переопределить существующие с помощью опции -T (-T form_field_name=field_value, например, -T login=test123 -T password=test321 — хотя обратите внимание, что -C и -A — гораздо лучший способ входа в систему).Есть также несколько параметров, связанных с производительностью. Используйте -g, чтобы задать
максимальное количество соединений, поддерживаемых глобально для всех целей (разумно
держать это значение ниже 50 или около того, чтобы не перегружать стек TCP/IP
вашей системы или ближайших устройств NAT / межсетевых экранов); и -m, чтобы задать
лимит на один IP-адрес (немного поэкспериментируйте: 2–4 обычно хорошо для localhost, 4–8 для
локальных сетей, 10–20 для внешних целей, 30+ для действительно медленных или
хостов без поддержки keep-alive). Также можно использовать -w, чтобы задать тайм-аут ввода/вывода (т.е.
skipfish будет ждать лишь определённое время для отдельного чтения или записи), и -t, чтобы
задать общий тайм-аут запроса, с учётом действительно медленных или действительно быстрых
сайтов.
Наконец, -f управляет максимальным количеством подряд идущих HTTP-ошибок, которые вы
готовы увидеть перед прерыванием сканирования; а -s задаёт максимальную длину
ответа для загрузки и анализа (более длинные ответы будут усекаться).
При сканировании крупных сайтов, насыщенных мультимедиа, вы также можете указать -e.
Это предотвращает хранение бинарных документов в памяти для целей формирования отчётов
и освобождает много оперативной памяти.
Дальнейшее ограничение скорости доступно через сторонние инструменты пользовательского режима, такие как trickle, или формирование трафика на уровне ядра.
Ах да, статистику сканирования в реальном времени можно отключить с помощью -u.
Стандартное аутентифицированное сканирование хорошо спроектированного и автономного сайта (предупреждает обо всех внешних ссылках, адресах электронной почты, смешанном контенте и проблемах с заголовками кэширования), включая щадящий перебор:
$ touch new_dict.wl
$ ./skipfish -MEU -S dictionaries/minimal.wl -W new_dict.wl
-C "AuthCookie=value" -X /logout.aspx -o output_dir
http://www.example.com/
Обход с пятью соединениями, но без перебора; имитация MSIE и доверие содержимому example.com:
$ ./skipfish -m 5 -L -W- -o output_dir -b ie -B example.com
http://www.example.com/
Только интенсивный перебор (без извлечения HTML-ссылок), ограниченный одним каталогом и тайм-аутом в 5 секунд:
$ touch new_dict.wl
$ ./skipfish -S dictionaries/complete.wl -W new_dict.wl
-P -I http://www.example.com/dir1/ -o output_dir -t 5 -I
http://www.example.com/dir1/
Краткий список всех параметров командной строки можно получить с помощью ./skipfish -h.
Большинство проблем, о которых сообщает skipfish, должны быть понятны сами собой, при условии, что вы хорошо понимаете основы веб-безопасности. Если вам нужно быстро освежить знания по некоторым более сложным темам, таким как MIME-сниффинг, вам может пригодиться наш подробный Справочник по безопасности браузеров в качестве отправной точки:
http://code.google.com/p/browsersec/
Если вам всё ещё нужна помощь, существует несколько организаций, которые прилагают значительные усилия для документирования и объяснения многих распространённых угроз веб-безопасности, а также для информирования общественности о способах их устранения. Я рекомендую вам обращаться к материалам, публикуемым OWASP и Web Application Security Consortium, среди прочих:
Хотя я с радостью диагностирую проблемы самого сканера, я, к сожалению, не могу оказать никакой помощи во внутреннем устройстве сторонних веб-приложений.
Ниже приведён список функций, которых в настоящее время не хватает в skipfish. Если вы хотите улучшить инструмент, внеся код в одной из этих областей, пожалуйста, дайте мне знать:
Проверки на переполнение буфера: после тщательного обдумывания я подозреваю, что не существует надёжного способа удалённо тестировать переполнение буфера. Как и сам сбой, который мы ищем, корректные проверки размера буфера также могут приводить к необработанным исключениям, сообщениям 500 и т.п. Хотя я был бы рад ошибаться.
Полноценное обнаружение XSS в JavaScript: в коде есть несколько элементарных проверок, но в него не встроен полноценный скриптовый движок для вычисления выражений и доступа к DOM.
Ошибки потребления символов / внедрения в кодировках переменной длины: эти проблемы, похоже, в значительной степени решены на уровне браузеров, поэтому на момент написания этого текста они имели гораздо более низкий приоритет.
Проверки безопасности и извлечение ссылок для стороннего контента на основе плагинов (Flash, Java, PDF и т.д.).
Перебор паролей и числовых имён файлов.
Интеграция с поисковыми системами (виртуальные хосты, стартовые пути).
Декодирование VIEWSTATE.
Аутентификация NTLM и digest.
Более специфичные PHP-тесты (eval-инъекции, RFI).
Поддержка прокси: экспериментальная поддержка HTTP-прокси доступна через директиву #define в config.h. Добавление поддержки HTTPS-проксирования сложнее и всё ещё находится в разработке.
Опция возобновления сканирования, улучшенная информация о времени выполнения.
Поддержка автономной установки (make install).
Веб-интерфейс для планирования и управления.
Нет такого хорошего веб-краулера, для которого не нашлось бы веб-фреймворка, способного однажды его поджечь. Если вы столкнулись с чем-то похожим на некорректное поведение (например, со сканированием, которое длится вечно и генерирует слишком много запросов, совершенно ложными узлами в результатах сканирования или полными сбоями), пожалуйста, сначала проверьте нашу страницу известных проблем:
http://code.google.com/p/skipfish/wiki/KnownIssues
Если вы не найдёте там удовлетворительного ответа, перекомпилируйте сканер с помощью:
$ make clean debug
...и запустите его повторно следующим образом:
$ ./skipfish [...previous options...] 2>logfile.txt
Затем вы можете просмотреть logfile.txt, чтобы понять, что пошло не так; если похоже, что проблема в сканере, пожалуйста, удалите из файла журнала любую конфиденциальную информацию и отправьте его автору.
Если сканер аварийно завершился, перекомпилируйте его, как указано выше, а затем выполните:
$ ulimit -c unlimited $ ./skipfish [...previous options...] 2>logfile.txt $ gdb --batch -ex back ./skipfish core
...и обязательно отправьте автору также вывод последней команды.
Skipfish стал возможен благодаря вкладу и ценным отзывам команды инженеров по информационной безопасности Google.
Если у вас есть сообщения об ошибках, вопросы, предложения или замечания по поводу приложения, с основным автором можно связаться по адресу [email protected].
Неспецифические информационные записи: