Статья PWK-(7) Активный сбор информации

disclaimer: Данный материал является свободным (приближенным к оригиналу) переводом методического материала PWK, в частности Глава 7. Активный сбор информации. В связи с закрытым форматом распространения данного материала убедительная просьба ознакомившихся с ней не осуществлять свободное распространение содержимого статьи, чтобы не ставить под удар других участников форума. Приятного чтения.
Вступление

В этом материале выйдем за рамки пассивного сбора информации и рассмотрим методы, которые включают прямое взаимодействие с целевыми службами. Рассмотрим некоторые основополагающие методы, но имейте в виду, что есть бесчисленное множество способов для этого. Сбор информации включает в себя взаимодействие с Active Directory, которая будет рассмотрена более подробно в отдельной статье. В этом модуле будут рассмотрены некоторые из наиболее распространенных методов активного сбора информации, включая сканирование портов и сбор информации о DNS, SMB, NFS, SMTP и SNMP.

Сбор информации о DNS

является одной из наиболее важных систем в Интернете и представляет собой распределенную базу данных, отвечающую за преобразование удобных для пользователей доменных имен в IP-адреса.

Этому способствует иерархическая структура, которая разделена на несколько зон, начиная с корневой зоны верхнего уровня. Давайте подробнее рассмотрим процесс и серверы, участвующие в определении имени хоста, такого как .

Процесс начинается, когда имя хоста вводится в браузер или другое приложение. Браузер передает имя хоста DNS-клиенту операционной системы, а затем операционная система пересылает запрос на внешний DNS-сервер, который выбран для использования. Этот первый сервер в цепочке известен как рекурсор DNS. Он отвечает за взаимодействие с инфраструктурой DNS и возврат результатов клиенту DNS. Рекурсор DNS связывается с одним из серверов в корневой зоне DNS. Затем корневой сервер отвечает адресом сервера, ответственного за зону, содержащую , в данном случае .com TLD.

Как только рекурсор DNS получает адрес DNS-сервера TLD, он запрашивает у него адрес официального сервера имен для домена megacorpone.com. Полномочный сервер имен является последним этапом процесса поиска DNS и содержит записи DNS в локальной базе данных, известной как файл зоны. Обычно в нем размещаются две зоны для каждого домена: зона прямого просмотра, которая используется для поиска IP-адреса определенного имени хоста, и зона обратного просмотра (если это настроено администратором), которая используется для поиска имени узла определенного IP-адреса. После того, как рекурсор DNS предоставит клиенту DNS IP-адрес для , браузер сможет связаться с нужным веб-сервером по его IP-адресу и загрузить веб-страницу.

Для повышения производительности и надежности DNS используется кэширование для хранения локальных копий записей DNS на разных этапах процесса поиска. Именно по этой причине некоторые современные приложения, такие как веб-браузеры, хранят отдельный кэш DNS. Кроме того, локальный DNS-клиент операционной системы также поддерживает свой собственный DNS-кэш вместе с каждым из DNS-серверов в процессе поиска. Владельцы домена также могут контролировать длительность кэширования DNS-записи сервером или клиентом через поле Time To Live (TTL) DNS-записи.

Взаимодействие с DNS-сервером

Каждый домен может использовать различные типы записей DNS. Некоторые из наиболее распространенных типов DNS включают в себя:

- NS - Записи Nameserver содержат имена доверенных серверов, на которых размещены записи DNS для домена.
- A - Также известная как запись хоста, "a record" содержит IP-адрес имени хоста (такой как ).
- MX - Записи Mail Exchange содержат имена серверов, ответственных за обработку электронной почты для домена. Домен может содержать несколько записей MX.
- PTR - Записи Pointer используются в зонах обратного поиска, а также для поиска записей, связанных с IP-адресом.
- CNAME - Записи Canonical Name используются для создания псевдонимов для других записей хоста.
- TXT - Записи Text могут содержать любые произвольные данные и могут использоваться в различных целях, например, для проверки права собственности на домен.

В связи с большим количеством информации, содержащейся в DNS, она часто является выгодной целью для активного сбора информации.

Чтобы продемонстрировать это, воспользуемся командой host для поиска IP-адреса :

Bash:
kali@kali:~$ host www.megacorpone.com
www.megacorpone.com has address 38.100.193.76
Листинг 1 - Использование host для поиска записи A для

По умолчанию команда host ищет запись A, но можно установить и другие поля, например, MX или TXT записи. Для этого используем опцию -t, чтобы указать тип искомой записи:

Bash:
kali@kali:~$ host -t mx megacorpone.com
megacorpone.com mail is handled by 10 fb.mail.gandi.net.
megacorpone.com mail is handled by 50 mail.megacorpone.com.
megacorpone.com mail is handled by 60 mail2.megacorpone.com.
megacorpone.com mail is handled by 20 spool.mail.gandi.net.

kali@kali:~$ host -t txt megacorpone.com
megacorpone.com descriptive text "Try Harder"
Листинг 2 - Использование host для поиска MX и TXT записей для megacorpone.com

Автоматический поиск

Теперь, когда есть немного исходных данных домена megacorpone.com, можно продолжать использовать дополнительные DNS-запросы, чтобы обнаружить больше имен хостов и IP-адресов, принадлежащих одному и тому же домену. Например, известно, что домен имеет веб-сервер с именем хоста " ".

Запустим host в отношении этого имени:

Bash:
kali@kali:~$ host www.megacorpone.com
www.megacorpone.com has address 38.100.193.76
Листинг 3 - Использование host для поиска действительного хоста

Теперь посмотрим, есть ли у megacorpone.com сервер с именем хоста "idontexist". Обратите внимание на разницу между выводами запросов:

Bash:
kali@kali:~$ host idontexist.megacorpone.com
Host idontexist.megacorpone.com not found: 3(NXDOMAIN)
Листинг 4 - Использование host для поиска недействительного хоста

В Листинге 3 было запрошено действительное имя хоста и получили ответ с разрешением IP-адреса. В Листинге 4 была выведена ошибка ( ), которая указывала на то, что публичная DNS-запись для этого имени хоста не существует. Теперь, когда есть понимание, как искать действительные имена хостов, можно автоматизировать наши усилия.

Перебор доменных имён

Брутфорс - это метод проб и ошибок, который стремится найти реальную информацию о веб-сервере: каталоги, комбинации имени пользователя и пароля или, в данном случае, действительные записи DNS. Используя список слов, содержащий обычные имена хостов, можно попытаться угадать DNS-записи и проверить ответ на существующие имена.

В примерах был использован прямой поиск, который запрашивает IP-адрес имени хоста. Если хост успешно разрешает имя в IP, это может указывать на существующий сервер. Можно автоматизировать прямой DNS-поиск общих имен хостов, используя команду host в однострочнике Bash.

Во-первых, создадим список возможных имен хостов:

Bash:
kali@kali:~$ cat list.txt
www
ftp
mail
owa
proxy
router
Листинг 5 - Небольшой список возможных имён

Далее используем однострочник Bash, чтобы попытаться разрешить каждое имя хоста в IP-адрес:

Bash:
kali@kali:~$ for ip in $(cat list.txt); do host $ip.megacorpone.com; done
www.megacorpone.com has address 38.100.193.76
Host ftp.megacorpone.com not found: 3(NXDOMAIN)
mail.megacorpone.com has address 38.100.193.84
Host owa.megacorpone.com not found: 3(NXDOMAIN)
Host proxy.megacorpone.com not found: 3(NXDOMAIN)
router.megacorpone.com has address 38.100.193.71
Листинг 6 - Использование Bash для поиска DNS-имен методом грубого перебора

С помощью этого простого списка слов обнаружены записи для "www", "mail" и "router". Однако имена хостов "ftp", "owa" и "proxy" не были найдены. Гораздо более полные списки слов доступны в рамках проекта SecLists. Эти списки слов можно установить в каталог /usr/share/seclists с помощью команды sudo apt install seclists.

Обратный перебор доменных имён

В результате прямого перебора DNS было выявлено несколько IP-адресов в одном и том же диапазоне (38.100.193.X). Если бы администратор DNS megacorpone.com настроил для домена, возможно было бы просканировать диапазон с помощью обратного перебора, чтобы запросить имя хоста для каждого IP.

Давайте используем цикл для сканирования IP-адресов с 38.100.193.50 по 38.100.193.100. Отфильтруем недействительные результаты, показывая только те записи, которые не содержат "not found" (с grep -v):

Bash:
kali@kali:~$ for ip in $(seq 50 100); do host 38.100.193.$ip; done | grep -v "not found"
69.193.100.38.in-addr.arpa domain name pointer beta.megacorpone.com.
70.193.100.38.in-addr.arpa domain name pointer ns1.megacorpone.com.
72.193.100.38.in-addr.arpa domain name pointer admin.megacorpone.com.
73.193.100.38.in-addr.arpa domain name pointer mail2.megacorpone.com.
76.193.100.38.in-addr.arpa domain name pointer www.megacorpone.com.
77.193.100.38.in-addr.arpa domain name pointer vpn.megacorpone.com.
...
Листинг 7 - Использование Bash для перебора имен DNS

Удалось преобразовать несколько IP-адресов в действительные хосты с помощью обратного перебора DNS. Если бы был проведен анализ вывода, возможно было бы дополнительно экстраполировать эти результаты и провести сканирование "mail1", "mail3" и т.д., и иных успешных результататов обратного перебора. Дело в том, что эти типы сканирования часто цикличны; поиск расширяется на основе любой информации, которую получаем на каждой итерации.

Передача зоны DNS

Передача зоны - это репликация базы данных между соответствующими DNS-серверами, в которой файл зоны копируется с главного DNS-сервера на подчиненный сервер. Файл зоны содержит список всех имен DNS, настроенных для этой зоны. Передача зон должна быть разрешена только авторизованным подчиненным DNS-серверам, но многие администраторы неправильно настраивают свои DNS-серверы. В таких случаях любой, кто запрашивает копию зоны DNS-сервера, обычно получает её.

Это эквивалентно передаче хакеру макета корпоративной сети на серебряном блюде. Все имена, адреса и функции серверов могут быть открыты для посторонних глаз.

