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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
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 -p [-1024]
аналізує до порту 1024 з тих, що включені в nmap-services. --port-ratio
-sV Сканування версій, інтенсивність можна регулювати від 0 до 9, за замовчуванням 7.
--version-intensity
-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
--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
Можна контролювати кількість паралельних сканерів, але краще цього не робити (Nmap вже має автоматичний контроль залежно від стану мережі): --min-parallelism
Ми можемо змінити RTT timeout, але зазвичай не потрібно: --min-rtt-timeout , --max-rtt-timeout , --initial-rtt-timeout
Можемо змінити кількість повторів: --max-retries
Можемо змінити час сканування одного хоста: --host-timeout
Можемо змінити затримку між кожним тестом, щоб уповільнити: --scan-delay ; --max-scan-delay
Можемо змінити кількість пакетів в секунду: --min-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:
Щоб використати random IP: nmap -D RND:10 Target_IP
-S IP Коли Nmap не бачить вашу IP — потрібно вказати її. Також служить, щоб змусити думати, що інша ціль сканує їх.
-e
Багато адміністраторів залишають деякі порти відкритими для зручності (DNS, FTP тощо). Щоб знайти цю вразливість, Nmap має: --source-port
--data
--data-string
--data-length
Щоб повністю налаштувати 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
-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, який аналізує версії сервісів за офлайн-базою даних (скачано з інших важливих джерел) і повертає можливі вразливості
Бази, які використовує:
- Scipvuldb.csv | http://www.scip.ch/en/?vuldb
- Cve.csv | http://cve.mitre.org
- Osvdb.csv | http://www.osvdb.org
- Securityfocus.csv | http://www.securityfocus.com/bid/
- Securitytracker.csv | http://www.securitytracker.com
- Xforce.csv | http://xforce.iss.net
- Exploitdb.csv | http://www.exploit-db.com
- 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 разом з бінарником.
Визначити архітектуру цілі (приклад)
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 — Підготуйте набір інструментів
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)
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)
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)
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
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)
Зібрати, упакувати та вивести інформацію про артефакт
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
'
Посилання
- Compiling static Nmap binary for jobs in restricted environments
- Static Nmap Binary Generator (helper tool)
- OpenSSL sources
- PCRE2 releases
- Nmap source tarballs
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.