Nmap Podsumowanie (ESP)

Tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Przeglądaj pełny katalog HackTricks Training dla ścieżek assessment (ARTA/GRTA/AzRTA) oraz Linux Hacking Expert (LHE).

Wsparcie HackTricks
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24

Parametry

Adresy IP do skanowania

  • <ip>,<net/mask>: Wskaż adresy IP bezpośrednio
  • -iL <ips_file>: list_IPs
  • -iR <number>: Liczba losowych IP, możesz wykluczyć możliwe IP za pomocą --exclude <Ips> lub --excludefile <file>.

Wykrywanie urządzeń

Domyślnie Nmap uruchamia fazę wykrywania składającą się z: -PA80 -PS443 -PE -PP

  • -sL: Nieinwazyjne, wypisuje cele wykonując zapytania DNS w celu rozwiązywania nazw. Przydatne, by wiedzieć, czy np. www.prueba.es/24 wszystkie IP są naszymi celami.
  • -Pn: Brak pingów. Przydatne gdy wiesz, że wszystkie są aktywne (w przeciwnym razie możesz stracić dużo czasu, ale ta opcja może także dawać fałszywie negatywne wyniki twierdząc, że nie są aktywne), zapobiega fazie wykrywania.
  • -sn : Brak skanowania portów. Po zakończeniu fazy rozpoznania nie skanuje portów. Relatywnie skryte, pozwala na szybkie skanowanie małej sieci. Z uprawnieniami wysyła ACK (-PA) na 80, SYN(-PS) na 443 oraz echo request i Timestamp request; bez uprawnień zawsze kończy połączenia. Jeśli celem jest sieć, używa tylko ARP(-PR). Jeśli użyte z inną opcją, pakiety innej opcji są pomijane.
  • -PR: Ping ARP. Używane domyślnie przy analizie komputerów w naszej sieci, szybsze niż używanie pingów. Jeśli nie chcesz używać pakietów ARP, użyj --send-ip.
  • -PS <ports>: Wysyła pakiety SYN; jeśli odpowie SYN/ACK to port jest otwarty (odpowiada się RST, aby nie zakończyć połączenia), jeśli odpowie RST to jest zamknięty, a jeśli nie odpowie to jest niedostępny. W przypadku braku uprawnień używane jest automatycznie pełne połączenie. Jeśli nie podano portów, używa 80.
  • -PA <ports>: Jak wyżej, ale z ACK; łączenie obu daje lepsze wyniki.
  • -PU <ports>: Cel jest odwrotny — wysyła się do portów, które spodziewane są zamknięte. Niektóre firewalle sprawdzają tylko połączenia TCP. Jeśli jest zamknięty, odpowiada port unreachable; jeśli odpowie innym ICMP lub nie odpowie, traktowany jest jako destination unreachable.
  • -PE, -PP, -PM : ICMP PINGI: echo reply, timestamp i addresmask. Wysyłane aby sprawdzić, czy cel jest aktywny.
  • -PY<ports>: Wysyła SCTP INIT (domyślnie do 80), może odpowiedzieć INIT-ACK (open) lub ABORT (closed) albo nic/ICMP unreachable (inactive).
  • -PO <protocols>: Wskazuje protokół w nagłówkach, domyślnie 1(ICMP), 2(IGMP) i 4(Encap IP). Dla protokołów ICMP, IGMP, TCP (6) i UDP (17) wysyłane są nagłówki protokołów, dla reszty tylko nagłówek IP. Cel jest taki, że w wyniku sfałszowania nagłówków otrzymuje się Protocol unreachable lub odpowiedzi tego samego protokołu, co pozwala ustalić, czy host jest aktywny.
  • -n: Brak DNS
  • -R: Zawsze DNS
  • --system-dns: Wymusza użycie resolvera systemowego zamiast równoległego stub resolvera Nmapa. Przydatne gdy /etc/hosts, split-DNS lub wtyczki resolvera zwracają dane, których bezpośrednie zapytania Nmapa nie dają. Wolniejsze; od Nmap 7.96 forward lookups są już zrównoleglone, więc zwykle potrzebne tylko dla kompatybilności resolvera.
  • --dns-servers <server[,server],...>: Wymusza konkretne serwery DNS dla reverse lookups. Przydatne w testach wewnętrznych do bezpośredniego zapytania serwerów autorytatywnych lub wewnętrznych resolverów, albo aby przekierować ruch -sL/reverse-DNS z domyślnych resolverów testera.