Существуют организации, чьи DNS-серверы настолько плохо настроены, что не разделяют свое внутреннее пространство имен DNS и внешнее пространство имен DNS на отдельные, не связанные между собой зоны. Это позволяет получить полную карту внутренней и внешней структуры сети. Это не нормально, когда DNS-сервер настроен таким образом.

Успешная передача зоны не приводит напрямую к нарушению работы сети, хотя и облегчает процесс её взлома.

Синтаксис команды host для выполнения передачи зоны выглядит следующим образом:

Bash:
host -l <domain name> <dns server address>
Листинг 8 - Использование команды host для передачи зоны DNS

Из результата работы команды host (Листинг 1) видно, что три DNS-сервера обслуживают домен megacorpone.com: ns1, ns2 и ns3. Давайте попробуем передачу зоны в отношении каждого.

Мы будем использовать host -l (list zone) для попытки передачи зоны:

Bash:
kali@kali:~$ host -l megacorpone.com ns1.megacorpone.com
Using domain server:
Name: ns1.megacorpone.com
Address: 38.100.193.70#53
Aliases:

Host megacorpone.com not found: 5(REFUSED)
; Transfer failed.
Листинг 9 - Первая попытка передачи зоны не удалась

К сожалению, первый сервер имен, ns1, не разрешает передачу зон DNS, поэтому попытка не удалась.

Попробуем выполнить те же шаги, используя второй сервер имен, ns2:

Bash:
kali@kali:~$ host -l megacorpone.com ns2.megacorpone.com
Using domain server:
Name: ns2.megacorpone.com
Address: 38.100.193.80#53
Aliases:

megacorpone.com name server ns1.megacorpone.com.
megacorpone.com name server ns2.megacorpone.com.
megacorpone.com name server ns3.megacorpone.com.
admin.megacorpone.com has address 38.100.193.83
beta.megacorpone.com has address 38.100.193.88
fs1.megacorpone.com has address 38.100.193.82
intranet.megacorpone.com has address 38.100.193.87
mail.megacorpone.com has address 38.100.193.84
mail2.megacorpone.com has address 38.100.193.73
ns1.megacorpone.com has address 38.100.193.70
...
Листинг 10 - Использование команды host для демонстрации передачи зоны DNS

Этот сервер позволяет передавать зоны и предоставляет полный дамп файла зоны для домена megacorpone.com, предоставляя удобный список IP-адресов и соответствующих имен хостов DNS!

Домен megacorpone.com имеет очень мало DNS-серверов для проверки. Однако в некоторых крупных организациях может быть размещено много DNS-серверов, или можно попытаться выполнить запросы на передачу зоны для всех DNS-серверов в данном домене. Bash-скрипты могут помочь справиться с этой задачей.

Для попытки передачи зоны с помощью команды host нам понадобятся два параметра: адрес сервера имен и имя домена. Можно получить серверы имен для данного домена с помощью следующей команды:

Bash:
kali@kali:~$ host -t ns megacorpone.com | cut -d " " -f 4
ns1.megacorpone.com.
ns2.megacorpone.com.
ns3.megacorpone.com.
Листинг 11 - Использование команды host для получения DNS-серверов для данного доменного имени

Выполнив этот шаг, можно написать Bash-скрипт, чтобы автоматизировать процесс идентификации соответствующих серверов имен и попытки передачи зоны из каждого:

Bash:
#!/bin/bash

# Simple Zone Transfer Bash Script
# $1 is the first argument given after the bash script
# Check if argument was given, if not, print usage

if [ -z "$1" ]; then
  echo "[*] Simple Zone transfer script"
  echo "[*] Usage   : $0 <domain name> "
  exit 0
fi

# if argument was given, identify the DNS servers for the domain

for server in $(host -t ns $1 | cut -d " " -f4); do
  # For each of these servers, attempt a zone transfer
  host -l $1 $server |grep "has address" ]
done
Листинг 12 - Bash-скрипт для передачи зоны DNS

Сделаем скрипт исполняемым и запустим его в отношении megacorpone.com.

Bash:
kali@kali:~$ chmod +x dns-axfr.sh

kali@kali:~$ ./dns-axfr.sh megacorpone.com
admin.megacorpone.com has address 38.100.193.83
beta.megacorpone.com has address 38.100.193.88
fs1.megacorpone.com has address 38.100.193.82
intranet.megacorpone.com has address 38.100.193.87
mail.megacorpone.com has address 38.100.193.84
mail2.megacorpone.com has address 38.100.193.73
ns1.megacorpone.com has address 38.100.193.70
ns2.megacorpone.com has address 38.100.193.80
ns3.megacorpone.com has address 38.100.193.90
router.megacorpone.com has address 38.100.193.71
...
Листинг 13 - Запуск Bash-сценария передачи зоны DNS

Утилиты для перечисления DNS в Kali Linux

В Kali Linux есть несколько инструментов, которые могут автоматизировать процесс сбора информации о DNS. Два примечательных примера - это DNSRecon и DNSenum. Используемые опции данных утилит, будут рассмотренны далее.

DNSRecon

DNSRecon - это современный скрипт для перечисления DNS, написанный на Python. Запуск dnsrecon в отношении megacorpone.com с использованием параметра -d для указания имени домена и -t для указания способа сбора информации (в данном случае передачи зоны) приводит к следующему выводу:

Bash:
kali@kali:~$ dnsrecon -d megacorpone.com -t axfr
[*] Testing NS Servers for Zone Transfer
[*] Checking for Zone Transfer for megacorpone.com name servers
[*] Resolving SOA Record
[+]      SOA ns1.megacorpone.com 38.100.193.70
[*] Resolving NS Records
[*] NS Servers found:
[*]     NS ns1.megacorpone.com 38.100.193.70
[*]     NS ns2.megacorpone.com 38.100.193.80
[*]     NS ns3.megacorpone.com 38.100.193.90
[*] Removing any duplicate NS server IP Addresses...
[*]
[*] Trying NS server 38.100.193.80
[+] 38.100.193.80 Has port 53 TCP Open
[+] Zone Transfer was successful!!
[*]      NS ns1.megacorpone.com 38.100.193.70
[*]      NS ns2.megacorpone.com 38.100.193.80
[*]      NS ns3.megacorpone.com 38.100.193.90
[*]      MX @.megacorpone.com fb.mail.gandi.net 217.70.178.215
[*]      MX @.megacorpone.com fb.mail.gandi.net 217.70.178.217
[*]      MX @.megacorpone.com fb.mail.gandi.net 217.70.178.216
[*]      MX @.megacorpone.com spool.mail.gandi.net 217.70.178.1
[*]      A admin.megacorpone.com 38.100.193.83
[*]      A fs1.megacorpone.com 38.100.193.82
[*]      A www2.megacorpone.com 38.100.193.79
[*]      A test.megacorpone.com 38.100.193.67
[*]      A ns1.megacorpone.com 38.100.193.70
[*]      A ns2.megacorpone.com 38.100.193.80
[*]      A ns3.megacorpone.com 38.100.193.90
...
[*]
[*] Trying NS server 38.100.193.70
[+] 38.100.193.70 Has port 53 TCP Open
[-] Zone Transfer Failed!
[-] No answer or RRset not for qname
[*]
[*] Trying NS server 38.100.193.90
[+] 38.100.193.90 Has port 53 TCP Open
[-] Zone Transfer Failed!
[-] No answer or RRset not for qname
Листинг 14 - Использование dnsrecon для передачи зоны

Исходя из вышеприведенного вывода, удалось выполнить успешную передачу зоны DNS домена megacorpone.com. В результате получается полный дамп файла зоны домена. Попробуем перебрать дополнительные имена хостов, используя файл list.txt, который был создан ранее для прямого перебора. Этот список выглядит так:

Bash:
kali@kali:~$ cat list.txt
www
ftp
mail
owa
proxy
router
Листинг 15 - Список, используемый для подбора доменного имени с помощью dnsrecon

Чтобы начать попытку перебора используем опцию -d, чтобы указать имя домена, -D чтобы указать имя файла, содержащего потенциальные строки поддоменов, и -t чтобы указать способа сбора информации (в данном случае brt для брутфорса):

Bash:
kali@kali:~$ dnsrecon -d megacorpone.com -D ~/list.txt -t brt
[*] Performing host and subdomain brute force against megacorpone.com
[*]      A router.megacorpone.com 38.100.193.71
[*]      A www.megacorpone.com 38.100.193.76
[*]      A mail.megacorpone.com 38.100.193.84
[+] 3 Records Found
Листинг 16 - Брутфорс имен хостов с использованием dnsrecon

Попытка перебора закончилась, и удалось найти несколько имен хостов.

DNSenum

DNSEnum - еще один популярный инструмент перечисления DNS. Чтобы показать другой вывод, запустим dnsenum для домена zonetransfer.me (который принадлежит и специально разрешает передачу зоны):

Bash:
kali@kali:~$ dnsenum zonetransfer.me
dnsenum.pl VERSION:1.2.2
-----   zonetransfer.me   -----

Host's addresses:
__________________

zonetransfer.me                          7200     IN    A        217.147.180.162

Name Servers:
______________

ns12.zoneedit.com                        3653     IN    A        209.62.64.46
ns16.zoneedit.com                        6975     IN    A        69.64.68.41

Mail (MX) Servers:
___________________

ASPMX5.GOOGLEMAIL.COM                    293      IN    A        173.194.69.26
ASPMX.L.GOOGLE.COM                       293      IN    A        173.194.74.26
ALT1.ASPMX.L.GOOGLE.COM                  293      IN    A        173.194.66.26
ALT2.ASPMX.L.GOOGLE.COM                  293      IN    A        173.194.65.26
ASPMX2.GOOGLEMAIL.COM                    293      IN    A        173.194.78.26
ASPMX3.GOOGLEMAIL.COM                    293      IN    A        173.194.65.26
ASPMX4.GOOGLEMAIL.COM                    293      IN    A        173.194.70.26


Trying Zone Transfers and getting Bind Versions:
_________________________________________________

