Nmap Підсумок (ESP)

Reading time: 17 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24

Параметри

IP-адреси для сканування

  • <ip>,<net/mask>: Вказати IP напряму
  • -iL <ips_file>: list_IPs
  • -iR <number>: Кількість випадкових IP, можна виключити можливі IP через --exclude <Ips> або --excludefile <file>.

Виявлення обладнання

За замовчуванням Nmap запускає фазу виявлення, яка складається з: -PA80 -PS443 -PE -PP

  • -sL: Неінвазивний, перераховує цілі, виконуючи DNS-запити для розв'язання імен. Корисно дізнатись, чи, наприклад, www.prueba.es/24 всі IP є нашими цілями.
  • -Pn: No ping. Корисно, якщо ви знаєте, що всі живі (інакше можна втратити багато часу, але ця опція також дає хибні негативи, вказуючи, що вони неактивні), запобігає фазі виявлення.
  • -sn : No port scan. Після завершення розвідки порти не сканує. Відносно stealth-режим, дозволяє невелике мережеве сканування. З привілеями відправляє ACK (-PA) на 80, SYN(-PS) на 443 та echo request і Timestamp request, без привілеїв завжди завершує з'єднання. Якщо ціль — мережа, використовує тільки ARP(-PR). Якщо використовується з іншою опцією, тільки пакети іншої опції відкидаються.
  • -PR: Ping ARP. Використовується за замовчуванням при аналізі машин у нашій мережі, швидше за використання ping. Якщо не хочете використовувати ARP-пакети — --send-ip.
  • -PS <ports>: Відправляє SYN-пакети: якщо відповідає SYN/ACK — відкрито (відповідає RST, щоб не завершувати з'єднання), якщо RST — закрито, якщо немає відповіді — недоступно. Без привілеїв автоматично використовується повне з'єднання. Якщо порти не вказані, за замовчуванням 80.
  • -PA <ports>: Як попередній, але з ACK; комбінація дає кращі результати.
  • -PU <ports>: Мета протилежна — відправляються на порти, які очікуються закритими. Деякі firewall перевіряють тільки TCP-з'єднання. Якщо закритий — відповідається порт unreachable, якщо інше ICMP або немає відповіді — залишає як destination unreachable.
  • -PE, -PP, -PM : ICMP PINGS: echo reply, timestamp та addresmask. Запускаються, щоб дізнатися, чи активна ціль.
  • -PY<ports>: Відправляє SCTP INIT-проби на 80 за замовчуванням, відповіді можуть бути INIT-ACK(open) або ABORT(closed) або нічого чи ICMP unreachable(inactive).
  • -PO <protocols>: Вказується протокол у заголовках, за замовчуванням 1(ICMP), 2(IGMP) і 4(Encap IP). Для ICMP, IGMP, TCP (6) і UDP (17) відправляються заголовки протоколу, для інших — тільки IP-заголовок. Мета — через невірно сформовані заголовки отримати Protocol unreachable або відповіді того ж протоколу, щоб знати, чи живий хост.
  • -n: No DNS
  • -R: DNS always

Техніки сканування портів

  • -sS: Не завершує з'єднання, тож не лишає слідів, дуже добре, якщо доступно (привілеї). Використовується за замовчуванням.
  • -sT: Завершує з'єднання, тому лишає слід, але гарантовано працює. За замовчуванням без привілеїв.
  • -sU: Повільніший, для UDP. Основні: DNS(53), SNMP(161,162), DHCP(67 і 68), (-sU53,161,162,67,68): open(reply), closed(port unreachable), filtered (інше ICMP), open/filtered (нічого). У випадку open/filtered, -sV відправляє численні запити для визначення версій, які підтримує nmap, і може визначити справжній стан. Значно збільшує час.
  • -sY: SCTP, неспроможний встановити з'єднання, тож логів немає, працює як -PY
  • -sN,-sX,-sF: Null, Fin, Xmas — інколи обходять деякі firewall і витягують інформацію. Базуються на тому, що стандартні машини мають відповідати RST на всі запити без SYN, RST або ACK: open/filtered(нічого), closed(RST), filtered (ICMP unreachable). Ненадійні на Windows, Cisco, BSDI і OS/400. На unix працюють.
  • -sM: Maimon scan: Відправляє FIN і ACK, використовувався для BSD, зараз повертає все як closed.
  • -sA, sW: ACK і Window, використовуються для виявлення firewall, щоб дізнатись, чи порти фільтруються. -sW розрізняє open/closed за різницею window: open (RST з window ≠ 0), closed (RST window = 0), filtered (ICMP unreachable або нічого). Не всі машини так працюють — якщо все закрите, значить не працює, якщо кілька відкритих — працює, якщо багато відкритих і мало закритих — працює навпаки.
  • -sI: Idle scan. У випадках активного firewall, але коли відомо, що він не фільтрує до певного IP (або щоб залишитись анонімним), використовують zombie scanner (працює для всіх портів). Для пошуку можливих zombie можна використати скрипт ipidseq або exploit auxiliary/scanner/ip/ipidseq. Цей сканер базується на полі IPID в IP-пакетах.
  • --badsum: Відправляє неправильну суму, машини відкинуть пакети, але firewall може щось відповісти — використовується для виявлення firewall.
  • -sZ: "Weird" SCTP scanner, при відправці проб з cookie echo fragments вони повинні бути відкинуті, якщо відкрито, або відповісти ABORT якщо закрито. Може проходити firewall, через які init не проходить; недолік — не розрізняє filtered і open.
  • -sO: Protocol IP scan. Відправляє некоректні та порожні заголовки, в яких іноді навіть протокол важко визначити. Якщо приходить ICMP unreachable protocol — closed, якщо unreachable port — open, якщо інша помилка — filtered, якщо нічого — open|filtered.
  • -b <server>: FTPhost --> Використовується для сканування хоста з іншого хоста: підключитись до ftp іншої машини і попросити її надіслати файли на порти, які ви хочете просканувати, з відповіді дізнаємось, відкриті вони чи ні. [<user>:<password>@]<server>[:<port>] Майже всі ftp-сервери зараз забороняють це, тому мало практичної користі.

Фокусний аналіз

-p: Використовується для вказання портів для сканування. Щоб вибрати всі 65,535 портів: -p- або -p all. Nmap має внутрішню класифікацію за популярністю. За замовчуванням сканує top 1000 портів. З -F (fast scan) аналізує top 100. З --top-ports аналізує вказану кількість top портів (від 1 до 65,535). Перевіряє порти у випадковому порядку; щоб цього уникнути, використовуйте -r. Можна також вказати конкретні порти: 20-30,80,443,1024- (останнє означає від 1024 і далі). Можна групувати порти по протоколах: U:53,T:21-25,80,139,S:9. Можна також вибрати діапазон у популярних портах Nmap: -p [-1024] аналізує до порту 1024 з тих, що включені в nmap-services. --port-ratio Аналізує найбільш поширені порти в межах коефіцієнту між 0 і 1.

-sV Сканування версій, інтенсивність можна регулювати від 0 до 9, за замовчуванням 7.

--version-intensity Регулює інтенсивність: чим нижче — тим менше проб запускається (тільки найімовірніші), що дозволяє значно скоротити час UDP-сканування.

-O Визначення OS

--osscan-limit Для коректного визначення хоста потрібно принаймні один відкритий і один закритий порт. Якщо ця умова не виконана і встановлено цю опцію — OS-передбачення не виконується (заощаджує час).

--osscan-guess Коли визначення OS не є точним — змушує спробувати більше варіантів.

Скрипти

--script |||[,...]

Щоб використати default scripts — використайте -sC або --script=default

Доступні типи: auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, і vuln

  • Auth: виконує всі доступні authentication scripts
  • Default: виконує базові default tool scripts
  • Discovery: витягує інформацію з цілі або жертви
  • External: скрипт для використання зовнішніх ресурсів
  • Intrusive: використовує скрипти, які вважаються intrusive до жертви чи цілі
  • Malware: перевіряє підключення, відкриті шкідливим кодом або backdoors
  • Safe: виконує неінтрузивні скрипти
  • Vuln: виявляє найбільш відомі вразливості
  • All: виконує абсолютно всі доступні NSE extension scripts

Щоб шукати скрипти:

nmap --script-help="http-*" -> Those starting with http-

nmap --script-help="not intrusive" -> All except those

nmap --script-help="default or safe" -> Those in either or both

nmap --script-help="default and safe" --> Those in both

nmap --script-help="(default or safe or intrusive) and not http-*"

--script-args =,={=},={,}

--script-args-file

--script-help ||||all[,...]

--script-trace ---> Надає інформацію про прогрес виконання скрипта

--script-updatedb

Щоб використати скрипт, просто введіть: nmap --script Script_Name target --> Під час використання скрипта одночасно виконуються і сканер, тому можна додавати і опції сканера. Можна додати "safe=1" щоб виконувати лише safe-скрипти.

Керування часом

Nmap може задавати таймаути в sec, min, ms: --host-timeout аргументи 900000ms, 900, 900s, та 15m — всі роблять те саме.

Nmap ділить загальну кількість хостів для сканування на групи і аналізує ці групи блоками, тому не перейде до наступного блоку, доки всі не будуть проаналізовані (і користувач не отримує оновлень, доки блок не оброблено). З цієї причини для Nmap оптимально використовувати великі групи. За замовчуванням для class C використовує 256.

Це можна змінити за допомогою --min-hostgroup ; --max-hostgroup (Налаштування розміру паралельних груп сканування)

Можна контролювати кількість паралельних сканерів, але краще цього не робити (Nmap вже має автоматичний контроль залежно від стану мережі): --min-parallelism ; --max-parallelism

Ми можемо змінити RTT timeout, але зазвичай не потрібно: --min-rtt-timeout , --max-rtt-timeout , --initial-rtt-timeout

Можемо змінити кількість повторів: --max-retries

Можемо змінити час сканування одного хоста: --host-timeout

Можемо змінити затримку між кожним тестом, щоб уповільнити: --scan-delay ; --max-scan-delay

Можемо змінити кількість пакетів в секунду: --min-rate ; --max-rate

Багато портів довго відповідають, коли фільтруються або закриті. Якщо нас цікавлять лише відкриті, можна прискоритись: --defeat-rst-ratelimit

Щоб визначити, наскільки агресивним хочемо бути: -T paranoid|sneaky|polite|normal|aggressive|insane

-T (0-1)

-T0 --> Сканує лише 1 порт одночасно і чекає 5 хв до наступного

-T1 і T2 --> Дуже подібні, але чекають 15 і 0.4 с відповідно між тестами

-T3 --> Режим за замовчуванням, включає паралельне сканування

-T4 --> --max-rtt-timeout 1250ms --min-rtt-timeout 100ms --initial-rtt-timeout 500ms --max-retries 6 --max-scan-delay 10ms

-T5 --> --max-rtt-timeout 300ms --min-rtt-timeout 50ms --initial-rtt-timeout 250ms --max-retries 2 --host-timeout 15m --max-scan-delay 5ms

Firewall/IDS

Вони не дозволяють доступ до портів і аналізують пакети.

-f Фрагментація пакетів, за замовчуванням фрагменти по 8 bytes після заголовка; щоб вказати розмір використовують ..mtu (з цим не використовуйте -f), зсув має бути кратний 8. Version scanners і scripts не підтримують фрагментацію

-D decoy1,decoy2,ME Nmap відправляє сканери від імені інших IP, таким чином ховаючи вас. Якщо вставити ME у список, Nmap поставить вас там; краще поставити 5-6 адрес перед вами, щоб повністю замаскуватись. Random IP можна згенерувати з RND:. Не працюють з TCP version detectors без з'єднання. Якщо ви всередині мережі — краще використовувати активні IP, інакше буде очевидно, що ви єдиний активний.

Щоб використати random IP: nmap -D RND:10 Target_IP

-S IP Коли Nmap не бачить вашу IP — потрібно вказати її. Також служить, щоб змусити думати, що інша ціль сканує їх.

-e Вибір інтерфейсу

Багато адміністраторів залишають деякі порти відкритими для зручності (DNS, FTP тощо). Щоб знайти цю вразливість, Nmap має: --source-port ; -g Еквівалентні

--data Для відправлення hex: --data 0xdeadbeef та --data \xCA\xFE\x09

--data-string Для звичайного тексту: --data-string "Scan conducted by Security Ops, extension 7192"

--data-length Nmap відправляє лише заголовки, з цим додає вказану кількість байтів (генеруються випадково)

Щоб повністю налаштувати IP-пакет використовуйте --ip-options

Щоб побачити опції в пакетах, вказаних та отриманих, вкажіть --packet-trace. Більше інформації та прикладів використання IP options з Nmap: http://seclists.org/nmap-dev/2006/q3/52.

--ttl

--randomize-hosts Щоб зробити атаку менш помітною

--spoof-mac <MAC address, prefix, or vendor name> Змінити MAC, приклади: Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2, Cisco

--proxies Використання проксі, іноді проксі не підтримує стільки відкритих з'єднань, скільки хоче Nmap — може знадобитись змінити паралелізм: --max-parallelism

-sP Виявлення хостів у нашій мережі через ARP

Багато адміністраторів створюють правило firewall, що дозволяє всі пакети з певного порту (наприклад 20,53,67). Можна сказати Nmap відправляти пакети з цих портів: nmap --source-port 53 IP

Виводи

-oN file Normal output

-oX file XML output

-oS file Script kiddies output

-oG file Greppable output

-oA file All except -oS

-v level verbosity

-d level debugging

--reason Причина стану хоста

--stats-every time Кожен такий проміжок показує прогрес

--packet-trace Щоб бачити, які пакети виходять; можна вказати фільтри, напр.: --version-trace або --script-trace

--open показує only open, open|filtered та unfiltered

--resume file Відновити зведення

Різне

-6 Дозволяє IPv6

-A еквівалентно -O -sV -sC --traceroute

Час виконання

Поки Nmap працює, опції можна змінювати:

v / V Збільшити / зменшити рівень verbosity

d / D Збільшити / зменшити рівень debugging

p / P Увімкнути / вимкнути packet tracing

? Показати help-екран runtime interaction

Vulscan

Скрипт Nmap, який аналізує версії сервісів за офлайн-базою даних (скачано з інших важливих джерел) і повертає можливі вразливості

Бази, які використовує:

  1. Scipvuldb.csv | http://www.scip.ch/en/?vuldb
  2. Cve.csv | http://cve.mitre.org
  3. Osvdb.csv | http://www.osvdb.org
  4. Securityfocus.csv | http://www.securityfocus.com/bid/
  5. Securitytracker.csv | http://www.securitytracker.com
  6. Xforce.csv | http://xforce.iss.net
  7. Exploitdb.csv | http://www.exploit-db.com
  8. Openvas.csv | http://www.openvas.org

Щоб завантажити та встановити у папку Nmap:

wget http://www.computec.ch/projekte/vulscan/download/nmap_nse_vulscan-2.0.tar.gz && tar -czvf nmap_nse_vulscan-2.0.tar.gz vulscan/ && sudo cp -r vulscan/ /usr/share/nmap/scripts/

Також потрібно завантажити пакети DB і додати їх до /usr/share/nmap/scripts/vulscan/

Використання:

Щоб використати всі: sudo nmap -sV --script=vulscan HOST_TO_SCAN

Щоб використати конкретну DB: sudo nmap -sV --script=vulscan --script-args vulscandb=cve.csv HOST_TO_SCAN

Прискорення Nmap Service scan x16

Згідно to this post ви можете прискорити аналіз сервісів nmap, змінивши всі значення totalwaitms в /usr/share/nmap/nmap-service-probes на 300 і tcpwrappedms на 200.

Крім того, проби, які не мають явно визначеного servicewaitms, використовують значення за замовчуванням 5000. Тому можна або додати значення до кожної проби, або скомпілювати nmap самому та змінити значення за замовчуванням у service_scan.h.

Якщо ви не хочете змінювати totalwaitms і tcpwrappedms у файлі /usr/share/nmap/nmap-service-probes, можна відредагувати parsing code, щоб ці значення в nmap-service-probes файлі повністю ігнорувалися.

Збірка статичного Nmap для обмежених середовищ

У загартованих або мінімальних Linux-середовищах (контейнери, appliances) динамічно зібрані бінарники Nmap часто відмовляють через відсутні runtime loaders або shared libraries (наприклад, /lib64/ld-linux-x86-64.so.2, libc.so). Збірка власного statically linked Nmap і пакування NSE-даних дозволяє запуск без встановлення системних пакетів.

Загальний підхід

  • Використати чистий amd64 Ubuntu builder через Docker.
  • Зібрати OpenSSL і PCRE2 як static libraries.
  • Зібрати Nmap, лінкуючи статично і використовуючи включені libpcap/libdnet, щоб уникнути динамічних залежностей.
  • Пакувати NSE scripts і data directories разом з бінарником.

Визначити архітектуру цілі (приклад)

bash
uname -a
# If building from macOS/ARM/etc., pin the builder arch:
docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc 'echo ok'

Крок 1 — Підготуйте набір інструментів

bash
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get install -y --no-install-recommends \
build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \
automake autoconf libtool m4 zlib1g-dev

Крок 2 — Зібрати OpenSSL статично (1.1.1w)

bash
OSSL="1.1.1w"
curl -fsSLO "https://www.openssl.org/source/openssl-$OSSL.tar.gz"
tar xzf "openssl-$OSSL.tar.gz" && cd "openssl-$OSSL"
./Configure no-shared no-zlib linux-x86_64 -static --prefix=/opt/ossl
make -j"$(nproc)" && make install_sw
cd /tmp

Крок 3 — Збірка статичної PCRE2 (10.43)

bash
PCRE2=10.43
curl -fsSLO "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2"
tar xjf "pcre2-$PCRE2.tar.bz2" && cd "pcre2-$PCRE2"
./configure --disable-shared --enable-static --prefix=/opt/pcre2
make -j"$(nproc)" && make install
cd /tmp

Крок 4 — Збірка статичного Nmap (7.98)

bash
NMAP=7.98
curl -fsSLO "https://nmap.org/dist/nmap-$NMAP.tar.bz2"
tar xjf "nmap-$NMAP.tar.bz2" && cd "nmap-$NMAP"
export CPPFLAGS="-I/opt/ossl/include -I/opt/pcre2/include"
export LDFLAGS="-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc"
export LIBS="-lpcre2-8 -ldl -lpthread -lz"
./configure \
--with-openssl=/opt/ossl \
--with-libpcre=/opt/pcre2 \
--with-libpcap=included \
--with-libdnet=included \
--without-zenmap --without-ndiff --without-nmap-update
# Avoid building shared libpcap by accident
sed -i -e "s/^shared: /shared: #/" libpcap/Makefile || true
make -j1 V=1 nmap
strip nmap

Ключові моменти

  • -static, -static-libstdc++, -static-libgcc змушують статичне лінкування.
  • Використання --with-libpcap=included/--with-libdnet=included уникає використання системних shared libs.
  • Невелика правка через sed відключає ціль shared libpcap, якщо вона присутня.

Крок 5 — Пакетування binary і даних NSE

bash
mkdir -p /out/nmap-bundle/nmap-data
cp nmap /out/nmap-bundle/nmap-linux-amd64-static
cp -r scripts nselib /out/nmap-bundle/nmap-data/
cp nse_main.lua nmap-services nmap-protocols nmap-service-probes \
nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc \
/out/nmap-bundle/nmap-data/ 2>/dev/null || true

tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle

Примітки щодо перевірки та операцій

  • Використовуйте file на артефакті, щоб підтвердити, що він статично зв'язаний.
  • Тримайте NSE data разом із binary, щоб забезпечити паритет скриптів на хостах без встановленого Nmap.
  • Навіть зі static binary виконання може бути заблоковане AppArmor/seccomp/SELinux; DNS/egress все одно має працювати.
  • Детерміновані збірки знижують ризик ланцюга постачання порівняно зі скачуванням непрозорих «static» binaries.

One-liner (Dockerized)

Зібрати, упакувати та вивести інформацію про артефакт
bash
docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc '
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get install -y --no-install-recommends \
build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \
automake autoconf libtool m4 zlib1g-dev

OSSL="1.1.1w"; curl -fsSLO "https://www.openssl.org/source/openssl-$OSSL.tar.gz" \
&& tar xzf "openssl-$OSSL.tar.gz" && cd "openssl-$OSSL" \
&& ./Configure no-shared no-zlib linux-x86_64 -static --prefix=/opt/ossl \
&& make -j"$(nproc)" && make install_sw && cd /tmp

PCRE2=10.43; curl -fsSLO "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2" \
&& tar xjf "pcre2-$PCRE2.tar.bz2" && cd "pcre2-$PCRE2" \
&& ./configure --disable-shared --enable-static --prefix=/opt/pcre2 \
&& make -j"$(nproc)" && make install && cd /tmp

NMAP=7.98; curl -fsSLO "https://nmap.org/dist/nmap-$NMAP.tar.bz2" \
&& tar xjf "nmap-$NMAP.tar.bz2" && cd "nmap-$NMAP" \
&& export CPPFLAGS="-I/opt/ossl/include -I/opt/pcre2/include" \
&& export LDFLAGS="-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc" \
&& export LIBS="-lpcre2-8 -ldl -lpthread -lz" \
&& ./configure --with-openssl=/opt/ossl --with-libpcre=/opt/pcre2 --with-libpcap=included --with-libdnet=included --without-zenmap --without-ndiff --without-nmap-update \
&& sed -i -e "s/^shared: /shared: #/" libpcap/Makefile || true \
&& make -j1 V=1 nmap && strip nmap

mkdir -p /out/nmap-bundle/nmap-data \
&& cp nmap /out/nmap-bundle/nmap-linux-amd64-static \
&& cp -r scripts nselib /out/nmap-bundle/nmap-data/ \
&& cp nse_main.lua nmap-services nmap-protocols nmap-service-probes nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc /out/nmap-bundle/nmap-data/ 2>/dev/null || true \
&& tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle \
&& echo "===== OUTPUT ====="; ls -lah /out; echo "===== FILE TYPE ====="; file /out/nmap-bundle/nmap-linux-amd64-static || true
'

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks