Hệ điều hành (OS), Linux

Cách Check lỗ hổng bảo mật trên máy chủ web với các lệnh Linux đơn giản

Trong kiểm thử chống xâm nhập (penetration testing) hệ thống, bước đầu tiên thường là chúng ta cần xác định các cổng mà máy chủ web đang lắng nghe. Quá trình quét cổng (port scanning) giống như “gõ cửa từng cánh cửa của một tòa nhà để xem cánh nào đang mở, cánh nào đang khóa”. Kẻ tấn công sử dụng cách này để tìm cổng mở trên mạng và dịch vụ đang chạy bên trong. Ngược lại, người quản trị hệ thống cũng cần biết những cổng nào đang mở để bảo vệ hệ thống, bởi vì mỗi cổng mở có thể trở thành lỗ hổng an ninh nếu bị Hackers khai thác. Ví dụ, nếu một dịch vụ web chỉ nên chạy trên cổng 80 (HTTP) hoặc 443 (HTTPS), nhưng do sơ xuất không kiểm tra kỹ có thể có cổng khác mở, kẻ xấu có thể sẽ lợi dụng để xâm nhập vào hệ thống. Do đó, xác định được cổng mở và dịch vụ trên máy chủ là bước quan trọng để nắm bắt rõ mặt bằng tấn công và triển khai biện pháp bảo vệ thích hợp cho máy chủ web server của bạn.

Theo ghi nhận từ các chuyên gia bảo mật, cổng 80 và 443 là các cổng chuẩn cho máy chủ web (để phục vụ HTTP và HTTPS). Ngoài ra, các cổng thay thế như 8080 (thường dùng cho HTTP proxy) và 8443 (thường là HTTPS thay thế) cũng rất phổ biến. Dưới đây là một số cổng web thông dụng:

  • Port 80: HTTP, giao thức web không mã hóa.

  • Port 443: HTTPS, giao thức web an toàn (được mã hóa với SSL/TLS).

  • Port 8080: HTTP proxy hoặc HTTP thay thế.

  • Port 8443: HTTPS thay thế hoặc Tomcat SSL.

Các cổng này là “cánh cửa” mặc định giúp trình duyệt và máy khách giao tiếp với máy chủ web. Khi quét mạng, nếu phát hiện có máy chủ phản hồi trên một trong những cổng trên, đó rất có thể là web server đang chạy ở địa chỉ IP đó. Ngược lại, các cổng không mong muốn nên được đóng lại để tránh lộ mặt bằng tấn công – như khuyến nghị rằng chúng ta chỉ nên mở những cổng cần thiết cho hệ thống.

Mô hình thử nghiệm và cài đặt công cụ

Trong ví dụ như trong hình minh họa, giả sử chúng ta có hai máy ảo Linux: một máy tấn công (attacker) chạy Ubuntu và một máy mục tiêu (target) chạy CentOS Stream. Máy CentOS được thiết lập có nhiều lỗ hổng giả định để cho việc học tập và thực hành. Ở máy Ubuntu (máy tấn công), chúng ta cần cài đặt các công cụ cơ bản: curlnmap. Nếu hệ thống chưa có sẵn, chúng ta có thể chạy các lệnh sau:

sudo apt update
sudo apt install curl -y
sudo apt install nmap -y

Lệnh trên sẽ cài curl (một công cụ đa năng để truy xuất nội dung web) và nmap (một công cụ quét mạng mạnh mẽ). Sau khi cài đặt xong, chúng ta sẽ dùng chúng để thực hiện các bước quét mạng. Điểm mấu chốt ở đây là xác định xem máy chủ web của mục tiêu đang mở những cổng nào, dịch vụ nào, và phiên bản OS VD là Linux hay Windows. Từ đó, ta có thể lập báo cáo và đề xuất biện pháp bảo vệ hệ thống.

Quét cổng web với cURL

Công cụ curl thường dùng để lấy nội dung trang web, nhưng nó cũng có thể được dùng linh hoạt cho việc quét mạng. Ví dụ, để kiểm tra trang web http://www.udemy.com, chúng ta chỉ cần chạy:

curl [https]://www.udemy.com

Lưu ý: Do quy tắc security của trang web không cho phép mình viết đúng lệnh này, vậy bạn hãy xem hình bên dưới để gõ đúng lệnh curl và url của trang web mà bạn muốn test nhé!

