3.Tập luật (rulesets) trong Snort:

Một phần của tài liệu Hệ thống phát hiện xâm nhập IDS SNORT (Trang 57 - 79)

C .hức năng của IDS

3.Tập luật (rulesets) trong Snort:

Giống như virus, hầu hết hành động xâm nhập có vài loại signature. Thông tin về những signature này dùng để tạo Snort rules. bạn đã phân tích một số kỹ thuật tấn công DoS/DDoS để tìm ra những cơ chế hoạt động và thông tin về những công cụ và công nghệ của họ. Hơn nữa, có những lổi cơ sở dữ liệu khiến cho những intruder muốn khai thác. Có nhiều cuộc tấn công được biết đến cũng sử dụng signature để tìm một ai đó cố gắng khai thác chúng. Những signature này có thể hiển thị trong phần header (tiêu đề) của gói dữ liệu hoặc trong payload. Hệ thống phát hiện Snort dựa trên rules. Những rule này lấy cơ sở từ dấu hiệu kẻ xâm nhập (signature). Snort rules có thể được sử dụng để kiểm tra những phần khác nhau của gói dữ liệu. Snort 1.x có thể phân tích ở những header ở lớp 3 và 4 nhưng không thể phân tích ở giao thức lớp ứng dụng. Snort phiên bản 2.x có hỗ trợ phần header lớp ứng dụng. Những rule được áp dụng trong một kiểu nào đó đến tất cả các gói phụ thuộc vào loại đó.

Một rule có thể sử dụng để phát ra một thông điệp cảnh báo, ghi một thông điệp, hay, trong những thuật ngữ của Snort, pass gói dữ liệu (không làm gì cả). Snort rules được

viết theo cú pháp dễ hiểu nhất. Hầu hết những rules được viết trên một dòng đơn. Tuy nhiên bạn cũng có thể mở rộng trên nhiều dòng bằng cách dùng một ký tự “\” vào cuối dòng. Rules thường đặt trong một file cấu hình, chẳng hạn như là snort.conf. Bạn cũng có thể sử dụng nhiều file bằng cách gôm chúng trong một file cấu hình chính. Trong chương này cung cấp thông tin về những loại rule khác nhau cũng như cấu trúc cơ bản của rule. Bạn sẽ tìm thấy nhiều ví dụ của những rule chung cho hành vi phát hiện xâm nhập trong chương sau.

1.Cấu trúc của một rule:

Tất cả các rule đều có 2 phần logic: rule header và rule options.

Rule Header Rule Options

Cấu trúc Rule

Rule header chứa thông tin về hoạt động mà rule để lấy. Nó cũng chứa tiêu chuẩn cho việc so sánh một luật dựa vào gói dữ liệu. Rule option thường chứa một thông điệp

cảnh báo và thông tin về thông điệp sẽ được sử dụng để phát sinh cảnh báo. Rule

option cũng chứa tiêu chuẩn cho việc so sánh một luật dựa vào gói dữ liệu. Một rule

có thể phát hiện một loại hay nhiều loại hành vi xâm nhập. Rule “thông minh” là rule có thể áp dụng lên nhiều dấu hiệu xâm nhập.

Cấu trúc chung của rule header như sau:

Rule Header

Action dùng để xác định loại hành động mà nó lấy về khi tiêu chuẩn gặp được và một rule được so sánh chính xác một gói dữ liệu. Những hoạt động điển hình là sinh ra một cảnh báo hoặc ghi thông điệp hoặc diện chứng cho rule khác.

Protocol dùng để áp dụng rule lên gói chỉ với một giao thức riêng. Đây là tiêu chuẩn đầu tiên giám sát trong rule. Bạn cũng có thể sử dụng những thành phần khác để ngăn chặn những địa chỉ từ một mạng đầy đủ. Chú ý rằng có 2 trường địa chỉ trong rule. Địa chỉ nguồn và đích được xác định dựa trên trên trường direction. Cho một ví dụ, nếu trường direction là “”, địa chỉ phía bên trái là nguồn, địa chỉ bên phải là đích.

