Dò tìm cổng mở trên hệ thống với Nmap: Hướng dẫn từ A–Z

Dò tìm cổng mở trên hệ thống với Nmap: Hướng dẫn từ A–Z

Mạng máy tính là một lĩnh vực rộng lớn và đôi khi gây bối rối cho những quản trị viên hệ thống mới. Có rất nhiều lớp (layers), giao thức (protocols), và giao diện (interfaces), cùng với đó là vô số công cụ và tiện ích mà bạn cần nắm vững để hiểu rõ về cách thức hoạt động của chúng.

Trong giao tiếp theo giao thức TCP/IP và UDP, các cổng đóng vai trò là điểm cuối của các kết nối logic. Một địa chỉ IP duy nhất có thể chạy nhiều dịch vụ khác nhau, chẳng hạn như máy chủ web, máy chủ ứng dụng và máy chủ lưu trữ. Để mỗi dịch vụ có thể giao tiếp, chúng sẽ được cấu hình lắng nghe trên một cổng cụ thể. Khi bạn kết nối đến một máy chủ, thực chất bạn đang kết nối đến địa chỉ IP và một cổng cụ thể.

Trong nhiều trường hợp, phần mềm bạn sử dụng sẽ tự động chỉ định cổng. Ví dụ, khi bạn truy cập https://dataonline.vn, bạn đang kết nối đến máy chủ của dataonline.vn qua cổng 443 – cổng mặc định cho lưu lượng web bảo mật. Vì đây là cổng mặc định, nên trình duyệt của bạn sẽ tự động thêm tham số cổng này.

Trong bài hướng dẫn này, bạn sẽ được khám phá sâu hơn về các cổng, qua đó học cách sử dụng chương trình netstat để xác định các cổng đang mở và sử dụng nmap để lấy thông tin chi tiết về trạng thái của các cổng trên máy tính trong mạng. Khi hoàn thành, bạn sẽ biết cách xác định các cổng phổ biến và quét hệ thống của mình để phát hiện các cổng mở.

Lưu ý: Hướng dẫn này tập trung vào bảo mật cho IPv4. Trên Linux, bảo mật IPv6 được quản lý riêng khỏi IPv4. Ví dụ, lệnh “nmap” mặc định quét các địa chỉ IPv4, nhưng có thể quét các địa chỉ IPv6 nếu bạn chỉ định tham số phù hợp (nmap -6). Để biết thêm thông tin chi tiết, bạn có thể tham khảo hướng dẫn: Cách cấu hình các công cụ để sử dụng IPv6 trên máy chủ Linux VPS.

Hiểu về các cổng

Mô hình OSI chia hệ thống mạng ra thành nhiều lớp. Lớp giao vận (transport layer) là lớp chính chịu trách nhiệm cho việc giao tiếp giữa các ứng dụng và dịch vụ.

Chính lớp này liên quan trực tiếp tới các cổng.

Để hiểu cấu hình cổng, bạn cần làm quen với một số thuật ngữ cơ bản:

● Port: Một vị trí mạng có thể định danh được trong hệ điều hành, giúp phân biệt lưu lượng dữ liệu đến các ứng dụng hoặc dịch vụ khác nhau.

● Internet Sockets: Một bộ mô tả tập tin (file descriptor) xác định một địa chỉ IP và số cổng kèm theo, cũng như giao thức truyền tải dùng để xử lý dữ liệu.

● Binding: Quá trình khi một ứng dụng hoặc dịch vụ sử dụng một internet socket để xử lý dữ liệu vào ra của nó.

● Listening: Khi một dịch vụ được cho là “lắng nghe” trên một cổng, nghĩa là nó đã thực hiện binding với một kết hợp cổng/giao thức/địa chỉ IP để chờ nhận yêu cầu từ các máy khách.

