Summary

Các loại scan nâng cao

Port Scan TypeExample Command
TCP Null Scansudo nmap -sN MACHINE_IP
TCP FIN Scansudo nmap -sF MACHINE_IP
TCP Xmas Scansudo nmap -sX MACHINE_IP
TCP Maimon Scansudo nmap -sM MACHINE_IP
TCP ACK Scansudo nmap -sA MACHINE_IP
TCP Window Scansudo nmap -sW MACHINE_IP
Custom TCP Scansudo nmap --scanflags URGACKPSHRSTSYNFIN MACHINE_IP
Spoofed Source IPsudo nmap -S SPOOFED_IP MACHINE_IP
Spoofed MAC Address--spoof-mac SPOOFED_MAC
Decoy Scannmap -D DECOY_IP,ME, MACHINE_IP
Idle (Zombie) Scansudo nmap -sI ZOMBIE_IP MACHINE_IP
Fragment IP data into 8 bytes-f
Fragment IP data into 16 bytes-ff

Các option phụ giúp hiểu rõ quá trình scan:

OptionPurpose
--reasonGiải thích tại sao Nmap đưa ra các kết luận của nó
-vVerbose
-vvVery verbose
-dDebugging
-ddChi tiết hơn về quá trình debugging

Note

Tất cả các loại scan bên dưới đều yêu cầu sử dụng privileged user.

TCP Null Scan, FIN Scan and Xmas Scan

Ta thường dùng null scan, FIN scan và Xmas scan để scan các target có sử dụng stateless firewall. Một stateless firewall sẽ chặn các gói tin TCP có flag SYN. Các loại scan này không dùng hoặc dùng các loại flag khác nên có thể đánh lừa firewall nhằm tiếp cận với target.

Tuy nhiên, nếu target có sử dụng statefull firewall thì nó sẽ block hết tất cả các package mà không quan tâm đến flag.

Null Scan

Cú pháp:

sudo nmap -sN TARGET

Ta tiến hành một null scan bằng cách gửi gói tin TCP mà không bật bất kỳ flag nào. Khi đó, nếu port của target có mở hoặc bị tường lửa chặn (filtered) thì sẽ không có phản hồi. Ngược lại, nếu port không mở thì target sẽ phản hồi lại gói tin RST.

Có thể thấy, null scan tương tự với UDP Scan bởi vì cả hai đều dùng gói tin RST nhằm phát hiện closed port.

FIN Scan

Cú pháp:

sudo nmap -sF TARGET

Thay vì không bật flag nào thì ta sẽ bật flag FIN. Cách scan này tương tự với null scan: chỉ nhận phản hồi trong trường hợp port đang đóng.

Xmas Scan

Cú pháp:

sudo nmap -sX TARGET

Tương tự với null scan và FIN scan nhưng ta cần phải bật ba flag là FIN, PSH và URG.

Maimon Scan

Cú pháp:

sudo nmap -sM TARGET

Gửi gói tin TCP với flag FIN và ACK. Các hệ thống BSD sẽ drop gói tin nếu có port đang mở. Tuy nhiên, đa số các hệ thống mạng hiện đại sẽ phản hồi lại gói tin RST kể cả khi port đang mở.

Như vậy, ta chỉ có thể dùng kiểu scan này đối với các hệ thống BSD cũ.

TCP ACK, Window and Custom Scan

ACK Scan

Cú pháp:

sudo nmap -sA TARGET

Với kiểu scan này, ta sẽ gửi gói tin TCP với flag ACK. Phản hồi mà ta nhận được là gói tin có flag RST kể cả khi port đang mở (tương tự Maimon scan).

Lý do cho hành vi này là vì gói tin ACK được dùng để phản hồi về việc đã nhận được dữ liệu ở bên nhận chứ không phải được dùng ở bên gửi như trong trường hợp của chúng ta.

Info

Loại scan này thường được dùng để kiểm tra sự tồn tại các quy tắc lọc gói tin hoặc firewall.

Đây là output của câu lệnh trước khi có firewall:

