Tiếp tục với Series tìm hiểu về kiểm thử xâm nhập, ta sẽ đi đến bước tiếp theo là Scanning. Trong kiểm thử xâm nhập (pentest), quá trình scanning đóng vai trò quan trọng để khám phá các lỗ hổng và mục tiêu tiềm năng trong hệ thống mục tiêu. Scanning là quá trình sử dụng các công cụ và kỹ thuật để kiểm tra và khám phá các cổng mạng, dịch vụ chạy trên các máy chủ, thiết bị mạng và các ứng dụng trong hệ thống. Trong quá trình scanning, người kiểm thử (pentester) sẽ thực hiện các hoạt động như:
-
Quét cổng (Port scanning): Kiểm tra các cổng mạng trên máy chủ hoặc thiết bị để xác định các dịch vụ đang chạy và cổng mạng có sẵn. Điều này giúp xác định các điểm yếu tiềm ẩn và cung cấp thông tin về cách cấu hình hệ thống.
-
Nhận diện hệ điều hành (OS fingerprinting): Xác định hệ điều hành đang chạy trên các máy chủ hoặc thiết bị mạng để hiểu rõ hơn về cấu trúc và cách vận hành của hệ thống.
-
Quét phiên bản (Version scanning): Xác định phiên bản của các phần mềm, dịch vụ và ứng dụng đang chạy trên các máy chủ hoặc thiết bị mạng. Việc này giúp xác định các lỗ hổng đã biết và các cập nhật bảo mật đã được áp dụng.
-
Quét lỗ hổng (Vulnerability scanning): Phát hiện và đánh giá các lỗ hổng trong hệ thống.
Quá trình scanning giúp pentester hiểu rõ hơn về môi trường mục tiêu và xác định các điểm yếu có thể khai thác. Từ đó, pentester có thể tiến hành các bước tiếp theo trong quá trình kiểm thử an ninh mạng để đánh giá tính bảo mật của hệ thống và đề xuất các biện pháp cải thiện
Dù bạn đang thực hiện kiểm thử an ninh mạng nội bộ hay từ bên ngoài, bạn cần có một phương pháp để tìm các mục tiêu, bao gồm máy chủ, tường lửa, switch, điểm truy cập không dây, các thiết bị Internet of Things (IoT) và có thể là thiết bị kiểm soát và thu thập dữ liệu giám sát (SCADA). Có quá nhiều công cụ để liệt kê giúp kẻ tấn công (và người kiểm thử) không chỉ tìm thấy mục tiêu mà còn giúp thu hẹp phạm vi dịch vụ có thể có lỗ hổng và khai thác những lỗ hổng đó. Trong bài viết này mình sẽ chỉ tập trung vào một số công cụ phù hợp với một mục đích cụ thể và nên có trong bộ công cụ của mỗi người kiểm thử.
I.Giới thiệu NMap
Nmap (Network Mapper) là một công cụ quét mạng phổ biến và mạnh mẽ được sử dụng trong kiểm thử bảo mật và khám phá mạng. Nó được phát triển bởi Gordon Lyon (còn được biết đến với tên Fyodor Vaskovich) và là một phần của dự án open source.
Nmap có thể hoạt động trên nhiều hệ điều hành như Windows, macOS và các phiên bản của Linux. Ngoài ra, Nmap cũng hỗ trợ nhiều tính năng mở rộng và tùy chỉnh, bao gồm scripting để thực hiện các tác vụ tự động và quét mạng phức tạp hơn. Trước khi bắt đầu khám phá quét cổng, việc làm quen với công cụ sẽ giúp bạn làm việc dễ dàng hơn.
NMAP runtime options
Khi bạn bắt đầu chạy lệnh nmap từ dòng lệnh, nó sẽ chuyển vào trạng thái chạy tương tác cho phép tương tác hạn chế với chương trình mà không làm dừng quá trình quét (nhằm hạn chế bị phát hiện ). Nhấn các nút trên bàn phím sẽ hiển thị một số thống kê cơ bản về quét hiện tại, như loại quét, thời gian quét đã chạy và thời gian dự kiến để hoàn thành quét. Ví dụ bấm nút v
khi đang quét nmap để bật Verbosity level:
Verbosity level có thể được thay đổi để hiển thị trạng thái hiện tại của quá trình quét, bao gồm số lượng máy chủ và cổng đã được quét, số lượng máy chủ phản hồi và các cổng phản hồi. Nmap cũng có thể hiển thị thông tin như yêu cầu và phản hồi DNS, vì mặc định nmap sẽ cố gắng thực hiện phân giải địa chỉ IP và tên miền. Verbosity level cũng có thể được kích hoạt từ dòng lệnh thông qua tùy chọn -v hoặc để xem chi tiết cao hơn, bạn có thể sử dụng -vv hoặc -vvv.
Ngoài ra còn có 2 phím được sử dụng trong quá trình chạy nmap:
- p/P: Bật/ tắt theo dõi gói tin
- d/D Bật tắt debug
Theo dõi gói tin (packet tracing), nếu được kích hoạt, hiển thị thông tin về các gói tin mạng mà nmap tạo ra và gửi đi. Theo dõi gói tin cũng có thể được kích hoạt từ dòng lệnh thông qua tùy chọn --packet-trace. Tùy chọn này thường tạo ra nhiều thông tin hơn bạn cần để hiển thị trong quá trình quét.
Debugging level không cần thiết trong quá trình kiểm thử tiêu chuẩn. Tuy nhiên, nếu bạn muốn hiểu rõ hơn về những gì nmap đang làm tại một điểm cụ thể trong quá trình quét, hoặc nếu bạn phát hiện một lỗi trong nmap mà bạn muốn báo cáo cho các nhà phát triển, bạn có thể kích hoạt degub. Có chín cấp độ debug có thể được kích hoạt từ dòng lệnh bằng cách chỉ định -d<number>
.
Nmap scan timming and tuning
Số lượng thời gian bạn dành cho việc quét mục tiêu giúp bạn có thể tự mình xác định liệu quá trình kiểm thử của bạn có hoàn thành đúng lịch trình hay không. Có sáu options được định nghĩa sẵn mà bạn có thể áp dụng vào quá trình quét của mình, từ chậm nhất đến nhanh nhất: Paranoid, Sneaky, Polite, Normal, Aggressive và Insane. Bạn cũng có thể sử dụng các số từ 0 đến 5 tương ứng để chỉ định option sử dụng. Mặc định là 3, để thay đổi option bạn sử dụng tùy chọn -T<number>
.
Trong ví dụ dưới đây, bạn có thể thấy sự khác biệt về thời gian để hoàn thành quá trình quét trong chế độ sneaky (-T2) so với chế độ aggressive (-T4). Trong chế độ sneaky, mất gần bảy phút để hoàn thành quá trình quét mà chỉ mất 0.09 giây trong chế độ aggressive.
Lưu đầu ra
Có những trường hợp bạn bị yêu cầu bởi hợp đồng phải ghi lại hoặc lưu lại công việc đã hoàn thành. Điều này cũng là một ý tưởng tốt để giữ thói quen lưu lại hoặc ghi chú tất cả các lệnh bạn chạy và kết quả đầu ra của chúng. Nó cũng có thể giúp bạn trả lời các câu hỏi mà khách hàng có thể đặt về một kết quả cụ thể và cách bạn đạt được kết luận đó. Nmap có định dạng đầu ra cụ thể, đồng thời cũng có thể giúp bạn nếu bạn muốn sử dụng lại dữ liệu đó với một định dạng khác. Bốn định dạng đầu ra chính là:
- -oN đầu ra bình thường
- -oX đầu ra dạng XML
- -oG đầu ra dạng Greppable
- -oS đầu ra dạng Script kiddie
- -oA Đầu ra sử dụng cả 3 loại định dạng trừ script kiddie
Ví dụ sử dụng -oA để xuất dữ liệu:
II.Ping sweeping
Ping sweeps, còn được gọi là Network sweeps, là một cách hiệu quả để xác định những máy chủ còn hoạt động trong một phạm vi mục tiêu đã cho. Phần này giới thiệu hai công cụ đi kèm với Kali Linux có thể giúp bạn xác định xem các máy chủ có hoạt động trên mạng hay không: là: fping và nmap. Ngoài ra bạn có thể ping sweep bằng cách sử dụng các công cụ hệ điều hành tiêu chuẩn.
FPING
Fping đã chứng minh nó là một công cụ để thực hiện ping sweep trên nhiều máy chủ với hiệu suất tốt hơn đáng kể so với công cụ ping tiêu chuẩn đi kèm với Linux. Fping có thể được cài đặt trên Kali Linux bằng lệnh
sudo apt-get -y install fping
Nó có thể quét nhanh chóng nhiều máy chủ hoặc mạng và báo cáo kết quả theo nhiều cách khác nhau. Chạy lệnh
fping -g 192.168.1.0 192.168.1.254
sẽ gửi các yêu cầu echo ICMP đến tất cả các địa chỉ IP trong khoảng giữa các địa chỉ được chỉ định trong lệnh và chỉ in ra các máy chủ đang hoạt động. Nếu nhận được phản hồi echo ICMP, nó báo cáo địa chỉ IP là "alive" (đang hoạt động).
NMAP
Nmap là tiêu chuẩn thực tế khi nói đến quét mạng và nên được coi là công cụ chính trong hộp công cụ của bạn. Nó cũng có khả năng thực hiện ping sweep. Nmap được đề cập chi tiết trong phần trước, do đó phần này tập trung vào chức năng ping sweeping của nó bằng cách hướng dẫn cách vô hiệu hóa quét cổng trong nmap thông qua tùy chọn -sn
. Nếu quét một mạng con kết nối cục bộ, lệnh này gửi một yêu cầu ARP để xác định xem máy chủ có hoạt động hay không. Nếu quét một mạng con không cục bộ, nmap gửi các gói tin TCP đến cổng 80 và 443, một yêu cầu echo ICMP và một yêu cầu thời gian ICMP.
Mặc dù ping sweep mặc định chỉ đủ đối với hầu hết các trường hợp, có thể có những lúc bạn muốn sửa đổi ping sweep của mình cho một mục đích cụ thể. Nmap cũng có khả năng thực hiện các loại ping sweep khác có thể vượt qua tường lửa, ví dụ như nếu mục tiêu của bạn đang chặn các thông điệp ICMP. Sau đây là các loại ping sweep khác nhau mà nmap có thể thực hiện:
- -PS [port list]: ping TCP SYN
- -PE: ICMP echo request
- -PP: ICMP timestamp request
- -PM: ICMP address mark request
- -PO [protocol list]: ping IP protocol
- -P0/-Pn: vô hiệu hóa ping, coi tất cả các máy chủ đều hoạt động
III. Port Scan
Kết hợp với thông tin OSINT bạn thu thập được trong giai đoạn khảo sát kiểm thử, scan port sẽ bắt đầu tạo ra thông tin thực tế và có thể thực hiện đối với mục tiêu của bạn. Mục tiêu chính của quét cổng là xác định xem các cổng TCP và UDP nào có thể "listening" trên một địa chỉ IP mục tiêu, từ đó cung cấp cho bạn cái nhìn tổng quan về bề mặt tấn công của tổ chức mục tiêu. Đây cũng là thời điểm mà mục tiêu của bạn có khả năng rất cao để phát hiện hoặc bắt gặp các hoạt động của bạn, vì số lượng gói tin bạn gửi tới mục tiêu rất lớn. Mặc định, nmap sẽ quét 1000 cổng phổ biến nhất mà nmap đã tìm thấy.
Nmap duy trì một "cơ sở dữ liệu" nội bộ (thực ra chỉ là một tệp tin) chỉ định cổng và tần suất mà nmap đã tìm thấy cổng mở. Tệp tin nmap-services được đặt tại đường dẫn /usr/share/nmap
mặc định trên Kali Linux. Lệnh sau đây sẽ hiển thị 100 cổng phổ biến nhất và dịch vụ mặc định tương ứng dựa trên tần suất mở cổng:
grep -v ^# /usr/share/nmap/nmap-services | sort -nr -k 3 | head -n 100
Nếu bạn muốn nmap quét với số lượng cổng khác, bạn có thể sử dụng tùy chọn --top-ports (number)
.
Nmap cũng cho phép bạn chỉ định cụ thể các cổng sử dụng tùy chọn -p
. Bạn có thể chỉ định cả cổng UDP và TCP nếu cần thiết. Ví dụ, nếu bạn muốn quét cổng TCP 22 và các cổng UDP 137-139, thì đặc tả cổng cho lệnh sẽ là -pT:22,U:137-139
.
Kết quả từ mỗi cổng có thể có một trong bốn trạng thái khác nhau được báo cáo bởi nmap:
-
mở (open): xác định rằng có một thành phần trên hệ thống mục tiêu đang lắng nghe kết nối đến
-
đóng (closed): cổng mục tiêu không có bất kỳ dịch vụ nào đang lắng nghe kết nối đến trong thời điểm quét
-
lọc (filtered): có một thiết bị nằm giữa máy khách và mục tiêu không cho phép giao thông đến cổng đích
-
chưa lọc (unfiltered): nmap có thể đến được cổng đích nhưng không thể xác định cổng đó có mở hay đóng
Ngoài ra, nmap cũng có thể báo cáo rằng một cổng có thể là open|filtered hoặc closed|filtered.
-
Nếu nmap báo cáo một cổng là open|filtered, điều đó có nghĩa là nmap không nhận được phản hồi từ mục tiêu. Điều này thường xảy ra trong quét cổng UDP
-
Một quét IP ID idle có thể báo cáo một cổng là filtered|closed, không thể xác định giữa hai trạng thái đó.
TCP connect Scan
The TCP connect (or full-connect) scan là quét mặc định của nmap khi người dùng chạy lệnh không có quyền raw socket hoặc packet. Loại quét này hoàn thành ba bước bắt tay TCP để thiết lập kết nối với mục tiêu trước khi phát ra một gói tin RST. Quét TCP connect sử dụng các lệnh hệ điều hành để thiết lập kết nối với mục tiêu, điều này dẫn đến overhead cao và quét chậm hơn Chạy một TCP connect scan bằng nmap sử dụng lệnh:
nmap -n -Pn -sT -p22 scanme.nmap.org
Áp dụng kiến thức đã học ở phần trước, ta thực hiện monitoring quá trình quét bằng tcpdump như sau:
Từ đầu ra, bạn có thể thấy điều này:
- Đầu tiên Nmap gửi một gói SYN packet đến mục tiêu trên TCP port 22 (dòng 4, 5)
- Trang web phản hồi lại với SYN/ACK (dòng 6, 7)
- Nmap phản hồi với ACK và kết nối được thiết lập (dòng 8, 9)
- Cuối cùng NMAP gửi cờ RST để hủy kết nối (dòng 10, 11)
TCP SYN SCAN
Một SYN scan (hoặc half-open scan) còn được gọi là stealth scan. SYN scans yêu cầu quyền root hoặc quyền đặc biệt, nhưng chúng không phụ thuộc vào hệ điều hành và do đó có ít overhead hơn so với full-connect scans và thường nhanh hơn. SYN scans không hoàn thành ba bước bắt tay. Thay vào đó, chúng phát ra một gói tin RST trước khi kết nối có thể được thiết lập. Thực hiện quét SYN dùng lệnh:
command nmap -n -Pn -sS -p22 scanme.nmap.org
monitoring quá trình:
Ta có thể thấy rõ ràng SYN Scan chỉ có 3 bước và không bao gồm bước thiết lập kết nối so với full-connect Scan
UDP SCANS
Như đã giới thiệu trong phần trước, UDP là một giao thức "cố gắng tốt nhất" (best effort), có nghĩa là một khi gói tin đã rời khỏi nguồn gửi, không có đảm bảo rằng gói tin sẽ đến được điểm đích, và người nhận sẽ không thông báo cho người gửi biết liệu gói tin đã đến hay chưa. Điều này làm cho việc quét cổng UDP khác biệt rất lớn so với việc quét cổng TCP, chủ yếu do sự khác biệt quan trọng duy nhất giữa hai giao thức này.
Đối với các dịch vụ UDP phổ biến hơn, nmap theo mặc định sẽ cố gắng gửi các yêu cầu cụ thể của giao thức dựa trên cổng đích. Nmap sẽ cố gắng gửi yêu cầu đến các cổng UDP sau đây để nhận phản hồi: 7/echo, 53/DNS, 111/rpc, 123/NTP, 137/NetBIOS, 161/SNMP, 177/xdmcp, 500/isakmp, 520/route, 1645 và 1812/RADIUS, 2049/NFS, 5353/zeroconf và 10080/amanda
IV. OS fingerprinting
Nmap cũng có khả năng nhận diện hệ điều hành đang chạy trên mục tiêu bằng cách sử dụng đối số -O
. Nó thực hiện việc này bằng cách gửi các gói tin TCP, UDP, IP và/hoặc ICMP và so sánh các gói tin nhận được với cơ sở dữ liệu đã biết. Nmap sẽ thực hiện hơn hai chục lượt kiểm tra cụ thể để nhận diện hệ điều hành. Bảng sau liệt kê một số phương pháp nhận diện hệ điều hành của nmap, mỗi phương pháp có một mã CAPEC con liên quan đến việc nhận dạng hệ điều hành hoạt động (CAPEC-312).
Cần lưu ý rằng mặc dù các phương pháp nhận diện hệ điều hành hoạt động của nmap có độ chính xác cao hơn so với các loại nhận diện không hoạt động, nhưng việc nhận dạng này có thể không chính xác 100%. Khi không chắc chắn về kết quả, nmap sẽ in ra một xác suất về hệ điều hành mà nó cho rằng mục tiêu có thể sử dụng và có thể in ra nhiều nhà cung cấp hoặc phiên bản hệ điều hành khác nhau. Chạy lệnh quét ip 10.0.37.34 với quyền root:
nmap -O 10.0.37.34
Kết quả trả về như sau:
Kết quả cho thấy máy chủ chạy hệ điều hành Linux phiên bản 2.6.X, với chi tiết cụ thể là Linux kernel 2.6.32.
V. Tạm kết
Trong phần này, chúng ta đã tìm hiểu về quá trình quét mạng và xác định hệ điều hành thông qua việc sử dụng công cụ Nmap. Khám phá các phương pháp quét mạng như TCP connect scan, SYN scan, và UDP scan. Mỗi phương pháp có những ưu điểm và hạn chế riêng, và cần được áp dụng phù hợp với từng tình huống. Ngoài ra, chúng ta cũng đã tìm hiểu về cách xác định hệ điều hành thông qua OS fingerprinting.
Trong phần tiếp theo, chúng ta sẽ tiếp tục với phần Version scanning (tìm hiểu về cách xác định các phiên bản của các dịch vụ đang chạy trên mục tiêu) và Vulnerability scanning (tìm hiểu về cách phát hiện và đánh giá các lỗ hổng trong hệ thống).