NMAP Cheatsheet
Cheatsheet dành cho Nmap (target specification, host discovery, port scanning, port states, scripts, output formats, bypass firewall, IDS/IPS)
Cheatsheet này được tổng hợp lại từ TryHackMe và HackTheBox.
Target Specification
| Option | Mô tả | Ví dụ |
|---|---|---|
| Hostnames / IP addresses / networks | Chấp nhận hostname, địa chỉ IP, network. | scanme.nmap.org, microsoft.com/24, 192.168.0.1, 10.0.0-255.1-254 |
-iL <inputfilename> | Nhập danh sách hosts/networks từ file. | -iL targets.txt |
-iR <num hosts> | Chọn ngẫu nhiên số lượng hosts. | -iR 10 |
--exclude <host1[,host2],...> | Loại trừ các hosts/networks khỏi target. | --exclude 192.168.0.1,scanme.nmap.org |
--excludefile <exclude_file> | Loại trừ danh sách từ file. | --excludefile exclude.txt |
Host Discovery
-sL : chỉ liệt kê targets (no scan)
-sn : ping scan (ko port scan) — phụ thuộc firewall
-Pn : giả định host online (skip ping)
-PR : ARP scan (chỉ trong cùng subnet) (mặc định)
-PE / -PP / -PM : ICMP probes (dùng cho target ngoài subnet; ko chạy nếu target trong cùng subnet)
-PS : TCP SYN probe (SYN scan)

-PA : TCP ACK probe

-PU : UDP probe


-n : ko resolve DNS (no DNS)
-R : luôn resolve DNS (force DNS)
Port Scan
Port Specification
Mặc định: 1000 cổng phổ biến.
-F : 100 cổng phổ biến.
-p x-y : cổng từ x → y. (ví dụ -p 1-1024)
-p x : chỉ cổng x. (ví dụ -p 80)
-p -x : cổng 1 → x. (ví dụ -p -1024)
-p- : tất cả cổng (1–65535).
--top-ports N : quét N cổng phổ biến nhất. (ví dụ --top-ports 50)
Port States
| State | Ý nghĩa |
|---|---|
open | Port chấp nhận kết nối (TCP/UDP/SCTP). |
closed | Port phản hồi bằng TCP RST → đóng, nhưng host đang sống. |
filtered | Không xác định open/closed vì không phản hồi (drop) hoặc trả về lỗi (reject: RST, ICMP error) → thường do firewall. |
unfiltered | Chỉ có trong TCP-ACK scan → port truy cập được, nhưng không biết open hay closed vì đều nhận về RST. |
open|filtered | Không có phản hồi → có thể open hoặc bị firewall chặn (UDP scan, NULL/FIN/XMAS scan, port mở thường không phản hồi). |
closed|filtered | Chỉ trong IP ID idle scan → không xác định được closed hay filtered. |
-sT TCP Connect
Gửi SYN → SYN/ACK ⇒ gửi ACK = open; RST ⇒ closed; no response/ICMP ⇒ filtered.
Không cần quyền raw, có thể chạy non-root.
Ưu: chính xác cao, chỉ rõ trạng thái port, tương tác đầy đủ với service, ít gây lỗi.
Nhược: ít stealth, dễ bị log/IDS, chậm hơn -sS.
So sánh: -sT = full connect (hoàn tất handshake, chính xác, noisy); -sS = half-open (không hoàn tất handshake, stealthy, cần quyền raw).

-sS SYN Scan
Dù stealthy hơn, nhưng các IDS/IPS hiện đại vẫn có thể phát hiện.

-sU UDP scan
UDP là stateless, không cần three-way handshake nên không có acknowledgment -> timeout lâu -> chậm; nhiều false-negatives.
Thường không nhận phản hồi vì Nmap gửi empty datagram tới UDP port.
Không xác định được packet có tới nơi hay không.
Nếu port open, chỉ nhận phản hồi khi ứng dụng được cấu hình để trả lời.
ICMP port unreachable → closed; no reply → open|filtered.


-sN NULL scan
Gửi TCP không có flag.
Nếu nhận RST → closed; no reply → open|filtered.
Lưu ý: không hoạt động trên Windows (Windows luôn trả RST).
Thường cần quyền raw.


-sF FIN scan
Gửi TCP FIN.
RST → closed; no reply → open|filtered.
Cũng không reliable trên Windows; cần raw socket.


-sX Xmas scan
Gửi TCP với flags FIN, PSH, URG (đèn “Xmas”).
RST → closed; no reply → open|filtered.
Cũng không reliable trên Windows; cần raw socket.


-sA ACK scan
Gửi ACK để kiểm tra lọc (mapping firewall rules).
RST → unfiltered (host reachable, nhưng ko biết open/closed).
No reply / ICMP lỗi → filtered (firewall đang block).
Dùng để phân biệt rule allow/block, không để biết open ports.

-sW Window scan
Gửi ACK, dò trường Window trong RST để suy đoán open vs closed.
Nếu RST kèm window size khác biệt → có thể open; RST + window bình thường → closed.
Độ tin cậy thấp.

Post Scanning
-sV: service detection (bắt buộc three-way handshake, **không dùng được với -sS).
--version-intensity N: mức độ dò version từ 0 → 9. --version-light = N=2. --version-all = N=9.
-O: OS detection (không thực sự đáng tin cậy lắm).
Tùy chọn -A chạy nhiều kỹ thuật cùng lúc: service detection (-sV), OS detection (-O), traceroute (--traceroute), default NSE scripts (-sC).
Nmap chủ yếu dựa vào banner của port để hiển thị thông tin. Nếu không xác định được version qua banner, Nmap dùng signature-based matching (scan lâu hơn) -> có thể bỏ sót thông tin nếu Nmap không biết cách xử lý dữ liệu nhận được.
Giải pháp: Kết nối bằng netcat tới service để grab banner -> tcpdump để quan sát traffic.
Nmap Scripting Engine (NSE)
Script được lưu tại: /usr/share/nmap/scripts/
-sC, --script=default: chạy các script mặc định.
Bảng nhóm script:
| Nhóm script | Mô tả (Tiếng Việt) |
|---|---|
auth | Các script liên quan xác thực (login, credential checks) |
broadcast | Tìm host bằng cách gửi thông điệp broadcast |
brute | Thực hiện tấn công dò mật khẩu (brute-force) |
default | Script mặc định (giống -sC) |
discovery | Lấy thông tin khởi điểm (ví dụ: bảng CSDL, tên DNS khả dụng) |
dos | Kiểm tra lỗ hổng dễ dẫn đến Denial of Service (DoS) |
exploit | Thử khai thác các dịch vụ dễ bị tấn công |
external | Kiểm tra bằng dịch vụ bên thứ ba (ví dụ: Geoplugin, VirusTotal) |
fuzzer | Thực hiện fuzzing để phát hiện lỗi xử lý đầu vào |
intrusive | Script xâm nhập mạnh (brute-force, exploitation) — có thể gây hại |
malware | Tìm backdoor / phần mềm độc hại |
safe | Script an toàn — không gây crash target |
version | Lấy thông tin phiên bản dịch vụ |
vuln | Kiểm tra lỗ hổng hoặc dịch vụ có thể bị khai thác |
Gọi script cụ thể: --script "script_name".
Gọi theo pattern: --script "ftp*".
Cẩn thận với script intrusive/ destructive; đọc description trước; chỉ dùng script tin cậy.
Output
Tăng độ chi tiết / debug: -v, -vv để verbose; -d, -d9 để debug. --reason hiển thị lý do kết luận trạng thái.
Các định dạng xuất:
-oN filename : output giống terminal (normal).
-oG filename : grepable format.
-oX filename : XML format (xử lý tiếp).
-oA basename : xuất cả 3 (normal, grepable, xml).
-oS : (đùa/bựa).
Chuyển XML sang HTML:
xsltproc target.xml -o target.htmlMở target.html trên browser để xem kết quả rõ ràng, phù hợp người không chuyên kỹ thuật.
Firewall & IDS/IPS Evasion
Performance
-T0 : paranoid (rất chậm, stealth)
-T1 : sneaky
-T2 : polite
-T3 : normal (mặc định)
-T4 : aggressive (nhanh)
-T5 : insane (rất nhanh, noisy)
Ghi nhớ: tăng T → nhiều packet/giây → dễ bị phát hiện/giới hạn bởi firewall.
--min-rate <pkts/s> / --max-rate <pkts/s> : giới hạn số gói mỗi giây.
- Ví dụ:
--min-rate 10hoặc--max-rate 1000.
--min-parallelism <n> / --max-parallelism <n> : giới hạn số probes song song.
- Dùng khi muốn điều tiết tải/giảm false positives.
--max-retries <tries> : Giới hạn số lần gửi lại probe cho mỗi port.
- Ví dụ:
--max-retries 2
--host-timeout <time> : Bỏ target nếu thời gian total scan cho host vượt quá <time>.
Hỗ trợ suffix:
smh(ví dụ30s,5m).Ví dụ:
--host-timeout 2m
Spoofing
Trong network setup nhất định, phải chắc chắn có phương thức để đọc được response, nếu không thì vô dụng, bởi response không trả về máy.
Spoofing: giả mạo IP nguồn.
Ví dụ: nmap -e NET_INTERFACE -Pn -S SPOOFED_IP 10.10.0.180.

Giả mạo MAC nguồn trong cùng subnet: --spoof-mac SPOOFED_MAC.
Decoys
Decoys: dùng nhiều IP nguồn làm mồi nhử, IP thật nằm ngẫu nhiên giữa chúng.
Ví dụ: -D 10.10.0.1,10.10.0.2,RND,RND,ME 10.10.0.180, -D RND:5.
Decoy phải “alive”, tránh gây SYN-flooding.
Có thể dùng IP thật từ VPS + thao tác “IP ID” để cải thiện khả năng scan.
Có thể áp dụng cho SYN, ACK, ICMP scan và OS detection.

Fragmented Packets
Chia nhỏ packet (data gói IP) để tránh bị phát hiện.
-f chia mỗi gói 8 byte (+ 20 byte IP header).
-ff mỗi gói 16 byte.
--mtu N mỗi gói N byte, nên là bội của 8.
--data-length N thêm N byte vào packet trước khi fragment.
Idle/Zombie scan
Gồm 3 bước:
đọc IP ID (field trong IP header) từ idle host;

gửi packet với spoof IP của idle host đến target, sau đó target sẽ phản hồi lại đến idle host hoặc không;

đọc lại IPID từ idle host.

Nếu IPID tăng 1 → port closed hoặc bị firewall chặn.
Nếu IPID tăng 2 → port open.
Idle host nên là một host “ngoài” kiểm soát của mình. Và nên “idle”; nếu “busy” thì IPID không ổn định.
DNS Proxying
DNS query thường qua UDP port 53, nhưng với IPv6 và DNSSEC, nhiều request cũng dùng TCP port 53.
Trong DMZ, DNS server nội bộ thường được tin cậy hơn Internet DNS → có thể dùng để tương tác với hosts trong internal network.
Có thể dùng TCP port 53 làm source port (-source-port) để bypass firewall/IDS/IPS nếu port này được tin tưởng.
Ví dụ: sudo nmap 10.129.2.28 -p50000 -sS -Pn -n --disable-arp-ping --packet-trace --source-port 53
HackTheBox Firewall and IDS/IPS Evasion Labs
Easy Lab
┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -vv 10.129.2.80
...
Host is up, received reset ttl 63 (0.25s latency).
Scanned at 2025-08-13 09:20:31 +07 for 60s
Not shown: 869 closed tcp ports (reset), 128 filtered tcp ports (no-response)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
10001/tcp open scp-config syn-ack ttl 63┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -p22,80 -sV -vv 10.129.2.80
...
Host is up, received echo-reply ttl 63 (0.26s latency).
Scanned at 2025-08-13 09:22:37 +07 for 9s
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelMedium Lab
┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -sS -vv 10.129.2.48
...
Host is up, received reset ttl 63 (0.25s latency).
Scanned at 2025-08-13 09:12:12 +07 for 9s
Not shown: 992 closed tcp ports (reset)
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 63
22/tcp open ssh syn-ack ttl 63
53/tcp filtered domain no-response
80/tcp open http syn-ack ttl 63
110/tcp open pop3 syn-ack ttl 63
139/tcp open netbios-ssn syn-ack ttl 63
143/tcp open imap syn-ack ttl 63
445/tcp filtered microsoft-ds no-response┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -p 53 -sU -sV -vv 10.129.2.48
...
Host is up, received echo-reply ttl 63 (0.25s latency).
Scanned at 2025-08-13 09:16:04 +07 for 26s
PORT STATE SERVICE REASON VERSION
53/udp open domain udp-response ttl 63 (unknown banner: HTB{GoTtgUnyze9Psw4vGjcuMpHRp})Hard Lab
┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -v 10.129.2.47
...
Host is up (0.26s latency).
Not shown: 869 closed tcp ports (reset), 129 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -p 22,80 -sV -v 10.129.2.47
...
Host is up (0.25s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -v 10.129.2.47 -g 53
...
Host is up (0.26s latency).
Not shown: 869 closed tcp ports (reset), 128 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
50000/tcp open ibm-db2┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -sU -v 10.129.2.47
...
Host is up (0.26s latency).
Not shown: 997 closed udp ports (port-unreach)
PORT STATE SERVICE
68/udp open|filtered dhcpc
137/udp open netbios-ns
138/udp open|filtered netbios-dgm┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -p68,137,138 -sU -sV -sC -vv 10.129.2.47 -g 53 -Pn -n
PORT STATE SERVICE REASON VERSION
68/udp open|filtered dhcpc no-response
137/udp open netbios-ns udp-response ttl 63 Samba nmbd netbios-ns (workgroup: WORKGROUP)
| nbns-interfaces:
| hostname: NIX-NMAP-HARD
| interfaces:
|_ 10.129.2.47
138/udp open|filtered netbios-dgm no-response
Service Info: Host: NIX-NMAP-HARD
Host script results:
| nbstat: NetBIOS name: NIX-NMAP-HARD, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| Names:
| NIX-NMAP-HARD<00> Flags: <unique><active>
| NIX-NMAP-HARD<03> Flags: <unique><active>
| NIX-NMAP-HARD<20> Flags: <unique><active>
| WORKGROUP<00> Flags: <group><active>
| WORKGROUP<1e> Flags: <group><active>
| Statistics:
| 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
| 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
|_ 00:00:00:00:00:00:00:00:00:00:00:00:00:00┌──(hungnt㉿kali)-[~/Downloads]
└─$ sudo nmap -p50000 -sV -sC 10.129.2.47 -g 53 -D RND:5 -Pn -n
PORT STATE SERVICE VERSION
50000/tcp open tcpwrapped
|_drda-info: TIMEOUT
┌──(hungnt㉿kali)-[~/Downloads]
└─$ nc -p 53 10.129.2.47 50000
220 HTB{kjnsdf2n982n1827eh76238s98di1w6}