Techniki skanowania portów

  • -sS: Nie kończy połączenia, więc nie zostawia śladu — bardzo dobre jeśli można go użyć (wymaga uprawnień). Używane domyślnie.
  • -sT: Kończy połączenie, więc zostawia ślad, ale można go zawsze użyć. Domyślnie bez uprawnień.
  • -sU: Wolniejsze, dla UDP. Głównie: DNS(53), SNMP(161,162), DHCP(67 i 68) — (-sU53,161,162,67,68): open(reply), closed(port unreachable), filtered (inne ICMP), open/filtered (brak odpowiedzi). W przypadku open/filtered, -sV wysyła wiele zapytań aby wykryć wersję obsługiwaną przez nmap i może wykryć rzeczywisty stan. Zwiększa znacząco czas.
  • -sY: SCTP — nie udaje się ustanowić połączenia, więc brak logów; działa jak -PY
  • -sN,-sX,-sF: Null, Fin, Xmas — potrafią ominąć niektóre firewalle i wydobyć informacje. Bazują na tym, że zgodne maszyny powinny odpowiadać RST na żądania bez SYN/RST/ACK: open/filtered (brak odpowiedzi), closed (RST), filtered (ICMP unreachable). Niewiarygodne na Windows, Cisco, BSDI i OS/400. Na Unix działa.
  • -sM: Maimon scan: Wysyła FIN i ACK, używane dla BSD, obecnie zwraca wszystko jako closed.
  • -sA, sW: ACK i Window, używane do wykrywania firewalli, by wiedzieć czy porty są filtrowane. -sW rozróżnia open/closed ponieważ otwarte odpowiadają inną wartością window: open (RST z window ≠ 0), closed (RST window = 0), filtered (ICMP unreachable lub brak odpowiedzi). Nie wszystkie maszyny działają tak samo; jeśli wszystko jest closed, metoda nie działa; jeśli kilka otwartych, działa poprawnie; jeśli dużo otwartych i kilka closed, działa odwrotnie.
  • -sI: Idle scan. Gdy istnieje aktywny firewall, ale wiemy, że nie filtruje do pewnego IP (lub gdy chcemy anonimowości), używamy zombie scanner (działa dla wszystkich portów). Aby znaleźć możliwe zombie można użyć skryptu ipidseq lub exploit auxiliary/scanner/ip/ipidseq. Ten skaner bazuje na numerze IPID pakietów IP.
  • --badsum: Wysyła błędną sumę kontrolną; komputery odrzuciłyby pakiety, ale firewalle mogą odpowiedzieć czymś — używane do wykrywania firewalli.
  • -sZ: “Weird” SCTP scanner — przy wysyłaniu probe’ów z cookie echo fragments powinny być odrzucone jeśli open albo odpowiadać ABORT jeśli closed. Może przechodzić przez firewalle, których init nie przechodzi; wadą jest brak rozróżnienia między filtered a open.
  • -sO: Skan protokołów IP. Wysyła złe i puste nagłówki, w których czasem nie można rozpoznać nawet protokołu. Jeśli przychodzi ICMP protocol unreachable — jest closed; jeśli przychodzi unreachable port — open; jeśli inny błąd — filtered; jeśli nic nie przychodzi — open|filtered.
  • -b <server>: FTPhost –> Używane do skanowania hosta z innego hosta poprzez połączenie z FTP innej maszyny i poproszenie jej o wysłanie plików na porty, które chcemy przeskanować z tamtej maszyny; zgodnie z odpowiedziami wiemy, czy są otwarte. [<user>:<password>@]<server>[:<port>] Prawie wszystkie serwery FTP już tego nie pozwalają, więc ma niewiele praktycznego zastosowania.

Skupiona analiza

