Введение
Nikto — популярный сканер веб-серверов с открытым исходным кодом, который выполняет комплексные тесты веб-серверов по множеству параметров, включая более 6700 потенциально опасных файлов/программ, проверку устаревших версий более чем 1250 серверов и проблем, специфичных для версий, на более чем 270 серверах.
Иногда веб-приложение требует наличия определенного HTTP-заголовка в запросах. Это может быть для аутентификации (например, API-ключ или токен сессии), для маршрутизации к определенной версии приложения или для включения режима отладки. Стандартные сканирования Nikto в таких сценариях завершатся неудачей или будут неполными, поскольку им будет не хватать требуемого заголовка.
В этой лабораторной работе вы научитесь использовать опцию -addheaders в Nikto для включения пользовательских заголовков в ваши сканирования. Это позволит вам тестировать приложения с особыми требованиями к заголовкам, обеспечивая более тщательную и точную оценку безопасности.
Определение требуемого приложением пользовательского HTTP-заголовка
На этом шаге вы будете взаимодействовать с простым веб-приложением, чтобы понять, почему может потребоваться пользовательский заголовок. У нас есть веб-сервер, работающий на порту 8000, который требует наличия определенного заголовка, X-LabEx-Auth, для доступа.
Сначала попробуем получить доступ к веб-приложению без пользовательского заголовка, используя команду curl.
curl http://127.0.0.1:8000
Вы получите сообщение "Access Denied" (Доступ запрещен), поскольку требуемый заголовок отсутствует.
Access Denied
Теперь отправим запрос снова, но на этот раз включим требуемый пользовательский заголовок, используя опцию -H в curl. Заголовок — X-LabEx-Auth со значением SecretToken.
curl -H "X-LabEx-Auth: SecretToken" http://127.0.0.1:8000
На этот раз сервер предоставит доступ и вернет приветственное сообщение. Это подтверждает, что приложение проверяет наличие этого конкретного заголовка.
Welcome, authorized user! The server is Apache/2.4.1 (Unix).
Этот процесс демонстрирует, как определить и подтвердить необходимость пользовательского заголовка перед запуском сканирования безопасности.
Использование опции -addheaders для указания заголовка и значения
На этом шаге вы узнаете об опции Nikto, используемой для добавления пользовательских заголовков в сканирования.
Теперь, когда мы знаем, что требуется пользовательский заголовок, нам нужно сообщить Nikto, чтобы он включал его во все свои HTTP-запросы. Для этой цели Nikto предоставляет опцию -addheaders.
Синтаксис прост:
-addheaders "ИмяЗаголовка:ЗначениеЗаголовка"
Вы заменяете ИмяЗаголовка на имя заголовка (например, X-LabEx-Auth), а ЗначениеЗаголовка — на соответствующее ему значение (например, SecretToken).
Если вам нужно добавить несколько пользовательских заголовков, вы можете разделить их символом новой строки (\n). Например:
-addheaders "Заголовок1:Значение1\nЗаголовок2:Значение2"
Для нашего текущего сценария полная структура команды Nikto для сканирования целевого приложения будет выглядеть следующим образом. Обратите внимание, что мы не запускаем команду на этом шаге; мы просто конструируем ее, чтобы понять синтаксис.
nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"
Эта команда предписывает Nikto нацелиться на хост по адресу http://127.0.0.1:8000 и добавить заголовок X-LabEx-Auth: SecretToken к каждому запросу, который он отправляет во время сканирования.
Запуск сканирования с включенным пользовательским заголовком
На этом шаге вы выполните сканирование Nikto, используя опцию -addheaders, о которой вы только что узнали.
С построенной правильной командой пришло время запустить сканирование. Это позволит Nikto взаимодействовать с приложением как авторизованный пользователь, потенциально обнаруживая уязвимости, которые не видны неаутентифицированным пользователям.
Выполните следующую команду в вашем терминале:
nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"
Nikto начнет сканирование. Поскольку каждый запрос включает заголовок X-LabEx-Auth: SecretToken, веб-приложение будет обрабатывать их успешно. Наблюдайте за выводом Nikto. Он определит сервер и начнет тестирование на различные уязвимости.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ "Allowed HTTP Methods: HEAD, OPTIONS, GET"
+ OSVDB-3233: /: Found a default page.
...
+ 15 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
Ключевой вывод заключается в том, что сканирование выполняется успешно, в то время как сканирование без заголовка было бы заблокировано приложением.
Проверка отправки заголовка с помощью инструмента прокси
На этом шаге вы проверите, действительно ли Nikto отправляет пользовательский заголовок со своими запросами. Хотя для этого обычно используются профессиональные инструменты, такие как Burp Suite или OWASP ZAP, мы можем имитировать прокси с помощью простого прослушивателя netcat (nc).
Сначала вам нужно открыть второй терминал. Вы можете сделать это, нажав на значок "+" на панели вкладок терминала.
В новом окне терминала запустите прослушиватель netcat на порту, например, 8888. Этот прослушиватель будет просто выводить любые полученные данные.
nc -l -p 8888
Теперь вернитесь в исходное окно терминала. Снова запустите сканирование Nikto, но на этот раз укажите ваш прослушиватель netcat вместо реального веб-сервера. Это заставит Nikto отправить свой HTTP-запрос в netcat, что позволит нам его проинспектировать.
nikto -h http://127.0.0.1:8888 -addheaders "X-LabEx-Auth: SecretToken"
После выполнения команды быстро вернитесь во второе окно терминала, где запущен netcat. Вы увидите необработанный HTTP-запрос, отправленный Nikto. Найдите в выводе заголовок X-LabEx-Auth: SecretToken.
GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000001)
X-LabEx-Auth: SecretToken
Accept-Encoding: gzip,deflate
Connection: close
Как вы можете видеть, пользовательский заголовок включен в запрос. Это подтверждает, что опция -addheaders работает должным образом.
Теперь вы можете остановить прослушиватель netcat, нажав Ctrl+C во втором окне терминала, а затем закрыть вкладку.
Тестирование на уязвимости, требующие определенных заголовков
На этом шаге вы поймете практическое значение использования пользовательских заголовков для безопасности, сравнивая сканирования с заголовком и без него.
Многие уязвимости, такие как небезопасные прямые ссылки на объекты (IDOR) или ошибки повышения привилегий, существуют только в аутентифицированных разделах приложения. Сканирование, которое не предоставляет правильный заголовок аутентификации, полностью пропустит эти проблемы.
Чтобы проиллюстрировать это, сначала выполните сканирование Nikto против веб-сервера без пользовательского заголовка. Это имитирует сканирование неаутентифицированным злоумышленником.
nikto -h http://127.0.0.1:8000
Nikto будет работать, но каждый отправленный им запрос будет встречен ответом "Access Denied" (Доступ запрещен). Сканер не может должным образом проанализировать приложение, потому что не может пройти первоначальную проверку авторизации. Результаты такого сканирования имеют ограниченную ценность.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ "Allowed HTTP Methods: GET, HEAD, OPTIONS"
+ OSVDB-3233: /: The site returned a 403 Forbidden, this may indicate that it's a default file.
...
Сравнивая это с успешным сканированием, которое вы выполнили в Шаге 3 (с использованием заголовка), вы можете увидеть разницу. Сканирование с пользовательским заголовком смогло взаимодействовать с основной логикой приложения (на что указывает сообщение "Welcome", которое мы видели с помощью curl) и выполнить значимые тесты. Сканирование без заголовка было остановлено у входной двери.
Это подчеркивает важность использования пользовательских заголовков для обеспечения максимальной полноты ваших сканирований на уязвимости.
Итоги
В этой лабораторной работе вы освоили важнейший метод проведения эффективной оценки безопасности веб-приложений с помощью Nikto.
Вы успешно:
- Определили требование приложения к пользовательскому HTTP-заголовку с помощью
curl. - Изучили синтаксис опции
-addheadersв Nikto. - Выполнили сканирование Nikto с включением пользовательского заголовка для получения авторизованного доступа.
- Проверили правильность отправки пользовательского заголовка с помощью прослушивателя
netcat. - Поняли, как сканирование с пользовательскими заголовками может выявить уязвимости, которые в противном случае были бы упущены.
Этот навык является неотъемлемым для любого специалиста по безопасности, поскольку он позволяет проводить более тщательное тестирование современных, сложных веб-приложений, которые полагаются на заголовки для аутентификации, управления состоянием и других функций.