Sau khi nhận được yêu cầu, dịch vụ sẽ thiết lập kết nối với máy khách (nếu cần) sử dụng cùng cổng mà nó đang lắng nghe. Việc các internet socket liên kết với một địa chỉ IP cụ thể của máy khách cho phép máy chủ vừa phục vụ các yêu cầu từ một khách vừa đồng thời lắng nghe và phục vụ các kết nối từ những máy khác.

● Port Scanning: Quá trình quét cổng là việc thử kết nối đến một dãy các cổng để thu thập thông tin về các cổng mở cũng như các dịch vụ và hệ điều hành đang chạy đằng sau chúng.

Xác định các cổng phổ biến

Các cổng được chỉ định bằng các con số từ 1 đến 65535.

● Các cổng dưới 1024 thường liên kết với các dịch vụ mà hệ điều hành Linux và các hệ điều hành tương tự Unix coi là thiết yếu cho các chức năng mạng, do đó chỉ có người dùng có quyền root mới có thể cấu hình các dịch vụ chạy trên các cổng này.

● Các cổng từ 1024 đến 49151 được gọi là “registered” (đã đăng ký). Điều này có nghĩa là chúng có thể được “đặt trước” (theo nghĩa tương đối linh hoạt) cho một số dịch vụ nhất định bằng cách gửi yêu cầu tới IANA (Internet Assigned Numbers Authority). Mặc dù việc đăng ký không được thực thi một cách nghiêm ngặt, nhưng chúng thường gợi ý về dịch vụ có thể đang chạy trên cổng đó.

● Các cổng từ 49152 đến 65535 không thuộc diện đăng ký và thường được sử dụng cho mục đích riêng tư.

Với số lượng lớn các cổng có sẵn, bạn sẽ không cần quan tâm đến hầu hết các dịch vụ luôn gán cho các cổng cố định. Tuy nhiên, có một số cổng nổi bật mà bạn nên nắm rõ do tính phổ biến của chúng. Dưới đây là danh sách chưa đầy đủ:

● 20: Dữ liệu FTP
● 21: Cổng điều khiển FTP
● 22: SSH
● 23: Telnet (Không bảo mật, không khuyến khích sử dụng)
● 25: SMTP
● 43: Giao thức WHOIS
● 53: Dịch vụ DNS
● 67: Cổng máy chủ DHCP
● 68: Cổng khách hàng DHCP
● 80: HTTP – Lưu lượng web không mã hóa
● 110: Cổng mail POP3
● 113: Dịch vụ xác thực Ident trên IRC
● 143: Cổng mail IMAP
● 161: SNMP
● 194: IRC
● 389: Cổng LDAP
● 443: HTTPS – Lưu lượng web bảo mật
● 587: Cổng gửi thư SMTP (message submission)
● 631: Cổng của daemon in CUPS
● 666: DOOM – Trò chơi kinh điển có cổng riêng

Những cổng nêu trên chỉ là một số ít ví dụ về các dịch vụ được liên kết với cổng. Bạn nên tham khảo tài liệu hướng dẫn của từng ứng dụng để xác định đúng cổng mà chúng sử dụng.

Hầu hết các dịch vụ có thể được cấu hình sử dụng cổng khác ngoài cổng mặc định, nhưng cần đảm bảo rằng cả máy khách và máy chủ đều được cấu hình nhất quán khi sử dụng các cổng không tiêu chuẩn.

Bạn có thể xem danh sách các cổng phổ biến bằng cách mở file /etc/services:

less /etc/services

File này sẽ liệt kê các cổng và dịch vụ tương ứng, ví dụ:

Output
. . .
tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
daytime         13/tcp
daytime         13/udp
netstat         15/tcp
qotd            17/tcp          quote
msp             18/tcp                          # message send protocol
. . .

Tùy thuộc vào hệ thống, danh sách này có thể hiện ra nhiều trang. Nhấn SPACE để xem trang tiếp theo hoặc nhấn Q để thoát.

Kiểm tra các cổng mở

