![](https://blog.crfnetwork.com/wp-content/uploads/2022/10/insecureeye2-vlad-socialnet-480x480-e1543189627154.png)
Giới thiệu
Nmap là một công cụ quét mạng mã nguồn mở miễn phí. Nó vô cùng mạnh mẽ và được ưa chuộng bởi có nhiều phương pháp quét, độ tin cậy cao, và tích hợp nhiều script giúp kiểm tra bảo mật.
Nmap có sẵn trong các phiên bản linux chuyên về bảo mật, kiểm thử như Kali Linux, Backbox, Parrot, dễ dàng cài đặt trên bất kỳ hệ thống linux, Windows, MacOS nào. Ngoài ra bạn có thể dùng Zenmap, là phiên bản có giao diện đồ hoạ của Nmap, giúp kết quả được trình bày một cách có hệ thống, dễ nắm bắt thông tin hơn.
Network Scanning là hoạt động nhằm xác định host, cổng và các dịch vụ trong một mạng. Các thông tin cần thu thập như các host đang sống, cổng đang mở, nhận diện hệ điều hành và kiến trúc hệ thống, các dịch vụ đang chạy và các nguy cơ an ninh (vulnerability) của các host đó.
Một số giao thức truyền thông mạng
Trước khi bắt đầu, hãy tìm hiểu về 16 giao thức truyền thông mạng cơ bản.
Một số cờ (flag) trong gói tin TCP:
- URG (urgent): dữ liệu trong gói nên được xử lý ngay lập tức.
- PSH (push): gửi tất cả dữ liệu đệm ngay lập tức.
- FIN (finish): thông báo kết thúc truyền thông, ko còn gì để phát đi.
- ACK (acknowledgement): xác nhận việc nhận được gói tin.
- RST (reset): yêu cầu kết nối lại.
- SYN (synchronize): khởi tạo kết nối.
Scan các host đang sống
Đương nhiên mục tiêu của attacker là tìm kiếm các host đang sống, tức là các thiết bị đang kết nối vào mạng một cách trực tuyến. Chứ máy ko tồn tại, hoặc có tồn tại nhưng đang tắt, hoặc chưa kết nối mạng thì chả có nghĩa lý gì cả.
Cách dễ nhất để quét mạng, ngay cả khi ko có Nmap, đó là dùng lệnh ping (lệnh ping có cả trên windows là linux):
ping <target_ip>
Tuy nhiên lệnh ping chỉ thăm dò được tới 1 host. Muốn ping tới nhiều host, bạn phải nhập bằng đấy lệnh ping. Để khắc phục điều bất tiện trên, hãy dùng Nmap với tham số lệnh sau:
nmap -sn <range_ip>
Dải địa chỉ IP có thể viết kiểu như sau 192.168.1.0-255 hoặc 192.168.1.0/24
Tham số -sn
(hay -PE
) chỉ đơn thuần là gửi gói tin ICMP Echo Request để kiểm tra host có sống hay ko, mà ko thực hiện quét cổng. Trong một số trường hợp, có lẽ bạn cần dùng loại ping khác như ICMP Timestamp Request (-PP
) hay ICMP Address Mask Request (-PM
).
Với hacker hay quản trị viên của mạng, cần biết nhiều thông tin hơn thế. Chúng ta cần biết các cổng nào đang mở, dịch vụ gì đang chạy, để đưa ra dự đoán về lỗ hổng bảo mật và kiểm tra điều đó. Các kỹ thuật quét sau đây sẽ đào sâu hơn vào điểm yếu trong các giao thức mạng, và quan trọng ko kém, đó là phải qua mặt được tường lửa hoặc hệ thống phát hiện xâm nhập IDS.
Các kỹ thuật quét cổng
![](https://blog.crfnetwork.com/wp-content/uploads/2022/10/image.png)
TCP Connect scan (Full-open scan)
Máy attacker sẽ thực hiện kết nối bằng giao thức TCP trên một cổng nhất định với đầy đủ bắt tay 3 bước như mô tả ở trên, tức là attacker gửi đi gói tin SYN.
Nếu cổng mở, mục tiêu sẽ trả lời bằng gói tin SYN+ACK. Khi đó attacker gửi tiếp gói tin ACK để duy trì kết nối. Nếu cổng đóng, mục tiêu sẽ trả lời bằng gói tin RST. Nếu mục tiêu ko phản hồi gì cả, thì cổng đã bị lọc bởi tường lửa.
Hoặc phản hồi bằng gói tin ICMP thông báo lỗi unreachable, cũng tính là đã bị lọc. Nói chung phương pháp nào mà bị trả về gói tin ICMP đều tính là bị lọc hết. Cách này dễ bị máy mục tiêu phát hiện và ghi lại. Thế nên nếu bạn là hacker, chả dại gì đi lựa chọn phương pháp này cả.
Tham số lệnh: -sT
TCP SYN scan (Half-open scan)
Giống như Full-open scan, nhưng sở dĩ gọi là nửa mở vì thay vì ở bước 3, attacker gửi gói tin ACK, thì attacker gửi ngay gói tin RST để kết thúc ngay kết nối. Còn nếu ở bước 2, mục tiêu gửi gói tin RST thì cũng có nghĩa là cổng đóng.
Phương pháp này có thể qua mặt được tường lửa hay các cơ chế ghi lại lịch sử (điều này ko phải tuyệt đối). Đây là kỹ thuật quét mặc định của Nmap.
Tham số lệnh: -sS
Inverse TCP Flag scan
Gọi chung cho các kỹ thuật NULL, FIN và Xmas scan. Attacker sẽ gửi đi các gói tin TCP mang cờ FIN, URG, PSH hoặc ko mang cờ, nghĩa là sự xuất hiện của các cờ này ko đúng với lẽ thông thường trong quy trình kết nối, để xem phản ứng của mục tiêu ra sao. Kết quả của các cách này đều giống nhau: nếu ko nhận được phản hồi gì từ mục tiêu thì là cổng mở hoặc bị lọc, còn nếu mục tiêu trả lời bằng gói tin RST thì là cổng đóng.
- NULL scan: gói tin ko mang cờ gì cả. Tham số lệnh:
-sN
- FIN scan: gói tin mang cờ FIN. Tham số lệnh:
-sF
- Xmas scan: mang đồng thời 3 cờ PSH, URG và FIN. Tham số lệnh:
-sX
TCP ACK scan
Attacker gửi luôn gói tin mang cờ ACK để thăm dò phản ứng của tường lửa của mục tiêu.
Nếu mục tiêu ko phản hồi, nghĩa là cổng đã bị lọc. Nếu mục tiêu phản hồi bằng gói tin RST, vậy là cổng ko bị tường lửa chặn. Tuy nhiên ta vẫn chưa biết là cổng đó đóng hay mở. Kỹ thuật này chủ yếu dùng để thăm dò tường lửa.
Tham số lệnh: -sA
Ngoài ra, chúng ta có kỹ thuật TCP Window scan (tham số -sW), về bản chất vẫn là TCP ACK scan, nhưng có hỗ trợ phân tích trường Window trong header của gói tin RST, nhờ đó biết thêm được cổng đóng hay mở. Tuy nhiên kết quả ko đáng tin cậy lắm.
Việc nhận biết cổng đóng hay mở có thể dựa vào trường Window và trường TTL (Time To Live). Nếu giá trị TTL thấp dưới 64 thì là cổng mở, hoặc giá trị Window mà khác 0 (trong khi các gói RST tương ứng với các cổng khác vẫn cho giá trị Window bằng 0) thì là cổng mở.
UDP scan
Attacker sẽ gửi đi gói tin UDP. Nếu mục tiêu phản hồi bằng gói tin UDP, cổng đó mở. Nếu phản hồi bằng gói tin ICMP thông báo lỗi, thì tuỳ vào lỗi mà xác định cổng đóng hay bị lọc. Nếu ko phản hồi, có thể cổng là mở hoặc bị lọc.
Tham số lệnh: -sU
Idle scan
Kỹ thuật này khá phức tạp, giả mạo địa chỉ IP một máy khác (ta gọi là máy zombie) để kiểm tra cổng của máy mục tiêu, như vậy nếu có hệ thống IDS thì hệ thống chỉ biết được hành vi đáng ngờ của máy zombie mà ko biết kẻ giả mạo. Mỗi một gói tin IP đều có một chuỗi số đánh thứ tự gọi là IPID. Nó tăng lên mỗi khi host đó gửi đi gói tin IP.
- Bước 1: attacker gửi cho zombie gói tin SYN+ACK. Zombie sẽ trả lời lại bằng gói tin RST, trong đó có chứa số IPID.
- Bước 2: giả mạo địa chỉ IP của máy zombie, gửi gói tin SYN cho máy mục tiêu.
- Nếu cổng mở, mục tiêu sẽ gửi gói SYN+ACK cho máy zombie, và zombie sẽ phản hồi lại cho mục tiêu bằng gói RST (tức là lúc này số IPID tăng lên 1).
- Nếu cổng đóng, mục tiêu sẽ gửi gói RST cho zombie, và dĩ nhiên zombie chẳng thể trả lời lại gì cả.
- Trường hợp khác là cổng bị lọc bởi tường lửa, mục tiêu chẳng gửi đi gói tin gì cả, thì zombie cũng chẳng có động thái gì cả. Như vậy biểu hiện của cổng đóng hay cổng bị lọc là như nhau.
- Bước 3: thăm dò lại máy zombie một lần nữa bằng gói SYN+ACK. Từ gói RST phản hồi của zombie, nếu thấy số IPID tăng lên 2 nghĩa là cổng trên máy mục tiêu được mở. Nếu tăng hơn 2, e rằng kết quả ko còn đáng tin cậy nữa, vì có thể zombie còn có sự giao thiệp nào khác.
Tham số lệnh: -sI [zombie] [target]
Trạng thái cổng quét được
Đó là về mặt lý thuyết. Thực tế khi sử dụng Nmap, bạn chỉ cần quan tâm Nmap cho ra kết quả cổng đó mang trạng thái gì. Có 6 trạng thái của cổng:
- Open: cổng mở tức là đang có một dịch vụ thực hiện kết nối ra bên ngoài mà ko bị giám sát bởi tường lửa. Đương nhiên rồi, cổng mở là điều hacker mong muốn nhất.
- Closed: cổng đóng chưa phải là điều đen tối nhất. Máy mục tiêu vẫn nhận và phản hồi, chỉ là ko có ứng dụng nào đang nghe trên cổng đó. Cổng được thông báo là đóng vẫn cho ta biết host đang sống. Ngoài ra nó vẫn hữu ích trong việc nhận diện hệ điều hành.
- Filtered: đây mới là điều tăm tối nhất. Bị lọc nghĩa là đã có sự ngăn chặn bởi tường lửa, bạn chẳng nhận được bất cứ phản hồi gì từ mục tiêu cả.
- Unfiltered: đồng nghĩa với việc ko bị chặn, nhưng ko thể biết được cổng đóng hay mở.
- Open/Filtered: ko biết là cổng mở hay bị lọc. Hiện tượng này xảy ra đối với kiểu quét mà cổng dù mở nhưng ko phản hồi gì cả, vì thế biểu hiện của nó giống như bị lọc.
- Closed/Filtered: trạng thái này chỉ gặp ở kỹ thuật Idle scan.