Trong giao thức TCP/UDP, port xác định cổng nguồn và đích của gói khi rule áp dụng lên đó. Trong trường hợp những giao thức lớp network như IP và ICMP, port numbers không có ý nghĩa.

Cho ví dụ, rule sau đây sẽ sinh ra cảnh báo khi nó phát hiện gói ping ICMP (ICMP ECHO REQUEST) với TTL bằng 100:

alert icmp any any -> any any (msg: "Ping with TTL=100"; \ ttl: 100;)

Phần nằm trước dấu ngoặc đơn gọi là rule header. Phần trong dấu ngoặc đơn là rule option. Header chứa những phần sau:

 Một rule action (hành động của luật). Trong rule trên, action là “alert”, có nghĩa là một cảnh báo sẽ sinh ra khi điều kiện bắt gặp. Nhớ rằng những gói được ghi bằng mặc định khi cảnh báo phát ra. Phụ thuộc vào trường action, rule option có thể chứa tiêu chuẩn cho rule.

 Protocol (giao thức). Ở đây là ICMP, nghĩa là rule chỉ áp dụng lên tất cả gói ICMP. Trong Snort detection engine, nếu giao thức của gói không phải

ICMP, rule sẽ không làm gì trên gói đó để tiết kiệm thời gian xử lý của CPU. Thành phần protocol là rất quan trọng khi bạn muốn áp dụng Snort rule chỉ trên những gói của một loại riêng biệt.

 Địa chỉ nguồn và cổng nguồn. Trong ví dụ này cả hai đều là “any”, có nghĩa là rule sẽ áp dụng lên tất cả các gói đến từ nhiều nguồn. Dĩ nhiên port number sẽ không áp dụng lên gói ICMP. Port number chỉ thích hợp trong trường hợp protocol là TCP hay UDP.

 Direction. Trong trường hợp này, nó là ký hiệu  từ trái sang phải. Nói lên địa chỉ và port number bên trái dấu  là nguồn còn bên phải là đích. Điều đó cũng có nghĩa rằng rule sẽ áp dụng lên gói đi từ nguồn đến đích. Bạn cũng có thể dùng dấu  để định nghĩa địa chỉ nguồn/đích cho gói. Ký tự <> cũng có thể sử dụng để áp dụng rule lên gói đi từ 2 bên.

 Địa chỉ đích là cổng đích. Trong ví dụ này cả hai đều là “any”, có nghĩa là rule sẽ áp dụng lên tất cả các gói không quan tâm đến địa chỉ đích. Direction

trong rule không đóng vai trò gí cả bởi vì rule được áp dụng lên tất cả các gói ICMP di chuyển cả hai bên, do đã sử dụng từ khóa “any” trong cả hai thành phần địa chỉ nguồn và đích.

Rule Option:

Rule option theo sau rule header và được đặt trong cặp dấu ngoặc đơn. Có thể một lựa chọn hay nhiều lựa chọn truyền vào cùng dấu. Nếu bạn sử dụng nhiều lựa chọn, dạng lựa chọn này là AND. Hành động trong rule header chỉ được gọi khi tất cả những tiêu chuẩn trong lựa chọn là đúng. Bạn đã sử dụng option như

khóa. Những Rule option chứa các đối số. Thường thì những lựa chọn có 2 phần: một từ khóa và một đối số. Những đối số truyền vào từ lựa chọn từ khóa bằng một dấu “:”. Chẳng hạn như:

msg: "Detected confidential";

Lựa chọn msg là từ khóa và Detected confidential là đối số cho từ khóa này. Sau đây là những từ khóa thông dụng . Nó hoạt động trên những giao thức riêng, cho nên có ý nghĩa khác nhau đi theo giao thức. (adsbygoogle = window.adsbygoogle || []).push({});

Về nội dung (lớp application):

