Definir um Timeout de Requisição no Nikto

Kali LinuxBeginner
Pratique Agora

Introdução

Nikto é um popular scanner de servidores web de código aberto que realiza testes abrangentes contra servidores web para vários itens, incluindo mais de 6700 arquivos/programas potencialmente perigosos, verifica versões desatualizadas de mais de 1250 servidores e problemas específicos de versão em mais de 270 servidores.

Ao escanear servidores web, especialmente em redes lentas ou não confiáveis, ou contra servidores que estão sob carga pesada, as requisições podem levar muito tempo para serem concluídas. Por padrão, o Nikto espera 10 segundos por uma resposta. Se um servidor for mais lento que isso, o Nikto pode relatar erros de timeout e não conseguir completar o escaneamento adequadamente.

Neste laboratório, você aprenderá a usar a opção -timeout do Nikto para controlar o período de timeout das requisições. Isso permitirá que você ajuste o comportamento do Nikto para escanear com sucesso servidores web lentos ou que não respondem.

Identificar um servidor web lento ou que não responde

Nesta etapa, você aprenderá como identificar se um servidor web está lento. Antes de ajustar os timeouts em uma ferramenta de escaneamento, é crucial medir primeiro o tempo de resposta típico do servidor. Uma maneira simples de fazer isso é com o comando curl.

Iniciamos um servidor web em segundo plano que é intencionalmente lento; ele espera 5 segundos antes de enviar uma resposta. Vamos usar o curl para medir quanto tempo leva para obter uma resposta dele. O flag -w nos permite formatar a saída, e %{time_total} é uma variável que contém o tempo total para a transação.

Execute o seguinte comando no seu terminal para medir o tempo de resposta do servidor local em execução na porta 8000:

curl -o /dev/null -s -w 'Total time: %{time_total}\n' http://localhost:8000

Você verá uma saída semelhante à seguinte. O tempo será ligeiramente superior a 5 segundos devido ao atraso artificial que adicionamos no servidor.

Total time: 5.00...

Isso confirma que o servidor está lento e leva mais do que alguns segundos para responder. Essa informação é vital para definir um timeout apropriado no Nikto.

Use a opção -timeout para definir um timeout curto em segundos

Nesta etapa, você aprenderá sobre a opção -timeout do Nikto. Esta opção permite especificar o número de segundos a esperar para que qualquer requisição individual seja concluída antes que o Nikto desista e a marque como timeout. O valor padrão é 10 segundos.

Para entender como o Nikto se comporta com um timeout mal configurado, definiremos intencionalmente um valor muito curto para o nosso servidor lento. Como sabemos que o servidor leva cerca de 5 segundos para responder, definiremos um timeout de 2 segundos. Isso fará com que o escaneamento falhe com erros de timeout, o que observaremos na próxima etapa.

Primeiro, vamos confirmar a existência e a descrição da opção -timeout usando o menu de ajuda do Nikto. Você pode canalizar a saída de nikto -Help para grep para encontrar a opção específica.

nikto -Help | grep timeout

A saída mostrará a opção -timeout e sua descrição:

-timeout <secs>     Timeout for requests (default 10 seconds)

Isso confirma como usar a opção. Na próxima etapa, aplicaremos isso em um escaneamento real.

Execute o escaneamento e observe possíveis erros de timeout

Nesta etapa, você executará o escaneamento Nikto com o valor de timeout curto que decidimos. Isso demonstrará o que acontece quando o timeout não é suficiente para o servidor alvo.

Execute o seguinte comando para escanear o servidor local com um timeout de 2 segundos. O flag -h especifica o host e -p especifica a porta.

nikto -h localhost -p 8000 -timeout 2

À medida que o escaneamento é executado, você verá várias mensagens de erro impressas no console. O Nikto tentará fazer requisições, mas como o servidor leva 5 segundos para responder, o timeout de 2 segundos será excedido a cada vez.

A saída será preenchida com erros semelhantes a este:

- 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) ...

