CONCEPTOS BASICOS DE NIKTO

 Nikto es una herramienta de escaneo de servidores web que se encarga de efectuar diferentes tipos de actividades tales como, detección de malas configuraciones y vulnerabilidades en el servidor objetivo, detección de ficheros en instalaciones por defecto, listado de la estructura del servidor, versiones y fechas de actualizaciones de servidores, tests de vulnerabilidades XSS, ataques de fuerza bruta por diccionario, reportes en formatos txt, csv, html, etc.

Nikto es un proyecto robusto que lleva varios años en desarrollo y se encuentra en constante evolución. Unas de las características mas interesantes de esta herramienta son la posibilidad de generar reportes en distintos formatos, la integración con LibWhisker (Anti-IDS), integración con Metasploit, entre otras.

El proyecto se encuentra ubicado en: http://cirt.net/nikto2 y se distribuye bajo licencia GNU/GPL lo que indica que el código se encuentra a disposición pública, para usar, modificar y/o distribuir.

Instalación de Nikto

Para instalar Nikto se puede usar uno de los dos siguientes mecanismos: Instalarlo directamente desde la versión disponible en el sitio oficial de Nikto o bajar e instalar directamente con una herramienta como apt con los repositorios adecuados.

La primera alternativa es la mas directa debido a que es posible acceder al sitio oficial de Nikto y descargar la ultima versión disponible.

Para instalar Nikto, en realidad no hace falta nada especial, solamente descargar la ultima versión y tener Perl instalado, lo que viene por defecto en distribuciones basadas en Debian/Ubuntu y con esto será suficiente para acceder a las utilidades “core” de la herramienta.

Para el soporte de SSL es necesario tener instalada la librería OpenSSL y el modulo Net::SSLeay de Perl, ambas librerías se pueden instalar con apt-get:

apt-get install openssl libcrypt-ssleay-perl

Una vez ejecutado el comando anterior, Nikto tendrá soporte para SSL. Por otro lado, Nikto cuenta con una configuración local para LibWhishker que utiliza el fichero LW.pm ubicado en el directorio plugins.

USO DE NIKTO

Nikto cuenta con la siguiente lista de opciones:

perl nikto.pl -H

Options:

-ask+ Whether to ask about submitting updates

yes Ask about each (default)

no Don’t ask, don’t send

auto Don’t ask, just send

-config+ Use this config file

-Cgidirs+ Scan these CGI dirs: «none», «all», or values like «/cgi/ /cgi-a/»

-dbcheck Check database and other key files for syntax errors

-Display+ Turn on/off display outputs:

1 Show redirects

2 Show cookies received

3 Show all 200/OK responses

4 Show URLs which require authentication

D Debug output

E Display all HTTP errors

P Print progress to STDOUT

S Scrub output of IPs and hostnames

V Verbose output

-evasion+ Encoding technique:

1 Random URI encoding (non-UTF8)

2 Directory self-reference (/./)

3 Premature URL ending

4 Prepend long random string

5 Fake parameter

6 TAB as request spacer

7 Change the case of the URL

8 Use Windows directory separator (\)

A Use a carriage return (0x0d) as a request spacer

B Use binary value 0x0b as a request spacer

-Format+ Save file (-o) format:

csv Comma-separated-value

htm HTML Format

msf+ Log to Metasploit

nbe Nessus NBE format

txt Plain text (default if not specified)

xml XML Format

-host+ Target host

-Help Extended help information

-id+ Host authentication to use, format is id:pass or id:pass:realm

-list-plugins List all available plugins, perform no testing

-mutate+ Guess additional file names:

1 Test all files with all root directories

2 Guess for password file names

3 Enumerate user names via Apache (/~user type requests)

4 Enumerate user names via cgiwrap (/cgi-bin/cgiwrap/~user type requests)

5 Attempt to brute force sub-domain names, assume that the host name is the parent domain

6 Attempt to guess directory names from the supplied dictionary file

-mutate-options Provide information for mutates

-nocache Disables the response cache

-nointeractive Disables interactive features

-nolookup Disables DNS lookups

-nossl Disables the use of SSL

-no404 Disables nikto attempting to guess a 404 page

-output+ Write output to this file

-port+ Port to use (default 80)

-Pause+ Pause between tests (seconds, integer or float)

-Plugins+ List of plugins to run (default: ALL)

-root+ Prepend root value to all requests, format is /directory

-ssl Force ssl mode on port

-Single Single request mode

-timeout+ Timeout (default 2 seconds)

-Tuning+ Scan tuning:

1 Interesting File / Seen in logs