Từ khóa content:

Một chức năng quan trọng của Snort, nó có khả năng tìm mẫu dữ liệu bên trong gói. Mẫu này có thể hiển thị ở dạng chuỗi ASCII hay nhị phân trong hình thức mã hexa. Rule sau đây phát hiện một mẫu “GET” trong phần dữ liệu của gói TCP xuất phát từ địa chỉ 192.168.1.0. từ khóa GET thường được sử dụng cho nhiều loại tấn công HTTP; tuy nhiên ở đây rule chỉ giúp cho bạn hiểu như thế nào từ khóa này làm việc mà thôi:

alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any \ (content: "GET"; msg: "GET matched";)

Rule dưới đây cũng tương tự nhưng nó liệt kê ở dang hexa:

alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any \ (content: "|47 45 54|"; msg: "GET matched";)

Số 47 tương đương mã ASCII là G, 45 = E, 54 = T. Bạn cũng có thể kết hợp dạng ASCII và nhị phân trong hexa vào một rule. Ký tự hexa nằm trong cặp dấu “||”.

Có 3 từ khóa khác nhau dùng chung với content. Những từ khóa này là tiêu chuẩn

trong khi tìm một mẫu bên trong gói. Đó là: Offst

Depth Nocase Từ khóa offset:

Từ khóa offset sử dụng để bắt đầu tìm trong khoảng nào đó từ điểm bắt đầu của phần dữ liệu của gói. Dùng một con số làm đối số cho từ khóa này. Ví dụ sau sẽ bắt đầu tìm từ “HTTP” sau 4 byte kể từ byte đầu tiên trong gói.

alert tcp 192.168.1.0/24 any -> any any \

Từ khóa depth định nghĩa điểm để Snort ngừng tìm kiếm mẫu. Từ khóa depth:

Chỉ định một giới hạn dưới cho việc lấy mẫu. Dùng depth cho phép bạn chỉ định một khoảng bắt đầu từ byte đầu tiên của gói. Dữ liệu sau khoảng này không lấy mẫu nữa. Nếu bạn kết hợp offset depth cùng với content, bạn có thể chỉ ra vùng dữ liệu mà

bạn muốn lấy mẫu. Ví dụ bạn muốn tìm từ “HTTP”, lấy mẫu 4 byte và chỉ xét trong 40 byte đầu tiên:

alert tcp 192.168.1.0/24 any -> any any (content: \ "HTTP"; offset: 4; depth: 40; msg: "HTTP matched";)

Nó rất quan trọng khi bạn muốn giới hạn công việc tìm kiếm trong gói. Cho ví dụ, thông tin về yêu cầu HTTP GET được tìm thấy từ đầu gói. Không cần phải tìm toàn bộ gói. Nhiều gói được capture với kích thước rất lớn, nó sẽ tốn nhiều thời gian để tìm kiếm.

Từ khóa nocase:

Nocase thường kết hợp với content. Nó không có đối số. Nó chỉ giúp tìm mẫu trong

dữ liệu không phân biệt chữ hoa hay thường. Từ khóa flow:

Flow được sử dụng để áp dụng một rule trên những phiên TCP đến những gói trong phương hướng riêng. Từ khóa này dùng xác định phương hướng. Những lựa chọn có thể sử dụng cho từ khóa này xác định phương hướng:

to_client to_server from_client from_server

Những lựa chọn này lần đầu có thể gây cho bạn khó hiểu. Từ “to” mang ý nghĩa là đáp ứng (response) và “from” mang nghĩa là yêu cầu (request).

Những lựa chọn khác dưới đây cũng có thể sử dụng để áp dụng rule vào các trạng thái khác nhau của kết nối TCP.

Lựa chọn stateless, áp dụng rule mà không cần xem trạng thái của phiên TCP Lựa chọn established, áp dụng rule mà để xác lập chỉ những phiên TCP

luồng.

