Памятка по использованию Nmap и сопутствующих утилит

12 октября 2015

Данный пост представляет собой небольшую шпаргалку по сканеру портов Nmap, а также утилитам, идущим с ним в комплекте — Ncrack, Ncat, Ndiff и Nping. Уметь пользоваться Nmap полезно не только злобным хакерам, но и системным администраторам, а также devops. Как еще, например, проверить, не осталось ли в системе лишних открытых портов? Или избавиться от сигнатур, по которым можно удаленно определить используемую на сервере ОС? Как обычно, здесь мы рассмотрим самые основные параметры и флаги, а более подробную информацию всегда можно найти в man.

Далее, если для выполнения команды требуются права суперпользователя, она выполняется через sudo. Если такие права не требуются, sudo не используется.

Установка Nmap в Debian/Ubuntu:

sudo apt-get install nmap

Установка утилиты Ncrack (на момент написания поста она находится в альфе и потому не содержится в deb-пакете):

wget https://nmap.org/ncrack/dist/ncrack-0.4ALPHA.tar.gz
tar -xvzf ncrack-0.4ALPHA.tar.gz
cd ncrack-0.4ALPHA
./configure
make
sudo ckeckinstall

Сканируем 1000 наиболее часто используемых портов:

nmap 12.34.56.78

Указываем список портов:

nmap -p22,80,100-200 12.34.56.78

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

nmap -p22 52.8.254.0/24

Сканирование списка хостов из файла:

nmap -p22 -iL iplist.txt

Генерировать списки случайных IP можно, например, таким скриптом на Perl:

#!/usr/bin/perl

use strict;
use warnings;

my $cnt = 0;
my %filter;

my $gen_number = shift;

if(!$gen_number) {
  die "Usage: $0 <number>";
}

while($cnt < $gen_number) {
  my $x = 1 + int(rand(239));
  my $y = int(rand(256));
  my $z = int(rand(256));
  my $w = 1 + int(rand(254));

  # see https://en.wikipedia.org/wiki/Reserved_IP_addresses
  if(($x == 10) || ($x == 127)) { next; }
  if(($x == 100) && ($y >= 64) && ($y <= 127)) { next; }
  if(($x == 169) && ($y == 254)) { next; }
  if(($x == 172) && ($y >= 16) && ($y <= 31)) { next; }
  if(($x == 192) && ($y == 0) && ($z == 0)) { next; }
  if(($x == 192) && ($y == 0) && ($z == 2)) { next; }
  if(($x == 192) && ($y == 88) && ($z == 99)) { next; }
  if(($x == 192) && ($y == 168)) { next; }
  if(($x == 198) && ($y == 18)) { next; }
  if(($x == 198) && ($y == 19)) { next; }
  if(($x == 198) && ($y == 51) && ($z == 100)) { next; }
  if(($x == 203) && ($y == 0) && ($z == 113)) { next; }
  if(($x >= 224) && ($x <= 239)) { next; }

  my $ip = "$x.$y.$z.$w";
  if($filter{$ip}) { next; }

  $filter{$ip} = 1;
  print "$ip\n";
  $cnt++;
}

Сканирование методом установки TCP соединения:

nmap -p22,80 -sT 12.34.56.78

SYN-сканирование:

sudo nmap -p22,80 -sS 12.34.56.78

Прочие виды сканирования: FIN, Xmas Tree и NULL:

sudo nmap -p22,80 -sF 12.34.56.78
sudo nmap -p22,80 -sX 12.34.56.78
sudo nmap -p22,80 -sN 12.34.56.78

Не определять доменные имена для сканируемых IP:

nmap -n -p22 12.34.56.78

Показывать причину, по которой определенный порт считается «открытым»:

nmap -p22,80,100-200 --reason 12.34.56.78

Определение версии сервисов:

nmap -p22,80,100-200 -sV 12.34.56.78

Определение операционной системы:

sudo nmap -O 12.34.56.78

Пингануть хосты для проверки, онлайн ли они, но не сканировать порты:

nmap -sn 12.34.56.0/24

Сканировать хосты, даже если они не отвечают на пинги:

nmap -p22,80 -Pn 12.34.56.78

Считать, что хост онлайн, если он отвечает на SYN, посланный на порт 443:

nmap -p22,80,443 -PS 443 12.34.56.0/24

Сканирование UDP (работает медленнее обычного сканирования TCP):

sudo nmap -sU -p123 tick.ucla.edu

Ограничиваем время, которое можно потратить на один хост:

nmap -p22 --host-timeout 1m 12.34.56.78

Управление степенью параллелизма:

nmap -p22 --max-parallelism 2 12.34.56.78
nmap -p22 --min-parallelism 2 12.34.56.78

Делаем паузу прежде, чем перейти к следующему хосту:

nmap -p22 --scan-delay 5s 12.34.56.0/24

Ограничение на число пакетов, посылаемых в секунду:

nmap -p22 --min-rate 1 --max-rate 100 12.34.56.78

Использование NSE (Nmap Scripting Engine):

# обновляем базу данных скриптов
sudo nmap --script-updatedb

# натравляем все скрипты из группы default:
nmap --script default 12.34.56.78

# все скрипты, название которых начинается на http
nmap --script http-* 12.34.56.78

Ломаем SSH с помощью Ncrack:

ncrack ssh://12.34.56.78
ncrack --user root ssh://12.34.56.78

Fun fact! Существуют и другие утилиты для подбора паролей, заметно отличающиеся между собой поддерживаемыми протоколами и опциями. В частности, стоит обратить внимание на утилиты hydra и medusa.

Указываем списки логинов и паролей для Ncrack:

ncrack -U users.txt -P passwords.txt ...

Выводим больше отладочной информации, включая подбираемые логины и пароли:

ncrack -d7 ...

Используем Ncrack совместно с Nmap:

nmap 12.34.56.78 -oX scan.xml
ncrack -iX scan.xml

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

ndiff scan1.xml scan2.xml

Пример использования Nping:

sudo nping -c2 -p80 --tcp 12.34.56.78

Примеры использования Ncat:

ncat host 123 < send.txt
ncat -l > received.txt

Использование Ncat в качестве бэкдора:

ncat -k -l -p 3344 -e /bin/bash
ncat localhost 3344

Ncat для пробрасывания портов:

ncat -l 10.1.2.3 --keep-open 2222 \
  --sh-exec "ncat 192.168.2.15 22"
ssh user@10.1.2.3 -p 2222

Ncat для расшифровки SSL:

ncat -l localhost --keep-open 8080 \
  --sh-exec "ncat --ssl encrypted.google.com 443"

С сохранением трафика в файл:

ncat -l localhost --keep-open 8080 --hex-dump dump.log \
  --sh-exec "ncat --ssl encrypted.google.com 443"

Такая вот незамысловатая шпаргалка. Если вам есть, что к ней добавить, не стесняйтесь воспользоваться комментариями.

Метки: , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.