Использование Nmap
Метки: ICMP | nmap | PING | skaner | TCP | UDP
Понедельник, 2 февраля 2009 г.
Просмотров: 9111
Рассмотрим немного примеров использования 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