Nmap – Phần 1: Cơ bản sử dụng Nmap để quét mạng

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 thêm nhiều module hay 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 đó.

Các giao thức truyền thông chính hoạt động trong mạng:

  • TCP : là kiểu giao thức có hướng, tức là mỗi gói tin truyền đi đều được sự xác nhận bởi cả 2 đầu của kết nối. Sự xác nhận này đến từ phương pháp “bắt tay 3 bước” như sau:
    1. A gửi gói tin mang cờ yêu cầu khởi tạo kết nối SYN cho B, ví dụ với số hiệu của gói là SEQ#10.
    2. Nếu B nhận được gói tin đó thì phản hồi lại cho A bằng gói tin mang cờ ACK với số hiệu ACK#11 cùng cờ SYN với số hiệu mới SEQ#142 (ACK#11 và SEQ#142 có nghĩa là “ê, tao nhận được gói số 10 của mày rồi, giờ tao gửi gói thứ 142 của tao cho mày, gửi tiếp gói 11 cho tao đê”).
    3. Tiếp tục nếu máy A nhận được thì trả lời lại bằng gói tin mang cờ ACK số hiệu ACK#143, SEQ#11 (để báo rằng “ok tao cũng vừa nhận được gói 142 từ mày rồi, gói thứ 11 của tao cho mày đây, đưa gói 143 tiếp theo đây”).

    Sau đó kết nối được duy trì bởi sự truyền qua truyền lại các gói tin mang cờ ACK như vậy. Đến khi một bên chấm dứt kết nối, chu trình vẫn 3 bước, nhưng bên chấm dứt sẽ gửi gói tin mang cờ báo hiệu kết thúc FIN thay vì SYN như lúc khởi tạo.
    3_way_handshake
    Nói thêm về các cờ (flag) gắn vào các gói tin trong giao thức truyền thông 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.

  • UDP : là kiểu giao thức vô hướng. Thường được dùng trong stream, truyền hình trực tuyến. Dữ liệu có bao nhiêu được đẩy vào đường truyền bấy nhiêu, ko cần sự chấp thuận của đầu bên kia, lấy thì lấy, ko lấy là mất.
  • ICMP : đây ko phải là giao thức truyền tin, mà chỉ là giao thức kiểm tra các host đang sống và thông báo sự cố trong mạng.

Tìm kiếm 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 [địa_chỉ_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 [một_địa_chỉ_ip hoặc dải_địa_chỉ_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:

scanning_techniques

  • 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 : là tên 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ở. Làm thế nào để đọc được giá trị các trường đó? Hãy dùng Wireshark.
  • 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]
  • Chi tiết về kỹ thuật này xem tại đây.

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

Bình luận về bài viết này

Trang web này sử dụng Akismet để lọc thư rác. Tìm hiểu cách xử lý bình luận của bạn.

Tạo một blog miễn phí với WordPress.com.

Up ↑

Craftsmanship

Everything in software architecture is a trade-off.

Make It Awesome

🍓🍓🍓 The fragrance always stays in the hand that gives the rose 🍓🍓🍓

Lược Sử Tộc Việt

Chuyên trang khảo cứu về nguồn gốc người-Việt, nguồn gốc cộng đồng tộc-Việt, thời kỳ tiền-Việt và nền văn minh Việt-cổ. Trên con thuyền hướng về Cội-Nguồn.

Nghiên Cứu Lịch Sử

Các bài nghiên cứu, biên khảo và dịch thuật các chủ đề về lịch sử

Codeaholicguy

director of engineering @ ShopBack, thoughtful software engineer, blogger

Blog của Chiến

Học. Thực hành. Sáng tạo

Kho tài liệu y khoa

Chia sẻ tài liệu, kiến thức y khoa

Từ coder đến developer - Tôi đi code dạo

Lập trình viên giỏi không phải chỉ biết code

Quyen Vu

Góc nhỏ của Quyền