As mensagens repetidas de ERROR: Connection timed out são um sinal claro de que o valor do timeout está muito baixo. Os resultados do escaneamento são não confiáveis e muitos testes provavelmente estão sendo pulados.

Aumente o valor do timeout para um escaneamento mais confiável

Nesta etapa, você corrigirá o problema da etapa anterior definindo um valor de timeout apropriado. Para garantir um escaneamento confiável, o timeout deve ser maior do que o tempo de resposta esperado mais longo do servidor.

Do nosso teste curl na Etapa 1, sabemos que o servidor leva cerca de 5 segundos para responder. Para ter segurança, devemos adicionar uma pequena margem. Vamos definir o timeout para 7 segundos. Isso dá ao servidor tempo suficiente para processar a requisição e enviar uma resposta.

Execute o escaneamento Nikto novamente, mas desta vez com um timeout de 7 segundos:

nikto -h localhost -p 8000 -timeout 7

Desta vez, você deverá ver um resultado diferente. O escaneamento prosseguirá sem os erros de "Connection timed out". O Nikto agora será capaz de se comunicar adequadamente com o servidor e realizar seus testes.

A saída se parecerá mais com um escaneamento normal e bem-sucedido:

- 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.
...

Observe a ausência de erros de timeout e a presença de um banner do servidor. Isso indica que o escaneamento agora está sendo executado de forma confiável.

Encontre um valor de timeout ideal para a rede alvo

Nesta etapa, discutiremos a estratégia para encontrar um valor de timeout ideal. Embora tenhamos usado um atraso conhecido em nosso ambiente controlado, em um cenário do mundo real, você não saberá o tempo de resposta exato.

Encontrar o timeout ideal é um equilíbrio:

  • Muito curto: Leva a erros de timeout e a um escaneamento não confiável (como visto na Etapa 3).
  • Muito longo: Pode tornar o escaneamento desnecessariamente lento se o servidor for realmente rápido. Por exemplo, definir um timeout de 30 segundos para um servidor que geralmente responde em 1 segundo significa que você esperará 30 segundos por cada requisição que realmente falhar, tornando o escaneamento geral mais lento.

Uma boa estratégia é:

  1. Realizar uma medição de base usando ping ou curl para entender a latência geral.
  2. Começar com um timeout alguns segundos maior do que sua medição de base.
  3. Se você ainda vir erros de timeout, aumente o valor incrementalmente até que o escaneamento ocorra sem problemas.

Para o nosso servidor, um timeout de 7 segundos funcionou bem. Vamos tentar um último escaneamento com um timeout ligeiramente mais generoso de 10 segundos (o padrão do Nikto) e também introduzir a opção -maxtime, que limita a duração total do escaneamento. Isso é útil para garantir que um escaneamento não dure horas em um site muito grande.

nikto -h localhost -p 8000 -timeout 10 -maxtime 60s

Este comando instrui o Nikto a esperar até 10 segundos por cada requisição e a abortar todo o escaneamento se ele levar mais de 60 segundos. Essa combinação lhe dá controle sobre os tempos de requisição individuais e a duração total do escaneamento.

Resumo

Neste laboratório, você aprendeu como gerenciar efetivamente os timeouts de requisição no Nikto, uma habilidade crítica para realizar escaneamentos de vulnerabilidade web confiáveis.

Você começou identificando um servidor web lento usando o comando curl para medir seu tempo de resposta. Em seguida, explorou a opção -timeout do Nikto, primeiro definindo-a para um valor muito baixo, o que resultou em erros de conexão. Subsequentemente, você aumentou o timeout para um valor apropriado, permitindo que o escaneamento fosse concluído com sucesso.

Finalmente, você aprendeu a estratégia para encontrar um valor de timeout ideal, equilibrando a confiabilidade e a eficiência do escaneamento, e foi introduzido à opção relacionada -maxtime para controlar a duração total do escaneamento. Configurar corretamente essas definições garante que seus escaneamentos Nikto sejam completos e oportunos.