Nikto¶
Nikto ist ein in Perl geschriebener Open-Source-Web-Server-Scanner. Er testet Webserver auf tausende potenziell schädliche Dateien und Programme, prüft Server-Versionen auf Aktualität und weist auf bekannte Sicherheitslücken hin. Zusätzlich prüft der Scanner Header und sucht nach ausnutzbaren Fehlern und unsicheren Defaults in der Webserver-Konfiguration.
Nikto schickt ein paar tausend GET-Requests pro Scan an den Webserver, richtet also keinen Schaden an und kann auch regelmässig gegen Produktivumgebungen laufen.
Die Konfigurationsdatei liegt unter /etc/nikto/config.txt (Git-Version) bzw. /etc/nikto/config (EPEL), die Plugins unter /usr/share/nikto/plugins; die Vulnerability-„Datenbanken“ sind reiner ASCII-Text und liegen unter /usr/share/nikto/databases.
Auf RHEL-basierten Systemen und Fedora kommen Signatur-Updates für den Scanner über die Paketverwaltung.
Begriffe¶
- Evasion
Technik, die einen Request so umformt, dass IDS-/WAF-Signaturen ihn nicht als Angriff erkennen. Nikto bietet acht Evasion-Modi (siehe
-evasion), die sich zu Testzwecken gegen die eigene WAF kombinieren lassen.- Plugin
Perl-Skript unter
/usr/share/nikto/plugins/, das einen Teil-Test durchführt (z.B.nikto_cookies,nikto_httpoptions,nikto_apache_expect_xss). Liste vianikto -list-plugins; einzelne Plugins ein- oder ausgeschaltet über-Plugins.- RFI
Remote File Inclusion. Schwachstellenklasse, bei der sich über einen unsicheren Include-Parameter in einer Webapp ein externes Skript einschleusen lässt. Nikto testet das, indem es versucht, einen eigenen URL (
RFIURLin der Config) includen zu lassen und die Response auf einen spezifischen Marker prüft.- Tuning
Filter, mit dem sich die Test-Kategorien eines Scans einschränken lassen. Nützlich, um grosse Scans thematisch aufzuteilen (etwa nur Misconfiguration, nur SQL-Injection).
Installation und Konfiguration¶
Aus EPEL:
dnf --assumeyes install epel-release
dnf --assumeyes install nikto
Alternativ direkt aus dem Git-Repo (immer aktuell):
git clone https://github.com/sullo/nikto
Debian/Ubuntu:
apt-get --yes install nikto
Achtung
Nikto installiert und verwendet nmap, was von einigen anderen Security-Scannern naturgemäss als Finding moniert wird.
Bei der Konfiguration stösst man auf den Begriff RFI (Remote File Inclusion). Damit Nikto erfolgreich testen kann, ob sich einer Seite erfolgreich ein externes, ausführbares Dokument (z.B. Malware) unterschieben lässt, hinterlegt man ein harmloses RFI-Beispiel auf dem eigenen Server und referenziert das in der /etc/nikto/config in RFIURL. Beispiele für solch eine Datei rfiinc.php, hier in PHP:
<?php
print "nik" . "to:" . 76197629 * 134.22 . ":<br>\n";
Wer Nikto aktualisieren möchte, verwendet:
# git version:
git pull --all
# yum/dnf version:
nikto -update
Verwendung¶
Scan gegen einen Host auf Port 80:
nikto -host $HOST -ssl
Die Ausgabe während der Arbeit:
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP: 1.2.3.4
+ Target Hostname: $HOST
+ Target Port: 80
+ Start Time: 2020-06-29 09:38:06 (GMT2)
---------------------------------------------------------------------------
+ Server: Apache
+ 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
+ Root page / redirects to: https://$HOST/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ 7518 requests: 0 error(s) and 3 item(s) reported on remote host
+ End Time: 2020-06-29 09:39:52 (GMT2) (106 seconds)
---------------------------------------------------------------------------
Scan gegen einen Host auf Port 443 (dauert knapp 15 Minuten), Output soll etwas ausführlicher sein:
nikto -host $HOST -Display V -ssl
So scannt man einen Webserver, dessen Angebot über HTTP Basic Auth erreichbar ist:
nikto -host $HOST -id $USERNAME:$PASSWORD
Nur Misconfiguration (2) und SQL-Injections (9) testen:
nikto -host $HOST -Tuning 29
Alles testen, ausser Denial of Service (6):
nikto -host $HOST -Tuning x 6
Ausgabe in Datei speichern (Formate: csv, htm, json, nbe, sql, txt, xml):
nikto -host $HOST -output $FILE -Format htm
Ein komplexerer Aufruf:
nikto -host $HOST -id $USERNAME:$PASSWORD -Cgidirs all -ssl -Plugins "@@ALL" -vhost $HOST
Die Tuning-Options im Überblick:
0 - File Upload
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
a - Authentication Bypass
b - Software Identification
c - Remote Source Inclusion
x - Reverse Tuning Options (i.e., include all except specified)
Evasion-Modi¶
Mit -evasion (Mehrfachauswahl zulässig) testet man, ob eine vorgeschaltete IDS/WAF die Angriffe erkennt. Die Modi verändern nicht das Scan-Ergebnis, sondern die Zustellungs-Form der Requests:
Random URI encoding (non-UTF8)
Directory self-reference (
/./)Premature URL ending
Prepend long random string
Fake parameter
TAB as request spacer
Change the case of the URL
Use Windows directory separator (
\)
nikto -host $HOST -evasion 17
Plugins¶
Alle verfügbaren Plugins auflisten:
nikto -list-plugins
Gezielt ein- bzw. ausschliessen:
# nur httpoptions-Plugin:
nikto -host $HOST -Plugins "httpoptions"
# alles ausser Plugin 'auth':
nikto -host $HOST -Plugins "@@ALL;-auth"
Proxy-Nutzung¶
Nikto kann HTTP-Proxies vorschalten, z.B. um Logs aufzuzeichnen oder durch ein internes Netz zu gehen. SOCKS-Proxies werden nicht unterstützt.
nikto -host $HOST -useproxy http://proxy.example.com:3128
Alternativ in der config persistent:
PROXYHOST=proxy.example.com
PROXYPORT=3128
Grenzen des Scanners¶
Nikto ist ein signaturbasierter Scanner und stösst an seine Grenzen bei:
JavaScript-lastigen Oberflächen (SPAs): keine JavaScript-Ausführung, dynamisch erzeugte URLs werden nicht besucht.
Authentifizierten Bereichen, die mehr als Basic Auth benötigen: Cookie-/Token-basierte Logins lassen sich nur manuell mit
-Cookiesoder-Headernachahmen, ein „Login dann crawlen“-Ablauf fehlt.Modernen Schwachstellen wie Injection-Varianten, Race-Conditions, Business-Logik: Nikto prüft bekannte Dateien und Konfigurationsmuster, keine Angriffslogik. Dafür eignen sich OWASP ZAP oder Wapiti besser.
Echtem Crawling: Nikto nutzt sein eigenes URL-Wörterbuch; es folgt keinen Links in ausgelieferten Seiten.
Der gute Einsatzzweck bleibt: schneller Schnellcheck auf bekannte Schwachstellen, Default-Files und Header-Hygiene. Für tiefergehende Audits mit anderen Tools kombinieren.
Individuelle Config¶
Config-Datei mit geändertem User-Agent (absolute Pfade verwenden):
CHECKMETHODS=GET
CIRT=107.170.99.251
DBDIR=/home/nikto/program/databases
DEFAULTHTTPVER=1.1
DOCDIR=/home/nikto/program/docs
EXECDIR=/home/nikto/program
FAILURES=20
LW_SSL_ENGINE=auto
MAX_WARN=20
NIKTODTD=/home/nikto/program/docs/nikto.dtd
PLUGINDIR=/home/nikto/program/plugins
RFIURL=http://cirt.net/rfiinc.txt?
SKIPPORTS=21 111
TEMPLATEDIR=/home/nikto/program/templates
UPDATES=yes
USERAGENT=Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
nikto -config ~/.config/nikto.conf -host $HOST