Tải bản đầy đủ
3 Cấu trúc luật của Snort

3 Cấu trúc luật của Snort

Tải bản đầy đủ

32

Trong các phiên bản trước 1.8 thì điều này là bắt buộc. Trong các bản hiện
nay, các luật có thể được viết trên nhiều dòng bằng việc thêm dấu “/” vào cuối
mỗi dòng. Nếu xét về mặt logic thì các luật Snort được chia làm 2 phần, phần
header và phần các tuỳ chọn. Phần header gồm có các thông tin về các giao
thức, action, các địa chỉ nguồn, đích và mặt nạ mạng địa chỉ cổng nguồn,
đích.
Phần tuỳ chọn chứa các thông điệp cảnh báo và các thông tin cho biết
phần nào của gói tin sẽ được phân tích để xác định action được thực hiện.
Ví dụ minh họa một luật Snort đơn giản:
alert tcp any ->192.168.1.0/24 111{content:”/00 01 86 a5/”: msg:
“mounld avvess”:}
Từ đầu dòng đến dấu ngoặc đơn đầu tiên là phần header và phần nằm
trong cặp nguồn là phần tuỳ chọn. Các từ nằm trong cặp dấu “//” là từ khoá
tuỳ chọn. Lưu ý là phần tuỳ chọn là không được luật nào yêu cầu cụ thể,
chúng chỉ để dùng với mục đích xác định rõ gói tin để tập hợp và cảnh báo
(hoặc huỷ). Tất cả các thành phần cấu thành luật phải đúng để các action được
thực hiện. Khi được đặt cùng nhau, các thành phần có thể được xem như hình
thành nên một câu lệnh AND về mặt logic và các luật trong file thư viện có
thể được xem như tạo nên một câu lệnh OR. [5]
2.3.1.1 Includes
Từ khoá include cho phép các file luật khác được nằm trong file luật
mà dòng lệnh Snort chỉ ra. Nó làm việc giống như # include trong ngôn ngữ
lập trinh C, đọc các content của file được chỉ ra và đặt chúng vào trong file
nơi include xuất hiện.
Định dạng:
include: < include đường dẫn/ tên file>

33

Lưu ý không có dấu: ở cuối mỗi dòng. Các file include sẽ thay các biến
được định nghĩa trước vào trong các biến tham chiếu của nó.
2.3.1.2 Các biến
Các biến có thể được định nghĩa trong Snort. Đây là các biến thay thế
đơn giản được đặt cùng với từ khoá var:
Định dạng:
var:
var: MY_NET [192.168.1.0/24, 10.1.1.0/24]
alert tcp any any -> S MY_NET any (flag: S; msg: “ SYN packet”;)
Có một số các định nghĩa tên biến, có thể định nghĩa biến meta dùng
toán tử S và các toán tử bổ xung, ? và * S var-định nghĩa biến meta, *(S var)- thay bằng giá trị của biến var, *
S (var: - default) – thay bằng giá trị của biến var hoặc giá trị default nếu var
không được định nghĩa. * S var:? message) – thay bằng giá trị của biến var
hoặc in ra thông báo lỗi và thoát.
Xem về các bổ sung của những luật này trong action:
var MY_NET 192.168.1.0/24
2.3.1.3 Config
Rất nhiều cấu hình và các tuỳ chọn của dòng lệnh Snort có thể được
định nghĩa trong file cấu hình
Định dạng:

config [“]

Directives:
order: Thay đổi trật tự thi hành của luật (Snort -0)
alertfile: Thiết lập file cảnh báo. Ví dụ: config alerfile: alerts

34

clasification Xây dựng các phân lớp ưu tiên cho các luật
decode_arp Bật chức năng giải mã arp (Snort –a)
dum_chars _only Bạt các kết xuất ký tự (Snort –C)
dump_payload Kết xuất dữ liệu lớp ứng dụng (Snort – d)
decode_data _lik Giải mã phần header của lớp data link (Snort –e)
bpf_file Quy định các bộ lọc BPF (Snort –F)
Ví dụ: config bpf_file: filename.bpf
set_gid

Chuyến đến GID này (Snort – g)

Ví dụ: config set_gid: Snort_group
daemon

Chạy như một daemon (Snort –D)

reference_net Thiết đặt home network (Snort –h)
interface

Thiết đặt giao tiếp mạng (Snort –i)

alert_with _interface_name Thêm tên giao tiếp mạng vào cảnh báo
(Snort –I)
logdir

