Прежде чем атаковать любой веб-сайт, хакер или пентестер сначала составляет список целевых поверхностей. После того, как проведена хорошая разведку и найдены нужные места, на которые можно направить прицел, будет использован инструмент сканирования веб-сервера, такой как Nikto, для поиска уязвимостей, которые могут быть потенциальными векторами атаки. Nikto — это простой сканер веб-серверов с открытым исходным кодом, который исследует веб-сайт и сообщает о найденных уязвимостях, которые могут быть использованы для эксплуатации или взлома сайта. Кроме того, это один из наиболее широко используемых в отрасли инструментов обнаружения уязвимостей веб-сайтов, который во многих кругах считается отраслевым стандартом. В даной статье мы разберемся как происодит поиск уязвимостей сайта с помощью Nikto.
Правильный способ использования Nikto
Если вы просто запустите Nikto на целевом веб-сайте, вы можете не знать, что делать с информацией, полученной при сканировании. Nikto на самом деле больше похож на лазерную указку, чтобы вызвать гораздо более крупный удар, и вы скоро увидите, как это сработает.
Во-первых, давайте поговорим о целевой поверхности. Это везде, где хакер попытается атаковать, и может включать в себя такие вещи, как сетевые принтеры и веб-сервер. Когда позже мы перейдем к использованию Nikto, нам нужно будет предоставить ему один из трех различных типов информации: IP-адрес для локальной службы, веб-домен для атаки или веб-сайт SSL/HTTPS.
Прежде чем приступить к сканированию с помощью Nikto, лучше провести дополнительную разведку с помощью инструмента разведки с открытым исходным кодом, такого как Maltego. Такие инструменты могут помочь создать профиль и более целенаправленный список доступных целей, на которых следует сосредоточиться. Как только это будет сделано, Nikto можно использовать для выявления потенциальных уязвимостей для целей в списке.
Как использовать Maltego для отпечатков всей сети
Если повезет, будет найдена уязвимость с вооруженным эксплойтом, а это означает, что уже есть инструмент, чтобы воспользоваться этой слабостью. С помощью соответствующего инструмента, который автоматически использует уязвимость, хакер может получить доступ к цели для выполнения любого количества скрытых атак, таких как добавление кода для выполнения вредоносного действия.
Установка Nikto
Если вы используете Kali Linux, Nikto предустановлен, поэтому вам не нужно ничего загружать или устанавливать. Он будет находиться в категории «Анализ уязвимостей». Если по какой-то причине у вас его нет, вы можете получить Nikto с его GitHub или просто использовать команду apt install.
apt install nikto
Если вы делаете это на Mac, вы можете использовать Homebrew для установки Nikto.
brew install nikto
Знакомство с Nikto
Прежде чем погрузиться в сканирование веб-серверов с помощью Nikto, давайте воспользуемся опцией -Help, чтобы увидеть все, что можно сделать внутри Nikto.
nikto -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
-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
Использование основного синтаксиса
Как вы можете видеть из предыдущего шага, у Nikto есть много опций, но для наших целей мы будем придерживаться основного синтаксиса, как показано ниже. Мы заменим <IP или имя хоста> фактическим IP-адресом или именем хоста без угловых скобок.
nikto -h <IP or hostname>
Тем не менее, Nikto может выполнять сканирование, которое может выполняться после SSL и порта 443, порта, который используют веб-сайты HTTPS (по умолчанию HTTP использует порт 80). Таким образом, мы не ограничиваемся только сканированием старых сайтов, мы можем проводить оценку уязвимостей на сайтах, использующих SSL, что в наши дни является в значительной степени требованием для индексации в результатах поиска.
Если мы знаем, что это SSL-сайт, на который мы нацелены, мы можем указать его в Nikto, чтобы сэкономить время на сканировании, добавив -ssl
в конец команды.
nikto -h <IP or hostname> -ssl
Сканировать веб-сайт с поддержкой SSL
Например, давайте начнем со сканирования pbs.org, чтобы увидеть некоторые типы информации, которые покажет сканирование Nikto. После того, как он подключается к порту 443, мы видим, что есть некоторая полезная информация о шифре и список других деталей, таких как сервер Nginx, но здесь не так много интересных данных для нас.
nikto -h pbs.org -ssl
- Nikto v2.1.6
------------------------------------------------------------------------------
- STATUS: Starting up!
+ Target IP: 54.225.198.196
+ Target Hostname: pbs.org
+ Traget Port: 443
------------------------------------------------------------------------------
+ SSl Info: Subject: /CN=www.pbs.org
Altnames: account.pbs.org, admin.pgs.org, dipsy-tc.pbs.org, docs.pbs.org, ga.video.cdn.pbs.org, git.pbs.org, heart.ops.pbs.org, hub-dev.pbs.org, image.pbs.org,
jaws..pbs.org, kids.pbs.org, koth-qa.svp.pbs.org, login.pbs.org, ops.pbs.org, pbs.org, player.pbs.org, projects.pbs.org, sentry.pbs.org, teacherline.pbs.org,
urs.pbs.org, video.pbs.org, weta-qa.svp.pbs.org, whut-qa.svp.pbs.org, wnet.video-qa.pbs.org, wnet.video-staging.pbs.org, www-cache.pbs.org, www.pbs.org
Ciphers: ECDHE-RSA-AES128-GCM-SHA256
Issuer: /C-US/0=Let's Encrypt/CN=Let's Encrypt Authority X3
+ Start Time: 2018-12-05 23:34:06 (GMT-8)
------------------------------------------------------------------------------
+ Server: nginx
+ 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
+ Uncommon header 'x-pbs-fwsrvname' found, with contents: fwcacheproxy1
+ The site uses SSL and the Strict-Transport-Security HTTP header is not defined.
+ 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://www.pbs.org/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ RC-1918 IP address found in the 'x-pbs-appsvrip' header: The IP is "10.137.181.52".
+ Uncommon header 'x-cache-fs-status' found, with contents: EXPIRED
+ Uncommon header 'x-pbs-appsvrname' found, with contents: fwcacheproxy1
+ Uncommon header 'x-pbs-appsvrip' found, with contents: 10.137.181.52
+ Server leaks inodes via ETags, header found with file /pbs.org.zip, fields: 0x5b96537e 0x1678
+ 7446 requests: 0 error(s) and 10 item(s) reported on remote host
+ End Time: 2018-12-06 00:30:29 (GMT-8) (3383 seconds)
------------------------------------------------------------------------------
+ 1 host(s) tested
Сканирование IP-адресов
Теперь, когда мы выполнили быстрое сканирование веб-сайта, давайте попробуем использовать Nikto в локальной сети, чтобы найти встроенные серверы, такие как страница входа для маршрутизатора или служба HTTP на другом компьютере, который является просто сервером без веб-сайта. Для начала давайте найдем наш IP-адрес с помощью ifconfig.
ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.0.48 netmask 0xffffff00 broadcast 192.168.0.255
inet6 XXXX::XXX:XXXX:XXXX:XXXX%en0 prefixlen 64 secured scopeid 0x8
ether XX:XX:XX:XX:XX:XX txqueuelen 1000 (Ethernet)
inet6 XXXX::XXX:XXXX:XXXX:XXXX%en0 prefixlen 64 autoconf secured
inet6 XXXX::XXX:XXXX:XXXX:XXXX%en0 prefixlen 64 autoconf temporary
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
en2: flags=8863<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TS04,TS06>
ether XX:XX:XX:XX:XX:XX
media: autoselect <full-duplex>
status: inactive
Нам нужен IP-адрес «inet». Затем мы можем запустить на нем ipcalc, чтобы получить диапазон нашей сети. Если у вас нет ipcalc, вы можете установить его с помощью apt install ipcalc, а затем повторить попытку. Диапазон будет рядом с «Network,» в моем случае 192.168.0.0/24.
ipcalc 192.168.0.48
Address: 192.168.0.48 11000000.10101000.00000000. 00110000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 192.168.0.0/24 11000000.10101000.00000000. 00000000
HostMin: 192.168.0.1 11000000.10101000.00000000. 00000001
HostMax: 192.168.0.254 11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255 11000000.10101000.00000000. 11111111
Hosts/Net: 254 Class C, Private Internet
Теперь нам нужно запустить Nmap, чтобы найти службы, работающие в сетевом диапазоне. Давайте просканируем порт 80 с нашим диапазоном и добавим -oG (отображаемый вывод), чтобы извлечь только те хосты, которые запущены и работают, то есть те, которые отвечают, указывая, что порт 80 открыт. Затем мы сохраним все в файл, который я называю nullbyte.txt, но он может называться как угодно.
nmap -p 80 192.168.0.0/24 -oG nullbyte.txt
Starting Nmap 7.60 ( https://nmap.org ) at 2018-12-06 00:43 PST
Nmap scan report for 192.168.0.1
Host is up (0.021s latency).
PORT STATE SERVICE
80/tcp open http
Nmap scan report for 192.168.0.2
Host is up (0.088s latency).
PORT STATE SERVICE
80/tcp open http
Nmap scan report for 192.168.0.4
Host is up (0.032s latency).
PORT STATE SERVICE
80/tcp open http
Nmap scan report for 192.168.0.5
Host is up (0.020s latency).
PORT STATE SERVICE
80/tcp open http
Nmap scan report for 192.168.0.11
Host is up (0.068s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap scan report for 192.168.0.24
Host is up (0.023s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap scan report for 192.168.0.31
Host is up (0.059s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap scan report for 192.168.0.48
Host is up (0.030s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap scan report for 192.168.0.60
Host is up (0.092s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap done: 256 IP addresses (9 hosts up) scanned in 8.92 seconds
Есть хороший маленький трюк, который может отправить все хосты прямо в Nikto для сканирования. Мы используем cat для чтения вывода, хранящегося в нашем документе nullbyte.txt (или как вы его назвали). Кроме того, есть awk, инструмент для Linux, который поможет найти следующий шаблон, где Up означает, что хост работает, а print $2 означает вывод второго слова в этой строке для каждого, т. е. только IP-адреса. Затем мы отправляем эти данные в новый файл с именем targetIP.txt (или как вы хотите его назвать).
cat nullbyte.txt | awk '/Up$/{print $2}' | cat >> targetIP.txt
Теперь мы можем просмотреть содержимое нашего нового файла с помощью cat, чтобы увидеть все IP-адреса, у которых открыт порт 80.
cat targetIP.txt
192.168.0.1
192.168.0.2
192.168.0.4
192.168.0.5
192.168.0.11
192.168.0.24
192.168.0.31
192.168.0.48
192.168.0.60
Это идеально подходит для Nikto, потому что он может легко интерпретировать такие файлы. Таким образом, мы можем отправить этот вывод в Nikto с помощью следующей команды.
nikto -h targetIP.txt
Результаты будут похожи на те, которые мы получили при выполнении сканирования SSL.
Сканирование HTTP-сайта
Мы просканировали безопасный веб-сайт и IP-адрес в локальной сети, и теперь пришло время проверить незащищенный веб-домен, используя порт 80. В этом примере я использую «afl.com.au», который не был используя SSL в то время, когда я выполнял это сканирование.
nikto -h www.afl.com.au
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP: 159.180.84.10
+ Target Hostname: www.afl.com.au
+ Target Port: 80
+ Start Time: 2018-12-05 21:48:32 (GMT-8)
---------------------------------------------------------------------------
+ Server: instart/nginx
+ Retried via header: 1.1 varnish (Varnish/6.1), 1.1 e9ba0a9a729ff2960a04323bf1833df8.cloudfront.net (CloudFront)
+ 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
+ Uncommon header 'x-cache' found, with contents: Miss from cloudfront
+ Uncommon header 'x-instart-cache-id' found, with contents: 17:12768802731504004780::1544075250
+ Uncommon header 'v-cache-hit' found, with contents: Hit
+ Uncommon header 'x-amz-cf-id' found, with contents: Dr-r6OwO5kk9ABt4ejzpc7R7AIF6SuH6kfJHQgP0v6xZoHwMLE55rQ==
+ Uncommon header 'x-instart-request-id' found, with contents: 12814413144077601501:BEQ01-CPVNPPRY18:1552504721:0
+ Uncommon header 'x-oneagent-js-injection' found, with contents: true
+ Uncommon header 'grace' found, with contents: cache
+ 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
+ Uncommon header 'x-ruxit-js-agent' found, with contents: true
+ Cookie dtCookie created without the httponly flag
+ Server banner has changed from 'instart/nginx' to 'nginx' which may suggest a WAF, load balancer or proxy is in place
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Entry '/sites/' in robots.txt returned a non-forbidden or redirect HTTP code (200)
+ Entry '/search/' in robots.txt returned a non-forbidden or redirect HTTP code (200)
+ Entry '*.mobileapp' in robots.txt returned a non-forbidden or redirect HTTP code (400)
+ Entry '*.liveradio' in robots.txt returned a non-forbidden or redirect HTTP code (400)
+ Entry '*.smartmobile' in robots.txt returned a non-forbidden or redirect HTTP code (400)
+ Entry '*.responsive' in robots.txt returned a non-forbidden or redirect HTTP code (400)
+ Entry '/stats?*/' in robots.txt returned a non-forbidden or redirect HTTP code (200)
+ "robots.txt" contains 8 entries which should be manually viewed.
+ OSVDB-3092: /sitemap.xml: This gives a nice listing of the site content.
+ OSVDB-3092: /psql_history: This might be interesting...
+ OSVDB-3092: /global/: This might be interesting...
+ OSVDB-3092: /home/: This might be interesting...
+ OSVDB-3092: /news: This might be interesting...
+ OSVDB-3092: /search.vts: This might be interesting...
+ OSVDB-3092: /stats.htm: This might be interesting...
+ OSVDB-3092: /stats.txt: This might be interesting...
+ OSVDB-3092: /stats/: This might be interesting...
+ OSVDB-3092: /Stats/: This might be interesting...
+ OSVDB-3093: /.wwwacl: Contains authorization information
+ OSVDB-3093: /.www_acl: Contains authorization information
+ OSVDB-3093: /.htpasswd: Contains authorization information
+ OSVDB-3093: /.access: Contains authorization information
+ OSVDB-3093: /.addressbook: PINE addressbook, may store sensitive e-mail address contact information and notes
+ OSVDB-3093: /.bashrc: User home dir was found with a shell rc file. This may reveal file and path information.
+ OSVDB-3093: /.bash_history: A user's home directory may be set to the web root, the shell history was retrieved. This should not be accessible via the web.
+ OSVDB-3093: /.forward: User home dir was found with a mail forward file. May reveal where the user's mail is being forwarded to.
+ OSVDB-3093: /.history: A user's home directory may be set to the web root, the shell history was retrieved. This should not be accessible via the web.
+ OSVDB-3093: /.htaccess: Contains configuration and/or authorization information
+ OSVDB-3093: /.lynx_cookies: User home dir found with LYNX cookie file. May reveal cookies received from arbitrary web sites.
+ OSVDB-3093: /.mysql_history: Database SQL?
+ OSVDB-3093: /.passwd: Contains authorization information
+ OSVDB-3093: /.pinerc: User home dir found with a PINE rc file. May reveal system information, directories and more.
+ OSVDB-3093: /.plan: User home dir with a .plan, a now mostly outdated file for delivering information via the finger protocol
+ OSVDB-3093: /.proclog: User home dir with a Procmail rc file. May reveal mail traffic, directories and more.
+ OSVDB-3093: /.procmailrc: User home dir with a Procmail rc file. May reveal subdirectories, mail contacts and more.
+ OSVDB-3093: /.profile: User home dir with a shell profile was found. May reveal directory information and system configuration.
+ OSVDB-3093: /.rhosts: A user's home directory may be set to the web root, a .rhosts file was retrieved. This should not be accessible via the web.
+ OSVDB-3093: /.sh_history: A user's home directory may be set to the web root, the shell history was retrieved. This should not be accessible via the web.
+ OSVDB-3093: /.ssh: A user's home directory may be set to the web root, an ssh file was retrieved. This should not be accessible via the web.
+ OSVDB-5709: /.nsconfig: Contains authorization information
+ /portal/changelog: Vignette richtext HTML editor changelog found.
+ 7587 requests: 4 error(s) and 55 item(s) reported on remote host
+ End Time: 2018-12-05 22:42:41 (GMT-8) (3249 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
Выше мы видим, что есть сервер Varnish и некоторые заголовки, которые помогают указать, как настроен веб-сайт. Тем не менее, самое интересное — это найденные каталоги, которые могут помочь найти файлы конфигурации, которые могут содержать учетные данные или другие вещи, которые были неправильно настроены и оставлены непреднамеренно доступными.
Элементы с префиксом OSVDB — это уязвимости, о которых сообщается в базе данных уязвимостей с открытым исходным кодом (сайт, закрытый в 2016 году). Он похож на другие базы данных уязвимостей, такие как SecurityFocus, Microsoft Technet и Common Vulnerabilities and Exposures. Я предпочитаю проверять Национальную базу данных уязвимостей.
Хотя нет никаких важных вещей, которые можно было бы использовать в результате этого сканирования, если бы они были, вы можете использовать справочный инструмент CVE для преобразования идентификатора OSVDB в запись CVE, поэтому вы можете использовать один из других сайтов выше, чтобы узнать больше. об уязвимости.
Допустим, мы нашли что-то стоящее изучения, например CVE-2018-10933, уязвимость Libssh, которую мы подробно рассмотрели ранее. CVE содержит информацию о том, что может быть использовано, какова оценка серьезности (например, критическая) и некоторую другую информацию, которая может помочь определить вектор атаки. Если это что-то, что стоит использовать, вы можете поискать в Metasploit, поскольку кто-то, вероятно, уже разработал для него боевой модуль, чтобы его было легче использовать.
Пара сканов с Metasploit
Одна из лучших особенностей Nikto заключается в том, что вы можете экспортировать информацию в формат, который Metasploit может прочитать при сканировании. Для этого просто используйте приведенные выше команды для выполнения сканирования, добавив в конец -Format msf+. Формат может помочь нам быстро сопоставить полученные данные с вооруженным эксплойтом.
nikto -h <IP or hostname> -Format msf+
Заключение
Итак, в этом руководстве мы перешли от определения площади поверхности цели к поиску уязвимости, а затем соединили ее с боевым эксплойтом, поэтому нам не нужно выполнять всю работу. Поскольку Nikto не является скрытым инструментом, целесообразно выполнять такие типы сканирования из VPN, через Tor или другой тип службы, чтобы ваш реальный IP-адрес не был помечен подозрительным поведением.