pentester@TryHackMe$ sudo nmap -sA MACHINE_IP
 
Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:37 BST
Nmap scan report for MACHINE_IP
Host is up (0.0013s latency).
All 1000 scanned ports on MACHINE_IP are unfiltered
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
 
Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds

Có thể thấy, 1000 port được quét qua đều có thể truy cập nhưng do đều có phản hồi là RST nên ta không thể phân biệt được port đang đóng hay mở.

Và đây là output của câu lệnh sau khi có firewall:

pentester@TryHackMe$ sudo nmap -sA MACHINE_IP
 
Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-07 11:34 BST
Nmap scan report for MACHINE_IP
Host is up (0.00046s latency).
Not shown: 997 filtered ports
PORT    STATE      SERVICE
22/tcp  unfiltered ssh
25/tcp  unfiltered smtp
80/tcp  unfiltered http
MAC Address: 02:78:C0:D0:4E:E9 (Unknown)
 
Nmap done: 1 IP address (1 host up) scanned in 15.45 seconds

Trong output trên, ta thấy được dòng Not shown: 997 filtered ports cho biết rằng có 997 port đã bị filtered (có firewall) và chỉ có ba port là không bị firewall chặn (mặc dù ta không biết là nó có mở hay không).

Important

Có thể unfiltered port không có dịch vụ đang chạy mặc dù Nmap đoán được tên service của nó.

Window Scan

Cú pháp:

sudo nmap -sW TARGET

Tương tự với ACK scan nhưng nó sẽ xem xét trường Window ở trong gói tin có flag RST nhận được.

Nếu target machine có sử dụng firewall, ta sẽ nhận được output cụ thể hơn (open hoặc closed) thay vì chỉ nhận được unfiltered:

pentester@TryHackMe$ sudo nmap -sW MACHINE_IP
 
Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-07 11:39 BST
Nmap scan report for MACHINE_IP
Host is up (0.00040s latency).
Not shown: 997 filtered ports
PORT    STATE  SERVICE
22/tcp  closed ssh
25/tcp  closed smtp
80/tcp  closed http
MAC Address: 02:78:C0:D0:4E:E9 (Unknown)
 
Nmap done: 1 IP address (1 host up) scanned in 14.84 seconds

Custom Scan

Chúng ta có thể dùng option --scanflags để tùy ý bật các flag mà mình muốn:

sudo nmap --scanflags CUSTOM_FLAGS TARGET

Khi sử dụng loại scan này, ta cần phải biết cách mà các port khác nhau phản hồi với gói tin chứa các custom flag.

Spoofing and Decoys

Spoofing

Để thực hiện scan với địa chỉ IP giả mạo (phục vụ cho mục đích tàng hình), ta có thể sử dụng câu lệnh sau:

sudo nmap -S SPOOFED_IP MACHINE_IP

Với SPOOFED_IP là địa chỉ IP giả mạo và ta cần phải theo dõi được network traffic nhằm phân tích các phản hồi.

Quy trình như sau:

  1. Attack gửi một gói tin với IP giả mạo đến target machine.
  2. Target machine phản hồi đến IP giả mạo.
  3. Attacker bắt gói tin phản hồi để nhận diện các open port.

Minh họa:

Một cách tổng quát, ta còn có thể khai báo thêm network interface với -e option và chặn ping scan với -Pn option:

sudo nmap -S SPOOFED_IP MACHINE_IP -e NET_INTERFACE -Pn

Trong trường hợp máy của attacker và target machine có cùng đường mạng Ethernet hoặc Wi-Fi thì có thể dùng cả địa chỉ MAC giả mạo với option sau:

--spoof-mac SPOOFED_MAC

Decoys

Spoofing chỉ hoạt động trong một số điều kiện nhất định, mà cụ thể là ta phải có khả năng theo dõi được các phản hồi. Ngoài spoofing thì ta còn có thể sử dụng các chim mồi (decoy).

Ý tưởng của kỹ thuật này rất đơn giản: thay vì sử dụng IP giả mạo thì ta sử dụng IP thật, nhưng chèn thêm nhiều IP vào để gây nhiễu.

Minh họa:

Chúng ta chạy scan có sử dụng decoy bằng option -D. Ví dụ như sau:

