Hướng dẫn sử dụng Snort
Snort là một ứng dụng IDS mã nguồn mở, hoạt động trên nhiều hệ điều hành trong đó có Linux và Windows. Bài này thực hiện cài đặt và vận hành Snort như một IDS chế độ network-based và host-based. Các bước thực hiện như sau:
Bước 1: Cài đặt SnortCài đặt các thư viện phần mềm cần thiết: [root@C2 ~]# yum install -y wget gcc flex bison zlib zlib-devel libpcap libpcap-devel libdnet libdnet-devel pcre pcre-devel tcpdump git libtool curl man Thực hiện các bước download mã nguồn, dịch mã nguồn và cài đặt tiếp theo như hướng dẫn trên trang chủ Snort: [root@C2 ~]# mkdir snort_src Sau khi cài đặt thành công, Snort có thể hoạt động ở 3 chế độ:
Kiểm tra Snort hoạt động ở chế độ package sniffer với tham số -dev. Trong khi chạy Snort ở chế độ này, thực hiện ping đến Google, ta sẽ thấy Snort bắt được các gói tin ICMP Echo và Reply rồi hiển thị thông tin các gói tin này lên màn hình. [root@C2 snort-2.9.8.3]# snort -dev Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! pcap DAQ configured to passive. Acquiring network traffic from "eth1". Decoding Ethernet --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.9.8.3 GRE (Build 383) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.4.0 Using PCRE version: 7.8 2008-09-05 Using ZLIB version: 1.2.3 Commencing packet processing (pid=20207) WARNING: No preprocessors configured for policy 0. 10/19-02:35:02.723245 08:00:27:F7:C2:01 -> 52:54:00:12:35:02 type:0x800 len:0x62 10.0.2.15 -> 203.113.129.120 ICMP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:84 DF Type:8 Code:0 ID:60238 Seq:14 ECHO 66 79 06 58 00 00 00 00 0E 09 0B 00 00 00 00 00 fy.X............ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 30 31 32 33 34 35 36 37 01234567 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ WARNING: No preprocessors configured for policy 0. 10/19-02:35:02.758950 52:54:00:12:35:02 -> 08:00:27:F7:C2:01 type:0x800 len:0x62 203.113.129.120 -> 10.0.2.15 ICMP TTL:56 TOS:0xA ID:59395 IpLen:20 DgmLen:84 Type:0 Code:0 ID:60238 Seq:14 ECHO REPLY 66 79 06 58 00 00 00 00 0E 09 0B 00 00 00 00 00 fy.X............ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./ 30 31 32 33 34 35 36 37 01234567 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ Tạo thư mục log /var/log/snort và chạy Snort vận hành ở chế độ package log: [root@C2 snort-2.9.8.3]# mkdir /var/log/snort [root@C2 snort-2.9.8.3]# snort -dev -l /var/log/snort Running in packet logging mode --== Initializing Snort ==-- Initializing Output Plugins! Log directory = /var/log/snort pcap DAQ configured to passive. Acquiring network traffic from "eth1". Decoding Ethernet --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.9.8.3 GRE (Build 383) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.4.0 Using PCRE version: 7.8 2008-09-05 Using ZLIB version: 1.2.3 Commencing packet processing (pid=20212) ^C*** Caught Int-Signal WARNING: No preprocessors configured for policy 0. =============================================================================== Run time for packet processing was 18.484920 seconds Snort processed 15 packets. Snort ran for 0 days 0 hours 0 minutes 18 seconds Pkts/sec: 0 =============================================================================== Memory usage summary: Total non-mmapped bytes (arena): 811008 Bytes in mapped regions (hblkhd): 21590016 Total allocated space (uordblks): 670688 Total free space (fordblks): 140320 Topmost releasable block (keepcost): 135008 =============================================================================== Packet I/O Totals: Received: 15 Analyzed: 15 (100.000%) Dropped: 0 ( 0.000%) Filtered: 0 ( 0.000%) Outstanding: 0 ( 0.000%) Injected: 0 =============================================================================== Breakdown by protocol (includes rebuilt packets): Eth: 15 (100.000%) VLAN: 0 ( 0.000%) IP4: 13 ( 86.667%) Frag: 0 ( 0.000%) ICMP: 7 ( 46.667%) UDP: 6 ( 40.000%) TCP: 0 ( 0.000%) IP6: 0 ( 0.000%) IP6 Ext: 0 ( 0.000%) IP6 Opts: 0 ( 0.000%) Frag6: 0 ( 0.000%) ICMP6: 0 ( 0.000%) UDP6: 0 ( 0.000%) TCP6: 0 ( 0.000%) Teredo: 0 ( 0.000%) ICMP-IP: 0 ( 0.000%) IP4/IP4: 0 ( 0.000%) IP4/IP6: 0 ( 0.000%) IP6/IP4: 0 ( 0.000%) IP6/IP6: 0 ( 0.000%) GRE: 0 ( 0.000%) GRE Eth: 0 ( 0.000%) GRE VLAN: 0 ( 0.000%) GRE IP4: 0 ( 0.000%) GRE IP6: 0 ( 0.000%) GRE IP6 Ext: 0 ( 0.000%) GRE PPTP: 0 ( 0.000%) GRE ARP: 0 ( 0.000%) GRE IPX: 0 ( 0.000%) GRE Loop: 0 ( 0.000%) MPLS: 0 ( 0.000%) ARP: 2 ( 13.333%) IPX: 0 ( 0.000%) Eth Loop: 0 ( 0.000%) Eth Disc: 0 ( 0.000%) IP4 Disc: 0 ( 0.000%) IP6 Disc: 0 ( 0.000%) TCP Disc: 0 ( 0.000%) UDP Disc: 0 ( 0.000%) ICMP Disc: 0 ( 0.000%) All Discard: 0 ( 0.000%) Other: 0 ( 0.000%) Bad Chk Sum: 4 ( 26.667%) Bad TTL: 0 ( 0.000%) S5 G 1: 0 ( 0.000%) S5 G 2: 0 ( 0.000%) Total: 15 =============================================================================== Snort exiting Trong khi chạy Snort chế độ package log, cũng thực hiện ping đến Google. Kết quả là trong thư mục /var/log/snort xuất hiện file log của Snort ghi lại các gói tin đã bắt được: [root@C2 snort-2.9.8.3]# ls /var/log/snort/ Lưu ý rằng file log được ghi lại ở dạng nhị phân, theo cấu trúc các gói tin. Có thể dụng lệnh file để kiểm tra cấu trúc của file nhị phân này: [root@C2 snort-2.9.8.3]# file /var/log/snort/snort.log.1476819559 Để đọc file này, cần sử dụng phần mềm tcpdump. Có thể thấy kết quả hiển thị các gói tin ban đầu là dịch vụ ARP để xác định địa chỉ MAC từ địa chỉ IP khi trạm làm việc cần gửi gói tin ra Gateway. Tiếp theo là các gói tin dịch vụ DNS để xác định địa chỉ IP của Google. Cuối cùng là các gói tin ICMP Echo và Reply của lệnh ping: [root@C2 snort-2.9.8.3]# tcpdump -r /var/log/snort/snort.log.1476819559 Bước 2: Vận hành Snort chế độ IDSTrong chế độ này, Snort thực hiện kiểm soát các gói tin và thực hiện các phản ứng theo các luật được khai báo trước. Các file cấu hình của Snort được đặt trong thư mục /etc/snort. Cần copy tất cả các file cấu hình mặc định trong thư mục cài đặt (snort-2.9.8.3/etc) vào thư mục này: [root@C2 ~]# cd ~/snort_src/snort-2.9.8.3 File cấu hình để vận hành Snort chế độ IDS là /etc/snort/snort.conf. Cần sửa đổi một số thông số như sau:
Sau khi thiết lập các thông số, file cấu hình snort.conf có dạng sau: [root@C2 ~]# cat /etc/snort/snort.conf # Set up the external network addresses. Leave as "any" in most situations # site specific rules
Khi khởi động Snort, mặc định nó cần đọc các file white_list.rules và black_list.rules để xử lý các trạm thuộc danh sách white và black. Tạm thời ta chưa xử lý gì đặc biệt đối với các trạm white và black nên tạo 2 file rỗng tương ứng. Tương tự, file myrules.rules cũng chưa được định nghĩa luật nào: [root@C2 rules]# touch /etc/snort/rules/black_list.rules Sau khi chuẩn bị các file cấu hình làm việc, chạy Snort chế độ IDS với yêu cầu bắt gói tin trên kết nối mạng eth2. Nếu thành công, Snort bắt đầu thực hiện bắt gói tin bằng dòng thông báo “Commencing packet processing (pid=23464)”: [root@C2 ~]# snort -i eth2 -l /var/log/snort -c /etc/snort/snort.conf --== Initializing Snort ==-- --== Initialization Complete ==-- ,,_ -*> Snort! <*- Rules Engine: SF_SNORT_DETECTION_ENGINE Version 2.6 Bước 3: Luật đơn giản cảnh báo truy nhập từ bên ngoàiSnort đã vận hành ở chế độ IDS thành công. Bước tiếp theo là khai báo các luật xử lý cho Snort. Ta bắt đầu với luật đơn giản nhất - phát hiện các truy cập từ bên ngoài với ssh hoặc ping. [root@C2 rules]# cat /etc/snort/rules/myrules.rules Cú pháp của luật này như sau:
Trong khi Snort đang vận hành ở chế độ IDS, từ một trạm nào đó thực hiện kết nối ssh vào máy chủ 192.168.2.10, một thông điệp cảnh báo sẽ được gửi đến file log: [root@C2 rules]# tail -f /var/log/snort/alert [**] [1:10000:0] incoming SSH connection! [**] b) Phát hiện kết nối ping [root@C2 rules]# cat /etc/snort/rules/myrules.rules Khởi động lại Snort và dùng một trạm khác ping đến địa chỉ 192.168.2.10. Kết quả cảnh báo như sau: [root@C2 rules]# tail -f /var/log/snort/alert [**] [1:10001:0] soomeone ping me! [**] [**] [1:10001:0] soomeone ping me! [**] Bước 4: Cảnh báo truy nhập từ bên trong đến một nội dung nhạy cảmCần kiểm soát các trạm thuộc HOME_NET và phát hiện trạm nào truy nhập đến một nội dung nhạy cảm không được phép. Lấy ví dụ giả định nội dung nhạy cảm là “terrorism” (khủng bố). Có thể thiết lập luật kiểm tra các truy nhập từ bên trong đến nội dung này và cảnh báo như sau: alert tcp $HOME_NET any -> $EXTERNAL_NET 80 (msg:"terrorism contact!"; content:"terrorism"; nocase; sid:10003;) Khởi động lại Snort chế độ IDS và kiểm tra file cảnh báo /var/log/snort/alert. Tiếp theo, dung web browser tìm kiếm một trang web nào đó có tên chứa từ khóa terrorism, giả sử là http://www.merriam-webster.com/dictionary/terrorism. Click vào link để truy nhập đến trang web này. Cảnh báo sẽ được phát ra: [root@C2 ~]# tail -f /var/log/snort/alert Trường hợp luật cảnh báo không phát hiện được khi truy nhập đến trang web, một trong những lý do là Snort không bắt được gói tin gửi đi trong khi tực tế trang web vẫn được truy nhập và hiển thị trong browser. Nguyên nhân phổ biến là vấn đề offload checksum. Trước khi gửi gói tin, bên truyền cần tính toán checksum và đưa vào trường checksum của gói tin. Nếu card mạng có chức năng tính toán checksum, phần mềm ứng dụng sẽ không tính checksum nữa mà chuyển gói tin có trường checksum bằng 0 xuống cho card mạng xử lý. Thư viện libpcap (thư viện phần mềm bắt gói tin trên Linux) hoạt động ở giữa phần ứng dụng và card mạng do vậy khi tiếp nhận gói tin sẽ thấy checksum không hợp lệ và không xử lý gói tin này. Dẫn đến luật alert không được thực thi. Có thể chạy Snort với thám số -k none để thông báo Snort không kiểm tra trường checksum: [root@C2 ~]# snort -d -c /etc/snort/snort.conf -i eth1 -k none Bước 5: Cảnh báo quét cổng (port scan) với preprocessor sfportscanQuét cổng thường là bước chuẩn bị cho các cuộc tấn công mạng. Nó thực hiện do thám hệ thống của nạn nhân để xác định các dịch vụ nào đang hoạt động và các thông tin liên quan đến các dịch vụ này. Có nhiều công cụ để thực hiện quét cổng trong đó nmaplà công cụ phổ biến nhất, hỗ trợ nhiều hệ điều hành và có cả phiên bản hỗ trợ giao diện đồ họa. Sử dụng yum để cài đặt nmap và thực hiện quét cổng đến máy nạn nhân (địa chỉ 192.168.2.10): [root@C1 ~]# yum install nmap [root@C1 ~]# nmap -v -A 192.168.2.10 Starting Nmap 5.51 ( http://nmap.org ) at 2016-10-21 04:57 EDT Uptime guess: 0.171 days (since Fri Oct 21 00:51:40 2016) TRACEROUTE Read data files from: /usr/share/nmap Trên Windows, phiên bản đồ họa của nmap có tên zenmap cho phép quét cổng của máy nạn nhân và hiển thị tất cả các thông số liên quan đến các dịch vụ đang chạy trên máy nạn nhân. Nguyên lý hoạt động của các công cụ quét cổng là lần lượt gửi gói tin đặc biệt (chẳng hạn TCP SYN) đến tất cả các cổng của máy nạn nhân và đợi gói tin trả về. Một dịch vụ đang hoạt động tại cổng tương ứng không phân biệt được đây là một kết nối từ trạm sử dụng thông thường hay là một hành động trong cuộc tấn công quét cổng, do vậy sẽ trả lời bằng một gói tin phù hợp (ví dụ, với TCP SYN sẽ là SYN ACK). Dựa vào kết quả trả về này, công cụ quét cổng xác định được dịch vụ đang “nghe” trên máy nạn nhân và tiếp tục gửi các gói tin phù hợp khác để do thám thêm thông tin về dịch vụ tương ứng. Hình vẽ 5‑9 : Sơ đồ các preprocessor trong kiến trúc Snort Với tấn công quét cổng, preprocessor sfportscan đã được phát triển để xử lý. Nó thu thập nhiều gói tin và phân tích sự liên quan giữa các gói tin này để quyết định chúng có phải là chuối các gói tin quét cổng hay không. Để kích hoạt preprocessor này, cần thiết lập tham số cấu hình sfportscan và include tập luật preprocessor.rules trong /etc/snort/snort.conf: [root@C2 tmp]# cat /etc/snort/snort.conf | grep sfportscan [root@C2 tmp]# cat /etc/snort/snort.conf | grep preprocessor.rules Khởi động lại Snort và thực hiện quét cổng từ một máy khác bằng nmap như mô tả bên trên. Cuộc tấn công quét cổng sẽ được Snort phát hiển và cảnh báo: |