-p: Używane do określenia portów do skanowania. Aby wybrać wszystkie 65,335 portów: -p- lub -p all. Nmap ma wewnętrzną klasyfikację opartą na popularności. Domyślnie używa top 1000 portów. Z -F (fast scan) analizuje top 100. Z –top-ports analizuje tę liczbę najpopularniejszych portów (od 1 do 65,335). Sprawdza porty w losowej kolejności; aby temu zapobiec użyj -r. Można też wybrać konkretne porty: 20-30,80,443,1024- (to ostatnie oznacza od 1024 wzwyż). Można grupować porty po protokołach: U:53,T:21-25,80,139,S:9. Można też wybrać zakres w popularnych portach Nmapa: -p [-1024] analizuje do portu 1024 spośród tych zawartych w nmap-services. –port-ratio Analizuje najczęściej używane porty w proporcji między 0 a 1

-sV Skanowanie wersji; intensywność można regulować od 0 do 9, domyślnie 7.

–version-intensity Regulujemy intensywność — im niższa, tym wysyłane będą tylko najbardziej prawdopodobne probe’y, a nie wszystkie. Dzięki temu można znacząco skrócić czas skanowania UDP.

–version-light Alias --version-intensity 2. Bardzo przydatne na pierwsze przejście przeciw dużym zakresom lub wolnym usługom UDP.

–version-all Alias --version-intensity 9. Wymusza wszystkie probe’y; przydatne gdy usługa odpowiada tylko na rzadkie probe’y.

–allports Wymusza wykrywanie wersji na portach wyłączonych przez nmap-service-probes (np. TCP/9100). Uwaga: na niektórych drukarkach lub nasłuchujących raw socket może to spowodować wydrukowanie danych probe’a.

-O Wykrywanie OS

–osscan-limit Do poprawnego zgadywania hosta potrzebny jest przynajmniej jeden otwarty i jeden zamknięty port. Jeśli ten warunek nie jest spełniony i ustawiliśmy tę opcję, nie będzie próbować przewidywania OS (oszczędza czas)

–osscan-guess Gdy wykrywanie OS nie jest perfekcyjne, to zmusza do dokładniejszych prób

Skrypty

–script |||[,…]

Aby użyć domyślnych skryptów, użyj -sC lub –script=default

Dostępne typy: auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, oraz vuln

  • Auth: uruchamia wszystkie dostępne skrypty uwierzytelniające
  • Default: uruchamia podstawowe domyślne skrypty narzędzia
  • Discovery: pobiera informacje z celu lub ofiary
  • External: skrypt korzystający z zasobów zewnętrznych
  • Intrusive: używa skryptów uznawanych za inwazyjne dla celu/ofiary
  • Malware: sprawdza połączenia otwarte przez złośliwe oprogramowanie lub backdoory
  • Safe: uruchamia nieinwazyjne skrypty
  • Vuln: odkrywa najbardziej znane podatności
  • All: uruchamia absolutnie wszystkie dostępne skrypty NSE

Aby wyszukać skrypty:

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 —> Dostarcza informacji o postępie działania skryptu

–script-updatedb

Aby użyć skryptu, po prostu wpisz: nmap –script Script_Name target –> Przy użyciu skryptu zarówno skrypt, jak i skaner zostaną uruchomione, więc można dodać również opcje skanera. Możemy dodać “safe=1” aby uruchomić tylko bezpieczne.

Kontrola czasu

Nmap może przyjmować czas w sekundach, minutach, ms: –host-timeout argumenty 900000ms, 900, 900s, i 15m robią to samo.

Nmap dzieli całkowitą liczbę hostów do przeskanowania na grupy i analizuje te grupy blokami, więc nie przechodzi do następnego bloku, dopóki wszystkie w bieżącym nie będą przeanalizowane (i użytkownik nie otrzymuje aktualizacji dopóki blok nie zostanie przetworzony). Dzięki temu efektywniejsze jest używanie dużych grup. Domyślnie w klasie C używa 256.

Można to zmienić za pomocą –min-hostgroup ; –max-hostgroup (Dostosowuje wielkości równoległych grup skanowania)