Đặt thư mục log (Snort -1). Ví dụ: config logdir:/var/log/Snort

umask

Che mặt nạ khi đang chạy (Snort –m). Ví dụ: config umask:

022
pkt_count Thoát sau N gói tin (Snort-n). Ví dụ: cấu hình pkt_count:13
nolog

Không cho phép log. Lưu ý là vấn có các cảnh báo. (Snort –N)

obfucate

Làm rối các địa chỉ IP (Snort –O)

no_prromisc
quiet

Không cho phép kiểu hỗn hợp (Snort –p)

Không cho phép các thông báo trạng thái và cấm (Snort –q)

35

checksum_mode

Kiểu của các gói tin để tính toán kiểm tra tổng. Các

giá trị nine, noip, noicmp, noudp, all
utc

Dùng TTC thay cho thời gian nội tại đối với các nhãn thời gian

(Snort –U)
verbose Dùng Verbose logging đến stdout (Snort- p)
dump_payload_verbose

Kết xuất các gói tin thô bắt đầu tại lớp liên

kết (Snort-X)
show_year Chỉ rõ năm trong các nhãn thời gian (Snort –U)
stateful

Đặt mode bảo đảm cho strream4 (est).

min_ttl

Đặt ttl nhỏ nhất để bỏ qua tất cả các lưu lượng.

disable_decode_alerts

Tắt các cảnh báo dinh ra trong lúc giải mã

Snort
disable_tcpot_experimental_alerts

Tắt các cảnh báo sinh ra bởi các

tuỳ chọn tcp thực nghiệm.
disable_tcpopt_ttcp_alerts

Tắt các cảnh báo sinh ra bởi các tùy chọn

T/TCP
disable_ipopt_alerts

Không cho phép các cảnh báo sự hợp lệ của độ

dài các tuỳ chọn TCP
disable_ipopt_alerts

Không cho phép các cảnh báo sự hợp lệ của độ

dài các tuỳ chọn IP
detection Cấu hình detection engine (Ví dụ: search –method lowmem)
reference Thêm một hệ thống tham chiếu mới đến Snort

36

2.3.2 Phần header của luật
2.3.2.1 Các Action
Phần header của luật chứa thông tin xác định gói tin của ai, từ đâu và
loại gì cũng như hành động gì nếu tất cả thuộc tính của gói tin phù hợp với
luật, rule action cho Snort biết phải làm gì, có 5 action mặc định trong Snort
là alert, log, pass, active và dynamic
1. alert – tạo ra một cảnh báo dùng phương thức cảnh báo được lựa
chọn sau đó log gói tin.
2. log – log gói tin
3. pass – bỏ qua gói tin
4. activate – cảnh báo và sau đó kích hoạt một luật động khác
5. dynamic – tiếp tục rỗi cho đến khi được kích hoạt bởi một luật
active, sau đó thi hành như một luật log.
Người dùng có thể định nghĩa luật của chính mình và kết hợp với một
hoặc nhiều plugin. Sau đó có thể dùng các rule type như là các action trong
luật Snort.
Ví dụ sau đây sẽ tạo ra một kiểu luật sẽ chỉ log đến tcpdump:
ruletype suspicious
{
type log output
log_tcpdump: suspicious,log
}
Ví dụ sau sẽ tạo ra một kiểu luật chỉ log đến syslog và một cơ sở dữ
liệu MySQL:

37

ruletype rdalert
{
typealert output
alert_syslog: LOG_AUTH LOG_ ALERT
output database: log, mysql, uer=snort dbname=snort host=loca1host
}
2.3.2.2 Các giao thức
Có 4 giao thức mà hiện nay Snort phân tích để tìm ra các hoạt động bất
thường là: tcp, udp, icmp và ip. Trong tương lai có thể có thêm nhiều hơn như
ARP, IGRP, GRE, OSPE, RIP, IPX,...
2.3.2.3 Các địa chỉ IP
Snort không có một cơ chế cung cấp tên host tìm cho các trường địa chỉ
IP trong các luật của file. Các địa chỉ được hình thành trực tiếp bằng một địa
chỉ IP và một CIDR. CIDR chỉ ra mặt nạ mạng được áp dụng vào địa chỉ của
luật này và bất cứ gói tin nào đến được kiểm tra theo luật.
Có một toán tử cũng được áp dụng cho các địa chỉ IP là toán tử phủ
định. Toán tử này cho Snort biết phải thực hiện các địa chỉ IP trừ đi IP được
viết.
Ví dụ về luật phủ định địa chỉ IP
alert tcp! 192.168.1.0/24 any -> 192.168.1.0/24/ 111/
{content: “/00 01 86 a5/”: msg: “ external mountd access”;}
Các địa chỉ IP của luật này cho biết bất kỳ gói tin tệp nào với địa chỉ
nguồn IP không xuất hiện phát từ mạng trong đến một địa chỉ ở mạng trong

38

Cũng có thể quy định danh sách các địa chỉ IP. Một danh sách địa chỉ
IP được quy định bằng cách thêm vào dấu phẩy để phân cách các địa chỉ IP và
các CIDR block trong cặp “[]”.
alert tcp! [192.168.1.0/24.10.1.1.0/24] any-> /
{192.168.1.0/24,10.1.1.0/24} 111 (content: “/00 01 85 a5/”/
2.3.2.4 Các số hiệu cổng Port
Các số hiệu cổng có thể được quy định theo vài cách, gồm có any ports,
các định nghĩa cổng tĩnh, các phạm vi và phủ định. Các cổng tĩnh được chỉ ra
bởi một số hiệu cổng duy nhất. Phạm vi cổng được chỉ ra bằng toán tử phạm
vi ‘:’. Toán tử phạm vi có thể dùng được theo vài cách (với các ý nghĩa khác
nhau), ví dụ:
log tcp any -> 192.168.1.0/24 : 6000
Log các lưu lượng từ cổng bất kỳ đến các cổng có số hiệu nhỏ hơn hoặc
bằng 6000.
log tcp any : 1024 -> 192.168.1.0/24 : 500
Log các lưu lượng tcp từ các cổng ưu tiên nhỏ hơn hoặc bằng 1024 đến
các cổng lớn hơn hoặc bằng 500.
Ví dụ về phạm vi cổng:
Toán tử! được dùng để lấy tất cả các cổng ngoại trừ cổng được viết
trong luật. Ví dụ nếu muốn log tất cả trừ các cổng X Windows, thử dòng sau:
log tcp any -> 192.168.1.0/24! 6000: 6010
2.3.2.5 Các luật Active/Dynamic
Cặp luật Active/Dynamic cho phép Snortcó một khả năng mạnh mẽ.
Dùng một luật để kích hoạt luật khác khi nó là action được thực hiện cho một
số gói tin. Các luật activate hoạt động như luật alert, trừ khi chúng có một

39

trường tuỳ chọn * required*: activates. Các luật dynamic hoạt động như luật
log, nhưng có một trường tuỳ chọn khác: activated_by. Các luật dynamic
giống như các luật log trừ việc chúng được cho phép một cách linh động khi
luật activate thoát.
Các luật Active và Dynamic đang dần bỏ để thay thế bằng tagging.
Đặt chúng cùng nhau và xem ví dụ sau:
activate tcp! SHOME_NET any -> SHOME_NET 143 (flag: PA:/
content: “/EBCOFFFFFF/ bin” : activates: 1; /
dynamic tcp! SHOME_ NET any -> SHOME_NET 143 (activated_by:
1 ; count: 50)
Các luật này báo cho Snort biết để cảnh báo khi nó phát hiện tràn bộ
đệm IMAP và lấy 50 gói tin tiếp theo đến cổng 143 từ bên ngoài
SHOME_NET đến sẽ nằm ở 50 gói tin tiếp đến cùng cổng dịch vụ trên mạng,
do đó việc lấy các gói tin đó để phân tích sau là cần thiết.
2.3.3 Các tuỳ chọn luật
Các tuỳ chọn luật là trái tim của hệ thống phát hiện xâm nhập Snort.
Tất cả các tuỳ chọn Snort được tách biệt nhau bởi ký tự dấu ‘:’. Từ khoá tuỳ
chọn luật tách biệt với các đối số của nó bằng dấi ‘:’
Các từ khoá:
msg – In một thông điệp ở các alert và các log gói tin
logt – Log gói tin tới một tên file người dùng muốn thay cho file output
chuẩn
ttl – Kiểm tra giá trị trường TTL của IP header
tos – Kiểm tra giá trị TOS của IP header.

40

id – Kiểm tra giá trị trường ID phân mảnh của IP header theo giá trị cụ
thể.
ipotion – xem các trường tuỳ chọn IP theo các mã cụ thể
fragbits – Kiểm tra bit phân mảnh của IP header.
dsize – Kiểm tra kích thước tải tin của gói tin theo một giá trị.
flags – Kiểm tra các cờ TCP theo một giá trị cho trước
seq – Kiểm tra trường TCP sequence number theo một giá trị cho trước
ack – Kiểm tra trường TCP acknowlegement theo một giá trị cụ thể
window – Kiểm tra trường TCP window theo giá trị cụ thể
itype – Kiểm tra trường ICMP type theo một giá trị cụ thể
icode – Kiểm tra trường ICMP code theo một giá trị
icmp_id – Kiểm tra trường ICMP ECHO ID theo một giá trị
icmp_seq – Kiểm tra số hiệu ICMP ECHO sequence theo một giá trị
content – Tìm một mẫu trong tải tin của gói tin
content – lost – Tìm một tập các mẫu trong tải tin của gói tin
offset – Là một bổ sung cho tuỳ chọn content, đặt độ sâu tìm kiếm đối
với một mẫu.
nocase – Tìm chuỗi content cho trước không phân biệt chữ hoa chữ
thường.
sesion – Kết xuất thông tin lớp ứng dụng đối với một phiên cho trước
rpc – Theo dõi các dịch vụ RPC đối với gọi thủ tục/ ứng dụng cụ thể.
resp – ứng phó chủ động ( ví dụ như khoá các kết nối)
react – ứng phó chủ động ( khoá websites)

41

reference – Các nhận dạng tấn công từ bên ngoài
sid – Số hiệu duyệt Snort
rev – Số hiệu duyệt lại luật
clastype – Xác địng phân lớp luật
priority – Xác định mức nghiêm ngặt của luật
uricontent – Tìm kiếm một mẫu trong phần URI của một gói tin
tag – Các actionlog cải tiến cho các luật
ip_proto – Giá trị theo thức của IP header
samip – Xác định nguồn và đích IP có giống nhau không
stateles – Hợp lệ không xem xét đến trạng thái luồng
regex – Tìm kiếm mẫu đại diện
byte_test – Kiểm tra mẫu là số
distance – Buộc so sánh mẫu tương đối nhảy khoảng trống
within – buộc so sánh mẫu tương đối nằm trong một số đếm
byte_jump – Kiểm tra mẫu số và điều chỉnh khoảng
2.3.3.1 Msg
Tuỳ chọn msg đưa ra thông điệp cho phần cảnh báo và phần log để in
cùng với một kế xuất gói tin đến cảnh báo. Nó là mỗi chuỗi văn bản đơn giản
dùng “/” như là một ký tự trống để chỉ ra ký tự rời rạc nếu không có thể làm
cho việc phân tích cú pháp Snort khó khăn.
Đinh dạng:
2.3.3.2 Logto

msg: “ < message text>”

42

Tuỳ chọn logto yêu cầu Snort log tất cả các gói tin mà luật này tác động
tới một file đầu ra đặc biệt. Điều này đặc biệt thuận tiện cho việc kết hợp dữ
liệu từ những hoạt động như NMAP, quét HTTP CGI,... Nên lưu ý rằng tuỳ
chọn này không làm việc khi Snort đang ở trong log kiểu nhị phân.
Định dạng:

logto: “ tên file”;

2.3.3.3 TTL
Tuỳ chọn này dùng để thiết lập một giá trị time-to-live cụ thể cho việc
kiểm tra. Kiểm tra Snort thực hiện chỉ thành công khi có một mẫu được tìm
chính xác. Từ khoá tuỳ chọn này được dành cho việc dùng trong việc phát
hiện các cuộc tấn công traceroute
Định dạng:

ttl:

2.3.3.4 TOS
Từ khoá tos cho phép kiểm tra trường TOS phần mào đầu của gói tin IP
theo một giá thị cụ thể. Kiểm tra Snort thực hiện chỉ thành công khi có một
mẫu được tìm chính xác.
Định dạng:

tos: < number >

2.3.3.5 ID
Từ khoá tuỳ chọn này được dùng để kiểm tra một mẫu chính xác trong
trường fragment ID của phần mào đầu IP. Một số công cụ hacking thiết đặc
trường này một cách đặc biệt cho các mục đích khác nhau, ví dụ, giá trị 31337
rất quen thuộc đối với nhiều hacker. Tuỳ chọn này có thể chống lại các
hackers bằng việc đặt một luật đơn giản để kiểm tra.
Đinh dạng:
2.3.3.6 Ipoption

id: