Tải bản đầy đủ (.pdf) (47 trang)

báo cáo thực tập tốt nghiệp snort ids

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.16 MB, 47 trang )


ĐẠI HỌC BÁCH KHOA HÀ NỘI
Chương trình kỹ sư Chất lượng cao




BÁO CÁO THỰC TẬP TỐT NGHIỆP
SNORT IDS

Giảng viên: PGS TS. Nguyễn Linh Giang
Sinh viên thực hiện: Ngô Doãn Dương
SHSV: 20090596
Lớp: HTTT và truyền thông - KSCLCK54


Hà Nội, 04/2014


2

Mục lục
Lời nói đầu 3
Phần 1. Tổng quan về IDS Snort 4
Phát hiện xâm nhập là gì? 4
Các thành phần và cơ chế hoạt động của Snort 8
Tập luật trong Snort 13
Cấu hình Snort 27
Phần 2. Snort và các sản phẩm kết hợp 34
Phần 3. Thử nghiệm khả năng phản ứng của Snort
IDS 43


Phần 4. Kết luận 47

3

Lời nói đầu
Bảo mật là một vấn đề lớn đối với tất cả các mạng trong môi trường
doanh nghiệp ngày nay. Hacker và intruder (kẻ xâm nhập) đã nhiều lần thành công
xâm nhập vào mạng công ty và đem ra ngoài rất nhiều thông tin giá tri Nhiều
phương pháp đã phát triển để đảm bảo cho hạ tầng mạng và giao tiếp trên
Internet, giữa chúng là sử dụng firewall (tường lửa), encryption (mã hóa), và
VPN (mạng riêng ảo). Phát hiện xâm nhập là một công nghệ mới. Các phương
pháp phát hiện xâm nhập bắt đầu xuất hiện những năm gần đây. Sử dụng
phương thức phát hiện xâm nhập, có thể thu thập và sử dụng thông tin từ
những loại tấn công đã biết và tìm ra một ai đó cố gắng tấn công vào mạng hay
máy cá nhân. Thông tin thu thập theo cách này có thể sử dụng làm cho mạng
chúng ta bảo mật hơn, nó hoàn toàn hợp pháp. Sản phẩm thương mại và mã
nguồn mở đều sẵn có cho mục đích này. Nhiều công cụ đánh giá tình trạng nguy
hiểm cũng sẵn có trên thị trường , nó dùng để đánh giá nhiều loại hình bảo mật
khác nhau và vai trò của nó trong mạng.
Snort là một hệ thống phát hiện xâm nhập mạng (NIDS) mã nguồn mở, là
miễn phí. NIDS là một dạng IDS, được sử dụng để quét luồng dữ liệu trên mạng.
Cũng có những IDS cơ bản trên host (host-based), nó được cài đặt trên host
riêng và phát hiện những cuộc tấn công chỉ trên host đó thôi. Mặc dù tất cả
phương pháp phát hiện xâm nhập vẫn còn mới, nhưng Snort giữ một vị trí là hệ
thống chất lượng thuộc loại top (hàng đầu) ngày nay.
Snort có thể làm việc chung với những sản phẩm khác. Những sản phẩm đó
bao gồm cơ sở dữ liệu MySQL () và điều khiển phân tích cho cơ sở
dữ liệu xâm nhập (ACID) ( Snort có khả năng ghi dữ
liệu thu thập được (như là những cảnh báo – alerts – và những thông điệp dạng
log khác) vào một cơ sở dữ liệu. MySQL được sử dụng làm cơ sở dữ liệu thông

dụng, nó là nơi mà dữ liệu sẽ lưu giữ. Sử dụng Apache web server
() và ACID, có thể phân tích dữ liệu này. Sự kết hợp của
Snort, Apache, MySQL, và ACID giúp ta ghi dữ liệu phát hiện xâm nhập vào trong
cơ sở dữ liệu và xem, phân tích nó về sau, bằng một giao diện web cơ bản.

4

Phần 1. Tổng quan về IDS Snort
1. Phát hiện xâm nhập là gì?
Phát hiện xâm nhập là một tập những công nghệ và phương thức
dùng để phát hiện hành động khả nghi trên cả host và mạng. Hệ thống phát
hiện xâm nhập (IDS)có 2 loại cơ bản sau: IDS signature-based (IDS dựa trên
dấu hiệu) và IDS anomaly-based (IDS dựa trên sự bất thường). Intruder có
những dấu hiệu, giống như virus máy tính - có thể được phát hiện bằng cách
sử dụng phẩn mềm quét virus. có thể cố gắng tìm những gói dữ liệu có chứa
những dấu hiệu liên quan đến xâm nhập đã biết hay những điều bất thường
liên quan đến giao thức. Dựa trên những tập signature và rules, hệ thống
phát hiện có thể tìm và ghi những hành động xâm nhập và phát ra cảnh báo.
Sự phát hiện xâm nhập dựa trên sự bất thường thường phụ thuộc vào tính
bất thường của tiêu đề (header) giao thức trong gói dữ liệu. Trong nhiều
trường hợp, phương pháp này có thể đem lại kết quả tốt hơn đối với IDS
signature-based. Thông thường một IDS capture dữ liệu từ mạng và áp dụng
những rule của nó vào dữ liệu này hoặc phát hiện những anomaly trong nó.
Snort là một IDS rule-base (IDS dựa trên tập luật) chính, tuy nhiên những
input plug-in giúp phát hiện những anomaly trong tiêu đề giao thức.
Snort sử dụng những rule lưu trong những text file, nó có thể xem
được bằng một trình soạn thảo văn bản. Những rule được nhóm theo từng
loại. Những rule đi cùng với mỗi loại được lưu trữ trong những file riêng.
Những file này sau đó được tập hợp trong một file cấu hình chính, gọi là
snort.conf. Snort đọc những rule này mỗi lần chạy và xây dựng các cấu trúc dữ

liệu bên trong nó hoặc áp dụng những rule đó để capture dữ liệu. Việc tìm
những signature và sử dụng chúng trong rule là một công việc đòi hỏi phải
tinh tế, khi dùng nhiều rule, sẽ có nhiều công việc xử lý hơn được yêu cầu để
capture dữ liệu trong thời gian thực. Snort cho phép định nghĩa lại rule cho
việc phát hiện xâm nhập và rất “linh hoạt” cho ta thêm vào rule riêng của
mình.

5

Một số định nghĩa cơ bản:
1.1 IDS:
Intrusion Detection System (hệ thống phát hiện xâm nhập) hay IDS là phần
mềm, phần cứng hoặc kết hợp cả ha i, dùng để phát hiện hành động của
kẻ xâm nhập. Snort là một IDS mã nguồn mở sẵn có trên mạng. Một IDS
có nhiều khả năng khác nhau tùy thuộc vào độ phức tạp của các thành
phần trong nó. Nhiều công ty đã ứng dụng IDS kết hợp phần cứng và
phần mềm. Nói cách khác, một IDS có thể sử dụng những công nghệ dựa
trên các dấu dấu hiệu hoặcsự bất thường hoặc cả hai.

1.2 Network IDS hay NIDS:
NIDS là một IDS capture dữ liệu trong quá trình truyền dữ liệu trên
mạng (cáp, wireless) và gắn chúng vào một cơ sở dữ liệu của những
signature. Phụ thuộc vào nơi mà một gói bi phát hiện với một tín hiệu
xâm nhập, lúc đó một cảnh báo sẽ được phát sinh hoặc gói đó sẽ được
ghi vào trong một file hay cơ sở dữ liệu. Một chuyên gia sử dụng Snort như
là một NIDS.

1.3 Host IDS hay HIDS:
Những hệ thống HIDS được cài đặt như là những agent (tác nhân)
trên một host. Những hệ thống này có thể nhìn vào trong những log file

ứng dụng để phát hiện ra hành vi kẻ xâm nhập. Một vài loại là reactive,
có nghĩa nó chúng chỉ báo cho ta biết khi mà mọi việc đã xảy ra. Cũng có
một số là proactive (đoán trước), chúng quét lưu lượng mạng tại những
HIDS đã được cài đặt và phát cảnh báo ngay cho ta.

1.4 Signatures (dấu hiệu):
Khi chúng ta nhìn vào trong gói dữ liệu, ta rút ra được một mẫu (lấy
mẫu dữ liệu), mẫu đó gọi là signature. Một signature dùng để phát hiện
một hoặc nhiều loại tấn công. Cho ví dụ, chuỗi “script/iisad-min” trong gói
dữ liệu đi vào web server có thể nói cho ta biết đó là một hành vi xâm
nhập.
Signatures có thể trình bày nhiều thành phần khác nhau trong một gói
dữ liệu phụ thuộc vào cách tấn công tự nhiên. Cho ví dụ, ban có thể tìm
6

signature trong IP header, transport layer header (TCP, UDP) và/hoặc
application layer header hay payload.
Thường thì IDS phụ thuộc vào signature để tìm những hành vi xâm nhập.
Một vài sản phẩm IDS cần phải cập nhật từ nhà cung cấp những
signature mới khi có một loại tấn công nào đó ra đời.Trong IDS khác,
như Snort, có thể cập nhật signature của riêng mình.

1.5 Alerts (cảnh báo):
Alerts là những loại thông báo người dùng của một hành vi xâm nhập.
Khi một IDS phát hiện ra một intruder, nó sẽ báo cho người quản trị bảo
mật bằng cách dùng những cảnh báo này. Alerts có thể là một dạng cửa sổ
pop-up, dạng console, gửi một e-mail, v.v Alerts cũng có thể được lưu
trong những log file hay cơ sở dữ liệu, nơi mà chúng có thể xem lại về
sau.
Snort có thể phát ra Alerts trong nhiều hình thức và được điều khiển bởi

những output plug-ins. Snort cũng có thể gửi cùng một alert đến nhiều
điểm đích. Cho ví dụ, nó có thể ghi Alerts vào trong cơ sở dữ liệu và
phát ra SNMP trap cùng một lúc. Một vài plug-ins cũng có thể thay đổi
cấu hình firewall nhằm ngăn những host xâm phạm vào firewall hay
router.

1.6 Logs:
Thông điệp log thường được lưu trong một file. Mặc định, Snort lưu
những thông điệp này dưới thư mục /var/log/snort. Tuy hiên, vị trí của nó
có thể thay đổi bằng cách sử dụng lệnh khi khởi động Snort. Thông điệp
log có thể lưu ở dạng text (văn bản) hay binary (nhị phân). Những file
binary có thể xem sau này bằng Snort hay chương trình tcpdump. Một
công cụ mới gọi là Barnyard cũng có thể phân tích những log file nhị phân.
Ghi ở dạng nhị phân thì nhanh hơn bởi vì nó lưu theo mức cao. Ghi theo
dạng nhị phân rất hữu dụng trong trường hợp khi thực thi Snort đòi hỏi
tốc độ cao.

1.7 False Alarms (cảnh báo lỗi):
False alarm là loại cảnh báo phát ra biểu thi một dấu hiệu mà không có
7

hành vi xâm nhập nào. Cho ví dụ, những host bên trong mạng do cấu
hình sai có thể những thông điệp broadcast khớp với một rule nào đó,
kết quả là nó phát ra một cảnh báo sai. Ở một vài router như Linksys,
nó sinh ra nhiều cảnh báo “lost of UpnP realated”. Để tránh những lỗi
trên, phải thay đổi điều chỉnh những rule mặc định khác. Trong vài
trường hợp, cần phải disable một vài rule để tránh False alarm.

8


2. Các thành phần và cơ chế hoạt động của Snort:
Snort được chia thành nhiều phần. Những phần này làm việc cùng nhau
nhằm phát hiện những loại tấn công khác nhau và sinh ra trong một định
dạng yêu cầu từ hệ thống phái hiện. Một Snort IDS cơ bản gồm các thành
phần chính sau:
a. Packet Decoder : bộ giải mã gói
b. Preprocessors : Bộ tiền xử lý.
c. Detection Engine : bộ máy phát hiện
d. Logging and Alerting System : hệ thống ghi và cảnh báo.
e. Output Modules : các mô đun xuất.
Dưới đây là mô hình của các thành phần Snort:


Hình 3.1: Cơ chế hoạt động của IDS
Sau đây sẽ giới thiệu ngắn gọn những thành phần này. Thông qua đó, có
thể tạo một vài rule.
9

2.1 Packet Decoder:
Packet decoder lấy những gói từ những loại khác nhau của giao diện mạng
và chuẩn bị đưa chúng vào preprocessed hoặc gửi nó qua detection
engine. Giao diện có thể là Ethernet, SLIP, PPP, v.v
2.2 Preprocessors:
Preprocessors là những thành phần hay những plug-in được sử dụng
cùng với Snort để sắp xếp và thay đổi những gói dữ liệu trước khi detection
engine thực hiện công việc tìm kiếm nếu gói dữ liệu đó là nguy hiểm. Một
vài preprocessor còn có thể thực hiện tìm ra những dấu hiệu bất thường
trong tiêu đề gói và sinh ra cảnh báo. Preprocessor rất là quan trọng đối với
IDS nhằm chuẩn bị những gói dữ liệu để phân tích cho việc thiết lập rule
trong detection engine. Hacker sử dụng những công nghệ khác nhau nhằm

đánh lừa một IDS bằng nhiều cách khác nhau. Cho ví dụ, có thể tạo một
rule để tìm một dấu hiệu “script/iiadmin” trong gói HTTP. Nếu so khớp
chính xác chuỗi này, có thể dễ dàng bắt lấy. Cho ví du:
 “script/./iisadmin”
 “script/examples/ /iisadmin”
 “script/iisadmin”

Để làm phức tạp trạng thái, hacker cũng có thể chèn vào Uniform
Resource Identifier (URI) ký tự nhị phân hay Unicode mà vẫn hợp quy tắc
của một web server. Chú ý rằng web server thường hiểu tất cả những chuỗi
và có thể xử lý chúng chính xác như mong muốn trong chuỗi
“script/iisadmin”. Tuy nhiên IDS vẫn theo dõi so khớp chính xác, nó không
thể phát hiện ra sự tấn công này. Một preprocessor có thể sắp xếp lại chuỗi đó
để nó có thể phát hiện được.
Preprocessor cũng có thể sử dụng cho những gói phân mảnh. Khi
một gói dữ liệu có kích thước lớn truyền vào một host, gói đó thường bị
phân mảnh. Cho ví dụ, kích thước mặc định lớn nhất cho gói dữ liệu trong
mạng Ethernet thường là 1500 byte. Giá trị này được điều khiển bởi giá trị
MTU (Maximum Transfer Unit) cho giao diện mạng. Điều này có nghĩa là nếu
gửi dữ liệu lớn hơn 1500 byte, nó sẽ cắt thành nhiều gói, mỗi gói phân mảnh
10

đó có kích thước nhỏ hơn hoặc bằng 1500 byte. Hệ thống nhận sẽ tái hợp
để thành gói dữ liệu nguyên thủy. Trên IDS, trước khi áp dụng những
rule hay tìm một signature, phải tái hợp gói. Cho ví dụ, phân nửa dấu
hiệu có thể cho thấy trong một đoạn này và nửa kia trong đoạn khác. Để
phát hiện chính xác dấu hiệu, phải kết hợp tất cả phân đoạn của mảnh.
Hacker sử dụng sự phân mảnh để đánh bại những hệ thống IDS. Preprocessor
thường được dùng để bảo vệ những loại tấn công này. Preprocessor trong
Snort có thể phân mảnh gói, giải mã HTTP URI, tái hợp luồng TCP, v.v Những

chức năng này rất là quan trọng trong thành phần IDS.
2.4 Detection Engine:
Detection engine là thành phần quan trọng nhất trong Snort. Nó
chịu trách nhiệm phát hiện nếu có hành vi xâm nhập trong một gói.
Detection engine tận dụng những rule Snort để làm việc này. Những rule
được đọc trong cấu trúc dữ liệu bên trong hay buộc chặt chúng vào nơi mà
chúng sẽ so khớp với tất cả các gói. Nếu một gói nào đó khớp với rule,
hành động thích hợp sẽ sinh ra, chẳng hạn gói đó sẽ bị hủy. Những hành
động đó có thể là ghi gói hay sinh cảnh báo.
Detection engine là một phần tiêu chuẩn thời gian (time-critical) của
Snort. Phụ thuộc vào sức khỏe của hệ thống và có bao nhiêu rule được định
nghĩa, nó có thể tiêu tốn bao nhiêu thời gian cho công việc đáp ứng các gói
này. Nếu lưu lượng trên hệ thống mạng của là khá cao khi Snort làm việc
trong chế độ NIDS, có thể hủy những gói. Sự vận hành của Detection
engine phụ thuộc vào các yêu tố sau:
 Số rule trên đó.
 Sức khỏe của hệ thống trên đó có Snort đang chạy.
 Thông lượng bên trong đó.
 Sức vận hành trên mạng
Khi thiết kế một NIDS, phải giữ tất cả hồ sơ kỹ thuật trong đó.
Nên nhớ rằng hệ thống phát hiện có thể khảo sát tỉ mỉ và áp dụng rule
trên nhiều phần của gói dữ liệu. Những phần này có thể là:
 IP header của gói.
11

 Header lớp transport. Header gồm: TCP, UDP, và những header lớp
transport khác. Nó cũng có thể làm việc trên ICMP header.
 Header lớp application. Nó gồm có: DNS header, FTP header,
SNMP header, SMTP header. có thể phải sử dụng nhiều phương
pháp trực tiếp tại header lớp application, chẳng hạn như tìm kiếm

offset của dữ liệu.
 Payload của dữ liệu. Điều này giúp tạo ra một rule dùng cho
detection engine để tìm một chuỗi bên trong dữ liệu.
Detection engine làm việc khác nhau trong mỗi phiên bản Snort khác
nhau. Trong tất cả phiên bản Snort 1.x, detection engine ngừng xử lý trên
gói đó khi một rule được so khớp trên gói đó. Phụ thuộc vào rule, detection
engine thực hiện những hành động thích hợp như ghi log file hay sinh một
cảnh báo. Điều này có nghĩa là nếu một gói khớp với tiêu chuần được định
nghĩa trong nhiều rule, chỉ rule đầu tiên được áp dụng vào gói đó mà không
tìm kiếm sự so khớp khác. Đây là một vấn đề. Một rule thiếu trọn vẹn sẽ
sinh ra một cảnh báo không trọn vẹn, thâm chí nếu một rule khá đầy đủ
(tương ứng với một cảnh báo tốt) có thể nằm sau rule trước nó. Vấn đề này
đã được sửa trong Snort phiên bản 2, tất cả các rule đều được so khớp vào
một gói trước khi sinh một cảnh báo. Sau khi so khớp tất cả các rule, rule nào
trọn vẹn nhất sẽ được chọn để sinh cảnh báo.
Detection engine trong Snort 2.0 đã được làm lại một cách hoàn
chỉnh để nó so sánh tốt hơn, phát hiện sớm hơn so với các phiên bản trước.
2.5 Logging và Alerting System:
Phụ thuộc vào detection engine tìm trong gói, gói có thể được
dùng để ghi hành động hay sinh cảnh báo. Việc ghi lưu trong những text file
đơn giản, loại file tcpdump hay những hình thức ghi khác. Mặc định tất cả
những log file được lưu trong /var/log/snort. có thể sử dụng dòng lệnh
“–l” để thay đổi vị trí sinh log file hay cảnh báo. Có nhiều lựa chọn dòng lệnh
sẽ được thảo luận trong phần sau và chi tiết thông tin về cách ghi log file
hay cảnh báo.
2.6 Output Modules:
12

Output modules hay plug-in thực hiện những hoạt động khác nhau
phụ thuộc muốn lưu kết quả sinh ra bởi logging và cảnh báo thế nào. Về cơ

bản, những modules này điều khiển loại kết quả sinh ra bởi hệ thống
logging và cảnh báo. Phụ thuộc vào sự cấu hình, Output modules có thể làm
những việc sau:
 Đơn giản chỉ ghi vào file /var/log/snort/alerts hay những file khác
 Gửi SNMP traps
 Gửi thông điệp đến syslog.
 Ghi vào cơ sở dữ liệu như MySQL hay Oracle.
 Sinh ra dẫn xuất eXtensible Markup Language (XML)
 Bổ sung cấu hình trên router và firewall.
 Gửi thông điệp Server Message Block (SMP) đến hệ thống Microsoft
Window. Những công cụ khác cũng có thể gửi cảnh báo trong những
định dạng khác như e-mail hay qua giao diện web. Bảng sau đây cho
ta thấy những thành phần khác nhau của một IDS:


13

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. Trong chương 1,
đã 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 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. 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. 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 phần sau.
3.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.

Hình 3.2: Cấu trúc Rule
14

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:

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. 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”,
15

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 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. 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.

16

3.2. 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 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.
đã sử dụng option như msg và ttl trong ví dụ trước rồi đó. Tất cả những lựa
chọn được định nghĩa bởi từ 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.
3.2.1. 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
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ê ở dạng hexa:
alert

tcp

192.168.1.0/24

any

->

![192.168.1.0/24]

any

\

(content:

"|47


45

54|";

msg:

"GET

matched";)

17

Số 47 tương đương mã ASCII là G, 45 = E, 54 = T. 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à:
Offset
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

\

(content:

"HTTP";

offset:

4;

msg:

"HTTP

matched";)

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
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 kết hợp offset và depth cùng với
content, có thể chỉ ra vùng dữ liệu mà muốn lấy mẫu. Ví dụ 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 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
18

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 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
 Lựa chọn no_stream, bật những rule để áp dụng vào gói mà không
cần xây dựng từ một 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.
19

3.2.2. Lựa chọn về IP:
 Từ khóa fragbits:
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. 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. 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 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, 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";)

 cũng có thể dùng từ khóa logto để ghi thông điệp vào một file. Tuy
20

nhiê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ố. 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";)

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
21

tại IANA .
 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à:
id:

"id_number"

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, có thể tìm ra nếu một ai đó cố gắng traceroute qua mạng
của .
Từ khóa cần chính xác giá trị TTL để mà so khớp.
22

3.2.3. 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. có thể tham khảo
thêm cờ flag trong TCP tại RFC 793 tại -
editor.org/rfc/rfc793.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 trong mục 1:

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 () 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 number là 0. Khi gói này không truy cập được
do bên nhận có áp dụng rule đối với TCP, nó sẽ gửi về một gói RST. Khi
nmap nhận được gói RST này, nó chỉ ra rằng host đó vẫn còn hoạt động.
Phương pháp này làm việc trên những host mà không đáp ứng những
gói ICMP ECHO REQUEST.
23

Để phát hiện loại ping TCP này, có thể tạo một rule như sau:
alert

tcp

any

any

->

192.168.1.0/24

any

(flags:


A;

\

ack:

0;

msg:

"TCP

ping

detected";)

Rule này cho biết là thông điệp cảnh báo sẽ phát ra khi nhận một gói
TCP với cờ A bật và ACK chứa có giá trị 0. Những cờ TCP được liệt kê
trong bảng dưới. Host đích là 192.168.1.0/24. có thể sử dụng giá trị
của ACK trong rule, tuy nhiên nó thêm vào Snort chỉ phát hiện cho loại
tấn công này. Thường thì khi cờ A được bật, giá trị ACK không còn là 0.

3.2.4. Lựa chọn về ICMP:
 Từ khóa icmp_id:
Lựa chọn icmp_id phát hiện ra ID của gói ICMP. Cú pháp của nó là:
icmp_id:

<ICMP_id_number
>


Trường nhận dạng một ICMP tìm thấy trong thông điệp ICMP ECHO
REQUEST và ICMP ECHO REPLY (xem RFC 792). Trường này được sử dụng
để so sánh ECHO REQUEST và ECHO REPLY. Thường thì khi sử dụng lệnh
ping, cả hai loại ICMP đó được trao đổi giữa bên gửi và bên nhận. Bên
gửi gửi gói ECHO REQUEST và bên nhận đáp ứng lại gói ECHO REPLY.
Trường này có ích cho việc nhận ra cái gói đáp ứng cho gói yêu cầu. Luật
sau kiểm tra nếu ICMP IP trong tiêu đề ICMP bằng 100 thì sinh một cảnh
24

báo.
alert

icmp

any

any

->

any

any

(icmp_id:

100;

\


msg:

"ICMP

ID=100";)

 Từ khóa icmp_seq:
Lựa chọn icmp_seq tương tự như icmp_id. Cú pháp của nó là:
icmp_seq:

<ICMP_id_number>

sequence number cũng là một trường trong tiêu đề ICMP và cũng có
ích trong việc so sánh ECHO REQUEST và ICMP ECHO REPLY (xem RFC
792). Từ khóa này cho phép tìm một sequence number đặc trưng. Tuy
nhiên, ít ai mà dùng từ khóa này. Xem rule sau, nếu sequence number
là 100 thì sinh cảnh báo:
alert

icmp

any

any

->

any


any

(icmp_seq:

100;

\

msg:

"ICMP

Sequence=100";)

 Từ khóa itype:
Tiêu đề ICMP đến sau tiêu đề IP và chứa một trường type.Từ khóa
itype nhằm phát hiện những tấn công sử dụng trường type trong tiêu đề
ICMP. Đối số cho nó là một số và có định dạng sau:
itype:

"ICMP_type_number"

Trường type trong ICMP header của gói dữ liệu được sử dụng để xác
định loại gói ICMP. Danh sách các loại ICMP khác nhau và giá trị của
trường type tương ứng:
25


Ví dụ, nếu muồn sinh một cảnh báo cho loại thông điệp source quench,
sử dụng rule sau:

alert

icmp

any

any

->

any

any

(itype:

4;

\

msg:

"ICMP

Source

Quench

Message


received";)

 Từ khóa icode:
Trong những gói ICMP, ICMP header đến sau IP header. Nó chứa một
trường code. Từ khóa icode dùng để phát hiện trường code trong tiêu
đề gói ICMP. Đối số cho trường này là một số và có định dạng sau:
icode:

"ICMP_codee_number"

Trường type trong tiêu đề ICMP cho biết loại thông điệp ICMP. Trường
code cho biết chi tiết loại đó. Ví dụ, nếu trường type có giá trị là 5
thì loại ICMP là “ICMPredirect”. Có thể có nhiều lý do sinh ra một
ICMP redirect. Trường code cho biết rõ những loại lý do đó:
 Nếu trường code bằng 0, gửi gói ICMP đến một mạng.
 Nếu trường code bằng 1, gửi gói ICMP đến một host
 Nếu trường code bằng 2, gói ICMP là loại của dịch vụ và mạng.
 Nếu trường code bằng 3, gói ICMP là loại của dịch vụ và host.
Icode trong Snort rule sử dụng để tìm giá trị trường code trong ICMP
header. Rule sau sinh ra một cảnh báo cho những gói ICMP đến host:

×