Możesz kontrolować liczbę równoległych skanerów, ale lepiej tego nie robić (Nmap ma automatyczną kontrolę na podstawie stanu sieci): –min-parallelism ; –max-parallelism

Możemy modyfikować timeout RTT, ale zwykle nie jest to konieczne: –min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout

Możemy modyfikować liczbę prób: –max-retries

Możemy modyfikować czas skanowania hosta: –host-timeout

Możemy modyfikować opóźnienie między testami, aby spowolnić: –scan-delay ; –max-scan-delay

Możemy modyfikować liczbę pakietów na sekundę: –min-rate ; –max-rate

Wiele portów długo odpowiada gdy są filtrowane lub zamknięte. Jeśli interesują nas tylko otwarte, możemy przyspieszyć: –defeat-rst-ratelimit

Aby zdefiniować jak agresywny ma być Nmap: -T paranoid|sneaky|polite|normal|aggressive|insane

-T (0-1)

-T0 –> Skanuje tylko 1 port na raz i czeka 5 minut do następnego

-T1 i T2 –> Bardzo podobne, ale czekają kolejno 15s i 0.4s między testami

-T3 –> Tryb domyślny, zawiera równoległe skanowanie

-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

Nie pozwalają na dostęp do portów i analizują pakiety.

-f Fragmentuje pakiety, domyślnie dzieli je na 8 bajtów po nagłówku; aby określić rozmiar użyj ..mtu (z tym nie używaj -f), offset musi być wielokrotnością 8. Version scanners and scripts don’t support fragmentation

-D decoy1,decoy2,ME Nmap wysyła skanery z innymi adresami IP jako źródło, w ten sposób cię ukrywa. Jeśli umieścisz ME na liście, Nmap umieści ciebie tam; lepiej dać 5–6 przed tobą, aby całkowicie się zamaskować. Losowe IP można generować z RND: aby wygenerować losowych IP. Nie działają z TCP version detectors bez połączenia. Jeśli jesteś w sieci wewnętrznej, lepiej użyć aktywnych IP, bo w przeciwnym razie łatwo będzie ustalić, że jesteś jedynym aktywnym.

Aby użyć losowych IP: nmap -D RND:10 Target_IP

-S IP Gdy Nmap nie rozpoznaje twojego IP, trzeba je podać. Służy też do zmylenia, że inny target cię skanuje.

-e Wybór interfejsu

Wielu administratorów zostawia pewne porty wejściowe otwarte dla poprawnego działania usług — łatwiej niż szukać innego rozwiązania. Mogą to być porty DNS lub FTP… aby znaleźć tę podatność Nmap ma: –source-port ;-g Są równoważne

–data Wysyła tekst heksadecymalny: –data 0xdeadbeef i –data \xCA\xFE\x09

–data-string Wysyła zwykły tekst: –data-string “Scan conducted by Security Ops, extension 7192”

–data-length Nmap wysyła tylko nagłówki; z tym dodajemy określoną liczbę bajtów (generowanych losowo)

Aby skonfigurować całkowicie pakiet IP użyj –ip-options

Jeśli chcesz zobaczyć opcje w pakietach wysyłanych i odbieranych, określ –packet-trace. Dla więcej informacji i przykładów użycia IP options z Nmap zobacz http://seclists.org/nmap-dev/2006/q3/52.

–ttl

–randomize-hosts Aby uczynić atak mniej oczywistym

–spoof-mac <MAC address, prefix, or vendor name> Aby zmienić MAC przykłady: Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2, oraz Cisco

–proxies Aby użyć proxy; czasem proxy nie utrzymuje tylu otwartych połączeń ile Nmap chce, więc równoległość trzeba będzie zmodyfikować: –max-parallelism

-sP Aby odkryć hosty w naszej sieci przez ARP

Wielu administratorów tworzy regułę firewalla pozwalającą na przepuszczanie wszystkich pakietów pochodzących z określonego portu (np. 20,53,67); możemy powiedzieć Nmapowi, aby wysyłał pakiety z tych portów: nmap –source-port 53 IP

Wyjścia

-oN file Normalne wyjście

-oX file Wyjście XML

-oS file Script kiddies output

-oG file Greppable output. Dalej działa, ale jest przestarzałe; XML jest lepszy do automatyzacji, bo nowe funkcje Nmap trafiają tam najpierw. Wciąż używaj -oN jeśli chcesz --resume, i preferuj -oX/-oA do parsowania maszynowego.

-oA file Wszystkie oprócz -oS

–webxml Zmienia odwołanie stylesheet w XML na https://nmap.org/svn/docs/nmap.xsl, ułatwiając otwieranie XML jako HTML na innym komputerze.

–stylesheet <path|url> Użyj własnego XSL stylesheet. --webxml to tylko skrót do hostowanej oficjalnej stylesheet.

-v level szczegółowość (verbosity)

-d level debugowanie

–reason Powód stanu hosta i portu

–stats-every time Co dany czas informuje o postępie

–packet-trace Aby zobaczyć jakie pakiety wychodzą; można określić filtry, np. –version-trace lub –script-trace

–open pokazuje open, open|filtered i unfiltered

–resume file Wznawia przerwany skan z normalnego (-oN) lub grepable (-oG) pliku wyjściowego. W obecnych workflowach powszechne jest trzymanie -oN dla wznowienia i -oX dla parsowania.

Przykład do workflowów parsowania/konwersji HTML:

# Send only XML to stdout for tooling
nmap -sV -oX - 10.10.10.0/24

# Portable HTML-friendly XML
nmap -sV --webxml -oX scan.xml 10.10.10.10

Różne

-6 Włącza obsługę IPv6

-A jest równoważne z -O -sV -sC –traceroute

Czas działania

Podczas działania Nmap możemy zmieniać opcje:

v / V Zwiększ / zmniejsz poziom szczegółowości

d / D Zwiększ / zmniejsz poziom debugowania

p / P Włącz / wyłącz śledzenie pakietów

? Wyświetl ekran pomocy interakcji w czasie działania

Vulscan

Skrypt Nmap, który analizuje wersje usług uzyskane w bazie offline (pobranej z innych, bardzo ważnych źródeł) i zwraca możliwe podatności

Używane bazy danych to:

  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

Aby pobrać i zainstalować w katalogu 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/

Musisz również pobrać pakiety bazy danych i dodać je do /usr/share/nmap/scripts/vulscan/

Użycie:

Aby użyć wszystkich: sudo nmap -sV –script=vulscan HOST_TO_SCAN

Aby użyć konkretnej bazy: sudo nmap -sV –script=vulscan –script-args vulscandb=cve.csv HOST_TO_SCAN

Jeśli masz dostęp do Internetu, oficjalny skrypt NSE Nmap vulners jest zwykle najszybszą, utrzymywaną alternatywą dla wzbogacania na podstawie wersji:

nmap -sV --script vulners --script-args mincvss=7.0 <IP>

This script belongs to the safe, external, and vuln categories. Because it depends on how accurate -sV was, validate hits manually when the service banner is generic or proxied.

Recent Practical Notes (7.94+)

  • Since Nmap 7.94, UDP port scan (-sU) and version detection (-sV) use the same nmap-service-probes payload source. A UDP response from the scan phase can immediately feed version matching, so -sU -sV --version-light is now a good first pass against large or lossy ranges.
  • Since Nmap 7.94, -sV can also probe UDP services hidden behind DTLS, which is useful for modern management/ICS gear that wraps UDP protocols in DTLS.
  • Nmap 7.95 added a large batch of new service fingerprints, including grpc, mysqlx, remotemouse, and tuya, plus new ICS-focused NSE coverage such as hartip-info and iec61850-mms. If you are scanning OT or embedded estates, updating Nmap matters more than adding custom probes too early.
  • Since Nmap 7.96, forward DNS lookups are parallelized too. Large hostname lists are much faster now, so --system-dns should usually be reserved for compatibility issues instead of performance.

Speed Up Nmap Service scan x16

According to this post you can speed up the nmap service analysis by modifying all the totalwaitms values in /usr/share/nmap/nmap-service-probes to 300 and tcpwrappedms to 200.

Moreover, probes which do not have a specifically defined servicewaitms use a default value of 5000. Therefore, we can either add values to each of the probes, or we can compile nmap ourselves and change the default value in service_scan.h.

