Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Использование Nmap

Рубрика: Безопасность -> Аудит сети
Метки: | | | | |
Понедельник, 2 февраля 2009 г.
Просмотров: 18814

Рассмотрим немного примеров использования nmap. Посмотрите от имени какого пользователя запускается nmap: если в приглашении командной строки указана решетка (#) - от пользователя root, а если доллар ($) - от обычного пользователя.

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

     Методом TCP connect () nmap будет сканировать диапазон портов (1-65535) компьютера с IP-адресом 172.16.0.1. Опция -sV служит для получения версий запущенных сервисов, а опция -I дает сведения о UID пользователей-владельцев запущенных сервисов:


$ nmap -sV -I 172.16.0.1 -p 1-65535

Starting Nmap 4.00 ( http://www.insecure.org/nmap/ )

Interesting ports on example.com (172.16.0.1):

(The 65520 ports scanned but not shown below are in state: closed)

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 3.7.1p2 (protocol 1.99)

53/tcp open domain ISC Bind 9.X

80/tcp open http Apache httpd 2.0.48 (…)

110/tcp open pop3 UW Imap pop3d 2003.83rh

111/tcp open rpcbind 2 (rpc #100000)

143/tcp open imap UW imapd 2003.338rh

389/tcp open ldap (Anonymous bind OK)

636/tcp open ssl/ldap (Anonymous bind OK)

5432/tcp open postgresql PostgreSQL DB

5454/tcp open tcpwrapped

5455/tcp open unknown

6000/tcp open X11 (access denied)

Service Info: Host: example.com

Nmap finished: 1 IP address (1 host up) scanned in 113.126 seconds

     В поле SERVICE всегда отображается значение из файла /etc/services, соответствующее номеру порта. Это отнюдь не означает, что по данному порту будет запущен тот сервис, который указан в поле SERVICE. Можно запустить Web-сервер по 22 порту, а сервер SSH - по 80, но nmap все будет писать, что 22 порт - это ssh, a 80 - это HTTP.

     Чтобы выяснить, какой же сервис работает на том или ином порту, нужно провести маленький эксперимент. Пусть сервисом будет сервис postgresql (5432/tcp).

     Опция -lnp программы netstat отображает только прослушиваемые порты (-I), использует только числовую адресацию и выводит PID программы-владельца сокета (-р). Вывод программы netstat перенаправляется программе-фильтру grep, которая показывает только интересующий нас порт:

$ netstat -lpn | grep 5432

tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 31421/postmaster

tcp 0 0 :::5432 :::* LISTEN 31421/postmaster

     Из вывода ясно, что демон, прослушивающий порт, называется postmaster. Точно, это демон postgresql. Но это еще не повод быть уверенным, что это точно postgresql. Все, что известно - это то, что программа называется postgresql. Можно и sshd переименовать в postgresql. Чтобы убедиться, что это точно postgresql, используем программу lsof(LiSt Open Files) с параметром -р 31421 (PID нашего процесса):

# lsof -p 31421

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

postmaster 31421 postgres cwd DIR 104,17 648 26 /home/pgsql/data

postmaster 31421 postgres txt REG 104,2 3686819 148501 /usr/bin/postgres

     Из вышеприведенного листинга видно, что программа postgresql действи­тельно является демоном PostgreSQL. Это ни замаскированный под postgresql Web-сервер, ни ssh-сервер. Мо­жет показаться, что этот пример не несет много информации, но эту технику можно использовать и для проверки других сервисов.

     Теперь просканируем брандмауэр/маршрутизатор на базе Linux. Вначале просканируем маршрутизатор с внут­реннего узла сети, а после - с удаленного узла, который находится вне нашей сети (например, в Интернете или другой локальной сети):

$ nmap 172.16.0.254 -p 1-65535

Starting Nmap 4.00 ( http://www.insecure.org/nmap/ )

Interesting ports on 172.16.0.254:

(The 65529 ports scanned but not shown below are in state: closed)

PORT STATE SERVICE

22/tcp open ssh

8080/tcp open http-proxy

10000/tcp filtered snet-sensor-mgmt

Nmap finished: 1 IP address (1 host up) scanned in 42.636 seconds

$ nmap -p 1-65535 example.com

Starting Nmap 4.00 ( http://www.insecure.org/nmap/ )

Interesting ports on example.com (172.20.1.100):

(The 65529 ports scanned but not shown below are in state: closed)

PORT STATE SERVICE

22/tcp open ssh

8080/tcp filtered http-proxy

10000/tcp filtered snet-sensor-mgmt

Nmap finished: 1 IP address (1 host up) scanned in 47.537 seconds

     В одном случае порт ssh открыт (open), другом - отфильтрован (filtered). Значение Filtered значит, что порт отклоняет (reject) или отбрасывает (drop) трафик. Это не говорит о том, запущен ли на этом порту сервис или нет. Порт 10000 закрыт от внешнего доступа, но доступен пользователям локальной сети. Это лучше, чем, если бы он был бы доступен всему миру.

     Как и в случае с snet-sensor-mgmt хоте­лось бы, чтобы SSH-сервер был доступен только из локальной сети, но за­крыт для всего мира. Но порой администратору нужно войти в сеть, когда он находится за ее пределами. В этом случае, он разрешает некоторым внешним до­менам доступ к ssh-серверу, в то время как доступ для всех остальных внешних доменов запрещен. Обычно, такой доступ предоставляют доменам или определенным адресам из своего домашнего провайдера. Это нормально - такая практика исполь­зуется многими администраторами. Разрешается доступ не всей сети, а только одному компьютеру, к примеру, домашнему компьютеру администратора.

     Проверка правил брандмауэра показывает, что брандмауэр не фильтрует оставшиеся порты самосто­ятельно. Обычно фильтрация осуществляется провайдером, который закрывает лишние порты от вторжения из­вне. Но надеяться на провайдера нельзя - лучше самому все проверить. Например, известен сервис subseven (27372/tcp) - это Windows-троян Sub7. Чтобы бороться с ним, провайдеры закрывают его.

     Также стоит своими силами проверить отдельные порты, в частности порт 53. Это делается с помощью опции -g (nmap -g 53 ...). Отдельные плохо сконфигурированные маршрутизаторы пропускают трафик по 53 порту, считая, что это DNS-трафик.

     UDP-сканирование.

     UDP-порты надо обязательно сканировать. При поиске уязвимостей UDP-сервисы обычно упускают из виду. Мол, там ничего нет интересного. Так делать нельзя. Многие UDP-сервисы (echo, chargen, DNS - работает как по TCP, так и по UDP, а также RPC (Remote Procedure Call)) работают по протоколу UDP. Некоторые из них известны своим огромным списком эксплоитов, позволяющим получить права root'a. UDP-сканирование делается с помощью опции -sU сканера nmap:

$ nmap -sU 172.16.0.1 -p 1-65535

Starting Nmap 4.00 ( http://www.insecure.org/nmap/ )

All 65535 ports on 172.16.0.1 are: closed

Nmap run completed - 1 IP address (1 host up) scanned in 85599:56 seconds

     Время сканирования очень большое примерно 1 секунда на порт. Отчего так долго? Система ограничила отправку ICMP-ответов: не более 1 в секунду. Tcpdump может посмотреть ответы, полученные при обращении к каждому порту:

172.16.0.40.55535 > 172.16.0.1.47728: udp 0

172.16.0.1 > 172.16.0.40: icmp: 172.16.3.1 udp port 47728 unreachable [tos 0xc0]

     При UDP-сканировании нужно использовать опцию -Т. Она позволяет указать агрессивность сканирования. Есть 6 скоростей сканирования: Paranoid, Sneaky, Polite, Normal, Aggressive и Insane ( -T Polite). Первая скорость самая медленная, последняя - самая быстрая.

     

     PING-сканирование.

     Последующий режим nmap - это Ping-сканирование, которое обыкновенно исполь­зуется для того, чтобы определить, «жив» ли узел или нет. Если узел вклю­чен и подключен к сети (не 220!), значит, он «жив».

     Многие узлы игнорируют ICMP-запросы echo, поэтому nmap отправляет АСК-пакеты на порт 80 (по умолчанию). Если в ответ получен RST-пакет, то жертва "жива". С помощью tcpdump можно увидеть, как nmap комбинирует методы - первым идет обычный "пинг", а после этого он отправляет пакеты на порт 80 (http).

     Данный метод не совершенен вдали. ICMP-запросы echo игнорируются многими узлами. Еще и 80-й порт нередко закрывают брандмауэром, поскольку посылается АСК-пакет без предварительной установки соединения. Чтобы "обойти" stateful-брандмауэр, нужно использовать для пинга SYN-пакеты:

 

# nmap -sP -PS 172.16.0.1

     Также можно изменить порт (указать другой порт, не 80):

# nmap -sP -PS22 172.16.0.1

     Эта команда говорит nmap использовать порт 22/tcp(ssh) вместо 80. Если не знаете, какие порты открыты, а какие - нет, то нужно использовать стандартные порты 21, 22, 25 и 53.

     Ping-сканирование хорошо подходит, когда есть список машин сети и нужно узнать, в какое время к сети подключаются некоторые машины, а когда - отключаются от нее. Его можно использовать для обнаружения новых машин в сети. Для ping-сканирования диапазона IP-адресов обязательно используйте при указании IP-адреса звездочку (*). Когда нужно просканировать диапазон 172.16.0.0-172.16.0.255, надо использовать следующую команду:

# nmap -sP 172.16.0.*

Starting Nmap 4.00 ( http://www.insecure.org/nmap/ )

Host 172.16.0.1 appears to be up.

Host 172.16.0.3 appears to be up.

Host 172.16.0.255 seems to be a subnet broadcast address (returned 1 extra pings).

Nmap finished: 256 IP addresses (2 hosts up) scanned in 2.767 seconds