Lệnh trên sẽ tải về mã HTML của trang Udemy (ví dụ). curl thậm chí có thể gửi yêu cầu POST giả lập tấn công thử, ví dụ:

curl --data "username=test&password=abc" https://www.microsoft.com/

nhưng mục tiêu ở đây là xác định máy chủ web đang hoạt động trên mạng nội bộ hoặc trên internet (bạn có thể thay thể lệnh dưới với địa chỉ IP public hoặc dải địa chỉ IP Private của Webserver của bạn để kiểm tra). curl hỗ trợ quét dải địa chỉ IP nhờ cú pháp dấu ngoặc vuông. Ví dụ, để quét IP từ 192.168.0.1 đến 192.168.0.254, chúng ta dùng:

curl [http]://192.168.0.[1-254]

Lệnh trên sẽ lần lượt gửi yêu cầu HTTP đến mỗi một địa chỉ trong dảimạng . Hầu hết các IP sẽ không tồn tại máy chủ web (sẽ trả về lỗi hoặc không phản hồi). Tuy nhiên, nếu IP nào trả về dữ liệu HTTP có nghĩa là đích đó đang có máy chủ web hoạt động. Để dễ quan sát, ta có thể thêm các tham số:

  • -w 'Success: %{remote_IP}\n' để in ra thông tin IP trả lời thành công.

  • -o /dev/null để bỏ qua nội dung (chỉ quan tâm kết quả).

  • -s để tắt các thông báo lỗi.

Ví dụ:

curl -w 'Success: %{remote_IP}\n' -o output -s http://192.168.0.[1-20]

Khi chạy lệnh này, kết quả sẽ chỉ hiển thị những địa chỉ trả về thành công. Từ đó, ta dễ dàng biết được địa chỉ IP nào đang chạy dịch vụ web trên cổng 80. Chẳng hạn, nếu thấy dòng Success: 192.168.0.1 được in ra, tức là máy tại IP 192.168.0.1 đang chạy một máy chủ HTTP trên cổng 80, như trong hình dưới.

Nếu muốn kiểm tra web server qua HTTPS (cổng 443) thay vì HTTP, chỉ cần đổi http:// thành https://. Ví dụ:

curl -w 'Success: %{remote_IP}\n' -o output -s https://192.168.0.[1-20]

Lúc này, curl sẽ thử kết nối HTTPS tới các IP trong dải mạng. Nếu có máy chủ trả về, curl sẽ báo “Success” cho IP đó. Qua ví dụ này, chúng ta đã xác định được server đó có HTTPS.

Ngoài ra, nếu nghi ngờ máy chủ web chạy trên một cổng khác không mặc định (ví dụ 8080 hay 8443), chúng ta cũng có thể quét cổng trực tiếp bằng lệnh curl. Chẳng hạn, biết IP máy chủ mục tiêu là 192.168.146.173, chúng ta có thể quét dãy cổng từ 75 đến 82:

curl -w 'Success: %{remote_port}\n' -o output -s http://192.168.146.173:[75-82]

Ở đây, %{remote_port} sẽ in ra cổng mà được kết nối thành công. Nếu kết quả trả về Success: 80, có nghĩa là máy chủ đang chạy web trên cổng 80 (HTTP). Nếu ta thay http thành https và thấy Success: 443, có nghĩa máy chủ đó đang chạy HTTPS trên cổng 443. Cách này giúp chúng ta xác định chính xác cổng web đang hoạt động mà không cần quét toàn bộ các cổng.

Quét cổng nâng cao với Nmap

Bên cạnh curl, Nmap là công cụ không thể thiếu trong việc quét mạng. Nmap được đánh giá là “con dao Đa dụng” để quét cổng và phát hiện lỗ hổng. Nó không chỉ quét được tất cả các cổng TCP, UDP mà còn có thể nhận diện hệ điều hành, phiên bản dịch vụ, và thậm chí chạy các script kiểm tra lỗ hổng. Ví dụ, ta có thể dùng lệnh Nmap sau với quyền cao nhất:

sudo nmap -p- -A 192.168.146.173

Giải thích các tham số:

  • -p- : quét tất cả 65.535 cổng TCP. Mặc định nếu không có -p-, Nmap chỉ quét 1.000 cổng phổ biến nhất.

  • -A : kích hoạt chế độ phân tích toàn diện – bao gồm phát hiện hệ điều hành, phiên bản dịch vụ, quét script cơ bản và theo dõi đường đi (traceroute).

