Bài 3: Xây dựng hệ thống IDS với 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 Snort.
  • Bước 2: Vận hành Snort chế độ IDS.
  • Bước 3: Tạo luật đơn giản cảnh báo truy nhập từ bên ngoài.
  • Bước 4: Cảnh báo truy nhập từ bên trong đến một nội dung nhạy cảm.
  • Bước 5: Cảnh báo quét cổng (port scan) với preprocessor sfportscan.

Bước 1: Cài đặt Snort

Cà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
[root@C2 ~]# cd snort_src
[root@C2 ~]# wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz
--2016-10-19 02:11:30--  https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz
. . .
[root@C2 ~]# wget https://www.snort.org/downloads/snort/snort-2.9.8.3.tar.gz
--2016-10-19 02:11:51--  https://www.snort.org/downloads/snort/snort-2.9.8.3.tar.gz
. . .
[root@C2 ~]# tar xvfz ./daq-2.0.6.tar.gz
. . .
[root@C2 ~]# cd daq-2.0.6
[root@C2 daq-2.0.6]# ./configure
. . .
[root@C2 daq-2.0.6]# make
. . .
[root@C2 daq-2.0.6]# make install
. . .
[root@C2 ~]# cd ..
[root@C2 ~]# tar xvfz ./snort-2.9.8.3.tar.gz
. . .
[root@C2 ~]# cd snort-2.9.8.3
[root@C2 daq-2.0.6]# ./configure
. . .
[root@C2 daq-2.0.6]# make
. . .
[root@C2 daq-2.0.6]# make install
. . .

Sau khi cài đặt thành công, Snort có thể hoạt động ở 3 chế độ:

  • Package sniffer: hiển thị thông tin header các gói tin
  • Package log: ghi lại các thông tin vào file log để xử lý sau này
  • IDS: phân tích các gói tin hoặc các luồng TCP, thực hiện các chức năng IDS theo cơ chế signature-based.

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/
snort.log.1476819559

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
/var/log/snort/snort.log.1476819559: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 1514)

Để đọ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
reading from file /var/log/snort/snort.log.1476819559, link-type EN10MB (Ethernet)
02:39:25.449298 IP 10.0.2.15.49648 > alu7750testscr.xyz1.gblx.mgmt.Level3.net.domain: 16399+ A? www.google.com. (32)
02:39:30.448623 ARP, Request who-has 10.0.2.2 tell 10.0.2.15, length 28
02:39:30.449542 ARP, Reply 10.0.2.2 is-at 52:54:00:12:35:02 (oui Unknown), length 46
02:39:30.455255 IP 10.0.2.15.42932 > google-public-dns-a.google.com.domain: 16399+ A? www.google.com. (32)
02:39:30.547000 IP google-public-dns-a.google.com.domain > 10.0.2.15.42932: 16399 8/0/0 A 203.113.129.184, A 203.113.129.187, A 203.113.129.181, A 203.113.129.185, A 203.113.129.186, A 203.113.129.182, A 203.113.129.180, A 203.113.129.183 (160)
02:39:30.547521 IP 10.0.2.15 > 203.113.129.184: ICMP echo request, id 62798, seq 1, length 64
02:39:30.602657 IP 203.113.129.184 > 10.0.2.15: ICMP echo reply, id 62798, seq 1, length 64
02:39:30.603036 IP 10.0.2.15.38095 > alu7750testscr.xyz1.gblx.mgmt.Level3.net.domain: 45677+ PTR? 184.129.113.203.in-addr.arpa. (46)
02:39:35.608456 IP 10.0.2.15.57237 > google-public-dns-a.google.com.domain: 45677+ PTR? 184.129.113.203.in-addr.arpa. (46)
02:39:35.685650 IP google-public-dns-a.google.com.domain > 10.0.2.15.57237: 45677 NXDomain 0/1/0 (116)
02:39:35.686025 IP 10.0.2.15 > 203.113.129.184: ICMP echo request, id 62798, seq 2, length 64
02:39:35.726270 IP 203.113.129.184 > 10.0.2.15: ICMP echo reply, id 62798, seq 2, length 64
02:39:36.687875 IP 10.0.2.15 > 203.113.129.184: ICMP echo request, id 62798, seq 3, length 64
02:39:36.725882 IP 203.113.129.184 > 10.0.2.15: ICMP echo reply, id 62798, seq 3, length 64
02:39:37.689496 IP 10.0.2.15 > 203.113.129.184: ICMP echo request, id 62798, seq 4, length 64

Bước 2: Vận hành Snort chế độ IDS

Trong 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
[root@C2 snort-2.9.8.3]# cp ./etc/* /etc/snort
[root@C2 snort]# ls -l /etc/snort/
total 328
-rw-r--r--. 1 root root   1281 Oct 19 10:53 attribute_table.dtd
-rw-r--r--. 1 root root   3757 Oct 19 10:53 classification.config
-rw-r--r--. 1 root root  23058 Oct 19 10:53 file_magic.conf
-rw-r--r--. 1 root root  31971 Oct 19 10:53 gen-msg.map
-rw-r--r--. 1 root root  13257 Oct 19 10:53 Makefile
-rw-r--r--. 1 root root    190 Oct 19 10:53 Makefile.am
-rw-r--r--. 1 root root  12306 Oct 19 10:53 Makefile.in
-rw-r--r--. 1 root root    687 Oct 19 10:53 reference.config
-rw-r--r--. 1 root root  26804 Oct 19 10:53 snort.conf
-rw-r--r--. 1 root root   2335 Oct 19 10:53 threshold.conf
-rw-r--r--. 1 root root 160606 Oct 19 10:53 unicode.map

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:

  • HOME_NET: đây là mạng hoặc máy trạm mà Snort sẽ bảo vệ (tùy theo chế độ hoạt động là network-based hay host-based). Trong bước này, ta sử dụng Snort để bảo vệ một máy chủ Web thuộc vùng DMZ (xem hình vẽ trong bài thực hành số 1) có địa chỉ IP là 192.168.2.10.
  • EXTERNAL_NET: là vùng bên ngoài, không cần được giám sát. Nó sẽ là tất cả các mạng & các máy trạm mà không thuộc HOME_NET.
  • RULE_PATH: thư mục chứa các luật xử lý gói tin. Thiết lập giá trị để thư mục này là /etc/snort/rules.
  • Tạm thời ta chưa sử dụng các chức năng nhúng modul động (dynamic) trong Snort nên comment tham sô dynamicdetection.
  • Tạm thời ta sẽ tự thiết lập các rule cho Snort mà không dùng các rule có sẵn. Vì vậy khai báo include file chứa rule (/etc/snort/rules/myrules.rules) và comment tất cả các lênh include các rule có sẵn.
  • Khai báo thư mục chứa các danh sách white (các trạm an toàn) và black (các trạm nghi vấn) cũng là thư mục RULE_PATH.

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
. . .
# Setup the network addresses you are protecting
ipvar HOME_NET 192.168.2.10

# Set up the external network addresses. Leave as "any" in most situations
ipvar EXTERNAL_NET !$HOME_NET
. . .
# Path to your rules files (this can be a relative path)
# Note for Windows users:  You are advised to make this an absolute path,
# such as:  c:\snort\rules
var RULE_PATH ./rules
. . .
# path to dynamic rules libraries
# dynamicdetection directory /usr/local/lib/snort_dynamicrules
. . .
# my rules
include $RULE_PATH/myrules.rules

# site specific rules
# include $RULE_PATH/local.rules
# include $RULE_PATH/app-detect.rules
. . .
var WHITE_LIST_PATH ./rules
var BLACK_LIST_PATH ./rules

 

Khi khởi động Snort, mặc định nó cần đọc các file white_list.rulesblack_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
[root@C2 rules]# touch /etc/snort/rules/white_list.rules
[root@C2 rules]# touch /etc/snort/rules/myrules.rules
[root@C2 rules]# ls -l /etc/snort/rules/
total 4
-rw-r--r--. 1 root root  0 Oct 19 10:25 black_list.rules
-rw-r--r--. 1 root root  0 Oct 19 10:24 white_list.rules
-rw-r--r--. 1 root root  0 Oct 19 10:26 myrules.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
Running in IDS mode

        --== Initializing Snort ==--
. . .
Acquiring network traffic from "eth2".
Reload thread starting...
Reload thread started, thread 0x7f3ee96d0700 (23465)
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

           Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 2.6  <Build 1>
Preprocessor Object: SF_SIP  Version 1.1  <Build 1>
Preprocessor Object: SF_POP  Version 1.0  <Build 1>
Preprocessor Object: SF_SDF  Version 1.1  <Build 1>
Preprocessor Object: SF_FTPTELNET  Version 1.2  <Build 13>
Preprocessor Object: SF_IMAP  Version 1.0  <Build 1>
Preprocessor Object: SF_REPUTATION  Version 1.1  <Build 1>
Preprocessor Object: SF_SSH  Version 1.1  <Build 3>
Preprocessor Object: SF_DNP3  Version 1.1  <Build 1>
Preprocessor Object: SF_DCERPC2  Version 1.0  <Build 3>
Preprocessor Object: SF_SMTP  Version 1.1  <Build 9>
Preprocessor Object: SF_GTP  Version 1.1  <Build 1>
Preprocessor Object: SF_DNS  Version 1.1  <Build 4>
Preprocessor Object: SF_SSLPP  Version 1.1  <Build 4>
Preprocessor Object: SF_MODBUS  Version 1.1  <Build 1>
Commencing packet processing (pid=23464)

Bước 3: Luật đơn giản cảnh báo truy nhập từ bên ngoài

Snort đã 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.
a) Phát hiện truy cập ssh
Giả sử cần cảnh báo khi xuất hiện truy nhập ssh từ một máy ở xa vào HOME_NET. Luật được thiết lập trong file myrules.rules như sau:

[root@C2 rules]# cat /etc/snort/rules/myrules.rules
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"incoming SSH connection!"; flags:S; sid:10000;)

Cú pháp của luật này như sau:

  • alert: thực hiện cảnh báo khi xuất hiện hoạt động khớp với khai báo của luật.
  • tcp: luật được thiết lập dựa trên thông số của gói tin TCP. Có thể thay thông số này bằng các loại gói tin khác như UDP, IP, ICMP, v.v..
  • $EXTERNAL_NET any -> $HOME_NET 22: điều kiện kiểm tra là gói tin đến từ bất cứ trạm nào trong EXTERNAL_NET và từ bất cứ cổng nào, gửi đến HOME_NET cổng 22 (là cổng mà dịch vụ SSH đang hoạt động).
  • msg:"incoming SSH connection!": hiển thị thông báo cảnh báo.
  • flags:S: điều kiện hạn chế lọc gói tin. Khi thực hiện một kết nối TCP đến cổng 22, có rất nhiều gói tin được gửi đến. Điều kiện lọc dựa trên nguồn và đích (địa chỉ & cổng) sẽ tạo ra nhiều cảnh báo cho cùng một hành động ssh. Thủ thuật ở đây là dựa vào thông điệp SYN. Ta biết rằng các kết nối TCP luôn phải bắt đầu bằng quá trình bắt tay 3 bước với các thông điệp SYN, ACK SYN, ACK. Vậy nên nếu lọc bổ sung thêm các thông điệp này (flags:S tương ứng với thông điệp SYN) sẽ chỉ tạo ra 1 cảnh bảo cho 1 hành động SSH.
  • sid:10000: mã số để khớp giữa cảnh báo với luật. Ví dụ khi cần liệt kê các cảnh báo theo từng luật thì có thể căn cứ vào sid của luật để lọc các cảnh báo.

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! [**]
[Priority: 0]
10/19-11:41:35.096890 192.168.2.25:38559 -> 192.168.2.10:22
TCP TTL:64 TOS:0x0 ID:49678 IpLen:20 DgmLen:60 DF
******S* Seq: 0x3467110D  Ack: 0x0  Win: 0x3908  TcpLen: 40
TCP Options (5) => MSS: 1460 SackOK TS: 3724035 0 NOP WS: 6  

b) Phát hiện kết nối ping
Có thể bổ sung luật mới để phát hiện ai đó đang ping vào hệ thống:

[root@C2 rules]# cat /etc/snort/rules/myrules.rules
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"incoming SSH connection!"; flags:S; sid:10000;)
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"soomeone ping me!"; sid:10001;)

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! [**]
[Priority: 0]
10/19-11:57:21.361893 192.168.2.25 -> 192.168.2.10
ICMP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:54020   Seq:1  ECHO

[**] [1:10001:0] soomeone ping me! [**]
[Priority: 0]
10/19-11:57:22.364432 192.168.2.25 -> 192.168.2.10
ICMP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:54020   Seq:2  ECHO

Bước 4: Cảnh báo truy nhập từ bên trong đến một nội dung nhạy cảm

Cầ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
[**] [1:10003:0] terrorism contact! [**]
[Priority: 0]
10/21-12:47:40.222111 10.0.2.15:45708 -> 118.69.16.14:80
TCP TTL:64 TOS:0x0 ID:21096 IpLen:20 DgmLen:1294 DF
***AP*** Seq: 0x81B33DB6  Ack: 0x2AB3C524  Win: 0x9C4E  TcpLen: 20

 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 sfportscan

Qué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 đó nmap là 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
. . .
Package 2:nmap-5.51-4.el6.x86_64 already installed and latest version
Nothing to do

[root@C1 ~]# nmap -v -A 192.168.2.10

Starting Nmap 5.51 ( http://nmap.org ) at 2016-10-21 04:57 EDT
NSE: Loaded 57 scripts for scanning.
Initiating ARP Ping Scan at 04:57
Scanning 192.168.2.10 [1 port]
Completed ARP Ping Scan at 04:57, 0.00s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 04:57
Completed Parallel DNS resolution of 1 host. at 04:57, 0.03s elapsed
Initiating SYN Stealth Scan at 04:57
Scanning 192.168.2.10 [1000 ports]
Discovered open port 22/tcp on 192.168.2.10
Discovered open port 6000/tcp on 192.168.2.10
Completed SYN Stealth Scan at 04:57, 0.15s elapsed (1000 total ports)
Initiating Service scan at 04:57
Scanning 2 services on 192.168.2.10
Completed Service scan at 04:57, 6.01s elapsed (2 services on 1 host)
Initiating OS detection (try #1) against 192.168.2.10
Retrying OS detection (try #2) against 192.168.2.10
Retrying OS detection (try #3) against 192.168.2.10
Retrying OS detection (try #4) against 192.168.2.10
Retrying OS detection (try #5) against 192.168.2.10
NSE: Script scanning 192.168.2.10.
Initiating NSE at 04:57
Completed NSE at 04:57, 0.13s elapsed
Nmap scan report for 192.168.2.10
Host is up (0.00047s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 5.3 (protocol 2.0)
| ssh-hostkey: 1024 24:59:54:fe:47:1e:63:ce:61:b3:5b:f6:b5:83:58:ec (DSA)
|_2048 42:95:fe:74:4c:17:65:58:72:75:2c:8d:34:8e:c7:7b (RSA)
6000/tcp open  X11     (access denied)
MAC Address: 08:00:27:1B:C2:02 (Cadmus Computer Systems)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=5.51%D=10/21%OT=22%CT=1%CU=35217%PV=Y%DS=1%DC=D%G=Y%M=080027%TM=5
OS:809D884%P=x86_64-redhat-linux-gnu)SEQ(SP=101%GCD=1%ISR=107%TI=Z%CI=Z%II=
OS:I%TS=A)OPS(O1=M5B4ST11NW7%O2=M5B4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7%
OS:O5=M5B4ST11NW7%O6=M5B4ST11)WIN(W1=3890%W2=3890%W3=3890%W4=3890%W5=3890%W
OS:6=3890)ECN(R=Y%DF=Y%T=40%W=3908%O=M5B4NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=
OS:O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD
OS:=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0
OS:%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1
OS:(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI
OS:=N%T=40%CD=S)

Uptime guess: 0.171 days (since Fri Oct 21 00:51:40 2016)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=257 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: OS: Unix

TRACEROUTE
HOP RTT     ADDRESS
1   0.47 ms 192.168.2.10

Read data files from: /usr/share/nmap
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 19.26 seconds
Raw packets sent: 1111 (52.918KB) | Rcvd: 1079 (46.702KB)

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.
Để phát hiện và cảnh báo một cuộc tấn công quét cổng như vậy, các luật đơn giản kiểm tra thông tin của từng gói tin riêng rẽ sẽ không xử lý được. Snort cung cấp cơ chế preprocessor và các luật prepresessor để phát hiện các dạng tấn công “tổ hợp” như vậy. Một cách khái quát, preprocessor là cách thức Snort chấp nhận thêm các modul (plugin) tiền xử lý gói tin. Các modul này được người dùng cài đặt thêm (bằng cách sử dụng thư viện hàm Snort API) và gắn vào Snort để nhận được các gói tin và xử lý chúng trước khi gói tin được chuyển cho máy xử lý trung tâm của Snort. Tùy vào từng mục đích riêng mà mỗi modul có thể kiểm tra các thông tin trong gói tin, thay đổi các thông tin này, rồi chuyển cho Snort xử lý. Một ví dụ là modul xử lý các gói tin tấn công dịch vụ web. Giả sử vùng chứa các script web admin (cần được bảo về) được đặt tại URL http://example.com/admin và Snort được thiết lập cảnh báo hoặc cấm truy nhập từ bên ngoài đến URL này. Tuy nhiên, một số biến thể của URL sẽ cho kết quả tương tự, ví dụ như http://example.com/./admin. Modul chuẩn hóa các gói tin HTTP cài đặt dạng preprocessor sẽ kiểm tra và chuyển tất cả các biến thể URL này trở thành URL đúng và chuyển cho Snort xử lý. Sơ đồ bên dưới mô tả vai trò và vị trí của các preprocessor trong kiến trúc Snort.


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
# Portscan detection.  For more information, see README.sfportscan
preprocessor sfportscan: proto  { all } scan_type { all } sense_level { low }

[root@C2 tmp]# cat /etc/snort/snort.conf | grep preprocessor.rules
include $PREPROC_RULE_PATH/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:

[root@C2 ~]# tail -f /var/log/snort/alert
[**] [122:1:1] (portscan) TCP Portscan [**]
[Classification: Attempted Information Leak] [Priority: 2]
10/21-16:22:17.259813 192.168.2.25 -> 192.168.2.10
PROTO:255 TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:159 DF