Trying Zone Transfer for zonetransfer.me on ns12.zoneedit.com ...
zonetransfer.me                          7200     IN    SOA
zonetransfer.me                          7200     IN    NS ...
office.zonetransfer.me                   7200     IN    A        4.23.39.254
owa.zonetransfer.me                      7200     IN    A        207.46.197.32
info.zonetransfer.me                     7200     IN    TXT
asfdbbox.zonetransfer.me                 7200     IN    A        127.0.0.1
canberra_office.zonetransfer.me          7200     IN    A        202.14.81.230
asfdbvolume.zonetransfer.me              7800     IN
AFSDB email.zonetransfer.me                    2222     IN
NAPTR dzc.zonetransfer.me                      7200     IN    TXT
robinwood.zonetransfer.me                302      IN    TXT
vpn.zonetransfer.me                      4000     IN    A        174.36.59.154
_sip._tcp.zonetransfer.me                14000    IN    SRV
dc_office.zonetransfer.me                7200     IN    A        143.228.181.132

ns16.zoneedit.com Bind Version: 8.4.X

brute force file not specified, bay.
Листинг 17 - Использование dnsenum для передачи зоны

Эти инструменты сбора информации являются одновременно функциональными и простыми.

Сканирование портов

Сканирование портов - это процесс проверки TCP или UDP портов на удаленной машине для обнаружения, какие сервисы запущены на цели и какие векторы атаки могут иметь место.

Обратите внимание, что сканирование портов не похоже на типичную пользовательскую активность и может считаться незаконным в некоторых юрисдикциях. Поэтому его не следует проводить вне лабораторий без прямого письменного разрешения владельца целевой сети.

Важно понимать последствия сканирования портов, а также влияние, которое может оказать конкретное сканирование. Из-за большой объема трафика и агрессивного характера, слепое выполнение сканирования портов может иметь негативные последствия для целевых систем или клиентской сети, например, вызывать перегрузку серверов и сетевых соединений или срабатывание IDS. Выполнение неправильного сканирования может привести к простоям в обслуживании клиентов.

Использование правильной методологии сканирования портов может значительно повысить эффективность работы пентестера, одновременно снижая риски. В зависимости от сферы применения, вместо того, чтобы проводить сканирование всех портов в целевой сети, можно начать со сканирования только портов 80 и 443. Имея список возможных веб-серверов, можно запустить полное сканирование портов на них в то время, как осуществляется сбор информации из других источников. Как только полное сканирование портов будет завершено, можно будет с каждым последующим сканированием всё более сужать задействованную область, чтобы получить еще больше информации. Сканирование портов следует рассматривать как динамический процесс, уникальный для каждого пентеста. Результаты одного сканирования определяют характер и масштаб следующего сканирования.

Сканирование UDP и TCP

Изучение темы сканирования портов следует начинать с простого сканирования TCP и UDP с помощью Netcat. Следует отметить, что Netcat не является сканером портов, но может быть использован как таковой в простейшем случае. Так как он уже присутствует во многих системах, можно использовать некоторые из его функциональных возможностей, чтобы реализовать базовое сканирование портов, когда нет необходимости в полнофункциональном сканере. Тем не менее, есть более подходящие инструменты для сканирования портов, которые будут далее детально рассмотрены.

Сканирование TCP

Самая простая техника TCP-сканирования (обычно называемая connect scanning) использует . Этот механизм спроектирован так, что два хоста сначала договариваются о параметрах TCP-соединения, а уже затем передают какие-либо данные. Простыми словами: хост отсылает TCP SYN пакет на целевой порт сервера и, если этот порт открыт, то сервер отвечает SYN-ACK пакетом. В конце хост-клиент посылает ACK пакет, чтобы завершить рукопожатие. Если рукопожатие прошло успешно, то порт считается открытым.

Чтобы проиллюстрировать это, просканируем TCP-порты 3388-3390 с помощью Netcat. Опция -w указывает таймаут соединения в секундах, а -z устанавливает режим нулевого ввода-вывода (zero-I/O), который используется только для сканирования без отправки данных:

Bash:
kali@kali:~$ nc -nvv -w 1 -z 10.11.1.220 3388-3390
(UNKNOWN) [10.11.1.220] 3390 (?) : Connection refused
(UNKNOWN) [10.11.1.220] 3389 (?) open
(UNKNOWN) [10.11.1.220] 3388 (?) : Connection refused
sent 0, rcvd 0
Листинг 18 - Использование nc для сканирования портов TCP

Основываясь на этом выводе, видно, что порт 3389 открыт, в то время как по портам 3388 и 3390 в соединении отказано (превышен тайм-аут). На скриншоте ниже показаны пакеты этого сканирования, захваченные Wireshark:

tcp_scanning_1.png


Рисунок 1: Пакеты, захвачанные Wireshark, при сканировании портов с помощью Netcat

В захваченном трафике (Рисунок 1) видно, что Netcat послал несколько TCP SYN пакетов на порты 3390, 3389 и 3388, что видно в строках 1, 5, и 9 соответственно. В связи с различными факторами, включая проблемы таймаута, порядок пакетов в Wireshark может нарушаться. Обратите внимание, сервер послал TCP SYN-ACK пакет с порта 3389 на 6'ой строке, показав что порт открыт. Остальные порты не ответили таким же SYN-ACK пакетом, поэтому можно сделать вывод, что они не открыты.

Наконец, в строке 8 Netcat закрыл это соединение, отправив FIN-ACK пакет.

Сканирование UDP

Поскольку UDP не предполагает трехэтапного рукопожатия, механизм сканирования UDP-портов отличается от TCP.

С помощью Netcat запустим сканирование UDP портов 160-162 на другой цели. Это делается с помощью одной из опций nc, которая ранее не использовалась -u, означающей сканирование UDP:

Bash:
kali@kali:~$ nc -nv -u -z -w 1 10.11.1.115 160-162
(UNKNOWN) [10.11.1.115] 161 (snmp) open
Листинг 19 - Использование Netcat для выполнения UDP-сканирования

Из лога Wireshark можно увидеть, что UDP-сканирование использует механизмы отличные от TCP-сканирования:

udp_scanning_1.png


Рисунок 2: Wireshark-лог пакетов во время UDP-сканирования

Как видно на рисунке 2, пустой пакет отправляется на определенный порт (пакеты 3, 5, 6 и 7). Если целевой UDP-порт открыт, то пакет пройдет на прикладной уровень и ответ будет зависеть от того, как приложение запрограммировано отвечать на пустые пакеты.

В этом примере приложение не отвечает. Однако, если UDP-порт закрыт, цель должна вернуть ответ "порт недоступен" (ICMP port unreachable; пакеты 4 и 8), который отсылается UDP/IP стеком целевой машины. Большинство UDP сканеров используют стандартное сообщение "ICMP port unreachable" для определения статуса порта. Однако, этот метод может быть недостоверным, когда целевой порт фильтруется файерволом. В этих случаях сканер сообщит, что целевой порт открыт, поскольку не получит в ответ ICMP-сообщение.

Типичные ловушки при сканировании портов

UDP-сканирование может быть проблематичным по нескольким причинам. Во-первых, сканирование UDP часто ненадежно, посколько файерволы и маршрутизаторы могут отбрасывать ICMP-пакеты. Это может приводить к ложно-положительным срабатываниям, когда порт отображается как открытый, хотя фактически это не так. Во-вторых, многие сканеры портов не обходят все доступные порты, а обычно ориентируется на предзаданный список "наиболее интересных" портов. Это может приводить к тому, что UDP-порты остаются незамеченными. Использование протокол-специфичных UDP-сканеров может поспособствовать получению более точных результатов. И в-третьих, пентестеры часто забывают просканировать открытые UDP-порты, фокусируясь на более привлекательных портах TCP. Хотя UDP-сканирование может быть ненадежным, существует множество векторов атак таящихся за открытыми UDP-портами.

Сканирование портов с Nmap

(написан Gordon Lyon, aka Fyodor) - один из самых популярных, универсальных и надежных сканеров портов. Он активно развивался на протяжении более 10 лет и обладает множеством функций помимо сканирования портов.

Некоторые из примеров сканирования Nmap в данном материале выполняются с использовании команды sudo. Это связано с тем, что многие опции сканирования требуют доступа к , для использования которых необходимы root-привилегии. Сырые сокеты позволяют осуществлять хирургические операции над TCP и UDP пакетами. Без доступа к сырым сокетам, Nmap ограничен созданием пакетов .

Рассмотрим некоторые примеры сканирования портов, чтобы лучше разобраться в Nmap и его возможностях.

Учет трафика

По умолчанию, Nmap при сканировании TCP-портов целевой машины пройдется по 1000 самых популярных портов. Прежде, чем сканировать вслепую, проверим количество исходящего трафика при данном типе сканирования. Просканируем одну из лабораторных машин, и одновременно будем отслеживать количество отсылаемого на целевой хост, трафика, с помощью .

Будут использоваться различные опции iptables. Во-первых, будет использоваться опция -I, чтобы добавить новое правило в определенную цепочку, которая будет содержать директивы INPUT (входящая цепочка) и OUTPUT (исходящая цепочка), идущие вслед за номером правила. Также будут задействованы опции -s для указания IP-адреса отправителя, -d, определяющая целевой IP, и -j, чтобы разрешить (ACCEPT) трафик. И последняя опция -Z для обнуления счетчиков пакетов и байтов во всех цепочках.

Запустим эти команды:

Bash:
kali@kali:~$ sudo iptables -I INPUT 1 -s 10.11.1.220 -j ACCEPT

kali@kali:~$ sudo iptables -I OUTPUT 1 -d 10.11.1.220 -j ACCEPT

kali@kali:~$ sudo iptables -Z
Листинг 20 - Конфигурирование правил iptables перед сканированием

Теперь сгенерируем немного трафика, используя nmap:

Bash:
kali@kali:~$ nmap 10.11.1.220
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:20 EST
Nmap scan report for 10.11.1.220
Host is up (0.29s latency).
Not shown: 980 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
3389/tcp open  ms-wbt-server
...

