Summary
Các loại scan nâng cao
Port Scan Type | Example Command |
---|---|
TCP Null Scan | sudo nmap -sN MACHINE_IP |
TCP FIN Scan | sudo nmap -sF MACHINE_IP |
TCP Xmas Scan | sudo nmap -sX MACHINE_IP |
TCP Maimon Scan | sudo nmap -sM MACHINE_IP |
TCP ACK Scan | sudo nmap -sA MACHINE_IP |
TCP Window Scan | sudo nmap -sW MACHINE_IP |
Custom TCP Scan | sudo nmap --scanflags URGACKPSHRSTSYNFIN MACHINE_IP |
Spoofed Source IP | sudo nmap -S SPOOFED_IP MACHINE_IP |
Spoofed MAC Address | --spoof-mac SPOOFED_MAC |
Decoy Scan | nmap -D DECOY_IP,ME, MACHINE_IP |
Idle (Zombie) Scan | sudo 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:
Option | Purpose |
---|---|
--reason | Giải thích tại sao Nmap đưa ra các kết luận của nó |
-v | Verbose |
-vv | Very verbose |
-d | Debugging |
-dd | Chi 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:
- Attack gửi một gói tin với IP giả mạo đến target machine.
- Target machine phản hồi đến IP giả mạo.
- 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
-
Xem thêm TCP SYN Ping. ↩