Xác định phiên bản của dịch vụ (service version)
Dò quét version bằng nmap
Mỗi port tại một thời điểm chỉ chạy một dịch vụ cụ thể và mọi dịch vụ đều có phiên bản (version) riêng. Một số version của giao thức không an toàn và có thể bị khai thác. Bằng cách thu thập chính xác phiên bản của dịch vụ, attacker có thể xác định lỗ hổng mà dịch vụ đó đang tồn tại và tiến hành tấn công.
Kỹ thuật xác định phiên bản của dịch vụ này cũng tập trung vào viêc dò quét các port TCP và UDP. Trong Zenmap, ta sử dụng option -sV
để dò quét phiên bản của dịch vụ.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 2 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 1](https://sinhviencntt.net/wp-content/uploads/2023/01/image-25.png)
Kỹ thuật giảm thời gian dò quét trong nmap
Trong nmap, hiệu suất và độ chính xác được ưu tiên cao và điều này chỉ đạt được bằng cách giảm thời gian dò quét.
Bỏ qua những yếu tố không quan trọng
Trong khi quét Nmap, có thể giảm độ phức tạp về thời gian bằng các phương pháp sau:
- Tránh quét quá nhiều nếu chỉ yêu cầu một lượng thông tin tối thiểu.
- Số lượng port được quét có thể giới hạn được.
- Quét port (
-sN
) có thể được bỏ qua khi và chỉ khi người ta phải kiểm tra xem máy chủ có online hay không. - Có thể tránh các kiểu quét nâng cao (
-sC
,-sV
,-O
,--traceroute
và-A
). - Chỉ nên bật chế độ phân giải DNS khi cần thiết.
Tối ưu hóa thông số thời gian
Để kiểm soát hoạt động quét, nmap cung cấp tùy chọn -T
để quét từ high-level đến low-level.
Tách biệt và tối ưu hóa UDP scan
Vì nhiều dịch vụ có lỗ hổng sử dụng giao thức UDP nên việc quét giao thức UDP là rất quan trọng và chúng ta nên quét riêng giao thức này vì quá trình quét TCP có các yêu cầu về hiệu suất và đặc điểm thời gian khác nhau. Ngoài ra, quá trình quét UDP bị ảnh hưởng nhiều hơn bởi giới hạn tỷ lệ lỗi ICMP so với quá trình quét TCP.
Nâng cấp nmap
Chúng ta cần sử dụng phiên bản mới nhất của nmap vì nó chứa nhiều sửa lỗi, cải tiến thuật toán quan trọng và các tính năng có hiệu suất cao như local network ARP scanning.
Thực thi các phiên bản nmap đồng thời
Chạy nmap trên toàn bộ hệ thống mạng thường làm cho mạng chậm hơn và kém hiệu quả hơn. Công cụ nmap hỗ trợ song song hóa và nó cũng có thể được tùy chỉnh theo nhu cầu cụ thể. Tốc độ tổng thể của quá trình quét có thể được cải thiện bằng cách chia thành nhiều nhóm và chạy chúng đồng thời.
Quét từ vị trí mạng thuận lợi
Luôn luôn chạy nmap khi đang ở trong mạng nội bộ, vì nó cung cấp khả năng bảo mật chuyên sâu. Quét bên ngoài chỉ nên sử dụng khi kiểm tra tường lửa hoặc khi mạng cần được giám sát từ bên ngoài.
Tăng băng thông khả dụng và thời gian CPU
Bằng cách tăng băng thông khả dụng hoặc sức mạnh của CPU, thời gian quét nmap có thể giảm xuống. Ta có thể thực hiện bằng cách dừng mọi ứng dụng đang chạy. Nmap được điều khiển bởi các thuật toán kiểm soát tắc nghẽn của chính nó, do đó có thể ngăn chặn tình trạng tràn mạng. Điều này cải thiện độ chính xác một cách hiệu quả.
Xác định hệ điều hành (Banner Grabbing/OS Fingerprinting)
Tổng quan
Banner grabbing hoặc OS fingerprinting là một phương pháp được sử dụng để xác định hệ điều hành đang chạy trên hệ thống mục tiêu. Đây là một phương pháp quét quan trọng, vì attacker sẽ có xác suất thành công cao hơn nếu biết hệ điều hành của hệ thống đích (thông qua việc xác định lỗ hổng dành riêng cho hệ điều hành đó). Sau đó, attacker có thể xây dựng chiến lược tấn công dựa trên hệ điều hành của hệ thống đích.
Có hai phương pháp để lấy banner: tìm banner khi cố gắng kết nối với một service, chẳng hạn như FTP và tải xuống file/bin/ls để kiểm tra kiến trúc hệ thống. Một kỹ thuật tiên tiến hơn phụ thuộc vào truy vấn stack, truy vấn này sẽ chuyển các gói đến máy đích và đánh giá dựa vào phản hồi. Phương pháp tiếp theo, được gọi là phân tích số thứ tự ban đầu (initial sequence number – ISN), xác định sự khác biệt trong bộ tạo số ngẫu trong TCP stack.
Phương pháp active banner gabbing áp dụng nguyên tắc IP stack của hệ điều hành có một cách duy nhất để phản hồi các gói TCP đặc biệt. Mỗi nhà cung cấp có một cách triển khai khác nhau do đó phản hồi là khác nhau. Ta có thể dựa trên dấu hiệu này để xác định hệ điều hành. Chẳng hạn như nmap sử dụng một loạt 9 bài test để xác định điều đó.
- Một gói TCP có bật cờ SYN và ECN-Echo được gửi đến một port TCP đang mở.
- Một gói TCP không có cờ nào được bật sẽ được gửi đến một port TCP đang mở. Loại gói này là gói NULL.
- Một gói TCP có bật các cờ URG, PSH, SYN và FIN được gửi đến một port TCP đang mở.
- Gói TCP có bật cờ ACK được gửi đến port TCP đang mở.
- Gói TCP có bật cờ SYN được gửi đến port TCP đã đóng.
- Một gói TCP có bật cờ ACK được gửi đến một port TCP đã đóng.
- Một gói TCP có bật các cờ URG, PSH và FIN được gửi đến một port TCP đã đóng.
- PU (Port Unreachable): Một gói UDP được gửi đến một port UDP đã đóng. Mục tiêu là trích xuất thông báo “Không thể truy cập cổng ICMP” từ máy mục tiêu.
- TSeq (TCP Sequence ability test): Gửi 6 gói TCP có bật cờ SYN tới một port TCP đang mở.
Mục tiêu của các bài test này là tìm các mẫu trong chuỗi số ban đầu. Chúng có thể được phân loại thành các nhóm, chẳng hạn như 64K (UNIX cũ), random increments (các phiên bản mới hơn của Solaris, IRIX, FreeBSD, Digital UNIX, Cray, …) hoặc true random (Linux 2.0.*, OpenVMS, AIX, …). Còn Windows sử dụng mô hình time-dependent trong đó ISN được tăng thêm một lượng cố định cho mỗi lần xuất hiện.
Passive Banner Grabbing
Giống như active banner gabbing, kỹ thuật passive banner grabbing cũng phụ thuộc vào cách triển khai khác biệt của stack và các cách khác nhau mà hệ điều hành phản hồi với các gói tin.
Passive banner grabbing bao gồm:
- Lấy banner từ thông báo lỗi: thông báo lỗi cung cấp thông tin, chẳng hạn như loại server, loại hệ điều hành và thông tin SSL.
- Giám sát lưu lượng mạng: bắt và phân tích các gói tin.
- Lấy banner từ page extensions: tìm tiện ích mở rộng trong URL có thể giúp ta xác định phiên bản ứng dụng. Ví dụ: .aspx chứng tỏ là server chạy IIS và nền tảng Windows.
Bốn trường thường được sử dụng:
- TTL: hệ điều hành đặt thời gian tồn tại trên gói gửi đi là bao nhiêu?
- Window Size: Kích thước cửa sổ do hệ điều hành đặt là bao nhiêu?
- Bit DF (Don’t Fragment): Hệ điều hành có đặt bit DF không?
- TOS (Type of Service): Hệ điều hành có đặt TOS không và nếu có thì đó là cài đặt gì?
Đôi khi dựa trên 4 field này cũng không hoàn toàn chính xác. Người ta có thể cải thiện độ chính xác bằng cách nhận biết một số dấu hiệu (signature) và kết hợp nhiều thông tin. Dưới đây là một ví dụ cụ thể:
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 4 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 3](https://sinhviencntt.net/wp-content/uploads/2023/01/image-26.png)
Dựa vào thông tin trên, ta có thể xác định được giá trị của 4 trường:
TTL | 45 |
Window Size | 0x7D78 (hoặc 32120 trong hệ thập phân) |
DF | 1 |
TOS | 0x0 |
- TLL: Từ phân tích là 45 (ở dòng thứ 2). Gói ban đầu trải qua 19 bước nhảy để nhảy đến mục tiêu, do đó, nó đặt TTL ban đầu thành 64. Dựa trên TTL này, có vẻ như người dùng đã gửi gói tin từ Linux hoặc FreeBSD.
- Window Size: Kích thước cửa sổ được đặt là 0x7D78, đây là kích thước cửa sổ mặc định được Linux sử dụng. Ngoài ra, FreeBSD và Solaris có xu hướng duy trì kích thước cửa sổ giống nhau trong suốt session. Tuy nhiên, các loại router của hãng Cisco và kích thước cửa sổ của Microsoft Windows NT lại liên tục thay đổi.
- Bit DF: Hầu hết các hệ thống sử dụng bộ bit DF; do đó, đây là giá trị hạn chế và ít thu được thông tin. Tuy nhiên sẽ giúp dễ dàng xác định một số hệ thống không sử dụng cờ DF (như SCO hoặc OpenBSD).
- TOS: TOS cũng là một giá trị hạn chế, vì nó đa số dựa trên session hơn là dựa trên hệ điều hành.
Sử dụng thông tin thu được bên trên, cụ thể là TTL và kích thước cửa sổ, người ta có thể so sánh kết quả này với cơ sở dữ liệu signature thì có thể xác định được đây là máy Linux Kernel 2.2.x.
Cách xác định hệ điều hành của mục tiêu
Trong một mạng, các tiêu chuẩn khác nhau được triển khai để cho phép các hệ điều hành khác nhau giao tiếp với nhau. Các tiêu chuẩn này chi phối hoạt động của các giao thức. Bằng cách phân tích các tham số/trường nhất định trong các giao thức này, ta có thể biết được thông tin về hệ điều hành. Các tham số như TTL và Window Size trong IP header của gói tin đầu tiên trong TCP session sẽ giúp xác định OS đang chạy trên máy đích. Trường TTL xác định thời gian tối đa mà gói có thể tồn tại trong mạng và Window Size xác định độ dài của gói. Các giá trị này là khác nhau giữa các hệ điều hành khác nhau:
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 5 xác định phiên bản của dịch vụ](https://sinhviencntt.net/wp-content/uploads/2023/01/image-27.png)
Attacker có thể sử dụng nhiều tool khác nhau như Wireshark, Nmap, Unicornscan và Nmap Script Engine.
Sử dụng Wireshark
Ta thực hiện chụp lại response từ máy đích bằng Wireshark và quan sát các trường TTL và TCP trong gói TCP được capture đầu tiên. Ví dụ như hình bên dưới ta thấy TTL là 128, ứng với bảng trên thì ta có thể xác định được đây là máy Windows.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 7 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 6](https://sinhviencntt.net/wp-content/uploads/2023/01/image-32.png)
Một ví dụ khác, với TTL là 64 thì đây có thể là Linux.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 9 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 8](https://sinhviencntt.net/wp-content/uploads/2023/01/image-31.png)
Sử dụng nmap
Nmap là một trong những công cụ hiệu quả để xác định hệ điều hành mục tiêu. Trong Zenmap, ta sử dụng tùy chọn -O
.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 11 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 10](https://sinhviencntt.net/wp-content/uploads/2023/01/image-51.png)
Sử dụng Nmap Script Engine
Nmap Scripting Engine (NSE) trong công cụ Nmap có thể tự động hóa nhiều tác vụ bằng cách viết và chia sẻ các script. Các script này có thể được thực thi song song nhưng mức độ hiệu quả và tốc độ vẫn tương tự như Nmap. Trong tình huống này, smb-os-discovery là một script sẵn có được sử dụng để thu thập thông tin hệ điều hành thông qua giao thức SMB. NSE được kích hoạt bằng tùy chọn -sC
. Nếu các script là các script tùy chỉnh thì sử dụng --script
.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 13 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 12](https://sinhviencntt.net/wp-content/uploads/2023/01/image-52.png)
Sử dụng IPv6 Fingerprinting
IPv6 Fingerprinting là một kỹ thuật khác được sử dụng để xác định hệ điều hành mục tiêu. Chức năng tương tự như IPv4 nhưng khác ở chỗ IPv6 sử dụng một số kỹ thuật thăm dò nâng cao dành riêng cho nó. Nmap gửi gần 18 probe theo thứ tự sau:
- Sequence generation (S1-S6)
- ICMPv6 echo (IE1)
- ICMPv6 echo (IE2)
- Node Information Query (Nl)
- Neighbor Solicitation (NS)
- UDP(Ul)
- TCP explicit congestion notification (TECN)
- TCP (T2-T7)
Trong nmap, ta sử dụng option -6
. Ở đây mình không có máy chạy IPv6 nên không thể demo cho các bạn xem.
Sử dụng Metasploit
Metasploit Framework là một công cụ cung cấp thông tin về các lỗ hổng bảo mật và hỗ trợ kiểm tra thâm nhập và phát triển chữ ký IDS (IDS signature). Một lợi thế chính của framework này là cách tiếp cận module, nghĩa là cho phép kết hợp exploit và payload tự do. Trong phần này, ta sẽ sử dụng Metasploit để xác định các máy đang hoạt động, port mở, dịch vụ đang chạy và thông tin hệ điều hành của các hệ thống có trong mạng mục tiêu.
Trên máy Kali Linux, ta thực hiện bật postgresql bằng câu lệnh:
systemctl start postgresql
Sau đó, kiểm tra xem dịch vụ này đã chạy hay chưa bằng câu lệnh:
systemctl status postgresql
Kết quả trên Linux:
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 15 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 14](https://sinhviencntt.net/wp-content/uploads/2023/02/image-43.png)
Bây giờ ta sẽ khởi chạy Metasploit bằng cách gõ lệnh msfconsole
:
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 17 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 16](https://sinhviencntt.net/wp-content/uploads/2023/02/image-46.png)
Ta kiểm tra kết nối từ Metasploit vào database bằng cách gõ lệnh db_status
. Nếu kết quả là “postgresql selected, no connection” chứng tỏ là kết nối chưa thành công.
msf6 > db_status
[*] postgresql selected, no connection
Ta tiến hành khởi tạo kết nối bằng lệnh msfdb init
:
msf6 > msfdb init
[*] exec: msfdb init
[i] Database already started
[+] Creating database user 'msf'
[+] Creating databases 'msf'
[+] Creating databases 'msf_test'
[+] Creating configuration file '/usr/share/metasploit-framework/config/database.yml'
[+] Creating initial database schema
Ta khởi động lại postgresql bằng lệnh systemctl restart postgresql
, chạy lại Metaspoit bằng lệnh msfconsole
rồi kiểm tra lại kết nối bằng db_status
:
msf6 > db_status
[*] Connected to msf. Connection type: postgresql.
Gõ lệnh nmap -Pn -sS -A -oX Test <subnet>
để scan subnet. Trường hợp của mình phát hiện được 6 hosts up.
msf6 > nmap -Pn -sS -A -oX Test 192.168.36.0/24
[*] exec: nmap -Pn -sS -A -oX Test 192.168.36.0/24
Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-05 23:34 EST
Nmap scan report for 192.168.36.1
Host is up (0.00057s latency).
Not shown: 998 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
3389/tcp open ms-wbt-server Microsoft Terminal Services
...
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 256 IP addresses (6 hosts up) scanned in 44.57 seconds
Sau đó, gõ db_import Test
để import kết quả scan từ nmap vào database.
msf6 > db_import Test
[*] Importing 'Nmap XML' data
[*] Import: Parsing with 'Nokogiri v1.13.4'
[*] Importing host 192.168.36.1
[*] Importing host 192.168.36.2
[*] Importing host 192.168.36.133
[*] Importing host 192.168.36.140
[*] Importing host 192.168.36.254
[*] Importing host 192.168.36.132
[*] Successfully imported /home/kali/Test
msf6 >
Gõ hosts
hoặc db_hosts
để xem các dịch vụ đang chạy trên mục tiêu.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 19 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 18](https://sinhviencntt.net/wp-content/uploads/2023/02/image-47.png)
Gõ services
hoặc db_services
để xem các dịch vụ đang chạy trên mục tiêu.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 21 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 20](https://sinhviencntt.net/wp-content/uploads/2023/02/image-48.png)
Ngoài việc chạy Nmap, còn có nhiều công cụ quét port khác tích hợp sẵn trong Metasploit Framework để quét các hệ thống đích. Gõ search portscan
để tìm kiếm các công cụ khác:
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 23 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 22](https://sinhviencntt.net/wp-content/uploads/2023/02/image-49.png)
Ở đây, mình sẽ sử dụng module auxiliary/scanner/portscan/syn để thực hiện quét SYN trên các hệ thống đích. Để làm như vậy, hãy nhập use auxiliary/scanner/portscan/syn
và nhấn Enter.
Mình sẽ quét SYN đối với dải địa chỉ IP mục tiêu (192.168.36.100 – 192.168.36.150) để tìm port 80 đang mở thông qua cổng giao tiếp mạng eth0. Ta cần chỉ định một số thông số:
- set INTERFACE eth0
- set PORTS 80
- set RHOSTS 192.168.36.100-150
- set THREADS 50
Trong đó PORTS: chỉ định các port để quét (ví dụ: 22-25, 80, 110-900), RHOSTS: chỉ định dải địa chỉ đích hoặc mã định danh CIDR và THREADS: chỉ định số lượng thread đồng thời (mặc định là 1). Gõ như hình bên dưới và gõ run
rồi nhấn Enter.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 25 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 24](https://sinhviencntt.net/wp-content/uploads/2023/02/image-50.png)
Kết quả cho thấy IP 192.168.36.140 đang mở port 80.
Bây giờ ta sẽ thử scan TCP bằng module auxiliary/scanner/portscan/tcp. Gõ lệnh use auxiliary/scanner/portscan/tcp
. Tiếp đó gõ hosts -R
để lấy lại kết quả scan các host đang online ở trên. Sau đó gõ run
và nhấn Enter.
![[CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 27 [CEH v12] Module 3 - Phần 6: Xác định phiên bản của dịch vụ và hệ điều hành 26](https://sinhviencntt.net/wp-content/uploads/2023/02/image-51.png)
Kết quả cho thấy từ khoảng port 1-100 thì có port 22 và 80 đang mở.
Comments 2