Icon

NMAP Cheatsheet

Cheatsheet dành cho Nmap (target specification, host discovery, port scanning, port states, scripts, output formats, bypass firewall, IDS/IPS)

November 4, 2025 September 17, 2025 Info
Author Author Hung Nguyen Tuong

Cheatsheet này được tổng hợp lại từ TryHackMeHackTheBox.

Target Specification

OptionMô tảVí dụ
Hostnames / IP addresses / networksChấ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)

image

-PA : TCP ACK probe

image

-PU : UDP probe

image

image

-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ừ xy. (ví dụ -p 1-1024)

-p x : chỉ cổng x. (ví dụ -p 80)

-p -x : cổng 1x. (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
openPort chấp nhận kết nối (TCP/UDP/SCTP).
closedPort phản hồi bằng TCP RST → đóng, nhưng host đang sống.
filteredKhô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.
unfilteredChỉ 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|filteredKhô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|filteredChỉ trong IP ID idle scan → không xác định được closed hay filtered.

-sT TCP Connect

Gửi SYNSYN/ACK ⇒ gửi ACK = open; RSTclosed; 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).

image

-sS SYN Scan

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

image

-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 unreachableclosed; no replyopen|filtered.

image

image

-sN NULL scan

Gửi TCP không có flag.

Nếu nhận RSTclosed; no replyopen|filtered.

Lưu ý: không hoạt động trên Windows (Windows luôn trả RST).

Thường cần quyền raw.

image

image

-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.

image

image

-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.

image

image

-sA ACK scan

Gửi ACK để kiểm tra lọc (mapping firewall rules).

RSTunfiltered (host reachable, nhưng ko biết open/closed).

No reply / ICMP lỗifiltered (firewall đang block).

Dùng để phân biệt rule allow/block, không để biết open ports.

image

-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.

image

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ừ 09. --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 scriptMô tả (Tiếng Việt)
authCác script liên quan xác thực (login, credential checks)
broadcastTìm host bằng cách gửi thông điệp broadcast
bruteThực hiện tấn công dò mật khẩu (brute-force)
defaultScript mặc định (giống -sC)
discoveryLấy thông tin khởi điểm (ví dụ: bảng CSDL, tên DNS khả dụng)
dosKiểm tra lỗ hổng dễ dẫn đến Denial of Service (DoS)
exploitThử khai thác các dịch vụ dễ bị tấn công
externalKiểm tra bằng dịch vụ bên thứ ba (ví dụ: Geoplugin, VirusTotal)
fuzzerThực hiện fuzzing để phát hiện lỗi xử lý đầu vào
intrusiveScript xâm nhập mạnh (brute-force, exploitation) — có thể gây hại
malwareTìm backdoor / phần mềm độc hại
safeScript an toàn — không gây crash target
versionLấy thông tin phiên bản dịch vụ
vulnKiể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.html

Mở 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 10 hoặ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: s m h (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.

image

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.

image

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:

  1. đọc IP ID (field trong IP header) từ idle host;

    image

  2. 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;

    image

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

    image

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_kernel

Medium 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}