nmap -D 10.10.0.1,10.10.0.2,ME MACHINE_IP

Trong đó ME chính là địa chỉ IP thật của chúng ta.

Hoặc cũng có thể thêm vào các IP ngẫu nhiên, đại diện bằng từ khóa RND như sau:

nmap -D 10.10.0.1,10.10.0.2,RND,RND,ME MACHINE_IP

Fragmented Packets

Để hạn chế việc bị phát hiện bởi firewall và IDS (Intrusion Detection System), chúng ta có thể sử dụng kỹ thuật chia nhỏ gói tin.

Option để chia nhỏ gói tin là -f. Kích thước gói tin bị chia nhỏ sẽ là 8 bytes hoặc ít hơn. Giả sử kích thước gói tin là 24 bytes và dùng -f thì ta sẽ có ba gói tin 8 bytes. Nếu thêm một -f (trở thành -ff) thì kích thước tối đa sẽ là 16 bytes.

Vùng dữ liệu màu đỏ sẽ bị chia nhỏ. IP ráp các gói tin bị chia nhỏ bằng cách sử dụng trường Identification (ID) và Fragment Offset ở dòng thứ hai.

Ta sẽ tiến hành so sánh câu lệnh sudo nmap -sS -p80 10.20.30.144 và câu lệnh sudo nmap -sS -p80 -f 10.20.30.144.

Câu lệnh thứ nhất không sử dụng chia nhỏ gói tin nên sẽ có traffic như sau:

Với dòng thứ 2 và 3 là dùng để thực hiện TCP SYN ping1. Dòng thứ 5 trở đi là để thực hiện TCP SYN scan ở port 80.

Câu lệnh thứ nhất có sử dụng chia nhỏ gói tin, traffic của nó có dạng như sau:

Các gói tin đầu tiên tương tự câu lệnh thứ nhất. Tuy nhiên, có thể thấy, gói tin thứ 5, 6 và 7 là các gói tin bị chia nhỏ của gói tin thứ 5 ở trong câu lệnh thứ nhất.

Idle/Zombie Scan

Loại scan này tương tự với spoofing nhưng thay vì ta dùng địa chỉ IP của một máy khác thì ta dùng địa chỉ IP của các thiết bị nhàn rỗi (idle host, có thể là máy in) nhưng có kết nối đến internet.

Cú pháp:

sudo nmap -sI ZOMBIE_IP MACHINE_IP

Với ZOMBIE_IP là địa chỉ của idle host.

Quy trình thực hiện: Bước 1: Lấy giá trị trường ID hiện tại của gói tin IP của idle host.

Bước 2: Gửi gói tin TCP có flag SYN đến port cần kiểm tra của target machine với source IP là địa chỉ của idle host.

Có ba trường hợp xảy ra, trường hợp thứ nhất là port đang đóng, target machine sẽ phản hồi lại gói tin có flag RST cho idle host và trường ID của idle host sẽ không tăng lên.

Trường hợp thứ hai là port đang mở, target machine sẽ phản hồi lại gói tin có flag là SYN/ACK cho idle host và idle host sẽ gửi lại cho target machine gói tin có flag là RST. Điều này dẫn đến việc trường ID của idle host sẽ tăng lên.

Trường hợp cuối cùng là target machine có tường lửa nên không phản hồi bất cứ thứ gì. Trường hợp này giống trường hợp thứ nhất do trường ID không tăng giá trị.

Bước 3: Attacker gửi gói tin có flag SYN/ACK đến idle host để nhận được gói tin có flag là RST và khiến cho IP ID của idle host tăng lên một lần nữa. Sau đó, attacker sẽ tìm sự khác biệt giữa IP ID ở bước thứ nhất và bước thứ ba. Nếu sự khác biệt là 1 thì biết được rằng port đó đang đóng. Nếu sự khác biệt là 2 thì biết được rằng port đó đang mở.

Important

Việc chọn một host nhàn rỗi là quan trọng bởi vì nếu nó bận thì các IP ID nhận được đều sẽ là vô nghĩa.

Resources

Footnotes

  1. Xem thêm TCP SYN Ping.