If you don’t want to change the values of totalwaitms and tcpwrappedms at all in the /usr/share/nmap/nmap-service-probes file, you can edit the parsing code such that these values in the nmap-service-probes file are completely ignored.

Build a static Nmap for restricted environments

In hardened or minimal Linux environments (containers, appliances), dynamically linked Nmap binaries often fail due to missing runtime loaders or shared libraries (e.g., /lib64/ld-linux-x86-64.so.2, libc.so). Building your own statically linked Nmap and bundling NSE data allows execution without installing system packages.

High-level approach

  • Use a clean amd64 Ubuntu builder via Docker.
  • Build OpenSSL and PCRE2 as static libraries.
  • Build Nmap linking statically and using the included libpcap/libdnet to avoid dynamic deps.
  • Bundle NSE scripts and data directories with the binary.

Discover target architecture (example)

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'

Krok 1 — Przygotuj toolchain

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

Krok 2 — Zbuduj statyczne 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

Krok 3 — Zbuduj statyczną wersję 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

Krok 4 — Zbuduj statyczny 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

Kluczowe punkty

  • -static, -static-libstdc++, -static-libgcc wymuszają statyczne linkowanie.
  • Użycie –with-libpcap=included/–with-libdnet=included zapobiega korzystaniu ze współdzielonych bibliotek systemowych.
  • Modyfikacja sed unieszkodliwia docelową współdzieloną bibliotekę libpcap, jeśli występuje.

Krok 5 — Zapakuj binarkę i dane 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

Notatki weryfikacyjne i operacyjne

  • Użyj polecenia file na artefakcie, aby potwierdzić, że jest statycznie linkowany.
  • Dołączaj dane NSE razem z binarką, aby zapewnić zgodność skryptów na hostach bez zainstalowanego Nmap.
  • Nawet w przypadku statycznej binarki, wykonanie może zostać zablokowane przez AppArmor/seccomp/SELinux; DNS i ruch wychodzący muszą nadal działać.
  • Deterministyczne kompilacje zmniejszają ryzyko w łańcuchu dostaw w porównaniu z pobieraniem nieprzejrzystych “static” binarek.

Jednolinijka (Dockerized)

Zbuduj, spakuj i wyświetl informacje o artefakcie ```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 ’

</details>

## Źródła

- [Kompilowanie statycznego binarnego pliku Nmap do pracy w ograniczonych środowiskach](https://www.pentestpartners.com/security-blog/compiling-static-nmap-binary-for-jobs-in-restricted-environments/)
- [Static Nmap Binary Generator (narzędzie pomocnicze)](https://github.com/0x5ubt13/static_nmap_binary_generator)
- [Źródła OpenSSL](https://www.openssl.org/source/)
- [Wydania PCRE2](https://github.com/PCRE2Project/pcre2/releases)
- [Archiwa źródłowe Nmap](https://nmap.org/dist/)
- [Dziennik zmian Nmap](https://nmap.org/changelog.html)
- [Formaty wyjściowe Nmap](https://nmap.org/book/man-output.html)


> [!TIP]
> Ucz się i ćwicz AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Ucz się i ćwicz GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Ucz się i ćwicz Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Przeglądaj [**pełny katalog HackTricks Training**](https://hacktricks-training.com/courses/) dla ścieżek assessment (**ARTA/GRTA/AzRTA**) oraz [**Linux Hacking Expert (LHE)**](https://hacktricks-training.com/courses/lhe/).
>
> <details>
>
> <summary>Wsparcie HackTricks</summary>
>
> - Sprawdź [**plany subskrypcji**](https://github.com/sponsors/carlospolop)!
> - **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f), [**grupy telegram**](https://t.me/peass), **obserwuj** [**@hacktricks_live**](https://twitter.com/hacktricks_live) na **X/Twitter**, albo sprawdź [**stronę LinkedIn**](https://www.linkedin.com/company/hacktricks/) i [**kanał YouTube**](https://www.youtube.com/@hacktricks_LIVE).
> - **Dziel się hacking tricks, wysyłając PR do** repozytoriów github [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
>
> </details>