Với tùy chọn này, Nmap sẽ gửi nhiều gói thử nghiệm để phân tích sâu mục tiêu. Do vậy, Nmap quét toàn diện các cổng và thu thập thông tin chi tiết, như có thể phát hiện chính xác dịch vụ đang chạy và phiên bản cụ thể. Đây là lý do nhiều chuyên gia xem Nmap là công cụ chủ lực trong security audit và pentesting.

Kết quả đầu ra từ lệnh Nmap trên ví dụ có thể trông như sau (giả sử máy mục tiêu 192.168.146.173 đang lắng nghe một số cổng như hình dưới):

Điều này cho thấy host đang online và phản hồi rất nhanh. Ba cổng mở được phát hiện là 22, 80 và 443. Mỗi cổng đều liệt kê dịch vụ và phiên bản: cổng 22 chạy SSH (OpenSSH 9.9), cổng 80 và 443 đều chạy web server Apache HTTPD phiên bản 2.4.62. Như vậy, máy chủ mục tiêu đang là một Apache Web Server (CentOS Stream) trên cả HTTP và HTTPS. Từ thông tin này giúp chúng ta có thể biết được môi trường hoạt động (OS: CentOS Stream, Web server: Apache 2.4.62) và các dịch vụ quan trọng.

Nhờ Nmap, chúng ta đã tạo ra một bức tranh khá đầy đủ về bề mặt tấn công của máy chủ: biết được cổng SSH (có thể cài đặt fail2ban hay khóa IP nếu cần), biết được Apache đang chạy bản 2.4.62 (cần kiểm tra xem phiên bản đó có lỗ hổng bảo mật gì hay không), biết được HTTP và HTTPS đang hoạt động. Thông tin này là cơ sở để đưa ra báo cáo chi tiết và kiến nghị bảo vệ hệ thống để gửi báo cáo cho các phòng ban liên quan.

Kết luận và biện pháp bảo vệ

Qua vài bước đơn giản với curlnmap, chúng ta đã xác định được chính xác máy chủ web đang chạy ở đâu, trên cổng nào, và dịch vụ gì đang phục vụ. Điều này rất quan trọng trong quy trình kiểm thử bảo mật, bởi mỗi cổng mở đều có thể là điểm yếu cho tấn công vào hệ thống. Ví dụ, nếu phát hiện Apache 2.4.62 chứa lỗ hổng được công bố, chúng ta cần lập tức cập nhật lên phiên bản an toàn hơn. Nếu một cổng của máy chủ web  không cần thiết phải mở, chúng ta nên tắt hoặc chặn nó. Như các chuyên gia khuyến cáo, chỉ nên mở các cổng thực sự cần thiết cho dịch vụ; các cổng khác phải được đóng hoặc lọc bởi tường lửa.

Tóm lại, những bước kiểm tra kể trên giúp chúng ta nắm bắt “tổng thể bề mặt tấn công” của máy chủ web. Sau khi đã xác định các dịch vụ và phiên bản, các bước tiếp theo bao gồm kiểm tra lỗ hổng chi tiết hơn (có thể dùng thêm công cụ như Nikto, Nessus, hoặc khai thác mẫu) và đưa ra giải pháp khắc phục, như cập nhật phần mềm, siết chặt việc cấu hình máy chủ và hệ thống tường lửa&network, hoặc thêm các biện pháp kiểm soát truy cập. Việc này sẽ giúp giảm thiểu rủi ro bị khai thác.

Hy vọng bài viết đã giúp bạn hiểu cách dùng các lệnh Linux cơ bản để phát hiện rủi ro bảo mật trên máy chủ web. Nếu bạn thích, hãy chia sẻ kinh nghiệm hoặc đặt câu hỏi bên dưới để chúng ta cùng thảo luận thêm nhé!

Nguồn tham khảo: Kiến thức về quét cổng và bảo mật hệ thống web được biên dịch từ nhiều tài liệu chuyên ngành và hướng dẫn thực tế. Các ví dụ lệnh và thủ thuật ở đây được minh họa từ các tài liệu hướng dẫn sử dụng curlnmap phổ biến. Có thể tham khảo bài viết “Hướng dẫn sử dụng công cụ quyét cổng Nmap Port Scanning trong Linux System”

Để 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 *