2 Misconfiguration / Default File

3 Information Disclosure

4 Injection (XSS/Script/HTML)

5 Remote File Retrieval – Inside Web Root

6 Denial of Service

7 Remote File Retrieval – Server Wide

8 Command Execution / Remote Shell

9 SQL Injection

0 File Upload

a Authentication Bypass

b Software Identification

c Remote Source Inclusion

x Reverse Tuning Options (i.e., include all except specified)

-useproxy Use the proxy defined in nikto.conf

-update Update databases and plugins from CIRT.net

-vhost+ Virtual host (for Host header)

-Version Print plugin and database versions

+ requires a value

A continuación se indica el uso de estas opciones y las técnicas empleadas para un escaneo eficiente con Nikto.

uso básico de Nikto

La opción -h es obligatoria y es allí donde se incluyen los objetivos del escaneo, en esta opción se puede especificar los siguientes valores

  • dirección IP: perl nikto.pl -h 127.0.0.1

  • dirección IP, especificando puerto: perl nikto.pl -h 127.0.0.1:80

  • dirección IP especificando puerto(s) y protocolo: perl nikto.pl -h 127.0.0.1 -p 443,80,8080 -ssl

  • dirección virtual host: perl nikto.pl -h localhost

  • dirección virtual host, especificando puerto: perl nikto.pl -h localhost.1:80

  • dirección virtual host, especificando puerto(s) y protocolo: perl nikto.pl -h localhost -p 443 -ssl

  • Especificando múltiples Objetivos: perl nikto.pl -h ficheroObjetivos

    • El fichero de objetivos contiene un objetivo por línea de comandos

  • Utilizando la entrada “greppable” de un comando nmap: nmap -p80 192.168.1.0/24 -oG – | perl nikto.pl -h –

 uso de servidores proxy

Si la máquina donde se ejecuta Nikto pasa por medio de un proxy es posible establecer el puerto y el host del proxy:

perl nikto.pl -h localhost -p 8080 -useproxy proxyIp

Por otro lado, si se desea que esta opción sea persistente, es posible establecer estas características en el fichero de configuración nikto.conf en las entradas PROXY*

actualizando Nikto

Es posible actualizar Nikto con una conexión a Internet, de esta forma se mantiene el software con la ultima versión estable, lo que siempre es deseable y aconsejable:

perl nikto.pl -update

 características interactivas

Durante el proceso de escaneo, Nikto permite la interacción del usuario para diferentes acciones sobre la ejecución activa simplemente presionando determinadas teclas mientras se ejecuta el comando, se pueden consultar diferentes resultados que pueden ser útiles para obtener información detallada en un momento dado, las opciones contenidas en Nikto para interacción con el usuario en el transcurso del escaneo son:

 Espacio: Estado actual del Escaneo.

./nikto.pl -h localhost -p 80

– Nikto v2.1.4

—————————————————————————

+ Target IP: 127.0.0.1

+ Target Hostname: localhost

+ Target Port: 80

+ Start Time: 2011-04-16 18:04:25

—————————————————————————

+ Server: Apache/2.2.16 (Ubuntu)

+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.17). Apache 1.3.42 (final release) and 2.0.64 are also current.

+ ETag header found on server, inode: 2888976, size: 177, mtime: 0x49e4ef92a0de4

+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS

– STATUS: Completed 650 tests (~10% complete, 18 seconds left: currently in plugin ‘Nikto Tests’)

– STATUS: Completed 1390 tests (~22% complete, 11 seconds left: currently in plugin ‘Nikto Tests’)

 v: Activar o Desactivar el modo Verbose

./nikto.pl -h localhost -p 80

– Nikto v2.1.4

—————————————————————————

+ Target IP: 127.0.0.1

+ Target Hostname: localhost

+ Target Port: 80

+ Start Time: 2011-04-16 18:06:48

—————————————————————————

+ Server: Apache/2.2.16 (Ubuntu)

+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.17). Apache 1.3.42 (final release) and 2.0.64 are also current.

+ ETag header found on server, inode: 2888976, size: 177, mtime: 0x49e4ef92a0de4

+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS

vV:Fri Apr 15 18:06:50 2011 – 404 for GET: /search?NS-query-pat=..\..\..\..\..\..\..\..\..\..\boot.ini

V:Fri Apr 15 18:06:50 2011 – 404 for GET: /..\..\..\..\..\..\temp\temp.class

V:Fri Apr 15 18:06:50 2011 – 400 for GET: /../../../../../../../../../../etc/passwd

V:Fri Apr 15 18:06:50 2011 – 404 for GET: /…/…/…/…/…/…/…/…/…/boot.ini

V:Fri Apr 15 18:06:50 2011 – 404 for GET: /………………/etc/passwd

V:Fri Apr 15 18:06:50 2011 – 404 for GET: /%3f.jsp

……………………………………….

 d: Activa o Desactiva el modo debug

./nikto.pl -h localhost -p 80

– Nikto v2.1.4

—————————————————————————

+ Target IP: 127.0.0.1

+ Target Hostname: localhost

+ Target Port: 80

+ Start Time: 2011-04-16 18:04:25

—————————————————————————

+ Server: Apache/2.2.16 (Ubuntu)

+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.17). Apache 1.3.42 (final release) and 2.0.64 are also current.

+ ETag header found on server, inode: 2888976, size: 177, mtime: 0x49e4ef92a0de4

+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS

D:Fri Apr 15 18:09:45 2011 ‘Result Hash’ = {

‘connection’ => ‘Keep-Alive’,

‘whisker’ => {

‘protocol’ => ‘HTTP’,

‘lowercase_incoming_headers’ => 1,

‘http_space2’ => ‘ ‘,

‘stats_reqs’ => 204,

‘http_space1’ => ‘ ‘,

‘code’ => 404,

‘stats_syns’ => 6,

‘version’ => ‘1.1’,

‘data’ => «<!DOCTYPE HTML PUBLIC \»-//IETF//DTD HTML 2.0//EN\»>\n<html><head>\n<title>404 Not Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p>The requested URL /cgi-bin/ezboard.cgi was not found on this server.</p>\n<hr>\n<address>Apache/2.2.16 (Ubuntu) Server at localhost Port 80</address>\n</body></html>\n»,

‘uri’ => ‘/cgi-bin/ezboard.cgi’,

‘message’ => ‘Not Found’,

‘header_order’ => [

‘date’,

‘server’,

‘vary’,

‘content-length’,

‘keep-alive’,

‘connection’,

‘content-type’

],

‘http_data_sent’ => 1,

‘MAGIC’ => 31340,

‘http_eol’ => «\r\n»,

‘socket_state’ => 1

},

‘keep-alive’ => ‘timeout=15, max=96’,

‘date’ => ‘Fri, 15 Apr 2011 16:09:45 GMT’,

‘vary’ => ‘Accept-Encoding’,

‘content-length’ => 292,

‘content-type’ => ‘text/html; charset=iso-8859-1’,

‘server’ => ‘Apache/2.2.16 (Ubuntu)’

};

e: Activar o desactivar mensajes sobre reportes de error

p: Activar o desactivar mensajes sobre progreso de de reportes

r: Activar o desactivar mensajes sobre redirecciones en la pantalla

c: Activar o desactivar mensajes sobre cookies en la pantalla

o: Activar o desactivar mensajes sobre las peticiones correctas (retorno código http 200)

a: Activar o desactivar mensajes sobre intentos de autenticación

q: Finalizar la ejecución de Nikto

N: Continuar con el siguiente Host, si no existe, finalizar con la ejecución de programa.

P: Pausar la ejecución del comando

OPCIONES DE CONFIGURACION DEL ESCANEO

-config

Permite especificar un fichero de configuración de Nikto diferente al establecido por defecto en el directorio raíz del programa

./nikto.pl -h localhost -p 80 -config nikto.conf

-dbcheck

Permite validar la consistencia los ficheros de base de datos de nikto, de esta manera si alguno de los ficheros utilizados por Nikto tiene un error de sintaxis, esta opción lo valida primero, estos ficheros se encuentran incluidos en el directorio plugins y son fácilmente identificados ya que se abrevian con las iniciales “db_”

./nikto.pl -h localhost -p 80 -dbcheck

–> Nikto Databases

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_headers

67 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_httpoptions

12 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_multiple_index

29 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_server_msgs

255 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_subdomains

293 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_favicon

26 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_embedded

15 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_404_strings

29 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_outdated

1081 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_realms

154 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_tests

6448 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_variables

12 entries

Syntax Check: /home/adastra/UTILITIES/nikto-2.1.4/plugins/db_content_search

9 entries

-Display

Enseña en la salida estándar controles adicionales que habilitan información mas detallada sobre distintos tópicos. Esta opción habilita los mensajes que se han indicado anteriormente sobre los comandos interactivos, con la diferencia que esta vez, en lugar de ser interactivos, se especifican directamente en la ejecución de Nikto, de la misma forma que cada comando interactivo tenia un parámetro asociado (una letra) esta opción también espera como parámetro uno o varios argumentos que le permita activar o desactivar determinadas configuraciones de mensajes que se enseñan en la consola, estos argumentos son:

1: Activar los mensajes de re direcciones detectados por Nikto

2: Activar los mensajes de cookies recibidas por Nikto

3: Activar los mensajes de todas las respuestas correctas 200/OK

4: Activar los mensajes de todas las URL’s que requieren autenticación

D: Activar los mensajes relacionados con la ejecución de Nikto en modo Depuración

E: Activar los mensajes con todos los Errores HTTP

P: Activar los mensajes relacionados con el progreso del escaneo.

V: Activar los mensajes verbose.

Los resultados correspondientes de estos argumentos son equivalentes a los resultados de los comandos interactivos anteriormente detallados.

-evasion

Esta opción permite que Nikto utilice la técnica de codificación/evasión de LibWhiskey, para conocer un poco más sobre esta librería, en una siguiente entrada se intentará profundizar un poco más. Esta opción toma como argumento un tipo de evasión que es listado a continuación:

  1. URI aleatoria codificada.

    ./nikto.pl -h localhost -p 80 -Display 1 -evasion 1

  2. Auto-referencia de directorio (/./)

./nikto.pl -h localhost -p 80 -Display 1 -evasion 2

  1. Finalización prematura de URL

./nikto.pl -h localhost -p 80 -Display 1 -evasion 3

  1. Concatenación de una cadena aleatoria larga

./nikto.pl -h localhost -p 80 -Display 1 -evasion 4

  1. Parámetro Falso

    ./nikto.pl -h localhost -p 80 -Display 1 -evasion 5

     

  2. TAB como peticion de Espaciador

    ./nikto.pl -h localhost -p 80 -Display 1 -evasion 6

     

  3. Cambia el tipo de la URL (mayuscula/minuscula)

./nikto.pl -h localhost -p 80 -Display 1 -evasion 7

  1. Usa separador de directorios de Windows (\)

./nikto.pl -h localhost -p 80 -Display 1 -evasion 7

A. Usar un retorno de carro (0x0d) como petición de espaciador
B. Usar un valor binario (0x0b) como petición de espaciador


-findonly / @@NONE

Solamente descubre puertos HTTP(s) y no ejecuta ningún escaneo de seguridad, con esto intentará conectarse por HTTP(S) y reportará sobre la respuesta del servidor. Esta opción se encuentra deprecada desde la versión 2.1.4 en lugar de esto, se debe utilizar la opción -Plugin con el parámetro @@NONE

./nikto.pl -h localhost -findonly

– Nikto v2.1.4

—————————————————————————

+ Server: http://localhost:80 Apache/2.2.16 (Ubuntu)

—————————————————————————

./nikto.pl -h localhost -Plugin @@NONE

– Nikto v2.1.4

—————————————————————————

+ Server: http://localhost:80 Apache/2.2.16 (Ubuntu)

—————————————————————————

 -output -o:

Con esta opción es posible generar un fichero donde se almacenan los resultados del escaneo realizado, de esta forma todo lo que sale por la consola, también es redirigido al fichero especificado como argumento. Esta opción frecuentemente se utiliza en conjunto con la opción -Format

./nikto.pl -h localhost -o /home/texto.txt

 Aunque es valida para generar ficheros de salida, también es empleada para conectarse con MetaSploit, sin embargo requiere especificarse un servicio RPC donde MetaSploit se encontrará esperando conexiones. Para conocer las características basicas de Metasploit ver una entrada anterior sobre este framework: https://thehackerway.wordpress.com/2011/03/11/comandos-y-conceptos-basicos-metasploit-framework/

-no404

Desactiva el chequeo de recursos no encontrados (file not found 404), aunque desactivando esta característica se podrán generar más falsos positivos, es la mejor opción a utilizar en conexiones lentas o dispositivos con capacidades de computo limitadas como por ejemplo un dispositivo móvil.

./nikto.pl -h localhost -no404

 -id

En los casos en los que el servidor web requiera autenticación para algún recurso se recurre a la opción id que incluye un usuario y una clave en el formato id:password en el caso de que se disponga de dicha información, en otro caso, se debe utilizar una técnica de mutación algo de lo que se hablará mas adelante.

 -nolookup

Indica que Nikto no debe realizar ningún lookup por nombre de dominio (DNS), lo que en muchos casos es útil para no dejar en evidencia el origen de la petición, en el caso de que el escaneo se este realizando de forma anónima, (como por ejemplo con el uso de Tor). Por esta razón es importante no especificar en la opción -h ningún nombre de dominio, host virtual o nombre de máquina, en cualquier caso, siempre se debe de indicar una dirección IP en otro caso el comando lanzará un error:

./nikto.pl -h localhost -nolookup

– Nikto v2.1.4

—————————————————————————

+ ERROR: -skiplookup set, but given name

./nikto.pl -h 127.0.0.1 -nolookup

– Nikto v2.1.4

—————————————————————————

+ Target IP: 127.0.0.1

+ Target Hostname: 127.0.0.1

+ Target Port: 80

+ Start Time: 2011-04-16 23:52:49

—————————————————————————

-nocache

Desactiva la cache de respuestas

./nikto.pl -h localhost -nocache

 -nointeractive

Desactiva las funciones de interacción con el usuario indicadas en párrafos anteriores.

./nikto.pl -h localhost -nointeractive

 -timeout

Especifica el tiempo en segundos que esperará Nikto antes de finalizar una petición por tiempo agotado, por defecto son 2 segundos cuando no se especifica un valor diferente

./nikto.pl -h localhost -timeout 3

 -nossl

Desactiva el uso de SSL para conectarse al servidor objetivo, lo que en algunos casos resulta ser una mala idea.

./nikto.pl -h localhost -nossl

 -ssl

Solo prueba conexiones SSL en los puertos especificados.

./nikto.pl -h localhost -port 443,8080 -ssl

 -vhost

Especifica un virtual host para incluir en el header de cada petición.

./nikto.pl -h localhost -port 80 -vhost google.com

 -Pause

Número de segundos que se deben de esperar entre cada test.

./nikto.pl -h localhost -Pause 10

 -Format

Esta opción nos permite especificar un formato de salida para el reporte generado por el escaneo, esta opción debe de ir acompañada con la opción -o (-output) para especificar un directorio de salida, los argumentos disponibles de la opción Format son:

./nikto.pl -h localhost -Format txt -o /home/texto.txt

./nikto.pl -h localhost -Format csv -o /home/csv.csv

./nikto.pl -h localhost -Format htm -o /home/pagina.html

msf: Conexión con servicio RPC de metasploit y registra los resultados del escaneo allí.

./nikto.pl -h localhost -evasion 1 -Format msf -o msf:password@http://127.0.0.1:55553/RPC2

./nikto.pl -h localhost -Format xml -o /home/report.xml

 -Single

Se trata de una opción interesante que permite ejecutar solamente una petición contra el objetivo, una vez se indica esta opción, Nikto comenzará a solicitar argumentos obligatorios para la petición de forma interactiva, asumiendo algunos valores por defecto para dicha petición, una vez, esta es ejecutada, Nikto retornará un informe con: Detalles de la conexión, Headers de la Petición y Contenido de la respuesta.

./nikto.pl -Single

——————————————– Nikto 2.1.4

——————————————– Single Request Mode

Hostname or IP: 127.0.0.1

Port (80):

URI (/):

SSL (0):

Proxy host:

…………………………………………………….

——————————————– Done with questions

Host Name: localhost.localdomain

Host IP: 127.0.0.1

HTTP Response Code: 200

——————————————– Connection Details

Connection: Keep-Alive

Host: 127.0.0.1

User-Agent: Mozilla/4.75 (Nikto/2.1.4

data:

force_bodysnatch: 0

force_close: 1

force_open: 0

host: 127.0.0.1

…………………………………………………….

——————————————– Response Headers

Accept-Ranges: bytes

Connection: Keep-Alive

Content-Length: 177

Content-Type: text/html

Date: Fri, 15 Apr 2011 22:12:24 GMT

ETag: «2c1510-b1-49e4ef92a0de4»

Keep-Alive: timeout=15, max=100

Last-Modified: Sat, 12 Mar 2011 20:32:11 GMT

Server: Apache/2.2.16 (Ubuntu)

Vary: Accept-Encoding

code: 200

——————————————– Response Content

<html><body><h1>It works!</h1>

<p>This is the default web page for this server.</p>

<p>The web server software is running but no content has been added, yet.</p>

</body></html>

 -Plugin

Selecciona cuales plugins se ejecutarán en los objetivos especificados, muchas opciones disponibles en Nikto (como la opción mutate) se han depreciado para ser utilizadas en forma de Plugin. Los plugins son simplemente entradas de texto que indican un conjunto de operaciones realizadas por Nikto, todos los Plugins se encuentran incluidos en el directorio Plugins y se pueden consultar por medio del comando –list-plugins, existen dos valores especiales que permiten usar todos los Plugins o ninguno son: @@ALL y @@NONE respectivamente.

./nikto.pl -h localhost -Plugin @ALL