Lựa chọn stream_only, áp dụng rule chỉ trên những gói đã xây dựng từ một luồng.

Luồng TCP (TCP Stream)được xử lý bởi bộ tiền xử lý stream4 (thảo luận trong phần sau). Lựa chọn stateless và established liên kết đến trạng thái TCP.

Lựa chọn về IP:

Từ khóa fragbits: (adsbygoogle = window.adsbygoogle || []).push({});

Tiêu đề IP (IP header) chứa 3 cờ bit, dùng để phân mảnh và tái hợp gói IP. Chức năng các cờ như sau:

Bit dành riêng (RB – Reserved Bit), dùng cho tương lai.

Bit không phân mảnh (DF – Don’t Fragment Bit). Nếu bit này bật, nó cho biết gói IP sẽ không phân mảnh.

Bit có nhiều phân mảnh (MF – More Fragments Bit).

D tương đương DF. Tương tự, R là RB, M là MF. Bạn cũng có thể dùng dấu “!”

trong rule. Ngoài ra, đi chung với “D,R,M”, ta cũng thường thấy các từ “+,-”. Nó có ý nghĩa, nếu là “+” tức là gắn thêm bit cờ với những bit khác, nếu là “-” thì bỏ bớt một số bit.

Từ khóa ipopts:

Trong IPv4, tiêu đề là 20 byte. Bạn có thể thêm những lựa chọn cho tiêu đề IP này. Chiều dài của phần lựa chọn có thể lên đến 20 byte. Lựa chọn IP dùng cho những mục đích khác nhau, đó là:

Record Route (rr) Time Stamps (ts)

Lose Source Routing (lsrr): định tuyến nguồn nới lỏng Strict Source Routing (ssrr); định tuyến nguồn siết chặc

Trong Snort rule, hầu hết những lựa chọn thường dùng liệt kê trong RFC 791 tại

http:// www . rfc-e dito r .org/ rfc / r f c 791.txt. Hacker có thể dùng những lựa chọn này để tìm thông tin về tổ chức mạng. Ví dụ, loose và strict source routing có thể giúp hacker khám phá ra đườn dẫn của một mạng nào đó tồn tại hay không.

Dùng những Snort rule, bạn có thể phát hiện những nổ lực tìm kiếm của hacker bằng từ khóa ipopts. Rule sau áp dụng cho Losse Source Routing:

alert ip any any -> any any (ipopts: lsrr; \ msg: "Loose source routing attempt";)

Bạn cũng có thể dùng từ khóa logto để ghi thông điệp vào một file. Tuy nhiên, bạn không thể chỉ định nhiều từ khóa lựa chọn IP trong một rule.

Từ khóa ip_proto:

Ip_proto sử dụng IP Proto plug-in để xác định con số giao thức trong IP header. Từ khóa

yêu cầu con số giao thức như một đối số. bạn có thể sử dụng một tên cho giao thức nếu nó đã định nghĩa trong file /etc/protocols. Xem mẫu file tương tự như sau:

ax.25 93 AX.25 # AX.25 Frames

ipip 94 IPIP # Yet Another IP encapsulation micp 95 MICP #Mobile Internetworking Control Pro.

scc-sp 96 SCC-SP # Semaphore Communications Sec. Pro.

etherip 97 ETHERIP # Ethernet-within-IP

Encapsulation

encap 98 ENCAP # Yet Another IP encapsulation

# 99 # any private encryption scheme

gmtp 100 GMTP # GMTP

ifmp 101 IFMP # Ipsilon Flow Management Protocol

pnni 102 PNNI # PNNI over IP

Rule sau kiểm tra nếu giao thức IPIP là đang sử dụng bởi gói dữ liệu:

alert ip any any -> any any (ip_proto: ipip; \msg: "IP-IP tunneling detected";) (adsbygoogle = window.adsbygoogle || []).push({});

Tiếp theo, ta dùng một số thay vì tên (hiệu quả hơn)

