Nmap применяется для анализа сети и сканирования портов. У программы огромное количество опций. Изучению этой программы посвящены целые книги! Предлагаю в этой теме делиться интересными находками по nmap. Если тема разрастётся, лучшие примеры будут подняты в шапку.
Обычное сканирование выполняется командой вида:
sudo nmap ЦЕЛЬ
В качестве ЦЕЛИ можно указать имя хоста, IP адрес, диапазоны IP адресов в разных нотациях.
Если нужно просканировать определённый порт или диапазон портов, то используется опция -p
Как просканировать все порты с nmap
По умолчанию nmap сканирует только самые популярные порты. Чтобы просканировать все порты, можно использовать опцию -p с указанием полного диапазона:
sudo nmap -p 1-65535 ЦЕЛЬ
Если вы забываете максимальное количество портов (у меня есть такая проблема), то вы всегда можете посчитать его по формуле: 216 - 1
Но ещё проще использовать опцию -p следующим образом:
sudo nmap -p- ЦЕЛЬ
В качестве сканируемых портов можно указывать диапазон, разделённый дефисом. Если не указать начальное значение диапазона, то будут просканированы номера начиная с 1. Если не указать конечное значение диапазона, то будут просканированы номера вплоть до последнего. Если не указать ни начальное, ни конечное значение диапазона, то будут просканированые все возможные порты.
Как узнать какие хосты в сети без сканирования портов
Иногда нужно только узнать, онлайн ли хост, либо просканировать локальную сеть, чтобы увидеть, какие устройства подключены к ней.
Если в этой ситуации пропустить сканирование портов, то можно сильно сэкономить время.
Чтобы только обнаружить активные хосты, но не сканировать их порты, используется опция -sn, например:
sudo nmap -sn 192.168.50.0/24
Как собрать банеры служб
Если служба запущена на нестандартном порту, то получается, что по номеру порта невозможно определить что это за служба. Тем не менее при попытке подключения служба может вывести достаточно информации, чтобы раскрыть себя. Именно этим пользуются сборщики банеров — инициализируют самое начало процесса подключения и смотрят, что им прислала служба. В nmap есть скрипт (NSE) который называется banner, чтобы он использовался, добавьте две опции к вашей команде -sV --script=banner.
Можно собирать банеры как для всех портов, так и для одного или нескольких.
Пример команды:
sudo nmap -p 25,53,80,81,135,137,138,139,445,1121,1122,2921,2980,2988,4949,5554,9306,9312 -sV --script=banner 88.99.152.33
Пример вывода:
Host is up (0.32s latency). PORT STATE SERVICE VERSION 25/tcp closed smtp 53/tcp open domain ISC BIND 9.8.2rc1 (RedHat Enterprise Linux 6) 80/tcp open http nginx 1.10.2 81/tcp open http Apache httpd 2.2.15 ((CentOS)) |_http-server-header: Apache/2.2.15 (CentOS) 135/tcp closed msrpc 137/tcp closed netbios-ns 138/tcp closed netbios-dgm 139/tcp closed netbios-ssn 445/tcp closed microsoft-ds 1121/tcp open ftp vsftpd 2.2.2 |_banner: 220 (vsFTPd 2.2.2) 1122/tcp open ssh OpenSSH 5.3 (protocol 2.0) |_banner: SSH-2.0-OpenSSH_5.3 2921/tcp open cesdcdman? |_banner: 220 Ready | fingerprint-strings: | DNSStatusRequestTCP, DNSVersionBindReqTCP, FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, Help, Kerberos, NULL, RPCCheck, RTSPRequest, SMBProgNeg, SSLSessionReq, TLSSessionReq, X11Probe: |_ 220 Ready 2980/tcp open http-proxy 3Proxy http proxy 2988/tcp open socks-proxy Socks4A |_banner: \x00[\x81\xF6\xEF\x7F\x00\x00 4949/tcp open tcpwrapped 5554/tcp closed sgi-esphttp 9306/tcp open mysql Sphinx Search SphinxQL 2.2.11-id64-release | banner: K\x00\x00\x00\x0A2.2.11-id64-release (95ae9a6)\x00\x01\x00\x00\ |_x00\x01\x02\x03\x04\x05\x06\x07\x08\x00\x08\x82!\x02\x00\x00\x00\x00... 9312/tcp open sphinxapi? |_banner: \x00\x00\x00\x01 | fingerprint-strings: | X11Probe: |_ :major command version mismatch (expected v.1.x, got v.0.0) 3 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service : ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port2921-TCP:V=7.70%I=7%D=12/18%Time=5C185B1C%P=x86_64-unknown-linux-gn SF:u%r(NULL,B,"220\x20Ready\r\n")%r(GenericLines,B,"220\x20Ready\r\n")%r(G SF:etRequest,B,"220\x20Ready\r\n")%r(HTTPOptions,B,"220\x20Ready\r\n")%r(R SF:TSPRequest,B,"220\x20Ready\r\n")%r(RPCCheck,B,"220\x20Ready\r\n")%r(DNS SF:VersionBindReqTCP,B,"220\x20Ready\r\n")%r(DNSStatusRequestTCP,B,"220\x2 SF:0Ready\r\n")%r(Help,B,"220\x20Ready\r\n")%r(SSLSessionReq,B,"220\x20Rea SF:dy\r\n")%r(TLSSessionReq,B,"220\x20Ready\r\n")%r(Kerberos,B,"220\x20Rea SF:dy\r\n")%r(SMBProgNeg,B,"220\x20Ready\r\n")%r(X11Probe,B,"220\x20Ready\ SF:r\n")%r(FourOhFourRequest,B,"220\x20Ready\r\n"); ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port2988-TCP:V=7.70%I=7%D=12/18%Time=5C185B1C%P=x86_64-unknown-linux-gn SF:u%r(NULL,8,"\0\[\x81\xf6\xef\x7f\0\0"); ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port9312-TCP:V=7.70%I=7%D=12/18%Time=5C185B1C%P=x86_64-unknown-linux-gn SF:u%r(NULL,4,"\0\0\0\x01")%r(GenericLines,4,"\0\0\0\x01")%r(Help,4,"\0\0\ SF:0\x01")%r(X11Probe,4A,"\0\0\0\x01\0\x01\0\0\0\0\0>\0\0\0:major\x20comma SF:nd\x20version\x20mismatch\x20\(expected\x20v\.1\.x,\x20got\x20v\.0\.0\) SF:")%r(LPDString,4,"\0\0\0\x01")%r(TerminalServer,4,"\0\0\0\x01")%r(JavaR SF:MI,4,"\0\0\0\x01")%r(ms-sql-s,4,"\0\0\0\x01"); Service Info: OSs: Linux, Unix; CPE: cpe:/o:redhat:enterprise_linux:6 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 106.88 seconds
Как просканировать UDP порты в nmap
По умолчанию nmap сканирует только TCP порты. Если использовать опцию -sU, то будут просканированы только UDP порты. Если нужно просканировать оба типа портов, то используйте одновременно -sS и -sU. Например:
sudo nmap -p 53 -sS -sU 88.99.152.33
Также с опцией -p перед номерами портов можно указать букву: T для TCP, U для UDP, S для SCTP или P для IP протоколов. Например, при задании аргумента -p U:53,111,137,T:21-25,80,139,8080 будут просканированы UDP порты 53,111, и 137, а также все перечисленные TCP порты. Имейте в виду, что для сканирования обоих и UDP и TCP портов, вы должны указать опцию -sU и, по крайне мере, один из типов сканирования TCP (таких как -sS, -sF или -sT) — если этого не сделать, то даже не смотря на буквы U и T при перечислении портов, будет использоваться опции по умолчанию, то есть будут просканированы только TCP порты.
sudo nmap -p U:53,111,137,T:21-25,80,139,8080 -sU -sS 88.99.152.33
Сканирование UDP портов не совсем тривиальная задача (из-за специфики протокола), поэтому полученные данные могут быть неточны, а сам процесс сканирования может сильно затянуться, поскольку UDP сканирование является довольно медленным.
ВНИМАНИЕ!!! После букв «T» и «U» идут «:» (двоеточия), но по какой-то причине движок форума их обрезает.
Как в Nmap делать трассировку узлов сети
В Nmap для трассировки есть опция --traceroute, пример трассировки до сайта suip.biz:
sudo nmap --traceroute suip.biz
Если вы не хотите сканировать порты, а хотите просто выполнить трассировку, то добавьте опцию -sn:
sudo nmap --traceroute -sn suip.biz
Кстати, это значительно сократить время до вывода результатов.
Бывает, что выводимые при трассировке программой nmap данные не являются полными. В этом случае попробуйте дополнительно добавить опцию -PE:
sudo nmap --traceroute -sn -PE suip.biz
Указание диапазонов IP в Nmap
В Nmap очень гибкая система указания диапазонов — пожалуй, Nmap поддерживает больше всего форматов.
Диапазоны можно указывать через дефис, причём он может использоваться не только в последнем октете, но и вообще в любом. Запись при этом может выглядеть трудно читаемой, но зато такой способ является максимально гибким:
sudo nmap 91.235.128-129.0-255
Можно использовать звёздочку и при этом её можно совмещать с другими способами записи диапазонов:
sudo nmap -sn 91.235.128-129.*
Поддерживается бесклассовая нотация:
sudo nmap 91.235.128.0/24
Запускать Nmap с правами root или от обычного пользователя?
Программу Nmap можно запускать с привилегиями суперпользователя:
sudo nmap 91.235.129.250
Или с привилегиями обычного пользователя:
nmap 91.235.129.250
На первый взгляд может показаться, что разницы нет, поскольку программа в любом случае возвращает результат. Но на самом деле при запуске от root программа Nmap может отправлять сырые пакеты с помощью которых сканирование является менее заметным: используются полуоткрытые соединения, которые приложения, прослушивающие порт, обычно вообще не замечают (но могут заметить файерволы и другое специальное сетевое оборудование).
При запуске от обычного пользователя, Nmap использует системный вызов и открывает полноценное соединение, что является более заметным и более медленным.
Некоторые виды сканирования невозможно запустить от пользователя с обычными правами! В этом случае программа выведет:
You requested a scan type which requires root privileges.
QUITTING!
Это означает, что перед вашей командой нужно добавить sudo.
Как сканировать IPv6 адреса в nmap
Чтобы сканировать открытые порты на IPv6 адресах необходимо соблюдение ряда условий:
- удалённых хост должен иметь IPv6 адрес
- ваш провайдер Интернет-услуг также должен иметь поддержку IPv6 и вашему устройству должен быть присвоен IPv6 адрес
- если устройство, с которого выполняется сканирование, не напрямую подключено к роутеру, то эта сеть также должна поддерживать IPv6. Например, Интернет-провайдер, ваш роутер и ваш компьютер поддерживают IPv6 — следовательно, вы можете сканировать эту версию адресов. Но если вы с этого же компьютера попытаетесь выполнить сканирование, например, из виртуальной машины за NAT, которая подключена к сети 10.*.*.*, то сканирование завершиться неудачей из-за ошибки вида:
setup_target: failed to determine route to suip.biz (2a02:f680:1:1100::3d5f)
Если все условия соблюдены, то к команде сканирования nmap нужно добавить опцию -6 и в качестве цели указать:
- полный IPv6 адрес
- имя хоста (если к нему привязан IPv6)
- для подсетей можно использовать нотацию CIDR
В настоящее время диапазоны октетов для IPv6 ещё не поддерживаются.
Даже если в качестве цели явно указан IPv6 адрес, опцию -6 нужно обязательно указывать, иначе возникнет ошибка вида:
2a0b:f4c0:16c:4::1 looks like an IPv6 target specification -- you have to use the -6 option.
Все опции и возможности nmap поддерживаются также и для IPv6 адресов.
Если вам нужно просканировать порты на IPv6 адресе, но отсутствует такая техническая возможность, то вы можете воспользоваться онлайн сервисом «Сканирование открытых портов IPv6 адреса» (бесплатный, не требует регистрации).
Пример сканирования IPv6 адреса в Nmap:
sudo nmap -6 2604:a880:800:c1::2ae:d001
Завершён перевод документации по опциям Nmap
В системах Linux документацию по Nmap можно посмотреть командой:
man nmap
Там содержится полный перечень опций с их подробным описанием, причём на русском языке.
Но проблема в том, что русскоязычный вариант не обновлялся как минимум 10 лет!
В 2016 было решено актуализировать русскоязычную справку по опциям Nmap на странице https://kali.tools/?p=1317 . За основу была взята актуальная справка на английском. Была сделана сверка с русской версией и она использовалась для уже переведённых фрагментов.
Был начат перевод отсутствующих в русской версии фрагментов, одновременно отслеживался чейнджлог Nmap для добавления информации о новых опциях.
В результате:
- по сравнению с оригинальной русской версией дополнена информация по уже присутствующим опциям
- добавлены новые опции с описанием, которые полностью отсутствуют в русскоязычной справке, в частности:
- --discovery-ignore-rst
- --defeat-icmp-ratelimit
- --resolve-all
- --script-timeout
- --data
- --data-string
- --exclude-ports
- --disable-arp-ping
- --nsock-engine
- --script-args-file
Теперь полную, актуальную справку по опциям Nmap на русском языке вы можете прочитать на странице: https://kali.tools/?p=1317
На самом деле, работа над поддержкой документации в актуальном состоянии продолжается. Скоро будут сделаны обновления, которые принёс недавний выпуск Nmap 7.90.
Быстрое сканирование огромных сетей в nmap
lijiejie, в своём блоге предложил вариант быстрого сканирования огромных подсетей.
Сканирование больших подсетей в nmap, например 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16,100.64.0.0/10 — это нетривиальная задача. На таких сетях nmap очень медленный и можно никогда не дождаться результатов сканирования. В результате многие просто используют другие инструменты, такие как Masscan и Zmap.
Сканируя огромное сетевое пространство, нас больше всего беспокоит эффективность, то есть затраты времени. Ради быстроты иногда можно пожертвовать точностью.
Основная идея быстрого сканирования — пинговать с высоким уровнем параллелизма:
sudo nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -oX nmap_output.xml 100.64.0.0/10
Значение опций:
- -sn: не сканировать порты, только пинговать хост
- -PE: определяет, жив ли хост через эхо ICMP
- -n: не преобразует IP-адреса в доменные имена.
- --min-hostgroup 1024: Регулирует размер групп для параллельного сканирования. Минимальная группировка установлена на 1024 IP-адреса. В Nmap есть возможность осуществлять сканирование портов или сканирование с целью определения версии нескольких хостов параллельно. Это происходит путём разделения целевого IP пространства на группы, а затем сканирования одной группы за раз. В общем случае целесообразно использовать большие группы. Недостатком является то, что вы не можете узанть информацию о каком-либо хосте, пока не закончится сканирование всей группы. Таким образом, если Nmap начнет сканирование группы из 50-ти хостов, то пользователь не будет получать никакой информации (кроме обновлений информации предлагаемых в вербальном режиме), пока не будет завершено сканирование всех 50-ти хостов. о умолчанию Nmap использует компромиссный подход к решению этой проблемы. Сначала производится сканирование небольших групп из 5-ти хостов, поэтому первые результаты приходят быстро, затем размер группы постепенно увеличивается до максимального - 1024. Точные значения по умолчанию зависят от заданных опций. Для большей эффективности Nmap использует группы больших размеров для UDP сканирования и для некоторых типов TCP сканирования портов.
- --min-parallelism 1024: Регулирует распараллеливание запросов. Этот параметр очень важен. Чтобы в полной мере использовать системные и сетевые ресурсы, мы устанавливаем количество проверок на не менее чем 1024. Эти опции регулируют общее количество запросов для группы хостов. Опции используются при сканировании портов и при обнаружении хостов. По умолчанию Nmap высчитывает степень параллельности основываясь на производительности сети. Если пакеты отбрасываются, то Nmap использует меньшее количество запросов. Количество запросов медленно увеличивается по мере того, как сеть продолжает нормально работать. Эти опции устанавливают минимальную и максимальную границы для этой переменной. По умолчанию параллелизм устанавливается в 1, если сеть работает плохо, и может достигать нескольких сотен при идеальных условиях.
- -oX nmap_output.xml: Вывести результат в формате XML, имя файла — nmap_output.xml
По окончании сканирования вы можете проанализировать XML-документ, чтобы узнать, какие IP-адреса активны.
Совет: количество одновременных зондов можно настроить в соответствии с условиями вашей сети.
Посмотрите на следующие данные результатов сканирования:
Read data files from: /usr/bin/../share/nmap Nmap done: 4012855 IP addresses (140507 hosts up) scanned in 2590.61 seconds Raw packets sent: 7897197 (221.122MB) | Rcvd: 160371 (6.456MB)
Просканировано 4012855 адресов за 2590 секунд — это 43 минуты. Найдено 140507 хостов онлайн. С настройками по умолчанию сканирование сети /10 заняло бы намного больше времени.