Nmap Σύνοψη (ESP)
Reading time: 19 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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24
Παράμετροι
IPs προς σάρωση
<ip>,<net/mask>
: Υποδεικνύει τις ips άμεσα-iL <ips_file>
: list_IPs-iR <number>
: Αριθμός τυχαίων Ips, μπορείτε να εξαιρέσετε πιθανές Ips με--exclude <Ips>
ή--excludefile <file>
.
Ανίχνευση εξοπλισμού
Κατά προεπιλογή το Nmap ξεκινάει μια φάση ανακάλυψης που αποτελείται από: -PA80 -PS443 -PE -PP
-sL
: Δεν είναι επεμβατικό, απαριθμεί τους στόχους κάνοντας DNS αιτήσεις για την επίλυση ονομάτων. Είναι χρήσιμο για να ξέρουμε αν π.χ. www.prueba.es/24 όλες οι Ips είναι οι στόχοι μας.-Pn
: No ping. Χρήσιμο αν ξέρετε ότι όλοι είναι ενεργοί (αν όχι, μπορεί να χάσετε πολύ χρόνο, αλλά αυτή η επιλογή επίσης παράγει false negatives λέγοντας ότι δεν είναι ενεργοί), αποτρέπει τη φάση ανακάλυψης.-sn
: No port scan. Μετά την ολοκλήρωση της φάσης αναγνώρισης, δεν σαρώνει πόρτες. Είναι σχετικά stealthy, και επιτρέπει μια μικρή σάρωση δικτύου. Με προνόμια στέλνει ένα ACK (-PA) στην 80, ένα SYN(-PS) στην 443 και ένα echo request και ένα Timestamp request, χωρίς προνόμια πάντα ολοκληρώνει συνδέσεις. Αν ο στόχος είναι το δίκτυο, χρησιμοποιεί μόνο ARP(-PR). Αν χρησιμοποιηθεί με άλλη επιλογή, μόνο τα πακέτα της άλλης επιλογής παραλείπονται.-PR
: Ping ARP. Χρησιμοποιείται από προεπιλογή όταν αναλύουμε υπολογιστές στο δίκτυό μας, είναι πιο γρήγορο από τη χρήση pings. Αν δεν θέλετε να χρησιμοποιήσετε ARP πακέτα χρησιμοποιήστε--send-ip
.-PS <ports>
: Στέλνει SYN πακέτα τα οποία αν απαντήσουν SYN/ACK είναι open (απαντούν με RST ώστε να μην ολοκληρωθεί η σύνδεση), αν απαντήσουν RST είναι closed και αν δεν απαντήσουν είναι unreachable. Σε περίπτωση μη ύπαρξης προνομίων, χρησιμοποιείται αυτόματα πλήρης σύνδεση. Αν δεν δοθούν ports, το πετάει στην 80.-PA <ports>
: Όπως το προηγούμενο αλλά με ACK, ο συνδυασμός τους δίνει καλύτερα αποτελέσματα.-PU <ports>
: Ο στόχος είναι το αντίθετο, στέλνονται σε ports που αναμένεται να είναι κλειστά. Κάποια firewalls ελέγχουν μόνο TCP συνδέσεις. Αν είναι closed απαντάται με port unreachable, αν απαντήσει με άλλο icmp ή δεν απαντήσει θεωρείται destination unreachable.-PE, -PP, -PM
: ICMP PINGS: echo reply, timestamp και addresmask. Εκτοξεύονται για να μάθουμε αν ο στόχος είναι ενεργός.-PY<ports>
: Στέλνει SCTP INIT probes στην 80 από προεπιλογή, INIT-ACK(open) ή ABORT(closed) ή τίποτα ή ICMP unreachable(inactive) μπορεί να απαντηθούν.-PO <protocols>
: Δίνεται ένα πρωτόκολλο στις κεφαλίδες, από προεπιλογή 1(ICMP), 2(IGMP) και 4(Encap IP). Για τα ICMP, IGMP, TCP (6) και UDP (17) πρωτόκολλα αποστέλλονται τα πρωτοκολλιακά headers, για τα υπόλοιπα μόνο το IP header αποστέλλεται. Ο σκοπός είναι ότι λόγω παραμόρφωσης των headers, απαντούν Protocol unreachable ή απαντήσεις του ίδιου πρωτοκόλλου για να ξέρουμε αν είναι up.-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 πρωτόκολλο, αποτυγχάνει να δημιουργήσει τη σύνδεση, οπότε δεν υπάρχουν logs, λειτουργεί όπως το -PY-sN,-sX,-sF
: Null, Fin, Xmas, μπορούν να διαπεράσουν κάποια firewalls και να εξάγουν πληροφορία. Βασίζονται στο ότι μηχανές που συμμορφώνονται με το πρότυπο πρέπει να απαντούν με RST σε όλα τα αιτήματα που δεν έχουν SYN, RST ή ACK flags ανυψωμένα: open/filtered(τίποτα), closed(RST), filtered (ICMP unreachable). Ανεξιχνίαστο σε WIndows, CIsco, BSDI και OS/400. Σε unix ναι.-sM
: Maimon scan: Στέλνει FIN και ACK flags, χρησιμοποιείται για BSD, σήμερα θα επιστρέψει όλα ως closed.-sA, sW
: ACK και Window, χρησιμοποιείται για ανίχνευση firewalls, για να ξέρουμε αν οι πόρτες είναι filtered ή όχι. Το -sW διακρίνει μεταξύ open/closed καθώς τα ανοιχτά απαντούν με διαφορετική τιμή window: open (RST με window διαφορετικό του 0), closed (RST window = 0), filtered (ICMP unreachable ή τίποτα). Δεν δουλεύουν όλοι οι υπολογιστές έτσι, οπότε αν είναι όλα closed, δεν δουλεύει, αν είναι λίγα open, δουλεύει καλά, και αν είναι πολλά open και λίγα closed, δουλεύει αντίστροφα.-sI
: Idle scan. Για τις περιπτώσεις όπου υπάρχει ενεργό firewall αλλά ξέρουμε ότι δεν φιλτράρει προς μια συγκεκριμένη IP (ή όταν απλά θέλουμε ανωνυμία) μπορούμε να χρησιμοποιήσουμε τον zombie scanner (δουλεύει για όλες τις πόρτες), για να ψάξουμε πιθανούς zombies μπορούμε να χρησιμοποιήσουμε το scrpit ipidseq ή το exploit auxiliary/scanner/ip/ipidseq. Αυτός ο scanner βασίζεται στον αριθμό IPID των IP πακέτων.--badsum
: Στέλνει το sum λάθος, οι υπολογιστές θα απορρίψουν τα πακέτα, αλλά τα firewalls ίσως απαντήσουν κάτι, χρησιμοποιείται για να ανιχνεύσει firewalls.-sZ
: "Weird" SCTP scanner, όταν στέλνει probes με cookie echo fragments θα πρέπει να απορρίπτονται αν είναι open ή να απαντούν με ABORT αν είναι closed. Μπορεί να περάσει μέσω firewalls που το init δεν περνάει, το κακό είναι ότι δεν διακρίνει μεταξύ filtered και open.-sO
: Protocol Ip scan. Στέλνει κακά και άδεια headers στα οποία μερικές φορές ούτε το πρωτόκολλο μπορεί να διακριθεί. Αν φτάσει ICMP unreachable protocol είναι closed, αν φτάσει unreachable port είναι open, αν φτάσει άλλο error, filtered, αν δεν φτάσει τίποτα, open|filtered.-b <server>
: FTPhost--> Χρησιμοποιείται για να σκανάρετε έναν host από έναν άλλο, αυτό γίνεται με το να συνδεθείτε στο ftp μιας άλλης μηχανής και να της ζητήσετε να στείλει αρχεία στις θύρες που θέλετε να σκανάρετε από άλλη μηχανή, σύμφωνα με τις απαντήσεις θα ξέρουμε αν είναι open ή όχι. [<user>:<password>@]<server>[:<port>] Σχεδόν όλοι οι ftp servers πλέον δεν το επιτρέπουν και επομένως έχει μικρή πρακτική χρήση.
Εστίαση Ανάλυσης
-p: Χρησιμοποιείται για να ορίσετε πόρτες για σάρωση. Για επιλογή όλων των 65,335 ports: -p- ή -p all. Το Nmap έχει εσωτερική ταξινόμηση βασισμένη στην δημοφιλία. Από προεπιλογή, χρησιμοποιεί τα top 1000 ports. Με -F (fast scan) αναλύει τα top 100. Με --top-ports
-sV Version scanning, η ένταση μπορεί να ρυθμιστεί από 0 έως 9, προεπιλογή είναι 7.
--version-intensity
-O OS detection
--osscan-limit Για σωστή ανίχνευση host, χρειάζεται τουλάχιστον μία open πόρτα και μία closed πόρτα. Αν αυτή η προϋπόθεση δεν ικανοποιείται και έχουμε ενεργοποιήσει αυτό, δεν θα επιχειρήσει πρόβλεψη OS (εξοικονομεί χρόνο)
--osscan-guess Όταν η ανίχνευση OS δεν είναι τέλεια, αυτό την ωθεί να προσπαθήσει περισσότερο
Σενάρια (Scripts)
--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: script για χρήση εξωτερικών πόρων
- Intrusive: χρησιμοποιεί scripts που θεωρούνται intrusive προς το θύμα ή στόχο
- Malware: ελέγχει για συνδέσεις που άνοιξαν κακόβουλος κώδικας ή backdoors
- Safe: εκτελεί μη-επεμβατικά scripts
- Vuln: ανακαλύπτει τις πλέον γνωστές ευπάθειες
- All: εκτελεί απόλυτα όλα τα διαθέσιμα NSE extension scripts
Για να ψάξετε για 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
--script-updatedb
Για να χρησιμοποιήσετε ένα script, απλά γράψτε: nmap --script Script_Name target --> Όταν χρησιμοποιείτε το script, τόσο το script όσο και ο scanner θα εκτελεστούν, οπότε μπορούν επίσης να προστεθούν επιλογές σάρωσης. Μπορούμε να προσθέσουμε "safe=1" για να εκτελεστούν μόνο τα safe.
Χρόνος (Time Control)
Το Nmap μπορεί να τροποποιήσει χρόνους σε seconds, minutes, ms: --host-timeout επιχειρήματα 900000ms, 900, 900s, και 15m όλα κάνουν το ίδιο.
Το Nmap διαιρεί τον συνολικό αριθμό hosts προς σάρωση σε ομάδες και αναλύει αυτές τις ομάδες σε μπλοκ, οπότε δεν προχωρά στο επόμενο μπλοκ μέχρι όλες να έχουν αναλυθεί (και ο χρήστης δεν λαμβάνει ενημερώσεις μέχρι να αναλυθεί το μπλοκ). Με αυτόν τον τρόπο, είναι πιο βέλτιστο για το Nmap να χρησιμοποιεί μεγάλες ομάδες. Από προεπιλογή σε class C, χρησιμοποιεί 256.
Αυτό μπορεί να αλλάξει με --min-hostgroup
Μπορείτε να ελέγξετε τον αριθμό των παράλληλων scanners αλλά είναι καλύτερο να μην το κάνετε (το Nmap ενσωματώνει ήδη αυτόματο έλεγχο βασισμένο στην κατάσταση του δικτύου): --min-parallelism
Μπορούμε να τροποποιήσουμε το RTT timeout, αλλά συνήθως δεν είναι απαραίτητο: --min-rtt-timeout , --max-rtt-timeout , --initial-rtt-timeout
Μπορούμε να τροποποιήσουμε τον αριθμό των προσπαθειών: --max-retries
Μπορούμε να τροποποιήσουμε τον χρόνο σάρωσης ενός host: --host-timeout
Μπορούμε να τροποποιήσουμε τον χρόνο μεταξύ κάθε δοκιμής για να το επιβραδύνουμε: --scan-delay ; --max-scan-delay
Μπορούμε να τροποποιήσουμε τον αριθμό των πακέτων ανά δευτερόλεπτο: --min-rate
Πολλές πόρτες παίρνουν πολύ χρόνο για να απαντήσουν όταν είναι filtered ή closed. Αν ενδιαφερόμαστε μόνο για τα open, μπορούμε να τρέξουμε πιο γρήγορα με: --defeat-rst-ratelimit
Για να ορίσουμε πόσο επιθετικό θέλουμε να είναι το Nmap: -T paranoid|sneaky|polite|normal|aggressive|insane
-T (0-1)
-T0 --> Σκανάρει μόνο 1 πόρτα κάθε φορά και περιμένει 5min μέχρι την επόμενη
-T1 και T2 --> Πολύ παρόμοια αλλά περιμένουν μόνο 15 και 0.4sec αντίστοιχα μεταξύ κάθε δοκιμής
-T3 --> Default λειτουργία, περιλαμβάνει παράλληλη σάρωση
-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 Για fragmentation πακέτων, από προεπιλογή τα κατακερματίζει σε 8bytes μετά το header, για να καθορίσετε αυτό το μέγεθος χρησιμοποιούμε ..mtu (με αυτό, μην χρησιμοποιείτε -f), το offset πρέπει να είναι πολλαπλάσιο του 8. Version scanners και scripts δεν υποστηρίζουν fragmentation
-D decoy1,decoy2,ME Το Nmap στέλνει scans αλλά με άλλες IP διευθύνσεις ως προέλευση, έτσι σας κρύβει. Αν βάλετε ME στη λίστα, το Nmap θα σας τοποθετήσει εκεί, καλύτερα να βάλετε 5 ή 6 πριν από εσάς για να σας καλύψει πλήρως. Τυχαίες IPs μπορούν να παραχθούν με RND:
Για χρήση τυχαίων IPs: nmap -D RND:10 Target_IP
-S IP Όταν το Nmap δεν ανιχνεύει τη δική σας IP πρέπει να την δώσετε με αυτό. Επίσης εξυπηρετεί για να τους κάνετε να νομίζουν ότι άλλος στόχος τους σκανάρει.
-e
Πολλοί administrators αφήνουν ανοικτές θύρες εισόδου για να δουλέψουν όλα σωστά και είναι πιο εύκολο για αυτούς από το να βρουν άλλη λύση. Αυτές μπορούν να είναι DNS ports ή FTP ports... για να βρείτε αυτή την ευπάθεια το 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, and Cisco
--proxies
-sP Για ανίχνευση hosts στο δίκτυό μας με ARP
Πολλοί administrators δημιουργούν κανόνα firewall που επιτρέπει όλα τα πακέτα που προέρχονται από μια συγκεκριμένη πόρτα να περνούν (όπως 20,53 και 67), μπορούμε να πούμε στο Nmap να στείλει τα πακέτα μας από αυτές τις πόρτες: nmap --source-port 53 IP
Εξόδους (Outputs)
-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 Γιατί host και state
--stats-every time Κάθε αυτό το διάστημα μας λέει πώς πάει
--packet-trace Για να δείτε ποια πακέτα βγαίνουν, μπορούν να καθοριστούν φίλτρα όπως: --version-trace ή --script-trace
--open δείχνει open, open|filtered και unfiltered
--resume file Εξάγει ένα summary
Διάφορα (Miscellaneous)
-6 Επιτρέπει IPv6
-A είναι το ίδιο με -O -sV -sC --traceroute
Χρόνος Εκτέλεσης (Run time)
Ενώ το Nmap τρέχει μπορούμε να αλλάξουμε επιλογές:
v / V Αύξηση / μείωση επιπέδου verbosity
d / D Αύξηση / μείωση επιπέδου debugging
p / P Ενεργοποίηση / απενεργοποίηση packet tracing
? Εκτύπωση οθόνης βοήθειας για runtime interaction
Vulscan
Nmap script που κοιτάζει τις εκδόσεις των υπηρεσιών που αποκτήθηκαν σε μια offline βάση δεδομένων (κατεβασμένη από άλλες πολύ σημαντικές) και επιστρέφει πιθανές ευπάθειες
Οι DB που χρησιμοποιεί είναι:
- 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
Σύμφωνα με this post μπορείτε να επιταχύνετε την ανάλυση υπηρεσιών του nmap τροποποιώντας όλες τις τιμές totalwaitms
στο /usr/share/nmap/nmap-service-probes
σε 300 και tcpwrappedms
σε 200.
Επιπλέον, probes που δεν έχουν συγκεκριμένα ορισμένο servicewaitms
χρησιμοποιούν μια προεπιλεγμένη τιμή 5000
. Επομένως, είτε μπορούμε να προσθέσουμε τιμές σε κάθε probe, είτε μπορούμε να συγκεκριμενοποιήσουμε (compile) το nmap εμείς οι ίδιοι και να αλλάξουμε την προεπιλεγμένη τιμή στο service_scan.h.
Αν δεν θέλετε να αλλάξετε καθόλου τις τιμές του totalwaitms
και tcpwrappedms
στο αρχείο /usr/share/nmap/nmap-service-probes
, μπορείτε να επεξεργαστείτε τον parsing code ώστε αυτές οι τιμές στο αρχείο nmap-service-probes
να αγνοούνται εντελώς.
Δημιουργία static Nmap για περιορισμένα περιβάλλοντα
Σε hardened ή minimal Linux περιβάλλοντα (containers, appliances), τα dynamically linked Nmap binaries συχνά αποτυγχάνουν λόγω έλλειψης runtime loaders ή shared libraries (π.χ., /lib64/ld-linux-x86-64.so.2, libc.so). Η δημιουργία του δικού σας statically linked Nmap και η συσκευασία των NSE δεδομένων επιτρέπει την εκτέλεση χωρίς εγκατάσταση system packages.
Υψηλού επιπέδου προσέγγιση
- Χρησιμοποιήστε έναν καθαρό amd64 Ubuntu builder μέσω Docker.
- Κατασκευάστε OpenSSL και PCRE2 ως static libraries.
- Κατασκευάστε Nmap συνδέοντας statically και χρησιμοποιώντας το περιλαμβανόμενο libpcap/libdnet για να αποφύγετε dynamic deps.
- Πακετάρετε τα NSE scripts και τους φακέλους δεδομένων μαζί με το binary.
Ανακαλύψτε την αρχιτεκτονική στόχου (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'
Βήμα 1 — Προετοιμάστε το 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
Βήμα 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 αποφεύγει τις κοινόχρηστες βιβλιοθήκες του συστήματος.
- Μια τροποποίηση με sed εξουδετερώνει έναν κοινόχρηστο στόχο 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 πάνω στο artifact για να επιβεβαιώσετε ότι είναι statically linked.
- Κρατήστε τα NSE data μαζί με το binary για να εξασφαλίσετε script parity σε hosts χωρίς εγκατεστημένο Nmap.
- Ακόμα και με static binary, η εκτέλεση μπορεί να μπλοκαριστεί από AppArmor/seccomp/SELinux — το DNS/egress πρέπει να εξακολουθούν να λειτουργούν.
- Τα deterministic builds μειώνουν τον supply-chain κίνδυνο σε σύγκριση με το κατέβασμα αδιαφανών “static” binaries.
One-liner (Dockerized)
Δημιούργησε, δέσε και εκτύπωσε πληροφορίες του artifact
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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.