Nikto, per il web assessment
by admin on Jul.15, 2010, under Hacking, Sicurezza, Tools
Con la proliferazione di web servers, principalmente dovuta all’esplosione del blogging, e la conseguente crescita della loro esposizione ad attacchi sempre più numerosi ed aggiornati nelle tecniche sfruttate, la presenza di uno specifico tool per l’assessment è quantomai opportuna, se non doverosa.
Nel campo dell’ open source lo specifico tool si chiama Nikto, ed è soggetto a licenza GPL.
Per inciso, il nome deriva dalla frase (”Klaatu barada nikto”) pronunciata per placare il robot Gort e dissuaderlo dalla vendetta distruttiva nei confronti della razza umana, colpevole di aver tradito il suo padrone extraterrestre Klaatu, nel mitico film di fantascienza “The Day The Earth Stood Still” (”Ultimatum alla Terra”), del 1951. L’espressione è stata poi spudoratamente scippata in “Army of Darkness” per farne una formula magica utile alla ricerca del Necronomicon.
Terminata questa digressione, possiamo dire che Nikto è un software progettato per rilevare la presenza di varie ed insicure impostazioni di default, files, configurazioni e programmi per ogni tipo di web server, con i conseguenti potenziali problemi e vulnerabilità, inclusi:
- Cattive configurazioni sia del Server che del software
- Files e programmi con impostazioni di default
- Files e programmi ritenuti insicuri
- Servers e programmi non aggiornati, e pertanto vulnerabili
Nikto, la cui ultima versione è attualmente la 2.1.2, è scritto in Perl e può quindi essere eseguito su qualsiasi piattaforma ove sia presente tale ambiente.
È un tool completamente a riga di comando, tramite la quale può anche venire automaticamente aggiornato.
Prevede una vasta gamma di opzioni:
# nikto
- Nikto v2.03/2.04
---------------------------------------------------------------------------
+ ERROR: No host specified
+ ERROR: No host specified
-Cgidirs+ scan these CGI dirs: 'none', 'all', or values like "/cgi/ /cgi-a/"
-dbcheck check database and other key files for syntax errors (cannot be abbreviated)
-evasion+ ids evasion technique
-Format+ save file (-o) format
-host+ target host
-Help Extended help information
-id+ host authentication to use, format is userid:password
-mutate+ Guess additional file names
-output+ write output to this file
-port+ port to use (default 80)
-Display+ turn on/off display outputs
-ssl force ssl mode on port
-Single Single request mode
-timeout+ timeout (default 2 seconds)
-Tuning+ scan tuning
-update update databases and plugins from cirt.net (cannot be abbreviated)
-Version print plugin and database versions
-vhost+ virtual host (for Host header)
+ requires a value
ottenibili anche in formato esteso
# perl nikto.pl -Help
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/"
-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
V Verbose output
-dbcheck Check database and other key files for syntax errors (cannot be abbreviated)
-evasion+ IDS evasion 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
-findonly Find http(s) ports only, don't perform a full scan
-Format+ Save file (-o) format:
csv Comma-separated-value
htm HTML Format
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 userid:password
-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 URI cache
-nossl Disables using SSL
-no404 Disables nikto attempting to guess a 404 page
-output+ Write output to this file
-Plugins List of plugins to run (default ALL)
-port+ Port to use (default 80)
-Pause+ Pause between tests (seconds)
-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 (cannot be abbreviated)
-Version Print plugin and database versions
-vhost+ Virtual host (for Host header)
+ requires a value
Alla fine dello scan nikto sarà in grado di elencare le debolezze riscontrate ed anche dare indicazioni su come porvi rimedio.
L’invocazione più semplice e comune è:
# perl nikto.pl -h nome o indirizzo host
Come utilizzare tuttavia a fondo le varie potenzialità offerte da Nikto?
Il primo passo è conoscere su quali porte del server target siano in ascolto servizi che implementano il protocollo HTTP. Nikto include al suo interno un port scanner, ma, dato che è scritto anch’esso in Perl, risulta nettamente meno efficiente di Nmap, e per questo gli sviluppatori hanno previsto, nel file di configurazione, la possibilità di avvalersi di Nmap per il port scanning.
E’ bene assicurarsi, quindi, di avere nel file di configurazione (nikto.conf) la seguente riga:
NMAP=/usr/local/bin/nmap # path del binario nmap
Se non si desiderasse eseguire un portscan, o perchè si dispone già delle informazioni necessarie, oppure perchè si desidera testare solo determinate porte, è possibile utilizzare il parametro -p nei seguenti modi:
# nikto -h target -p 80 # standard,
# nikto -h target -p 80,443 # supportando ssl, controlla anche la porta https.
# nikto -h target -p 80-90 # controlla le porte dalla 80 alla 90,
# nikto -h target -p 80-90,443 # una combinazione delle precedenti.
Nella eventualità che Nikto non riuscisse a rilevare se una porta implementa http oppure https, è comunque possibile forzare il protocollo https con il parametro -ssl, e di conseguenza tutte le porte verranno interrogate tramite richieste https.
E’ utile anche rendere le richieste quanto più possibile varie o anonime:
Nikto di default si annuncia ai server web come definito, sempre in nikto.conf, dal parametro USERAGENT:
USERAGENT=Mozilla/4.75 (Nikto/@VERSION) (Evasions:@EVASIONS) (Test:@TESTID)
pertanto è possibile modificarlo con un altro valore, sperimentando magari diverse alternative, in quanto alcuni siti web rispondono in modo differenziato in base al browser da cui ricevono la richiesta.
Un altra tecnica utile consiste nel forzare lo scan generico ignorando gli header di risposta dei server web:
Il parametro -g permette di utilizzare tutti i test conosciuti senza basarsi sulle informazioni ottenute dal server.
In caso di pagine protette da http-authentication il parametro -id (seguito da userid:password) risulta molto comodo.
Altre opzioni utili sono:
- -Update che permette a Nikto di cercare in internet eventuali aggiornamenti al db di attacchi.
- -Format permette di specificare il formato dell’output, normalmente è usato il formato di testo semplice TXT, è possibile utilizzare HTM per l’output in html utile per essere visualizzato su una pagina web, oppure il CSV (valori separati da virgola) utile per avere dei dati pronti per essere inseriti in un database o per definire il file dove scrivere l’output del programma, di default viene utilizzato lo standard output. Altri formati attualmente disponibili sono XML e NBE (il formato di Nessus).
- -vhost che risulta utile nel caso in cui si voglia specificare il virtual host da analizzare, e non quello rilevato dallo scan iniziale.
- -host (-h) è il parametro che definisce il bersaglio. E’ possibile anche passare il nome di un file anziché indicare direttamente il target, potendo con ciò definire bersagli multipli.
La sintassi di ogni riga del file è elementare:
nomehost:porta,porta.
Se insieme a questa opzione si utilizza anche il parametro -p (-port) le porte aggiuntive verranno analizzate per ogni server presente nel file.
Un host file può anche essere rappresentato dall’output di nmap in formato “greppabile” (ad es. con l’opzione -oG).
Il file può essere passato a Nikto attraverso stdout/stdin usando il simbolo “-” come filename. Ad esempio:
# nmap -p80 172.16.10.0/24 -oG - | nikto.pl -h -
Nel file di configurazione è anche possibile configurare un proxy da usare per tutte le richieste che Nikto effettuerà, oltre a poter definire altri parametri come nomi di utenti comuni da usare, directory standard da analizzare…
I risultati ottenuti dagli strumenti utilizzati per analizzare servizi e vulnerabilità permetteranno di identificare gli attacchi appropriati per ogni situazione.
Quando si ottengono informazioni inerenti vulnerabilità è necessario interpretarle correttamente in modo da capire come sfruttare opportunamente le falle presenti.
I report prodotti risultano fondamentali per individuare i pacchetti da aggiornare o da configurare in modo corretto.
Un’ultima doverosa raccomandazione, prima di utilizzare il tool:
Nikto è un tool per l’analisi remota che per propria natura effettua un numero estremamente alto di richieste al server indicato, e in alcuni casi ciò potrebbe portare al blocco di quest’ultimo.
In ogni caso i log del server si gonfieranno di centinaia (se non migliaia) di righe che riveleranno l’esecuzione dello scan. Nikto non è certo uno strumento silenzioso!
In secondo luogo tra Nikto e il server target potrebbero essere presenti sistemi di tipo IDS o addirittura IPS che potrebbero vanificare i nostri tentativi; per questo motivo, all’interno di Nikto sono stati inclusi i meccanismi di evasione IDS implementati nella libreria libWhisker.
Per attivarli basterà utilizzare il parametro -e (-evasion) seguito da uno o più numeri identificativi delle tecniche di evasione disponibili.
E’ inoltre illegale usare Nikto (e strumenti analoghi) su server senza la preventiva ed esplicita autorizzazione di chi ha la diretta responsabilità del server stesso, e questo vale anche per il proprio sito in hosting.
Attenzione quindi a evitare di ritenersi erroneamente legittimati ad utilizzarlo!