alert ip any any -> any any (ip_proto: 94; \msg: "IP-IP tunneling detected";)

Những giao thức mới nhất có thể tìm thấy từ ICANN tại http:// www .i c ann.o r g tại IANA http://i a n a .or g .

Từ khóa id:

Id dùng để so sánh trường ID phân mảnh của tiêu đề IP. Mục đích của nó là phát hiện ra những tấn công mà có dùng ID cố định trong IP header. Định dạng của nó là:

Nếu giá trị của trường id trong IP header bằng 0, nó cho biết đây là phân mảnh cuối cùng của một gói IP (nếu gói IP đó bị phân mảnh). Giá trị 0 cũng cho biết rằng nó chỉ phân mảnh nếu gói đó là không phân mảnh. Id trong Snort rule dùng để xác định phân mảnh

cuối cùng trong gói IP. Từ khóa tos:

Tos dùng để phát hiện ra một giá trị nào đó trong trường TOS (Type of Service) của IP header. Ví dụ như sau:

tos: 1;

Từ khóa ttl:

Ttl được dùng để phát hiện giá trị Time o Live trong IP header của gói. Từ khóa có một

giá trị cho biết chính xác giá trị TTL.Từ khóa này có thể sử dụng với tất cả loại giao thức xây dựng trên giao thức IP, bao gồm ICMP, UDP và TCP. Định dạng chung của nó như sau:

ttl: 100;

Tiện ích traceroute sử dụng TTL để tìm bộ định tuyến kế tiếp trong đường đi của gói. Traceroute gởi những gói UDP với giá trị TTL tăng dần. Giá trị TTL được giảm dần tại mỗi hop. Khi nó có giá trị là 0, router sinh ra một gói ICMP đến nguồn. Sử dụng gói ICMP này, tiện ích traceroute tìm ra địa chỉ IP của router. Ví dụ, để tìm router thứ 5, traceroute sẽ gửi những gói UDP với TTL đặt là 5. Khi gói này đến router thứ 5, nó có giá trị là 0 và một gói ICMP được sinh ra.

Sử dụng ttl, bạn có thể tìm ra nếu một ai đó cố gắng traceroute qua mạng của bạn.

Từ khóa cần chính xác giá trị TTL để mà so khớp.

Lựa chọn về TCP:

Từ khóa seq:

Seq trong Snort rule kiểm tra sequence number của gói TCP. Đối số này là một

sequence number. Nó có định dạng:

seq: "sequence_number";

Sequence number là một phần trong tiêu đề TCP. Từ khóa flags:

Flags dùng để tìm ra cờ bit được bật trong tiêu đề TCP gói. Mỗi cờ có thể dùng như một

đối số cho flags trong Snort rule. Bạn có thể tham khảo thêm cờ flag trong TCP tại RFC 793 tại http: / / www . rf c -e dito r .or g / r f c / r f c 793.txt. Cờ bit này được sử dụng cho nhiều

công cụ bảo mật nhằm mục đích khác nhau bao gồm công cụ quét cổng như nmap. Snort hỗ trợ những loại cờ bit .Bạn cũng có thể dùng dấu “!,+,*” giống như cờ bit trong tiêu đề IP, tương ứng với phép AND, OR và NOT.

alert tcp any any -> 192.168.1.0/24 any (flags: SF; \

msg: “SYNC-FIN packet detected”;)

Từ khóa ack:

TCP header có một trường Acknowledgemant Number, có chiều dài 32 bit. Trường cho biết là sequence number tiếp theo của gói TCP bên gởi đang chờ đợi từ bên nhận. Trường này chỉ có ý nghĩa khi cờ ACK trong TCP header được bật.

Công cụ nmap (http: / /nm a p.o r g ) sử dụng tính năng của gói TCP này đế ping một máy. Cho ví dụ, nó có thể gửi một gói TCP tới port 80 với cờ ACK bật và sequence (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Hệ thống phát hiện xâm nhập IDS SNORT (Trang 57 - 79)