Nmap done: 1 IP address (1 host up) scanned in 46.29 seconds
Листинг 21 - Сканирование 1000 самых популярных TCP-портов на определенном IP

Сканирование закончилось и выявило несколько открытых портов.

Теперь посмотрим на статистику iptables, чтобы получить представление о количестве сгенерированного трафика. Были использованы опции -v, чтобы сделать вывод более подробным, -n, чтобы включить числовой вывод, и -L, чтобы перечислить правила из всех цепочек:

Bash:
kali@kali:~$ sudo iptables -vn -L
Chain INPUT (policy ACCEPT 1528 packets, 226K bytes)
  pkts   bytes    target        prot  opt  in      out   source              destination
  1263  51264  ACCEPT      all     --    *        *       10.11.1.220       0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
  pkts   bytes    target        prot  opt  in      out   source              destination

Chain OUTPUT (policy ACCEPT 1323 packets, 191K bytes)
  pkts   bytes    target        prot  opt  in      out   source              destination
  1314  78300   ACCEPT     all     --     *       *       0.0.0.0/0           10.11.1.220
Листинг 22 - Использование iptables для отслеживания объема трафика при сканировании топ-1000 портов

Согласно этому выводу, сканирование топ-1000 портов сгенерировало около 78 Кб трафика. Воспользуемся iptables -Z для обнуления счетчиков пакетов и байтов на всех цепочках и запустим nmap с опцией -p, для сканирования всех TCP портов.

Bash:
kali@kali:~$ sudo iptables -Z

kali@kali:~$ nmap -p 1-65535 10.11.1.220
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:27 EST
Nmap scan report for 10.11.1.220
Host is up (0.00067s latency).
Not shown: 65507 closed ports
PORT      STATE    SERVICE
21/tcp    open     ftp
53/tcp    open     domain
88/tcp    open     kerberos-sec
135/tcp   open     msrpc
139/tcp   open     netbios-ssn
389/tcp   open     ldap
445/tcp   open     microsoft-ds
464/tcp   open     kpasswd5
593/tcp   open     http-rpc-epmap
636/tcp   open     ldapssl
1291/tcp  filtered seagulllms
3268/tcp  open     globalcatLDAP
3269/tcp  open     globalcatLDAPssl
3389/tcp  open     ms-wbt-server
5722/tcp  open     msdfsr
9389/tcp  open     adws
12777/tcp filtered unknown
46056/tcp filtered unknown
47001/tcp open     winrm
...

Nmap done: 1 IP address (1 host up) scanned in 80.42 seconds

kali@kali:~$ sudo iptables -vn -L
Chain INPUT (policy ACCEPT 219K packets, 252M bytes)
   pkts     bytes    target        prot  opt  in      out   source              destination
   66243  2659K   ACCEPT     all     --    *        *       10.11.1.220       0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
  pkts     bytes    target        prot  opt  in      out   source              destination

Chain OUTPUT (policy ACCEPT 85792 packets, 11M bytes)
  pkts     bytes    target        prot  opt  in      out   source              destination
  66768  4006K   ACCEPT     all     --    *        *       0.0.0.0/0           10.11.1.220
Листинг 23 - Использование iptables для измерения объема трафика при сканировании всех TCP-портов

Похожее сканирование, явно проверяющее все 65535 локальных портов, генерирует около 4 Мб трафика, что является значительным объемом. Однако, данное полное сканирование обнаружило новые порты, ранее пропущенные при обычном TCP-сканировании топ-1000.

Результаты выше предполагают, что полное Nmap-сканирование сети класса C (254 хоста) сгенерирует около 1000 Мб исходящего трафика. В идеальной ситуации, полное TCP и UDP сканирование на каждой целевой машине, предоставит более точную информацию о всех открытых сетевых сервисах. Но пример выше показывает, что нужно выдерживать баланс между ограничениями пропускной способности сети (например, когда она медленная) и потребностью обнаружить дополнительные открытые порты и сервисы, используя полное сканирование. Это особенно верно для больших сетей, типа класс А или класс B.

В следующем разделе будут рассмотрены некоторые из техник сканирования Nmap.

Скрытное/SYN-сканирование

Наиболее предпочтительная техника сканирования в Nmap - это SYN-сканирование или . Использование SYN-сканирования дает множество преимуществ, и поэтому этот метод используется для сканирования по умолчанию, когда в команде nmap не указан метод сканирования, а у пользователя есть необходимые права доступа к сырым сокетам.

SYN-сканирование это метод сканирования TCP портов, включающий в себя отправку SYN-пакетов на различные порты целевой машины, без завершения TCP-рукопожатия. Если TCP-порт открыт, то от целевой машины в ответ придет SYN-ACK, информирующий нас, что порт открыт. Но при этом, сканер не будет утруждать себя отправкой финального ACK-пакета, для завершения трехэтапного рукопожатия.

Bash:
kali@kali:~$ sudo nmap -sS 10.11.1.220
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:27 EST
Nmap scan report for 10.11.1.220
Host is up (1.3s latency).
Not shown: 980 closed ports
PORT        STATE SERVICE
21/tcp      open  ftp
53/tcp      open  domain
88/tcp      open  kerberos-sec
135/tcp     open  msrpc
139/tcp     open  netbios-ssn
389/tcp     open  ldap
445/tcp     open  microsoft-ds
464/tcp     open  kpasswd5
...

Листинг 24 - Использование nmap для осуществления SYN-сканирования

Поскольку трехэтапное рукопожатие никогда не завершается, информация не передается на прикладной уровень и потому никогда не появится ни в каких логах приложения. Кроме прочего SYN-сканирование является быстрой и эффективной техникой, поскольку меньше пакетов отсылается и принимается.

Пожалуйста, обратите внимание, что термин "скрытный" относится к факту, что в прошлых, примитивных файерволах не регистрировались незавершенные TCP-соединения. Хотя данная техника не является невидимой для современных файерволов, термин "скрытный" сохранился и может ввести вас в заблуждение.

Connect-сканирование TCP

Когда у пользователя nmap нет возможности доступа к сырым сокетам, Nmap по умолчанию будет использовать TCP-портов, упомянутую ранее. Так как TCP connect-сканирование Nmap использует сокеты Беркли для осуществления трехэтапного рукопожатия, оно не требует повышенных привелегий. Но, поскольку Nmap должен дождаться завершения рукопожатия прежде, чем API сокетов Беркли вернет статус соединения, connect-сканирование занимает намного больше времени чем SYN.

Могут быть моменты, когда необходимо выполнить именно connect-сканирование с помощью nmap, например, когда оно происходит через определенные типы прокси. Для такого сканирования используется опция -sT:

Bash:
kali@kali:~$ nmap -sT 10.11.1.220
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:37 EST
Nmap scan report for 10.11.1.220
Host is up (1.3s latency).
Not shown: 980 closed ports
PORT        STATE SERVICE
21/tcp      open  ftp
53/tcp      open  domain
88/tcp      open  kerberos-sec
135/tcp     open  msrpc
139/tcp     open  netbios-ssn
389/tcp     open  ldap
445/tcp     open  microsoft-ds
464/tcp     open  kpasswd5
Листинг 25 - Использование nmap для осуществления TCP connect-сканирования

Сканирование UDP

При выполнении Nmap будет использовать комбинацию из двух различных методов, чтобы определить открыт порт или закрыт.
Для большинства портов он будет использовать стандартный метод "ICMP порт недоступен" (ICMP port unreachable) с отправкой пустого пакета на определенный порт, как это было описано ранее. Однако, для стандартных портов, например, для используемого SNMP порта 161, он отправит специальный пакет для протокола SNMP, пытаясь получить ответ от приложения, связанного с этим портом. Чтобы выполнить сканирование UDP используется опция -sU в сочетании с sudo, т.к. для его осущствления требуется доступ к сырым сокетам:

Bash:
kali@kali:~$ sudo nmap -sU 10.11.1.115
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:46 EST
Nmap scan report for 10.11.1.115
Host is up (0.079s latency).
Not shown: 997 open|filtered ports
PORT        STATE SERVICE
111/udp     open  rpcbind
137/udp     open  netbios-ns
161/udp     open  snmp

Nmap done: 1 IP address (1 host up) scanned in 22.49 seconds
Листинг 26 - Использование nmap для UDP-сканирования

UDP-сканирование (-sU) может также использоваться в сочетании с TCP SYN-сканированием (-sS) для формирования более полного представления о цели:

Bash:
kali@kali:~$ sudo nmap -sS -sU 10.11.1.115
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 12:46 EST
Nmap scan report for 10.11.1.115
Host is up (0.15s latency).
Not shown: 997 open|filtered ports, 989 closed ports
PORT        STATE SERVICE
21/tcp      open  ftp
22/tcp      open  ssh
25/tcp      open  smtp
80/tcp      open  http
111/tcp     open  rpcbind
139/tcp     open  netbios-ssn
143/tcp     open  imap
199/tcp     open  smux
443/tcp     open  https
3306/tcp    open  mysql
32768/tcp   open  filenet-tms
111/udp     open  rpcbind
137/udp     open  netbios-ns
161/udp     open  snmp

Nmap done: 1 IP address (1 host up) scanned in 64.74 seconds
Листинг 27 - Использование nmap для выполнения комбинации UDP- и SYN-сканирования

В следующем разделе будут рассмотрены методы работы с большими сетями или сетями, ограниченными по трафику.

Network Sweeping

Чтобы справится с большим объемом хостов или просто сэкономить сетевой трафик, можно попробовать исследовать цель с помощью техники Network Sweeping, в которой всё начинается с обширного сканирования сети, а затем более детально исследуются заинтересовавшие нас хосты.

При выполнении подобного сканирования (опция -sn) процесс обследования хоста состоит не только из отправки эхо-запроса ICMP. В дополнение к ICMP-запросу используется несколько других проверок. Nmap посылает TCP SYN пакет на порт 443, TCP ACK на 80-ый порт, а также запрос временной метки ICMP для проверки доступности хоста.

