Pokud se zaměřujete na weby a máte nainstalovaný Kali linux, tak nástroj Nikto bude jeden z prvních, který začnete zkoumat. Tento článek vás provede architekturou a vybranými volbami tohoto nástroje.
K čemu je skener?
Nikto je skener na testování bezpečnosti webových serverů. Přesněji řečeno otestuje základní „dětské nemoci“ konfigurace web serveru, nepřehlédne typické adresáře a soubory o kterých možná ani nevíte. Pokud vlastníte a provozujete web server, určitě tento nástroj vyzkoušejte. Nikdy není na škodu vědět, co všechno útočník může z takového testu zjistit.
Nikto je napsaný v Perlu a lze jej používat i na jiných operačních systémech než je Kali. Na domovské stránce projektu https://cirt.net/Nikto2 najdete kromě sekce ke stažení také dokumentaci, mailing list s archivy a v neposlední řade GitHub repositář.
Varování
Příklady s testovacími nástroji si obecně zkoušejte v izolovaných labech. Proč? Protože každý nástroj může mít chyby, nebo můžete špatně pochopit použití parametrů. Pokud použijete nástroj neautorizovaně, tj. bez písemného souhlasu vlastníka, a něco se stane, půjde vše na vaše triko. Často je web server sdílený a provozuje se na něm více webových stránek.
Nápověda
Otevřeme si terminál a spustíme program nikto bez parametrů. Z prvního výpisu můžeme vidět „krátkou“ nápovědu s přehledem všech voleb. Hned v hlavičce vidíme verzi nástroje a chybovou hlášku, že jsme nepoužili povinný parametr pro specifikaci cílového serveru (ERROR: No host specified).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
root@kali:~# nikto - Nikto v2.1.6 --------------------------------------------------------------------------- + ERROR: No host specified -config+ Use this config file -Display+ Turn on/off display outputs -dbcheck check database and other key files for syntax errors -Format+ save file (-o) format -Help Extended help information -host+ target host -id+ Host authentication to use, format is id:pass or id:pass:realm -list-plugins List all available plugins -output+ Write output to this file -nossl Disables using SSL -no404 Disables 404 checks -Plugins+ List of plugins to run (default: ALL) -port+ Port to use (default 80) -root+ Prepend root value to all requests, format is /directory -ssl Force ssl mode on port -Tuning+ Scan tuning -timeout+ Timeout for requests (default 10 seconds) -update Update databases and plugins from CIRT.net -Version Print plugin and database versions -vhost+ Virtual host (for Host header) + requires a value Note: This is the short help output. Use -H for full help text. |
Jak je z výpisu vidět, každý parametr začíná znakem mínus. Matoucí znaménko plus za parametrem má evokovat, že se tento parametr nastavuje na nějakou hodnotu. Jak to přesně udělat se dozvíme v online dokumentaci nebo v úplné nápovědě přes parametr -H.
Architektura nástroje
Zjednodušeně můžeme říct, že nástroj posílá aplikační dotazy pomocí protokolu HTTP(S) a potřebuje jen správné definice dotazů.
Zásuvné moduly
Nikto podporuje zásuvné moduly „pluginy“, to jsou ucelené části kódu, které řeší logicky podobnou detekci, nebo zpracování výstupu. Pokud bychom se chtěli podívat na seznam podporovaných modulů, použijeme parametr -list-plugins.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@kali:~# nikto -list-plugins ... Plugin: msgs Server Messages - Checks the server version against known issues. Written by Sullo, Copyright (C) 2008 CIRT Inc. Plugin: drupal Drupal Specific Tests - Performs a selection of drupal specific tests Written by Tautology, Copyright (C) 2014 CIRT Inc. Options: 0: Flag to tell plugin to enumerate modules path: Basic path for modules (can usually be found in page source). .. neúplný výpis .. |
Kromě jména modulu ve výpise najdeme i jeho stručný popis, to se hodí pro představu, co vše Nikto umí. Najdeme zde například moduly pro testování Drupalu, HTTP metod a modul Dictionary pro test obvyklých adresářů a souborů.
Verze modulů a databází
Každý zásuvný modul má většinou svoji databázi s definicemi aplikačních dotazů. Pod aplikačním dotazem si můžeme představit, například HTTP požadavek na ověření dostupnosti adresáře „phpmyadmin“. Pokud prošťouráme GitHub repositář, najdeme v něm adresář databases a soubor definic pro modul „dictionary“, který obsahuje seznam adresářů, které Nikto zkouší na web serveru objevit. V tomto souboru naleznete i slovo phpmyadmin.
Následující příklad vypíše seznam všech zásuvných modulů a jejich databází, včetně jejich verzí.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
root@kali:~# nikto -Version File Version ----------------------------- -------- Nikto main 2.1.6 LibWhisker 2.5 db_404_strings 2.003 db_content_search 2.000 nary 1.0 db_drupal 1.00 db_embedded 2.004 db_favicon 2.010 db_headers 2.008 db_httpoptions 2.002 db_multiple_index 2.005 db_outdated 2.017 db_parked_strings 2.001 db_realms 2.002 db_server_msgs 2.006 db_subdomains 2.006 db_tests 2.021 db_variables 2.004 nikto_apache_expect_xss.plugin 2.04 nikto_apacheusers.plugin 2.06 nikto_auth.plugin 2.04 nikto_cgi.plugin 2.06 nikto_clientaccesspolicy.plugin 1.00 nikto_content_search.plugin 2.05 nikto_cookies.plugin 2.05 nikto_core.plugin 2.1.5 nikto_dictionary_attack.plugin 2.04 nikto_drupal.plugin 1.00 nikto_embedded.plugin 2.07 nikto_favicon.plugin 2.09 nikto_fileops.plugin 1.00 nikto_headers.plugin 2.11 nikto_httpoptions.plugin 2.10 nikto_ms10_070.plugin 1.00 nikto_msgs.plugin 2.07 nikto_multiple_index.plugin 2.03 nikto_negotiate.plugin 2.00 nikto_outdated.plugin 2.09 nikto_parked.plugin 2.00 nikto_paths.plugin 2.00 nikto_put_del_test.plugin 2.04 nikto_report_csv.plugin 2.07 nikto_report_html.plugin 2.05 nikto_report_nbe.plugin 2.02 nikto_report_sqlg.plugin 2.00 nikto_report_text.plugin 2.05 nikto_report_xml.plugin 2.05 nikto_robots.plugin 2.06 nikto_shellshock.plugin 2.01 nikto_siebel.plugin 1.00 nikto_sitefiles.plugin 2.00 nikto_ssl.plugin 2.01 nikto_subdomain.plugin 2.01 nikto_tests.plugin 2.04 |
Aktualizace modulů a databází
Aktuální moduly a databáze mohou odhalit něco nového. Pokud si už dáme tu práci web server skenovat, má smysl zaktualizovat nástroj a jeho moduly. Nikto si umí sám zaktualizovat svoje zásuvné moduly a databáze pomocí volby –update. Bohužel tato funkcionalita dnes nefunguje, jak uvádí následující příklad.
1 2 3 |
root@kali:~# nikto -update + ERROR (302): Unable to get cirt.net/nikto/UPDATES/2.1.6/versions.txt |
Aktualizace selhala, protože na stránce projektu neexistuje adresář a ani soubor versions.txt pro verzi 2.1.6. Otázka je, zda autoři tuto adresu ještě udržují, protože z výpisů obsahu adresářů na serveru http://cirt.net/nikto/UPDATES/ to vypadá, že poslední verze se zde objevila v roce 2014.
Naproti tomu GitHub repositář je daleko živější. Zkrátka automatická aktualizace nebude fungovat a jediná možnost jak dostat aktuální verzi nástroje Nikto je přes GitHub.
Test web serveru (-h)
Konečně se dostáváme k testu web serveru. Pomocí parametru -h definujeme IP adresu, nebo doménové jméno cílového web serveru, který chceme testovat. Pokud neuvedeme parametr pro port, použije se výchozí hodnota 80, viz. následující výpis.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
root@kali:~# nikto -h 10.10.0.49 - Nikto v2.1.6 --------------------------------------------------------------------------- + Target IP: 10.10.0.49 + Target Hostname: 10.10.0.49 + Target Port: 80 + Start Time: 2016-08-31 13:55:59 (GMT-4) --------------------------------------------------------------------------- + Server: Apache/2.4.10 (Debian) + Server leaks inodes via ETags, header found with file /, fields: 0x663 0x517785d2776bd + 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) + Apache/2.4.10 appears to be outdated (current is at least Apache/2.4.12). Apache 2.0.65 (final release) and 2.2.29 are also current. + Allowed HTTP Methods: POST, OPTIONS, GET, HEAD + Uncommon header 'x-ob_mode' found, with contents: 0 + OSVDB-3268: /tools/: Directory indexing found. + OSVDB-3092: /tools/: This might be interesting... + OSVDB-3092: /manual/: Web server manual found. + OSVDB-3268: /manual/images/: Directory indexing found. + OSVDB-3233: /icons/README: Apache default file found. + OSVDB-3268: /wordpress/: Directory indexing found. + /phpmyadmin/: phpMyAdmin directory found + 7669 requests: 0 error(s) and 14 item(s) reported on remote host + End Time: 2016-08-31 14:04:37 (GMT-4) (518 seconds) --------------------------------------------------------------------------- |
Skener Nikto nám radostně hlásí chybějící ochranné hlavičky proti anti-Clickjackingu a Cross-site Scriptingu (XSS).
Dále nám skener hlásí, že našel webový server Apache ve verzi 2.4.10, která už je zastaralá. Mezi zajímavé informace patří objevené adresáře /tools, /manual, /icons, /wordpress a hlavně /phpmyadmin, což je webová aplikace pro správu databází MySQL.
Nastavení bázové URL adresy
Nikto je primárně skener webového serveru. Můžeme mít však potřebu testovat jen určitou bázovou URL adresu. To se hodí v situaci, kdy server odpovídá jen na specifické URL adresy a na ostatní dotazy reaguje stavovým kódem HTTP 404. Nikto umí definovat kořenovou URL adresu pomocí parametru -root.
1 |
nikto -h 10.10.0.5 -root /wordpress |
Bohužel z výstupu nástroje Nikto žádný rozdíl nepoznáme a musíme si zapnout podrobný výpis přes volbu Display s hodnotou V (zjištěno z podrobné nápovědy, označuje „Verbose“).
1 2 3 4 5 6 7 8 |
nikto -h 10.10.0.5 -root /wordpress -Display V .. výpis zkrácen .. V:Sat Sep 3 17:09:27 2016 - 404 for GET: /wordpress/bin/ V:Sat Sep 3 17:09:27 2016 - 404 for GET: /wordpress/cgi/ V:Sat Sep 3 17:09:27 2016 - 404 for GET: /wordpress/mpcgi/ V:Sat Sep 3 17:09:27 2016 - 404 for GET: /wordpress/cgi-bin/ V:Sat Sep 3 17:09:27 2016 - 404 for GET: /wordpress/ows-bin/ V:Sat Sep 3 17:09:27 2016 - 404 for GET: /wordpress/cgi-sys/ |
Po nějaké době, až se na řadu dostane modul „dictionary“, můžeme vidět sadu HTTP GET požadavků, které v URL začínají prefixem /wordpress.
Z výpisu je dále vidět, že Nikto od webového serveru dostává odpovědi se stavovým kódem 404, což znamená, že daný soubor nebo adresář na serveru nebyl nalezen.
Skenovací techniky (-T)
Nikto můžeme parametrem –Tunning (-T) omezit, aby prováděl pouze vybrané testy. Podrobná nápověda zmiňuje celkem 16 typů nastavení. My si otestujeme pouze SQL injektáž (volba 9). Podrobný výpis (Display -V) necháme zapnutý.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
nikto -h 10.10.0.5 -root /wordpress -T 9 -Display V ... V:Sat Sep 3 17:27:11 2016 - 62 server checks loaded V:Sat Sep 3 17:27:11 2016 - Running start for "Drupal Specific Tests" plugin V:Sat Sep 3 17:27:11 2016 - Running start for "Favicon" plugin V:Sat Sep 3 17:27:11 2016 - Running start for "HTTP Headers" plugin V:Sat Sep 3 17:27:11 2016 - Running start for "Embedded Detection" plugin V:Sat Sep 3 17:27:11 2016 - Running start for "Content Search" plugin V:Sat Sep 3 17:27:11 2016 - Running start for "Guess authentication" plugin ... displayCategory.php V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/postnuke/My_eGallery/public/displayCategory.php V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/postnuke/html/My_eGallery/public/displayCategory.php V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/modules/My_eGallery/public/displayCategory.php V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/phpBB/My_eGallery/public/displayCategory.php V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/forum/My_eGallery/public/displayCategory.php ... V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/imp/mailbox.php3?actionID=6&server=x&imapuser=x';somesql+--&pass=x V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/userinfo.php?uid=1; V:Sat Sep 3 17:27:38 2016 - 404 for GET: /wordpress/site/' UNION ALL SELECT FileToClob('/etc/passwd','server')::html,0 FROM sysusers WHERE username=USER --/.html ... ... zkraceny vypis.. |
Z podrobného výpisu vidíme, že Nikto spustil základní testy proti web serveru a pak se na posledním řádku bezhlavě pustil do zkoušení SQL injection (UNION ALL SELECT).
Falešné nálezy
Nikto je bezvadný nástroj, ale jeho výsledky je třeba brát s rezervou. Nástroj je tak dobrý, jak jsou jeho dotazy a pravidla na zpracování odpovědi. Například moderní webové aplikace použivající JSON v těle HTTP odpovědi skener matou. Z tohoto důvodu nálezy dále ověřujeme. Můžeme použít testovací nástroj Burp Suite nebo webový prohlížeč v kombinaci s vývojářským panelem FireBug.
Úplná nápověda (-H)
Nakonec si ještě vyzkoušíme volání úplné nápovědy s parametrem -H. Na první pohled vidíme, že jsou zde dokumentované nejen parametry, ale také jeho hodnoty. Pokud byste chtěli vidět i příklady použití parametrů, musíte do online dokumentace.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
root@kali:~# nikto -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 -Cgidirs+ Scan these CGI dirs: "none", "all", or values like "/cgi/ /cgi-a/" -config+ Use this config file -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 -dbcheck Check database and other key files for syntax errors -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 nbe Nessus NBE format sql Generic SQL (see docs for schema) txt Plain text xml XML Format (if not specified the format will be taken from the file extension passed to -output) -Help Extended help information -host+ Target host -404code Ignore these HTTP codes as negative responses (always). Format is "302,301". -404string Ignore this string in response body content as negative response (always). Can be a regular expression. -id+ Host authentication to use, format is id:pass or id:pass:realm -key+ Client certificate key file -list-plugins List all available plugins, perform no testing -maxtime+ Maximum testing time per host (e.g., 1h, 60m, 3600s) -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 -nointeractive Disables interactive features -nolookup Disables DNS lookups -nossl Disables the use of SSL -no404 Disables nikto attempting to guess a 404 page -Option Over-ride an option in nikto.conf, can be issued multiple times -output+ Write output to this file ('.' for auto-name) -Pause+ Pause between tests (seconds, integer or float) -Plugins+ List of plugins to run (default: ALL) -port+ Port to use (default 80) -RSAcert+ Client certificate file -root+ Prepend root value to all requests, format is /directory -Save Save positive responses to this directory ('.' for auto-name) -ssl Force ssl mode on port -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 d WebService e Administrative Console x Reverse Tuning Options (i.e., include all except specified) -timeout+ Timeout for requests (default 10 seconds) -Userdbs Load only user databases, not the standard databases all Disable standard dbs and load only user dbs tests Disable only db_tests and load udb_tests -useragent Over-rides the default useragent -until Run until the specified time or duration -update Update databases and plugins from CIRT.net -useproxy Use the proxy defined in nikto.conf, or argument http://server:port -Version Print plugin and database versions -vhost+ Virtual host (for Host header) + requires a value |
Závěr
V článku jsme vysvětlili k čemu se hodí sken web serveru a z popisu architektury už víme, že srdcem nástroje jsou moduly a jejich databáze definic s aplikačními dotazy.
Ukázali jsme si celkem tři případy skenování: plný sken webserveru, sken na bázovou URL adresu a sken s přednastavenou metodou skenování. Nakonec jsme nakousli téma falešných nálezů.
Máte vlastní tipy pro tento nástroj? Využíváte jeho slovníky nebo píšete vlastní uživatelské databáze? Podělte se o svoje zkušenosti a napište nám na email nebo na facebook.
To je pro dnešek vše. Zvažujete-li cestu etického hackera od začátku nebo si chcete vyzkoušet nikto skener, rád uvidím na hacking kurzech.