[Network] Tìm hiểu cơ chế, cách hoạt động của IDS (phần 2)
Bài đăng này đã không được cập nhật trong 6 năm Show 1.Giới thiệu về snortSnort là phần mềm IDS được phát triển bởi Martin Roesh dưới dạng mã nguồn mở. Snort ban đầu được xây dựng trên nền Unix nhưng sau đó phát triển sang các nền tảng khác. Snort được đánh giá rất cao về khả năng phát hiện xâm nhập. Tuy snort miễn phí nhưng nó lại có rất nhiều tính năng tuyệt vời. Với kiến trúc kiểu module, người dùng có thể tự tăng cường tính năng cho hệ thống Snort của mình. Snort có thể chạy trên nhiều hệ thống như Windows, Linux, OpenBSD, FreeBSD, Solaris Bên cạnh việc có thể hoạt động như một ứng dụng bắt gói tin thông thường, Snort còn được cấu hình để chạy như một NIDS. 2.Kiến trúc của SnortSnort bao gồm nhiều thành phần, mỗi phần có một chức năng riêng biệt
Kiến trúc của Snort được thể hiện qua mô hình sau: Khi Snort hoạt động, nó sẽ lắng nghe tất cả các gói tin nào di chuyển qua nó. Các gói tin sau khi bị bắt sẽ được đưa vào module giải mã. Tiếp theo sẽ vào module tiền xử lý và rồi module phát hiện. Tại đây tùy vào việc có phát hiện được xâm nhập hay không mà gói tin có thể bỏ qua để lưu thông tin tiếp hoặc đưa vào module Log và cảnh báo để xử lý. Khi các cảnh báo được xác định, Module kết xuất thông tin sẽ thực hiện việc đưa ra cảnh báo theo đúng định dạng mong muốn. 2.1 Module giải mã gói tinSnort chỉ sử dụng thư viện pcap để bắt mọi gói tin trên mạng lưu thông qua hệ thống. Một gói tin sau khi được giải mã sẽ đưa tiếp vào module tiền xử lý. 2.2 Module tiền xử lýModule này rất quan trọng đối với bất kỳ hệ thống nào để có thể chuẩn bị gói dữ liệu đưa vào cho Module phát hiện phân tích. 3 nhiệm vụ chính:
2.3 Module phát hiệnĐây là module quan trọng nhất của Snort. Nó chịu trách nhiệm phát hiện các dấu hiệu xâm nhập. Module phát hiện sử dụng các luật được định nghĩa trước để so sánh với dữ liệu thu thập được, từ đó xác định xem có xâm nhập xảy ra hay không. Một vấn đề quan trọng đối với module phát hiện và vấn đề thời gian xử lý gói tin: một IDS thường nhận rất nhiều gói tin và bản thân nó cũng có rất nhiều luật xử lý. Khi lưu lượng mạng quá lớn có thể xảy ra việc bỏ sót hoặc không phản hồi đúng lúc. Khả năng xử lý của module phát hiện phụ thuộc vào nhiều yếu tố: số lượng các luật, tốc độ hệ thống, băng thông mạng. Một module phát hiện có khả năng tách các phần của gói tin ra và áp dụng luật lên từng phần của gói tin:
Do các luật trong Snort được đánh số thứ tự ưu tiên nên 1 gói tin khi bị phát hiện bởi nhiều luật khác nhau, cảnh báo được đưa ra theo luật có mức ưu tiên cao nhất. 2.4 Module log và cảnh báoTùy thuộc vào module phát hiện có nhận dạng được xâm nhập hay không mà gói tin có thể bị ghi log hay đưa ra cảnh báo. Các file log là các file dữ liệu có thể ghi dưới nhiều định dạng khác nhau như tcpdump 2.5 Module kết xuất thông tinModule này thực hiện các thao tác khác nhau tùy thuộc vào việc cấu hình lưu kết quả xuất ra như thế nào.
3.Bộ luật của Snort3.1 Cấu trúc luật của SnortTìm hiểu một ví dụ: alert tcp 192.168.0.0/22 23 -> any any (content:confidential; msg: Detected confidential) Ta thấy cấu trúc có dạng sau: |Rule Header| Rule Option| | Phần Header: chứa thông tin về hành động mà luật đó sẽ thực hiện khi phát hiện ra có xâm nhập nằm trong gói tin và nó cũng chứa tiểu chuẩn để áp dụng luật với gói tin đó. Phần Option: chứa thông điệp cảnh báo và các thông tin về các phần của gói tin dùng để tạo nên cảnh báo. Phần Option chứa các tiêu chuẩn phụ thêm để đối sánh với gói tin. 3.2 Cấu trúc của phần HeaderAction| Protocol| Address| Port| Direction| Address| Port| | Alert| TCP| 192.168.0.0/22| 23| ->| Any| Any
3.2.1 ActionCó 5 luật được định nghĩa:
3.2.2 ProtocolChỉ ra loại gói tin mà luật được áp dụng:
Nếu là IP thì Snort sẽ kiểm tra header của lớp liên kết để xác định loại gói tin. Nếu bất kỳ giao thức nào khác, Snort sẽ sử dụng header IP để xác định loại giao thức 3.2.3 AddressCó 2 phần là địa chỉ đích và địa chỉ nguồn. Nó có thể là 1 IP đơn hoặc 1 dải mạng. Nếu là any thì áp dụng cho tất cả địa chỉ trong mạng. Chú ý: nếu là một host thì có dạng: IP-address/32. VD: 192.168.0.1/32 Snort cung cấp phương pháp để loại trừ địa chỉ IP bằng cách sử dụng dấu !. VD: alert icmp ![192.168.0.0/22] any -> any any (msg: Ping with TTL=100; ttl: 100;) Lưu ý: dấu [] chỉ cần dùng khi đằng trước có ! 3.2.4 PortSố port để áp dụng cho các luật. VD: telnet là 23, DNS là 53 Port chỉ áp dụng cho 2 giao thức là TCP và UDP Để sử dụng 1 dãy các port thì ta phân biệt bởi dấu :. VD: alert udp any 1024:8080 -> any any (msg: UDP port 3.2.5 DirectionChỉ ra đâu là nguồn, đâu là đích. Có thể là -> hay <- hoặc <>. Trường hợp <> là khi ta muốn kiểm tra Client và Server. 3.3 Phần OptionPhần Option nằm ngay sau phần Header và được bao bọc trong dấu ngoặc đơn. Nếu có nhiều option thì sẽ phân biệt nhau bởi dấu ;. Một option gồm 2 phần: một từ khóa và một tham số, 2 phần này sẽ phân cách nhau bằng dấu hai chấm. 3.3.1 Từ khóa ackTrong header TCP có chứa trường Acknowledgement Number với độ dài 32 bit. Trường này chỉ ra số thứ tự tiếp theo gói tin TCP của bên gửi đang được chờ để nhận. Trường này chỉ có ý nghĩa khi mà cờ ACK được thiết lập. Các công cụ như Nmap sử dụng đặc điểm này để ping một máy. Ví dụ nó có thể gửi gói tin TCP tới cổng 80 với cờ ACK được bật và số thứ tự là 0. Bởi vậy bên nhận thấy gói tin không hợp lệ sẽ gửi lại gói tin RST. Và khi nhận được gói RST này, Nmap sẽ biết được IP này đang tồn tại hay không. Để kiểm tra loại ping TCP này thì ta có thể dùng luật sau: Alert tcp any any -> 192.168.0.0/22 any (flags: A; ack: 0; msg: TCP ping detected) 3.3.2 Từ khóa classtypeCác luật có thể được phân loại và gán cho 1 số chỉ độ ưu tiên nào đó để nhóm và phân biệt chúng với nhau. Để hiểu rõ hơn về classtype thì ta cần hiểu được file classification.config. Mỗi dòng trong file này đều có cấu trúc như sau: Config classification: name, description, priority Trong đó:
VD: Config classification: DoS, Denied of Service Attack, 2 Và luật Alert udp any any -> 192.168.0.0/22 6838 (msg:DoS; content: server; classtype: DoS; priority: 1;) đã ghi đè lên giá trị priority mặc định của lớp đã định nghĩa 3.3.3 Từ khóa contentMột đặc tính quan trọng của Snort là có khả năng tìm 1 mẫu dữ liệu bên trong một gói tin. VD: alert tcp 192.168.0.0/22 any -> ![192.168.0.0/22] any (content: GET; msg :GET match Luật trên tìm mãu GET trong phần dữ liệu của tất cả gói tin TCP có nguồn mạng là 192.168.0.0/22 đi đến các địa chỉ đích không nằm trong dải mạng đó. Tuy nhiên khi sử dụng từ khóa content cần nhớ rằng: Đối chiếu nội dung cần phải xử lý rất lớn nên ta phải cân nhắc kỹ khi sử dụng nhiều luật đối chiếu nội dung. Các từ khóa được sử dụng cùng với content để bổ sung thêm các điều kiện là:
3.3.4 Từ khóa dsizeDùng để đối sánh theo chiều dài của phần dữ liệu. Rất nhiều cuộc tấn công sử dụng lỗi tràn bộ đệm bằng cách gửi các gói tin có kích thước rất lớn. VD: alert ip any any -> 192.168.0.0/22 any (dsize > 5000; msg: Goi tin co kich thuoc lon 3.3.5 Từ khóa FlagsTừ khóa này dùng để phát hiện xem những bit cờ flag nào được bật trong phần TCP header của gói tin. Mỗi cờ có thể được sử dụng như 1 tham số trong từ khóa flags. Flag| Kí hiệu tham số dùng trong luật của Snort| | FIN Finish Flag| F SYN Sync Flag |S RST Reset Flag| R PSH Push Flag |P ACK Acknowledge Flag| A URG Urgent Flag| U Reversed Bit 1| 1 Reversed Bit 2| 2 No Flag set| 0 VD: luật sau đây sẽ phát hiện một hành động quét dùng gói tin SYN-FIN: Alert tcp any any -> 192.168.0.0/22 any (flags: SF; msg: SYNC-FIN flag detected 3.3.6 Từ khóa fragbitsPhần IP header của gói tin chứa 3 bit dùng để chống phân mảnh và tổng hợp các gói tin IP. Các bit đó là:
VD: luật sau sẽ phát hiện xem bit DF trong gói tin ICMP có được bật hay không: alert icmp any any -> 192.168.0.0/22 any (fragbits: D; msg: Dont Fragment bit set Đây là link demo snort cảnh báo các gói tin ICMP trong mạng: http://192.168.2.23/base/base_main.php |