Bash:
kali@kali:~$ nmap -sn 10.11.1.1-254
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:27 EST
Nmap scan report for 10.11.1.5
Host is up (0.026s latency).
MAC Address: 00:50:56:89:70:15 (VMware)
Nmap scan report for 10.11.1.7
Host is up (0.026s latency).
MAC Address: 00:50:56:89:36:32 (VMware)
...
Nmap done: 254 IP addresses (44 hosts up) scanned in 6.14 seconds
Листинг 28 - Использование nmap для выполнения сканирования с помощью Network Sweeping

Поиск "живых" машин с помощью grep на стандартном выводе nmap может быть громоздким решением. Вместо этого, просто добавим опцию -oG, чтобы Nmap выводил результаты в более подходящем для grep формате:

Bash:
kali@kali:~$ nmap -v -sn 10.11.1.1-254 -oG ping-sweep.txt
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:34 EST
Initiating ARP Ping Scan at 11:34
Scanning 254 hosts [1 port/host]
Completed ARP Ping Scan at 11:35, 4.71s elapsed (254 total hosts)
Initiating Parallel DNS resolution of 254 hosts. at 11:35
Completed Parallel DNS resolution of 254 hosts. at 11:35, 0.07s elapsed
Nmap scan report for 10.11.1.1 [host down]
Nmap scan report for 10.11.1.2 [host down]
Nmap scan report for 10.11.1.3 [host down]
Nmap scan report for 10.11.1.4 [host down]
Nmap scan report for 10.11.1.5
Host is up (0.026s latency).
MAC Address: 00:50:56:89:70:15 (VMware)
...

kali@kali:~$ grep Up ping-sweep.txt | cut -d " " -f 2
10.11.1.5
10.11.1.7
10.11.1.8
Листинг 29 - Использование nmap для выполнения network sweep в сочетании с grep, чтобы найти "живые" хосты

Можно искать определенные TCP или UDP порты в сети, в попытке найти распространенные сервисы или порты, которые могут быть полезны или содержат известные уязвимости. Это сканирование может быть более точным, чем ping sweep (Листинг 29):

Bash:
kali@kali:~$ nmap -p 80 10.11.1.1-254 -oG web-sweep.txt
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:38 EST
Nmap scan report for 10.11.1.5
Host is up (0.036s latency).
PORT        STATE  SERVICE
80/tcp      closed http
MAC Address: 00:50:56:89:70:15 (VMware)

Nmap scan report for 10.11.1.7
Host is up (0.029s latency).

PORT        STATE    SERVICE
80/tcp      filtered http
MAC Address: 00:50:56:89:36:32 (VMware)

Nmap scan report for 10.11.1.8
Host is up (0.034s latency).

PORT   STATE SERVICE
80/tcp open  http
MAC Address: 00:50:56:89:20:34 (VMware)
...

kali@kali:~$ grep open web-sweep.txt | cut -d" " -f2
10.11.1.8
10.11.1.10
10.11.1.13
...
Листинг 30 - Использование nmap для поиска веб-серверов с открытым 80-ым портом

Чтобы сохранить время и ресурсы сети, можно сканировать множество IP, проверяя только короткий список распространенных портов. Например, давайте проведем connect-сканирование TCP для топ-20 TCP-портов, задействовав опцию --top-ports, и разрешив определение версии ОС, сканирование по скриптам и трассировку, с помощью опции -A:

Bash:
kali@kali:~$ nmap -sT -A --top-ports=20 10.11.1.1-254 -oG top-port-sweep.txt
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:40 EST
Nmap scan report for 10.11.1.5
Host is up (0.037s latency).

PORT     STATE  SERVICE     VERSION
21/tcp   closed ftp
22/tcp   closed ssh
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   closed http
110/tcp  closed pop3
...
Host script results:
|_nbstat: NetBIOS name: ALICE, NetBIOS user: <unknown>, NetBIOS MAC: 00:50:56:89:70:15
| smb-os-discovery:
|   OS: Windows XP (Windows 2000 LAN Manager)
|   OS CPE: cpe:/o:microsoft:windows_xp::-
|   Computer name: alice
|   NetBIOS computer name: ALICE\x00
|   Domain name: thinc.local
|   Forest name: thinc.local
|   FQDN: alice.thinc.local
|_  System time: 2019-03-04T16:44:52+00:00
| smb-security-mode:
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
|_smb2-time: Protocol negotiation failed (SMB2)
...
Листинг 31 - Выполнение сканирования портов топ-20 и сохранение вывода в формате удобном для grep

Топ-20 портов nmap определены в файле /usr/share/nmap/nmap-services. Этот файл использует простой формат трех колонок, разделенных пробелами. Первая - имя сервиса, вторая содержит номер порт и протокол, а третья частоту встречаемости порта. Всё, что после третьей колонки игнорируется, но обычно это пространство используется для комментариев, как это видно по наличию знака решетки (#). Частота встречаемости порта основывается на том, как часто порт был замечен открытым во время исследовательских :

Bash:
kali@kali:~$ cat /usr/share/nmap/nmap-services
...
finger    79/udp    0.000956
http    80/sctp    0.000000    # www-http | www | World Wide Web HTTP
http    80/tcp    0.484143    # World Wide Web HTTP
http    80/udp    0.035767    # World Wide Web HTTP
hosts2-ns    81/tcp    0.012056    # HOSTS2 Name Server
hosts2-ns    81/udp    0.001005    # HOSTS2 Name Server
...
Листинг 32 - Часть файла nmap-services, отражающая частоту встречаемости открытого порта 80

На данном этапе можно было бы провести более полное сканирование определенных машин, богатых на сервисы или еще что-нибудь интересное.

Существует множество творческих путей для сохранения пропускной способности, снижения заметности и максимально эффективного использования интересных , которые заслуживают дальнейшего изучения.

Определение ОС по ее отпечатку (Fingerprinting)

В Nmap есть встроенная функция определения отпечатков ОС ( ), которая активизируется опцией -O. Эта функция пытается угадать какая ОС на целевом хосте, основываясь на анализе возвращаемых ею пакетов. Это возможно благодаря тому, что различные операционные системы имеют немного отличающиеся реализации стека TCP/IP (например, различные значения TTL и разные размеры окна TCP) и эти небольшие различия создают отпечаток, который часто может идентифицировать Nmap.

Nmap будет проверять трафик от целевой машины и сопоставлять его со списком известных отпечатков.

Рассмотрим простое подобное сканирование с помощью nmap, в качестве примера:

Bash:
kali@kali:~$ sudo nmap -O 10.11.1.220
...
Device type: general purpose
Running: Microsoft Windows 2008|7
OS CPE: cpe:/o:microsoft:windows_server_2008:r2 cpe:/o:microsoft:windows_7
OS details: Microsoft Windows 7 or Windows Server 2008 R2
Network Distance: 1 hop
...
Листинг 33 - Использование nmap для определения ОС по отпечатку

В ответе говорится, что операционная система на целевой машине - Windows 7 или Windows 2008 R2.

Обратите внимание, что определение операционной системы по отпечатку не всегда точно на 100%, но эту функцию определенно стоит использовать. Рассмотрим возможности более тщательного изучения цели для подтверждения результата детектирования по отпечатку.

Сбор баннеров / перечисление сервисов

Можно определить сервисы, запущенные на определенных портах, изучая сервисные баннеры (-sV), и различные ОС с помощью скриптов для сбора информации о сервисах (–A):

Bash:
kali@kali:~$ nmap -sV -sT -A 10.11.1.220
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:27 EST
Nmap scan report for 10.11.1.220
Host is up (0.00043s latency).
Not shown: 979 closed ports
PORT       STATE SERVICE       VERSION
21/tcp     open  ftp           FileZilla ftpd 0.9.34 beta
| ftp-syst:
|_ SYST: UNIX emulated by FileZilla
53/tcp     open  domain        Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1)
| dns-nsid:
|_ bind.version: Microsoft DNS 6.1.7601 (1DB15D39)
88/tcp     open  kerberos-sec  Microsoft Windows Kerberos (server time: 2013-12-28 07:37:57Z)
135/tcp    open  msrpc         Microsoft Windows RPC

...
Nmap done: 1 IP address (1 host up) scanned in 55.67 seconds
Листинг 34- Использование nmap для сбора баннеров и/или перечисления сервисов

Имейте ввиду, что баннеры могут быть изменены системными администраторами. Они могут быть намеренно настроены на фальшивые имена сервисов, чтобы ввести в заблуждение потенциального злоумышленника.

Сбор баннеров сильно влияет как на объем трафика, так и на скорость сканирования. Следует помнить об опциях, которые используются с nmap и как они влияют на сканирование.

Скриптовый движок Nmap (NSE)

Можно использовать скриптовый движок Nmap ( ) для запуска пользовательских скриптов, чтобы автоматизировать различные задачи при сканировании. Эти скрипты могу выполнять широкий спектр функций, включая сбор информации о DNS, брут-форс атаки и даже идентификацию уязвимостей. NSE-скрипты расположены в директории /usr/share/nmap/scripts.

К примеру, скрипт smb-os-discovery пытается подключиться к SMB-сервису на целевой системе и определить версию ОС:

Bash:
kali@kali:~$ nmap 10.11.1.220 --script=smb-os-discovery
...
    OS: Windows Server 2008 R2 Standard 7601 Service Pack 1 (Windows Server 2008 R2 Sta
|    OS CPE: cpe:/o:microsoft:windows_server_2008::sp1
|    Computer name: master
|    NetBIOS computer name: MASTER\x00
|    Domain name: thinc.local
|    Forest name: thinc.local
|    FQDN: master.thinc.local
|_   System time: 2013-12-27T23:37:58-08:00

Nmap done: 1 IP address (1 host up) scanned in 5.85 seconds
Листинг 35 - Использование NSE для определения OS по отпечатку (fingerprinting)

Другой полезный (и говорящий сам за себя) NSE-скрипт - dns-zone-transfer:

Bash:
kali@kali:~$ nmap --script=dns-zone-transfer -p 53 ns2.megacorpone.com
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:54 EST
Nmap scan report for ns2.megacorpone.com (38.100.193.80)
Host is up (0.010s latency).
Other addresses for ns2.megacorpone.com (not scanned):

PORT      STATE SERVICE
53/tcp open domain
|  dns-zone-transfer:
|  megacorpone.com.        SOA   ns1.megacorpone.com. admin.megacorpone.com.
|  megacorpone.com.        MX    10 fb.mail.gandi.net.     
|  megacorpone.com.        MX    20 spool.mail.gandi.net. 
|  megacorpone.com.        MX    50 mail.megacorpone.com. 
|  megacorpone.com.        MX    60 mail2.megacorpone.com. 
|  megacorpone.com.        NS    ns1.megacorpone.com.     
...
Листинг 36 - Использование DNS для передачи зоны DNS

Чтобы увидеть больше информации о скрипте, можно воспользоваться опцией --script-help, которая отобразит его описание и URL, содержащий более детальную информацию, такую как аргументы скрипта и примеры его использования.

Bash:
kali@kali:~$ nmap --script-help dns-zone-transfer
Starting Nmap 7.70 ( https://nmap.org ) at 2019-05-06 11:02 MDT

dns-zone-transfer
Categories: intrusive discovery
https://nmap.org/nsedoc/scripts/dns-zone-transfer.html
  Requests a zone transfer (AXFR) from a DNS server.

  The script sends an AXFR query to a DNS server. The domain to query is
  determined by examining the name given on the command line, the DNS
  server's hostname, or it can be specified with the
  <code>dns-zone-transfer.domain</code> script argument. If the query is
  successful all domains and domain types are returned along with common
  type specific data (SOA/MX/NS/PTR/A).
...
Листинг 37 - Использование опции --script-help для получения информации о скрипте

Если доступ к Интернету отсутствует, немало информации может быть почерпнуто из самого файла NSE-скрипта.

Уделите время для изучения различных NSE-скриптов, так как многие из них полезны и сэкономят вам время.

Masscan

, пожалуй, самый быстрый сканер портов - он может просканировать весь Интернет примерно за 6 минут, передавая пакеты с ошеломляющей скоростью: 10 миллионов в секунду! Хотя изначально он был разработан для сканирования всего Интернета, он может быть легко применен и к подсетям классов А и Б, которые являются более подходящим целевым диапазоном во время тестирования на проникновение.

Masscan не установлен в Kali по умолчанию. Это можно сделать с помощью apt install:

Bash:
kali@kali:~$ sudo apt install masscan
...
The following NEW packages will be installed:
  masscan
0 upgraded, 1 newly installed, 0 to remove and 1469 not upgraded.
Need to get 184 kB of archives.
After this operation, 401 kB of additional disk space will be used.
...
Листинг 38 - Установка masscan в Kali Linux
Рассмотрим команду, которая обнаруживает все машины с открытым 80-м портом (опция -p80), в большой внутренней сети. Так как masscan реализует пользовательский стек TCP/IP он будет требовать доступа к сырым сокетам и, следовательно, потребуется sudo.

Bash:
kali@kali:~$ sudo masscan -p80 10.0.0.0/8
Листинг 39 - Использование masscan для поиска всех веб-серверов внутри подсети класса А

Чтобы попробовать masscan на подсети класса С внутри лабораторной сети PWK, можно воспользоваться следующим примером. Добавим несколько дополнительных опций masscan, включая --rate, установливающую желаемую скорость передачи пакетов, -e, для указания используемого сетевого интерфейса, и --router-ip, задающую IP-адрес соответствующего шлюза.

Bash:
kali@kali:~$ sudo masscan -p80 10.11.1.0/24 --rate=1000 -e tap0 --router-ip 10.11.0.1

Starting masscan 1.0.3 (http://bit.ly/14GZzcT) at 2019-03-04 17:15:40 GMT
-- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 256 hosts [1 port/host]
Discovered open port 80/tcp on 10.11.1.14
Discovered open port 80/tcp on 10.11.1.39
Discovered open port 80/tcp on 10.11.1.219
Discovered open port 80/tcp on 10.11.1.227
Discovered open port 80/tcp on 10.11.1.10
Discovered open port 80/tcp on 10.11.1.50
Discovered open port 80/tcp on 10.11.1.234
...
Листинг 40 - Использование masscan с дополнительными опциями

Сбор информации о SMB

Из-за открытого характера и сложной реализации, сведения о безопасности Server Message Block ( ) протокола в течение многих лет были неудовлетворительными. От неаутентифицированных нулевых сессий SMB в Windows 2000 и Windows XP, до множества ошибок и уязвимостей на протяжении многих лет, SMB наблюдал свою .

Тем не менее, протокол SMB также обновлялся и совершенствовался параллельно с выпуском операционных систем Windows.

Сканирование службы NetBIOS

прослушивает как TCP-порт 139, так и несколько UDP-портов. Следует отметить, что SMB (TCP-порт 445) и NetBIOS - это два отдельных протокола. NetBIOS является независимым протоколом сеансового уровня и службой, которая позволяет компьютерам в локальной сети взаимодействовать друг с другом. В то время как современные реализации SMB могут работать без NetBIOS, NetBIOS поверх TCP ( ) необходим для обратной совместимости и часто также включен. По этой причине сбор информации об этих двух сервисах часто идет одновременно. Их можно сканировать с помощью таких инструментов, как nmap, используя синтаксис, аналогичный приведенному ниже:

Код:
kali@kali:~$ nmap -v -p 139,445 -oG smb.txt 10.11.1.1-254
Листинг 41 - Использование nmap для сканирования сервиса NetBIOS

Существуют и другие, более специализированные инструменты для конкретной идентификации NetBIOS информации, такие как nbtscan, который используется в следующем примере. Опция -r используется для указания UDP-порта источника как 137, который используется для запроса NetBIOS-службы имен для действительных NetBIOS-имён:

Bash:
kali@kali:~$ sudo nbtscan -r 10.11.1.0/24
Doing NBT name scan for addresses from 10.11.1.0/24
IP address       NetBIOS Name     Server    User       MAC address
------------------------------------------------------------------------
10.11.1.5        ALICE            <server>  ALICE      00:50:56:89:35:af
10.11.1.31       RALPH            <server>  HACKER     00:50:56:89:08:19
10.11.1.24       PAYDAY           <server>  PAYDAY     00:00:00:00:00:00
...
Листинг 42 - Использование nbtscan для сбора дополнительной информации о NetBIOS

Nmap SMB NSE скрипты

Nmap содержит множество полезных NSE скриптов, которые можно использованы для обнаружения и сборе информации о SMB сервисах. Эти скрипты можно найти в каталоге /usr/share/nmap/scripts:

Bash:
kali@kali:~$ ls -1 /usr/share/nmap/scripts/smb*
/usr/share/nmap/scripts/smb2-capabilities.nse
/usr/share/nmap/scripts/smb2-security-mode.nse
/usr/share/nmap/scripts/smb2-time.nse
/usr/share/nmap/scripts/smb2-vuln-uptime.nse
/usr/share/nmap/scripts/smb-brute.nse
/usr/share/nmap/scripts/smb-double-pulsar-backdoor.nse
/usr/share/nmap/scripts/smb-enum-domains.nse
/usr/share/nmap/scripts/smb-enum-groups.nse
/usr/share/nmap/scripts/smb-enum-processes.nse
/usr/share/nmap/scripts/smb-enum-sessions.nse
/usr/share/nmap/scripts/smb-enum-shares.nse
/usr/share/nmap/scripts/smb-enum-users.nse
/usr/share/nmap/scripts/smb-os-discovery.nse
...
Листинг 43 - Поиск различных nmap SMB NSE скриптов

Здесь можно найти несколько интересных Nmap SMB NSE скриптов, которые выполняют различные задачи, такие как обнаружение и сбор информации о ОС через SMB.

Попробуем использовать модуль smb-os-discovery:

Bash:
kali@kali:~$ nmap -v -p 139, 445 --script=smb-os-discovery 10.11.1.227
...
Nmap scan report for 10.11.1.227
Host is up (0.57s latency).
PORT    STATE SERVICE
139/tcp open netbios-ssn

Host script results:
|  smb-os-discovery:
|     OS: Windows 2000 (Windows 2000 LAN Manager)
|     OS CPE: cpe:/o:microsoft:windows_2000::-
|     Computer name: srv2
|     NetBIOS computer name: SRV2
|     Workgroup: WORKGROUP
...
Листинг 44 - Использование nmap-скриптового движка для выполнения обнаружения ОС.

Этот конкретный сценарий определил потенциальное соответствие для операционной системы хоста.

Для проверки известных уязвимостей SMB протокола можно воспользоваться одним из NSE скриптов smb-vuln. Далее будет рассмотрен smb-vuln-ms08-067, который использует опцию --script-args для передачи аргументов в NSE скрипт.

Замечание: Если установить параметр скрипта unsafe=1, то скрипты, которые будут выполняться, почти (или абсолютно) гарантированно аварийно завершат работу уязвимой системы. Разумеется, нужно быть предельно осторожным при включении этой опции, особенно при сканировании производственных систем.

Bash:
kali@kali:~$ nmap -v -p 139,445 --script=smb-vuln-ms08-067 --script-args=unsafe=1 10.11.1.5
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-04 11:27 EST
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
...
Scanning 10.11.1.5 [2 ports]
...
Completed NSE at 00:04, 17.39s elapsed
Nmap scan report for 10.11.1.5
Host is up (0.17s latency).
PORT    STATE SERVICE
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
MAC Address: 00:50:56:AF:02:91 (VMware)

Host script results:
| smb-vuln-ms08-067:
|   VULNERABLE:
|   Microsoft Windows system vulnerable to remote code execution (MS08-067)
|     State: VULNERABLE
|     IDs: CVE:CVE-2008-4250
|          The Server service in Microsoft Windows 2000 SP4, XP SP2 and
|          SP3, Server 2 Vista Gold and SP1, Server 2008, and 7
|          Pre-Beta allows remote attackers to code via a crafted RPC
|          request that triggers the overflow during path cano
|
|     Disclosure date: 2008-10-23
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-4250
|_      https://technet.microsoft.com/en-us/library/security/ms08-067.aspx
...
Листинг 45 - Определение того, является ли хост уязвимым к уязвимости MS08_067

В данном случае, Nmap идентифицирует, что конкретная SMB служба не имеет хотя бы одного критического патча под .

Сбор информации о NFS

- это протокол распределенной файловой системы, изначально разработанный компанией Sun Microsystems в 1984 году. Он позволяет пользователю на клиентском компьютере получать доступ к файлам в сети так, как если бы они находились на локальном хранилище.

NFS часто используются в операционных системах UNIX и является небезопасным. Иногда сложно настроить безопасную систему, поэтому нередки случаи, когда NFS открыты для кого угодно. Это довольно удобно для нас, как для пентестеров, так как можно использовать их для сбора конфиденциальной информации, повышения привилегий и так далее.

Сканирование сервисов NFS

И , и работают на 111 TCP порту. RPCbind сопоставляет RPC сервисы с портами, которые они прослушивают. RPC процессы уведомляют rpcbind при своем запуске, регистрируя прослушиваемые ими порты и номера RPC программ, которые они ожидают обслужить.

Затем, клиентская система связывается с rpcbind на сервере с определенным номером RPC программы. Сервис rpcbind перенаправляет клиента на соответствующий номер порта (зачастую 2049 TCP порт), чтобы он мог связаться с запрошенным сервисом. Можно просканировать эти порты с помощью nmap, используя следующий синтаксис:

Bash:
kali@kali:~$ nmap -v -p 111 10.11.1.1-254
Листинг 46 - Использование nmap для идентификации хостов, на которых запущен portmapper / rpcbind

Можно использовать NSE скрипты, такие как rpcinfo, чтобы найти службы, которые могут быть зарегистрированы в rpcbind:

Bash:
kali@kali:~$ nmap -sV -p 111 --script=rpcinfo 10.11.1.1-254
...
Nmap scan report for 10.11.1.72
Host is up (0.0055s latency).

PORT    STATE SERVICE VERSION
111/tcp open  rpcbind 2-4 (RPC #100000)
| rpcinfo:
|   program version   port/proto  service
|   100000  2,3,4        111/tcp  rpcbind
|   100000  2,3,4        111/udp  rpcbind
|   100003  2,3,4       2049/tcp  nfs
|   100003  2,3,4       2049/udp  nfs
|   100005  1,2,3      50255/udp  mountd
|   100005  1,2,3      56911/tcp  mountd
|   100021  1,3,4      40160/udp  nlockmgr
|   100021  1,3,4      57765/tcp  nlockmgr
|   100024  1          34959/udp  status
|   100024  1          46908/tcp  status
|   100227  2,3         2049/tcp  nfs_acl
|_  100227  2,3         2049/udp  nfs_acl
...
Листинг 47 - rpcbind запрос для получения зарегистрированных сервисов

Nmap NFS NSE скрипты

Как только стало известно, что NFS работает, можно найти какую-то дополнительную информацию, а также собрать данные о NFS службах и обнаружить дополнительные сервисы, используя NSE скрипты, найденные в каталоге /usr/share/nmap/scripts:

Bash:
kali@kali:~$ ls -1 /usr/share/nmap/scripts/nfs*
/usr/share/nmap/scripts/nfs-ls.nse
/usr/share/nmap/scripts/nfs-showmount.nse
/usr/share/nmap/scripts/nfs-statfs.nse
Листинг 48 - Поиск различных NSE скриптов для NFS

Можно запустить эти три скрипта, используя символ подстановки (*) в названии скрипта:

Bash:
kali@kali:~$ nmap -p 111 --script nfs* 10.11.1.72
...
Nmap scan report for 10.11.1.72

PORT    STATE SERVICE
111/tcp open  rpcbind
| nfs-showmount:
|_  /home 10.11.0.0/255.255.0.0
Листинг 49 - Запуск всех NSE скриптов для NFS

В этом случае весь каталог /home является общим, и можно получить к нему доступ, примонтировав его в нашу виртуальную машину Kali. Для этого используем команду mount, а также -o nolock для отключения блокировки файлов, что часто требуют старыe NFS сервера:

Bash:
kali@kali:~$ mkdir home

kali@kali:~$ sudo mount -o nolock 10.11.1.72:/home ~/home/

kali@kali:~$ cd home/ && ls
jenny  joe45  john  marcus  ryuu
Листинг 50 - Использование mount для доступа к NFS службе в Kali

Основываясь на этом списке файлов, видно, что существует несколько домашних каталогов для локальных пользователей на удаленном компьютере. Копнув немного глубже, находим искомое имя файла, и далее пытаемся его посмотреть:

Bash:
kali@kali:~/home$ cd marcus

kali@kali:~/home/marcus$ ls -la
total 24
drwxr-xr-x 2 1014  1014 4096 Jun 10 09:16 .
drwxr-xr-x 7 root root 4096 Sep 17 2015 ..
-rwx------ 1 1014  1014   48 Jun 10 09:16 creds.txt

kali@kali:~/home/marcus$ cat creds.txt
cat: creds.txt: Permission denied
Листинг 51 - Использование встроенных команд для просмотра общей NFS службы

Похоже, что нет разрешения на просмотр этого файла. При более внимательном рассмотрении файловых разрешений видно, что его владелец имеет UUID 1014, а также имеет права на чтение (r), запись (w) и выполнение (x). Что можно сделать с этой информацией? Поскольку имеется полный доступ к нашему компьютеру Kali, можно попытаться добавить к систему локального пользователя, используя команду adduser, изменить его UUID на 1014, командой su переключимся на этого пользователя, а затем попытаться получить доступ к файлу еще раз:

Bash:
kali@kali:~/home/stefan$ sudo adduser pwn
Adding user `pwn' ...
Adding new group `pwn' (1001) ...
Adding new user `pwn' (1001) with group `pwn' ...
Creating home directory `/home/pwn' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for pwn
Enter the new value, or press ENTER for the default
     Full Name []:
     Room Number []:
     Work Phone []:
     Home Phone []:
     Other []:
Is the information correct? [Y/n]
Листинг 52 - Добавление локального пользователя к нашему компьютеру Kali

Основываясь на вышеприведенных данных, видно, что новый пользователь имеет UUID 1001, что на самом деле не то, что нужно. Можно изменить его на 1014 с помощью команды sed и подтвердить, что изменение произошло. Опция -i используется для замены файла, а опция -e выполняет скрипт. В данном случае это будет 's/1001/1014/g', что глобально заменит UUID в файле /etc/passwd:

Bash:
kali@kali:~/home/marcus$ sudo sed -i -e 's/1001/1014/g' /etc/passwd

kali@kali:~/home/marcus$ cat /etc/passwd | grep pwn
pwn:x:1014:1014:,,,:/home/pwn:/bin/bash
Листинг 53 - Обновление UUID в файле /etc/passwd

Пока все отлично. Попробуем переключиться на пользователя pwn командой su, также, проверим, что наш UUID действительно изменился, а затем попробуем получить доступ к этому файлу еще раз. Далее будет использована команда su для изменения владельца текущего сеанса входа. Затем используеется id для отображения текущего идентификатора пользователя. Наконец, снова попытаемся получить доступ к файлу:

Bash:
kali@kali:~/home/marcus$ su pwn

pwn@kali:/root/home/marcus$ id
uid=1014(pwn) gid=1014 groups=1014

pwn@kali:/root/home/marcus$ cat creds.txt
Not what you are looking for, try harder!!! :O)
Листинг 54 - Доступ к файлу в качестве pwn пользователя

Отлично! Теперь можно прочитать файл и при желании внести в него изменения. Хотя содержимое файла и не то, которое ожидалось в данном случае, системы с таким уровнем безопасности печально известны тем, что хранят конфиденциальную информацию в текстовых файлах. Подумайте о том, что бы еще можно было бы сделать в этом случае: от замены SSH ключей, до прочтения конфиденциальных файлов и так далее.

Сбор информации о SMTP

Также можно собирать информацию о хосте или сети через уязвимые почтовые сервера. поддерживает несколько интересных команд, таких как *VRFY* и *EXPN*. Запрос *VRFY* просит сервер подтвердить адрес электронной почты, тогда как *EXPN* запрашивает у сервера членство в списке рассылки. Эти команды часто можно использовать для проверки существующих пользователей на почтовом сервере, что является полезной информацией во время пентеста. Рассмотрим следующий пример:

Bash:
kali@kali:~$ nc -nv 10.11.1.217 25
(UNKNOWN) [10.11.1.217] 25 (smtp) open
220 hotline.localdomain ESMTP Postfix VRFY root
252 2.0.0 root
VRFY idontexist
550 5.1.1 <idontexist>: Recipient address rejected: User unknown in local recipient table
^C
Листинг 55 - Использование nc для проверки пользователей SMTP

Обратите внимание, как отличаются сообщения об успехе и об ошибке. SMTP-сервер успешно подтверждает, что пользователь существует. Эта процедура может использоваться, чтобы помочь угадать действительные имена пользователей в автоматизированном режиме. Рассмотрим следующий скрипт Python, который открывает сокет TCP, подключается к SMTP-серверу и исполняет команду VRFY для данного имени пользователя:

Python:
#!/usr/bin/python

import socket
import sys

if len(sys.argv) != 2:
        print "Usage: vrfy.py <username>"
        sys.exit(0)

# Create a Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to the Server
connect = s.connect(('10.11.1.217',25))

# Receive the banner
banner = s.recv(1024)

print banner

# VRFY a user
s.send('VRFY ' + sys.argv[1] + '\r\n')
result = s.recv(1024)

print result

# Close the socket
s.close()
Листинг 56 - Использование Python для написания скрипта, который собирает данные о пользователях SMTP

Сбор данных в SNMP

На протяжении многих лет часто отмечалось, что Simple Network Management Protocol (SNMP) не совсем понятен многим сетевым администраторам. Это часто приводит к неправильной конфигурации SNMP, что может в свою очередь привести к значимой утечке информации.

SNMP основан на UDP, простом протоколе без сохранения состояния, и поэтому подвержен IP спуфингу и атакам повторного воспроизведения. Кроме того, обычно используемые протоколы SNMP 1, 2 и 2c не обеспечивают шифрование трафика, а это означает, что информация и учетные данные SNMP могут быть легко перехвачены в локальной сети. Также традиционные протоколы SNMP имеют слабые схемы аутентификации и обычно остаются настроенными по умолчанию public и private community strings.

Теперь примем во внимание, что все вышеперечисленное относится к протоколу, который по определению предназначен для "управления сетью". По всем этим причинам SNMP является еще одним из наших любимых протоколов для сбора информации.

Несколько лет назад был проведен внутренний пентест в компании, которая предоставляла услуги сетевой интеграции большому количеству корпоративных клиентов, банков и других подобных организаций. После нескольких часов исследования системы блыа обнаружена большая сеть класса B с тысячами подключенных маршрутизаторов Cisco. Заказчик пояснил, что каждый из этих маршрутизаторов является шлюзом для одного из клиентов, используемых в целях управления и настройки.

При быстром сканировании учетных данных telnet по умолчанию cisco/cisco был обнаружен единственный низкоуровневый маршрутизатор Cisco ADSL. Немного покопавшись, были обнаружены сложные public и private SNMP community strings в файле конфигурации маршрутизатора. Как выяснилось, эти же public и private community strings использовались на каждом сетевом устройстве для всего диапазона класса B и выше - нехитрая настройка, верно?

Интересная особенность оборудования для корпоративной маршрутизации состоит в том, что эти устройства часто поддерживают чтение и запись файла конфигурации с помощью доступа к private SNMP community string. Поскольку private community string для всех шлюзовых маршрутизаторов были теперь известны, написав простой скрипт для копирования всех конфигураций маршрутизаторов в этой сети с использованием протоколов SNMP и TFTP, была не только скомпрометирована инфраструктура сетевой интеграции всей компании, но также и инфраструктура клиентов.

SNMP MIB дерево

SNMP Management Information Base (MIB) - это база данных, содержащая информацию, обычно относящуюся к управлению сетью. База данных организована как дерево, где ветви представляют различные организации или сетевые функции. Листья дерева (оконечные точки) соответствуют определенным значениям переменных, которые затем могут быть доступны и проверены внешним пользователем. содержит обширную информацию о дереве MIB.

Например, следующие значения MIB соответствуют определенным параметрам SNMP в Microsoft Windows и содержат гораздо больше, чем информация о сети:

Код:
| Значения MIB              | Параметры SNMP            |
|:-------------------------:|:-------------------------:|
|1.3.6.1.2.1.25.1.6.0       |System Processes           |
|1.3.6.1.2.1.25.4.2.1.2     |Running Programs           |
|1.3.6.1.2.1.25.4.2.1.4     |Processes Path             |
|1.3.6.1.2.1.25.2.3.1.4     |Storage Units              |
|1.3.6.1.2.1.25.6.3.1.2     |Software Name              |
|1.3.6.1.4.1.77.1.2.25      |User Accounts              |
|1.3.6.1.2.1.6.13.1.3       |TCP Local Ports            |
Таблица 1 - Значения SNMP MIB для Windows

Сканирование для поиска SNMP

Для поиска открытых портов SNMP можно запустить nmap, как показано в следующем примере. Опция -sU используется для выполнения сканирования UDP, а опция --open используется для вывода только открытых портов:

Bash:
kali@kali:~$ sudo nmap -sU --open -p 161 10.11.1.1-254 -oG open-snmp.txt
Starting Nmap 7.70 ( https://nmap.org ) at 2019-05-01 06:26 MDT
Nmap scan report for 10.11.1.7
Host is up (0.080s latency).

PORT    STATE         SERVICE
161/udp open|filtered snmp
MAC Address: 00:50:56:89:1A:CD (VMware)

Nmap scan report for 10.11.1.10
Host is up (0.080s latency).

PORT    STATE         SERVICE
161/udp open|filtered snmp
MAC Address: 00:50:56:93:4E:DC (VMware)
...
Листинг 57 - Использование nmap для сканирования SNMP

В качестве альтернативы можно использовать такой инструмент, как , который попытается осуществить брутфорс атаку по списку IP-адресов. Сначала необходимо собрать текстовые файлы, содержащие community strings и IP-адреса, которые хотим сканировать:

Bash:
kali@kali:~$ echo public > community
kali@kali:~$ echo private >> community
kali@kali:~$ echo manager >> community

kali@kali:~$ for ip in $(seq 1 254); do echo 10.11.1.$ip; done > ips

kali@kali:~$ onesixtyone -c community -i ips
Scanning 254 hosts, 3 communities
10.11.1.14 [public] Hardware: x86 Family 6 Model 12 Stepping 2 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)
10.11.1.13 [public] Hardware: x86 Family 6 Model 12 Stepping 2 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)
10.11.1.22 [public] Linux barry 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686
...
Листинг 58 - Использование onesixtyone для брутфорса community strings

Найдя службы SNMP, можно начать опрашивать их на конкретные MIB данные, которые могут представлять интерес для нас.

Примеры сбора информации о SNMP в Windows

Можно проверять и запрашивать значения SNMP с помощью такого инструмента, как snmpwalk, при условии, что известна по крайней мере SNMP read-only community string, которая чаще всего имеет значение "public".

Сбор информации о всем дереве MIB

Используя некоторые значения MIB, можно попытаться собрать информацию о их соответствующих значениях. Далее будут приведены примеры в лабораторной сети раскрывающие технику сбора информации с машин, на которых порт SNMP Windows открыт с параметром community string "public". Следующая команда собирает информацию обо всем дереве MIB, используя параметр -c, чтобы указать community string, и -v, чтобы указать номер версии SNMP, а также -t 10, чтобы увеличить время ожидания до 10 секунд:

Bash:
kali@kali:~$ snmpwalk -c public -v1 -t 10 10.11.1.14
iso.3.6.1.2.1.1.1.0 = STRING: "Hardware: x86 Family 6 Model 12 Stepping 2 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.311.1.1.3.1.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (2005539644) 232 days, 2:56:36.44
iso.3.6.1.2.1.1.4.0 = ""
...
Листинг 59 - Использование snmpwalk для сбора информации о всем дереве MIB

Сбор информации о пользователях Windows

Пример сбора информации о пользователях Windows:

Bash:
kali@kali:~$ snmpwalk -c public -v1 10.11.1.14 1.3.6.1.4.1.77.1.2.25
iso.3.6.1.4.1.77.1.2.25.1.1.3.98.111.98 = STRING: "bob"
iso.3.6.1.4.1.77.1.2.25.1.1.5.71.117.101.115.116 = STRING: "Guest"
iso.3.6.1.4.1.77.1.2.25.1.1.8.73.85.83.82.95.66.79.66 = STRING: "IUSR_BOB"
...
Листинг 60 - Использование snmpwalk для сбора информации о пользователях Windows

Сбор информации о процессах Windows

Пример сбора информации о процессах Windows:

Bash:
kali@kali:~$ snmpwalk -c public -v1 10.11.1.73 1.3.6.1.2.1.25.4.2.1.2
iso.3.6.1.2.1.25.4.2.1.2.1 = STRING: "System Idle Process"
iso.3.6.1.2.1.25.4.2.1.2.4 = STRING: "System"
iso.3.6.1.2.1.25.4.2.1.2.224 = STRING: "smss.exe"
iso.3.6.1.2.1.25.4.2.1.2.324 = STRING: "csrss.exe"
iso.3.6.1.2.1.25.4.2.1.2.364 = STRING: "wininit.exe"
iso.3.6.1.2.1.25.4.2.1.2.372 = STRING: "csrss.exe"
iso.3.6.1.2.1.25.4.2.1.2.420 = STRING: "winlogon.exe"
iso.3.6.1.2.1.25.4.2.1.2.448 = STRING: "services.exe"
iso.3.6.1.2.1.25.4.2.1.2.480 = STRING: "lsass.exe"
iso.3.6.1.2.1.25.4.2.1.2.488 = STRING: "lsm.exe"
...
Листинг 61 - Использование snmpwalk для сбора информации о процессах Windows

Сбор информации об открытых TCP портах

Пример сбора информации об открытых TCP портах:

Bash:
kali@kali:~$ snmpwalk -c public -v1 10.11.1.14 1.3.6.1.2.1.6.13.1.3
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.21.0.0.0.0.18646 = INTEGER: 21
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.80.0.0.0.0.45310 = INTEGER: 80
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.135.0.0.0.0.24806 = INTEGER: 135
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.443.0.0.0.0.45070 = INTEGER: 443
...
Листинг 62 - Использование snmpwalk для сбора информации об открытых TCP портах

Сбор информации об установленном программном обеспечении

Пример сбора информации об установленном программном обеспечении:

Bash:
kali@kali:~$ snmpwalk -c public -v1 10.11.1.50 1.3.6.1.2.1.25.6.3.1.2
iso.3.6.1.2.1.25.6.3.1.2.1 = STRING: "LiveUpdate 3.3 (Symantec Corporation)"
iso.3.6.1.2.1.25.6.3.1.2.2 = STRING: "WampServer 2.5"
iso.3.6.1.2.1.25.6.3.1.2.3 = STRING: "VMware Tools"
iso.3.6.1.2.1.25.6.3.1.2.4 = STRING: "Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148"
iso.3.6.1.2.1.25.6.3.1.2.5 = STRING: "Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.61030"
...
Листинг 63 - Использование snmpwalk для сбора информации об установленном программном обеспечении

Заключение

Не существует одного "наилучшего" инструмента для какой-то конкретной ситуации, тем более, что многие инструменты в Kali Linux пересекаются по функционалу. Всегда лучше ознакомиться с как можно большим количеством инструментов, понять их нюансы и в случаях, когда это возможно, сравнить их результаты, чтобы разобраться, что происходит за кулисами. В некоторых ситуациях "лучшим" инструментом является тот инструмент, которого придерживаются самые опытные практики.
 
Последнее редактирование:
Статья огонь! Спасибо большое, жаль не успел поучаствовать в переводе.
 
  • Нравится
Реакции: Dallas system
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!