Có nhiều công cụ khác nhau để quét các cổng mở. Một trong những công cụ được cài đặt sẵn trên hầu hết các bản phân phối Linux là netstat.

Bạn có thể dễ dàng phát hiện các dịch vụ đang chạy bằng cách thực hiện lệnh:

sudo netstat -plunt

Kết quả sẽ hiển thị thông tin như sau:

Output
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      785/sshd        
tcp6       0      0 :::22                   :::*                    LISTEN      785/sshd

Kết quả này cho bạn biết cổng và socket đang lắng nghe của các dịch vụ, cũng như liệt kê các giao thức UDP và TCP.

Ngoài ra, công cụ nmap là một phương pháp khác để xác định các cổng mở.

Sử dụng Nmap

Một phần quan trọng trong việc bảo mật hệ thống là kiểm tra lỗ hổng bảo mật qua quá trình thử nghiệm tấn công (vulnerability testing). Điều này bao gồm việc xâm nhập thử vào hệ thống nhằm phát hiện ra các điểm yếu – giống như cách mà tin tặc có thể làm.

Trong số các công cụ có sẵn, nmap được xem là một trong những công cụ mạnh mẽ và phổ biến nhất.

Bạn có thể cài đặt nmap trên các máy chạy Ubuntu hoặc Debian bằng cách nhập các lệnh sau:

sudo apt-get update
sudo apt-get install nmap

Việc cài đặt nmap cũng mang lại lợi ích phụ là có file ánh xạ cổng (port mapping file) cải tiến. Bạn có thể xem bảng ánh xạ cổng-dịch vụ chi tiết bằng cách mở file:

less /usr/share/nmap/nmap-services

Kết quả sẽ hiển thị như sau:

Output
. . .
tcpmux  1/tcp   0.001995        # TCP Port Service Multiplexer [rfc-1078]
tcpmux  1/udp   0.001236        # TCP Port Service Multiplexer
compressnet     2/tcp   0.000013        # Management Utility
compressnet     2/udp   0.001845        # Management Utility
compressnet     3/tcp   0.001242        # Compression Process
compressnet     3/udp   0.001532        # Compression Process
unknown 4/tcp   0.000477
rje     5/udp   0.000593        # Remote Job Entry
unknown 6/tcp   0.000502
echo    7/tcp   0.004855
echo    7/udp   0.024679
echo    7/sctp  0.000000
. . .

File này chứa gần 20.000 dòng và có thêm các trường phụ như cột thứ ba ghi lại tần suất mở của mỗi cổng qua các lần quét trên Internet.

Quét cổng bằng Nmap

Nmap có khả năng cung cấp rất nhiều thông tin về một host, nhưng cũng có thể khiến quản trị viên của máy chủ mục tiêu nghi ngờ có hành vi xâm nhập.
Vì thế, bạn chỉ nên sử dụng nmap trên những máy chủ bạn sở hữu hoặc sau khi đã thông báo cho chủ sở hữu của hệ thống.

Nhà phát triển của nmap cung cấp một máy chủ thử nghiệm tại scanme.nmap.org. Đây là địa chỉ lý tưởng để thực hành cũng như kiểm tra nmap, bên cạnh đó bạn có thể sử dụng máy chủ của riêng mình.

Dưới đây là một số thao tác quét thông dụng với nmap. Lưu ý rằng tất cả các lệnh dưới đây được chạy với quyền sudo nhằm đảm bảo kết quả đầy đủ – một số lệnh có thể mất thời gian xử lý lâu:

1. Quét để nhận diện hệ điều hành của host:

sudo nmap -O scanme.nmap.org

2. Bỏ qua bước phát hiện mạng và giả định host đang trực tuyến (hữu ích khi xuất hiện thông báo “Note: Host seems down” ở các kiểm tra khác):

sudo nmap -PN scanme.nmap.org

3. Quét mà không thực hiện tra cứu DNS ngược cho địa chỉ IP, giúp tăng tốc độ phản hồi:

sudo nmap -n scanme.nmap.org

4. Quét một cổng cụ thể thay vì quét tất cả các cổng phổ biến:

sudo nmap -p 80 scanme.nmap.org

5. Để quét các kết nối TCP, nmap thực hiện quy trình “3-way handshake” (được giải thích chi tiết bên dưới) với cổng mục tiêu:

sudo nmap -sT scanme.nmap.org

6. Quét các kết nối UDP:

sudo nmap -sU scanme.nmap.org

7. Quét toàn bộ các cổng TCP và UDP mở:

sudo nmap -n -PN -sT -sU -p- scanme.nmap.org

Giải thích Quét TCP “SYN”:
Khi bắt đầu một kết nối TCP, phía gửi sẽ gửi một gói “synchronize request” tới máy chủ, sau đó máy chủ phản hồi bằng gói “synchronize acknowledgment”. Cuối cùng, phía gửi khẳng định lại bằng gói “acknowledgment” để hoàn tất kết nối.
Trong trường hợp quét “SYN”, nmap sẽ hủy kết nối ngay sau khi nhận gói phản hồi đầu tiên từ máy chủ. Đây được gọi là cuộc quét “half-open” và trước đây được coi là một phương pháp tinh vi để quét cổng, vì ứng dụng liên quan không nhận được dữ liệu do kết nối chưa hoàn tất.

Để thực hiện quét SYN, bạn sử dụng lệnh:

sudo nmap -sS scanme.nmap.org

Một phương pháp ẩn dụ khác là gửi các tiêu đề TCP không hợp lệ. Nếu host tuân thủ đúng chuẩn TCP, nó sẽ gửi về một gói thông báo nếu cổng đó đang đóng. Cách này thường hiệu quả với các máy chủ không chạy Windows.

Bạn có thể sử dụng các tham số -sF-sX hoặc -sN (lưu ý: từ “flags” được dịch là “tham số”) – tất cả đều nhằm mục đích tạo ra phản hồi mong muốn:

sudo nmap -PN -p 80 -sN scanme.nmap.org

Để xác định phiên bản dịch vụ đang chạy trên host, hãy chạy lệnh sau. Nmap sẽ thử nghiệm các phản hồi khác nhau từ máy chủ để xác định dịch vụ và phiên bản tương ứng:

sudo nmap -PN -p 80 -sV scanme.nmap.org

Cuối cùng, bạn cũng có thể sử dụng nmap để quét nhiều máy chủ cùng lúc.

  • Để quét một dải địa chỉ IP nhất định (sử dụng dấu “-” hoặc “/24”), hãy dùng lệnh:
    sudo nmap -PN xxx.xxx.xxx.xxx-yyy
  • Hoặc quét một dải mạng để tìm các dịch vụ đang hoạt động:
    sudo nmap -sP xxx.xxx.xxx.xxx-yyy

Có rất nhiều tổ hợp lệnh khác nhau mà bạn có thể sử dụng với nmap, nhưng các lệnh trên sẽ giúp bạn bắt đầu khám phá các lỗ hổng mạng của hệ thống.

Kết luận

Việc nắm vững các công cụ giám sát và kiểm soát lưu lượng mạng không chỉ giúp bạn hiểu rõ hơn về hoạt động của hệ thống mà còn là nền tảng để xây dựng một môi trường máy chủ an toàn, ổn định. Trong thời đại mà các mối đe dọa mạng ngày càng tinh vi, việc chủ động phát hiện và xử lý các điểm yếu tiềm ẩn sẽ giúp bạn luôn đi trước một bước so với các rủi ro bảo mật. Hãy nhớ rằng, bảo mật không phải là trạng thái – đó là một quá trình liên tục, và hiểu rõ về hệ thống của mình chính là chìa khóa để kiểm soát nó một cách hiệu quả nhất.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *