Введение
Nikto — популярный сканер веб-серверов с открытым исходным кодом, который выполняет комплексные тесты веб-серверов на наличие множества элементов, включая более 6700 потенциально опасных файлов/программ, проверяет устаревшие версии более чем 1250 серверов и проблемы, специфичные для версий, на более чем 270 серверах.
При сканировании веб-серверов, особенно в медленных или ненадежных сетях, или против серверов, испытывающих высокую нагрузку, запросы могут выполняться долго. По умолчанию Nikto ожидает ответа в течение 10 секунд. Если сервер работает медленнее, Nikto может сообщать об ошибках тайм-аута и не сможет корректно завершить сканирование.
В этой лабораторной работе вы научитесь использовать опцию -timeout Nikto для управления периодом ожидания запроса. Это позволит вам настроить поведение Nikto для успешного сканирования медленных или неотзывчивых веб-серверов.
Определение медленного или неотзывчивого веб-сервера
На этом шаге вы научитесь определять, является ли веб-сервер медленным. Прежде чем настраивать тайм-ауты в инструменте сканирования, крайне важно сначала измерить типичное время отклика сервера. Простой способ сделать это — использовать команду curl.
Мы запустили веб-сервер в фоновом режиме, который намеренно работает медленно; он ждет 5 секунд перед отправкой ответа. Давайте используем curl для измерения времени, необходимого для получения ответа от него. Флаг -w позволяет нам форматировать вывод, а %{time_total} — это переменная, которая содержит общее время транзакции.
Выполните следующую команду в терминале, чтобы измерить время отклика локального сервера, работающего на порту 8000:
curl -o /dev/null -s -w 'Total time: %{time_total}\n' http://localhost:8000
Вы увидите вывод, похожий на следующий. Время будет немного больше 5 секунд из-за искусственной задержки, которую мы добавили на сервере.
Total time: 5.00...
Это подтверждает, что сервер работает медленно и для ответа ему требуется более нескольких секунд. Эта информация жизненно важна для установки соответствующего тайм-аута в Nikto.
Использование опции -timeout для установки короткого тайм-аута в секундах
На этом шаге вы узнаете об опции -timeout в Nikto. Эта опция позволяет указать количество секунд, которое Nikto будет ждать завершения любого отдельного запроса, прежде чем сдаться и пометить его как тайм-аут. Значение по умолчанию — 10 секунд.
Чтобы понять, как Nikto ведет себя при неправильно настроенном тайм-ауте, мы намеренно установим значение, которое слишком короткое для нашего медленного сервера. Поскольку мы знаем, что сервер отвечает примерно за 5 секунд, мы установим тайм-аут в 2 секунды. Это приведет к сбою сканирования с ошибками тайм-аута, которые мы увидим на следующем шаге.
Сначала давайте подтвердим существование и описание опции -timeout с помощью меню справки Nikto. Вы можете передать вывод команды nikto -Help в grep, чтобы найти нужную опцию.
nikto -Help | grep timeout
Вывод покажет вам опцию -timeout и ее описание:
-timeout <secs> Timeout for requests (default 10 seconds)
Это подтверждает, как использовать опцию. На следующем шаге мы применим ее в реальном сканировании.
Запуск сканирования и наблюдение потенциальных ошибок тайм-аута
На этом шаге вы запустите сканирование Nikto с установленным нами коротким значением тайм-аута. Это продемонстрирует, что происходит, когда тайм-аут недостаточен для целевого сервера.
Выполните следующую команду для сканирования локального сервера с тайм-аутом в 2 секунды. Флаг -h указывает хост, а -p — порт.
nikto -h localhost -p 8000 -timeout 2
По мере выполнения сканирования вы увидите множество сообщений об ошибках, выводимых в консоль. Nikto будет пытаться отправлять запросы, но поскольку сервер отвечает 5 секунд, тайм-аут в 2 секунды будет превышен каждый раз.
Вывод будет заполнен ошибками, подобными этой:
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: No banner retrieved
+ 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
+ ERROR: Connection timed out
+ ERROR: Connection timed out
... (many more errors) ...
Повторяющиеся сообщения ERROR: Connection timed out являются явным признаком того, что значение тайм-аута слишком низкое. Результаты сканирования ненадежны, и многие тесты, вероятно, пропускаются.
Увеличение значения тайм-аута для более надежного сканирования
На этом шаге вы исправите проблему из предыдущего шага, установив соответствующее значение тайм-аута. Чтобы обеспечить надежное сканирование, тайм-аут должен быть больше самого длительного ожидаемого времени ответа сервера.
Из нашего теста curl в Шаге 1 мы знаем, что сервер отвечает примерно за 5 секунд. Для надежности следует добавить небольшой запас. Установим тайм-аут в 7 секунд. Это даст серверу достаточно времени для обработки запроса и отправки ответа.
Запустите сканирование Nikto снова, но на этот раз с тайм-аутом в 7 секунд:
nikto -h localhost -p 8000 -timeout 7
На этот раз вы должны увидеть другой результат. Сканирование будет проходить без ошибок "Connection timed out". Nikto теперь сможет корректно взаимодействовать с сервером и выполнять свои тесты.
Вывод будет больше похож на обычное успешное сканирование:
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: Python/3.10.6 http.server/0.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)
+ "robots.txt" not found.
...
Обратите внимание на отсутствие ошибок тайм-аута и наличие баннера сервера. Это указывает на то, что сканирование теперь выполняется надежно.
Поиск оптимального значения тайм-аута для целевой сети
На этом шаге мы обсудим стратегию поиска оптимального значения тайм-аута. Хотя в нашей контролируемой среде мы использовали известную задержку, в реальных сценариях вы не будете знать точное время ответа.
Поиск оптимального тайм-аута — это баланс:
- Слишком короткий: Приводит к ошибкам тайм-аута и ненадежному сканированию (как показано в Шаге 3).
- Слишком длинный: Может сделать сканирование ненужно медленным, если сервер на самом деле быстрый. Например, установка 30-секундного тайм-аута для сервера, который обычно отвечает за 1 секунду, означает, что вы будете ждать 30 секунд для каждого действительно неудачного запроса, замедляя общее сканирование.
Хорошая стратегия заключается в следующем:
- Проведите базовое измерение с помощью
pingилиcurl, чтобы понять общую задержку. - Начните с тайм-аута, который на несколько секунд превышает ваше базовое измерение.
- Если вы по-прежнему видите ошибки тайм-аута, увеличивайте значение постепенно, пока сканирование не будет проходить без сбоев.
Для нашего сервера хорошо подошел тайм-аут в 7 секунд. Давайте проведем финальное сканирование с немного более щедрым тайм-аутом в 10 секунд (значение по умолчанию для Nikto), а также введем опцию -maxtime, которая ограничивает общую продолжительность сканирования. Это полезно для того, чтобы сканирование не длилось часами на очень большом веб-сайте.
nikto -h localhost -p 8000 -timeout 10 -maxtime 60s
Эта команда указывает Nikto ждать до 10 секунд для каждого запроса и прервать все сканирование, если оно займет более 60 секунд. Эта комбинация дает вам контроль как над временем отдельных запросов, так и над общей продолжительностью сканирования.
Резюме
В этой лабораторной работе вы научились эффективно управлять тайм-аутами запросов в Nikto, что является критически важным навыком для выполнения надежного сканирования уязвимостей веб-приложений.
Вы начали с определения медленного веб-сервера, используя команду curl для измерения времени его ответа. Затем вы изучили опцию Nikto -timeout, сначала установив ее на слишком низкое значение, что привело к ошибкам соединения. Впоследствии вы увеличили тайм-аут до соответствующего значения, что позволило сканированию успешно завершиться.
Наконец, вы узнали стратегию поиска оптимального значения тайм-аута путем балансировки надежности и эффективности сканирования, а также познакомились с соответствующей опцией -maxtime для контроля общей продолжительности сканирования. Правильная настройка этих параметров гарантирует, что ваши сканирования Nikto будут как тщательными, так и своевременными.


