Snort е напишан од страна на Мартин Роеш во 1998 година, и е систем за спречување и детекција на наметнувања, кој своите методи на инспекција ги извршува со помош на креирани потписи, протоколи и аномалии. Snort работи на различни дистрибуции на Linux и на Windows платформи. Во овој текст, ќе инсталираме и конфигурираме Snort на Fedora 8 од RedHat. Доколку сте заинтересирани за инсталација на Snort во Windows околина, можете да погледнете тука: (http://www.sans.org/resources/idfaq/snort.php).
За инсталација на Snort ќе ви бидат потребни две библиотеки и самиот Snort:
1. libpcap, или API за фаќање на пакети, која можете да ја преземете од www.tcpdump.org
2. libpcre, или Perl Compatible Regular Expressions, која можете да ја преземете од www.pcre.org
3. SNORT, кој можете да го преземете од www.snort.org
Откако ќе ги преземете потребните податоци, прво што ќе направите е да ги инсталирате потребните библиотеки пред да го инсталираме Snort. Во мојов случај тоа би било вака:
[root@zeroscience lab]# ls
libpcap-0.9.8.tar.gzpcre-7.7.tar.gz snort-2.8.1.tar.gz
[root@zeroscience lab]# tar -zxvf libpcap-0.9.8.tar.gz; cd libpcap-0.9.8;
./configure; make; make install
[root@zeroscience
libpcap-0.9.8]#
Истото го правиме и за PCRE библиотеката:
[root@zerosciencelab]# tar -zxvf pcre-7.7.tar.gz; cd pcre-7.7; ./configure;
make; make install
[root@zeroscience
pcre-7.7]#
И на крај отпакување на Snort и негова инсталација:
[root@zeroscience lab]# tar -zxvf snort-2.8.1.tar.gz; cd snort-2.8.1; ./configure; make; make
install
[root@zeroscience snort-2.8.1]#
Отпакувањето и инсталацијата на потребните библиотеки а воедно и на Snort е завршено. Сега
почнува потешкиот дел од целиот циклус, конфигурација и сетирање на Snort во IDS мод.
После секоја инсталација на некоја апликација, како некое непишано правило е прво да се прочитаат help или manual фајловите пред да започнете со користење на софтверот. За да ги видиме опциите кои Snort ни ги нуди, пишуваме:
[root@zeroscience snort-2.8.1]# snort –?
,,_
-*> Snort! <*-
o"
)~
Version 2.8.1 (Build 28)
””
By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2008 Sourcefire
Inc., et al.
Using PCRE version: 7.7 2008-05-07
USAGE: snort [-options]
<filter options>
Options:
-A
Set alert mode: fast, full, console,
test or none
(alert file alerts only)
"unsock" enables
UNIX socket logging (experimental).
-b
Log packets in tcpdump format (much
faster!)
-B <mask>
Obfuscated IP addresses in alerts and packet
dumps using CIDR mask
-c <rules> Use Rules File
<rules>
-C
Print out payloads with character data
only (no hex)
-d
Dump the Application Layer
-D
Run Snort in background (daemon) mode
-e
Display the second layer header info
-f
Turn off fflush() calls after binary
log writes
-F <bpf>
Read BPF filters from file <bpf>
-g <gname> Run snort gid as
<gname> group (or gid) after initialization
-G <0xid>
Log Identifier (to uniquely id events for
multiple snorts)
-h <hn>
Home network = <hn>
-H
Make hash tables deterministic.
-i <if>
Listen on interface <if>
-I
Add Interface name to alert output
-k <mode>
Checksum mode
(all,noip,notcp,noudp,noicmp,none)
-K <mode>
Logging mode (pcap[default],ascii,none)
-l <ld>
Log to directory <ld>
-L <file>
Log to this tcpdump file
-M
Log messages to syslog (not alerts)
-m <umask> Set umask =
<umask>
-n <cnt>
Exit after receiving <cnt> packets
-N
Turn off logging (alerts still work)
-o
Change the rule testing order to
Pass|Alert|Log
-O
Obfuscate the logged IP addresses
-p
Disable promiscuous mode sniffing
-P <snap>
Set explicit snaplen of packet (default:
1514)
-q
Quiet. Don’t show banner and status
report
-r <tf>
Read and process tcpdump file <tf>
-R <id>
Include ‘id’ in snort_intf<id>.pid
file name
-s
Log alert messages to syslog
-S <n=v>
Set rules file variable n equal to value v
-t <dir>
Chroots process to <dir> after
initialization
-T
Test and report on the current Snort
configuration
-u <uname> Run snort uid as
<uname> user (or uid) after initialization
-U
Use UTC for timestamps
-v
Be verbose
-V
Show version number
-w
Dump 802.11 management and control
frames
-X
Dump the raw packet data starting at
the link layer
-y
Include year in timestamp in the alert
and log files
-Z <file>
Set the performonitor preprocessor file path
and name
-?
Show this information
<Filter Options> are
standard BPF options, as seen in TCPDump
Longname options and their
corresponding single char version
–logid <0xid>
Same as -G
–perfmon-file <file>
Same as -Z
–pid-path <path>
Specify the path for the Snort
PID file
–snaplen <snap>
Same as -P
–help
Same as -?
–version
Same as -V
–alert-before-pass
Process alert, drop, sdrop, or
reject before pass, default is pass before alert, drop,…
–treat-drop-as-alert
Converts drop, sdrop, and reject
rules into alert rules during startup
–process-all-events
Process all queued events (drop,
alert,…), default stops after 1st action group
–dynamic-engine-lib <file>
Load a dynamic detection engine
–dynamic-engine-lib-dir <path> Load
all dynamic engines from directory
–dynamic-detection-lib <file>
Load a dynamic rules library
–dynamic-detection-lib-dir <path>
Load all dynamic rules libraries from directory
–dump-dynamic-rules <path>
Creates stub rule files of all loaded rules
libraries
–dynamic-preprocessor-lib <file>
Load a dynamic preprocessor library
–dynamic-preprocessor-lib-dir <path>
Load all dynamic preprocessor libraries from directory
–dump-dynamic-preproc-genmsg
<path>
Creates gen-msg.map files
of all loaded preprocessor libraries
–create-pidfile
Create PID file, even when not
in Daemon mode
–nolock-pidfile
Do not try to lock Snort PID
file
–disable-inline-initialization Do not
perform the IPTables initialization in inline mode.
–pcap-single <tf>
Same as -r.
–pcap-file <file>
file that contains a list of
pcaps to read – read mode is implied.
–pcap-list "<list>"
a space separated list of pcaps to
read – read mode is implied.
–pcap-dir <dir>
a directory to recurse to look
for pcaps – read mode is implied.
–pcap-filter <filter>
filter to apply when getting pcaps
from file or directory.
–pcap-no-filter
reset to use no filter when
getting pcaps from file or directory.
–pcap-loop <count>
this option will read the pcaps
specified on command line continuously.
for
<count> times.
A value of 0 will
read until Snort is terminated.
–pcap-reset
if reading multiple pcaps,
reset snort to post-configuration state before reading next pcap.
–pcap-show
print a line saying what
pcap is currently being read.
–exit-check <count>
Signal termination after
<count> callbacks from pcap_dispatch(), showing the time it
takes from
signaling until pcap_close() is called.
[root@zeroscience
snort-2.8.1]#
Од дадениот опис на секоја
опција, мислам дека е повеќе од јасно која опција зошто служи зависно од вашите
потреби.
Snort може да биде
стартуван во 3 различни модови, и тоа:
– Sniffer mode
– Packet logger mode
–
Intrusion Detection System mode
1. Sniffer mode или прислушкување може да се стартува на следниот начин:
[root@zeroscience snort-2.8.1]# ./snort -v -d -e
Што значи: (-v) verbose mode, или да излистува на конзолата што се случува, (-d) dump the application layer, или да ги прикаже информациите од application layer од OSI моделот и (-e) display the second header layer info, или да ги прикаже информациите од вториот хедер слој на пакетот.
2. Packet logger mode или запишување на секој пакет или мрежен сообраќај кој поминува низ мрежата во некој log фајл. Се стартува на следниот начин:
[root@zeroscience snort-2.8.1]# ./snort -dev -l log_folder
Исто што и:
[root@zeroscience snort-2.8.1]# ./snort -d -e -v -l log_folder
Што значи: (-dev) односно -d -e -v, исто како горенаведниот пример за sniffer mode, само што во packet logger mode имаме додатна опција -l folder со која специфицираме име на фолдерот каде што ќе се запишуваат сите информации од прислушкувањето.
3. Intrusion Detection System mode или систем за детекција на наметнувања кој служи за детекција на некои мрежни аномалии и неправилности или напади од страна на злонамерни напаѓачи. Пред да го стартуваме Snort во IDS мод, прво што треба да направиме е да креираме .conf податок во кој ќе бидат напишани правила (rules) според кои Snort ќе извршува дадени инструкции врз детектираните потписи.
Бидејќи пишувањето на правила зависи од вашите потреби, ќе прегледаме неколку примери со нивно објаснување за да добиете некаков увид.
После инсталацијата на Snort, нема никаков .conf фајл (snort rule file), ние ќе треба да направиме таков од почеток. Креираме фајл по име snort.conf во кој ќе почнеме со запишување на правилата:
[root@zeroscience snort-2.8.1]# touch snort.conf
[root@zeroscience snort-2.8.1]# nano snort.conf
Пред да почнеме да пишуваме, првин, да објасниме каква е структурата на пишување на правилата за Snort.
Структурата би изгледала вака:
1. [log, pass, alert]
2. [ip, icmp, tcp, udp]
3. [any, destination address]
4. [any, destination port]
5. [->, <>, <-]
6. [any, source address]
7. [any, source port]
8. [msg, content, offset, depth, content-list,
dsize, flags, nocase, reference, pcre, logto, minifrag, ttl, id, seq, ack,
itype, icode, session]
Односно:
За пример, една линија во snort.conf фајлот би изгледала вака:
alert tcp any 80 -> 192.168.1.0/24 any (content-list: "poker"; msg: "Sovapgjanje na zborot poker"; nocase)
Горенаведената линија или правило, не известува (alert) за секој доаѓачки пакет од портот 80 (http) до внатрешната мрежа 192.168.1.0/24 доколку во мрежниот пакет постои зборот "poker" при што се испишува порака: "Sovpagjanje na zborot poker" во log фајлот, доколку сакате да видите дали вашите вработени сурфаат на сајтови поврзани со покер и коцкање. :-P
Објаснување на полињата во фајлот со правила:
Snort разликува 3 видови на акции или rule actions:
– log (запишување на пакетот)
– alert (известување според специфициран метод и запишување на пакетот)
– pass (го пушта или игнорира пакетот)
За време на ова пишување, Snort разликува 4 видови на протоколи:
– ip
– icmp
– tcp
– udp
Потоа следи внесување на IP адреса како и внесување на subnet со помош на CIDR блокот. Доколку сакате да специфицирате било која IP адреса, внесувате: any.
Истото важи и за портовите. Можете да внесете any за било кој порт или пак домет во стилот:
– 21:25
(сите портови од 21 до 25)
– 21: (портови од 21 па
нагоре)
– :21 (портови помали или еднакви на 21)
Напомена: Можете да го користите и знакот "!" за негација односно исклучување на IP адреса или порт, како на пример: !21:25, би ги пратело сите портови освен тие од 21 до 25.
Операторите за насока односно direction operators (->, <> и <-) се користат за
ориентација (насоката) на сообраќајот за која правилата важат.
И за крај тука се опциите на правилата, односно:
– msg, content, offset, depth, content-list, dsize, flags, nocase, reference, pcre, logto, minifrag, ttl, id, seq,
ack, itype, icode, gid, sid, rev, classtype, priority, metadata, session, rawbytes, distance, within и уште многу други за кои можете детално да прочитате на следнава страна: (http://www.snort.org/docs/snort_htmanuals/htmanual_281/node191.html)
Откако видовме каква е структурата на Snort правилата, можеме да почнеме да ги пишуваме
нашите правила во snort.conf фајлот.
Напомена: На крајот од секоја напишана линија, мора да стои знакот "" за избегнување на секакви нови редови во snort.conf фајлот (carriage
return), за да не ја добиваме следната порака:
[root@zeroscience snor-2.8.1]# ./snort -dev -l ./log_folder
-h 192.168.1.0/24 -c snort.conf
Initializing rule chains…
ERROR: Unterminated rule in
file snort.conf, line 1
(Snort rules must be contained on a single line or
on multiple lines with a ” continuation
character
at the end of the line, make sure there are no
carriage returns before the end of this line)
Fatal Error, Quitting..
[root@zeroscience
snort-2.8.1]#
Пишуваме во веќе отворениот snort.conf фајл:
alert tcp any any -> any any (msg: "Detektiran TCP paket")
и го сочувуваме документот.
Го стартуваме Snort во IDS мод со следниве опции:
[root@zeroscience snort-2.8.1]# snort -dev -l ./log_folder
-h 192.168.1.0/24 -c snort.conf
Running in IDS mode
–== Initializing Snort ==–
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file snort.conf
Tagged Packet Limit: 256
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains…
0 Snort rules read
0 detection rules
0 decoder rules
0 preprocessor rules
0 Option Chains linked into 0
Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
+——————-[Rule Port
Counts]—————————————
|
tcp
udp
icmp
ip
|
src
0
0
0
0
|
dst
0
0
0
0
|
any
0
0
0
0
|
nc
0
0
0
0
|
s+d
0
0
0
0
+—————————————————————————-
+———————–[thresholding-config]———————————-
| memory-cap : 1048576 bytes
+———————–[thresholding-global]———————————-
| none
+———————–[thresholding-local]———————————–
| none
+———————–[suppression]——————————————
| none
——————————————————————————-
Rule application order:
activation->dynamic->pass->drop->alert->log
Log directory = ./log_folder
Verifying Preprocessor
Configurations!
0 out of 512 flowbits in use.
***
*** interface device lookup
found: eth0
***
Initializing Network Interface
eth0
OpenPcap() device eth0 network
lookup:
eth0: no IPv4 address assigned
Decoding Ethernet on interface
eth0
–== Initialization Complete ==–
,,_
-*> Snort! <*-
o"
)~
Version 2.8.1 (Build 28)
””
By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2008 Sourcefire
Inc., et al.
Using PCRE version: 7.7 2008-05-07
Not Using PCAP_FRAMES
05/26-17:33:05.321647
0:C:6E:C5:B7:F6 -> FF:FF:FF:FF:FF:FF type:0x800 len:0x156
0.0.0.0:68 ->
255.255.255.255:67 UDP TTL:16 TOS:0x10 ID:0 IpLen:20 DgmLen:328
Len: 300
01 01 06 00 BD C2 1F 3E 00 00
00 00 00 00 00 00
…….>……..
00 00 00 00 00 00 00 00 00 00
00 00 00 0C 6E C5
…………..n.
B7 F6 00 00 00 00 00 00 00 00
00 00 00 00 00 00
…………….
00 00 00 00 00 00 00 00 00 00
00 00 63 82 53 63
…………c.Sc
35 01 01 32 04 C0 A8 01 03 0C
0F 7A 65 72 6F 73
5..2…….zeros
63 69 65 6E 63 65 2E 6F 72 67
37 0A 01 1C 02 03
cience.org7…..
0F 06 0C 28 29 2A FF 00 00 00
00 00 00 00 00 00
…()*……….
00 00 00 00 00 00 00 00 00 00
00 00
…………
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
05/26-17:33:10.000880
0:C:6E:C5:B7:F6 -> FF:FF:FF:FF:FF:FF type:0x800 len:0x156
0.0.0.0:68 ->
255.255.255.255:67 UDP TTL:16 TOS:0x10 ID:0 IpLen:20 DgmLen:328
Len: 300
01 01 06 00 BD C2 1F 3E 00 05
00 00 00 00 00 00
…….>……..
00 00 00 00 00 00 00 00 00 00
00 00 00 0C 6E C5
…………..n.
B7 F6 00 00 00 00 00 00 00 00
00 00 00 00 00 00
…………….
00 00 00 00 00 00 00 00 00 00
00 00 63 82 53 63
…………c.Sc
35 01 01 32 04 C0 A8 01 03 0C
0F 7A 65 72 6F 73
5..2…….zeros
63 69 65 6E 63 65 2E 6F 72 67
37 0A 01 1C 02 03
cience.org7…..
0F 06 0C 28 29 2A FF 00 00 00
00 00 00 00 00 00
…()*……….
00 00 00 00 00 00 00 00 00 00
00 00
…………
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
[4]+
Stopped
snort -dev -l ./log_folder -h
192.168.1.0/24 -c snort.conf
[root@zeroscience
snort-2.8.1]#
Во овој случај, се забележува дека имаме детекција на некоја активност според пишаното правило. Запишано известување дека имаме мрежен сообраќај преку TCP протоколот од IP адресата
0.0.0.0:68 (DHCP) -> 255.255.255.255:67 (Broadcast), серверот комуницира со мрежата за споделување на IP адреси и разрешување на нивните имињата (zeroscience.org).
[root@zeroscience snort-2.8.1]# cd log_folder/
[root@zeroscience log_folder]# ls
alert snort.log.1211815696
[root@zeroscience log_folder]#
За да овој текст не излезе премногу за листање, бидејќи Snort системот е одлично документиран на интернет и можете да наидете на многу туторијали и детални објаснувања за се што се наоѓа во него и како работи, ќе прикажам неколку примери на Snort правила:
alert icmp any any -> any any (msg: "ICMP Packet found")
alert icmp any any -> 192.168.1.113/32 any (msg: "Ping with TTL=100"; ttl:100)
alert icmp ![192.168.2.0/24] any -> any any (msg: "Ping with TTL=100";
ttl: 100)
log tcp 192.168.2.0/24 23 -> any any (content: "confidential"; msg: "Detected confidential")
alert udp any 1024:2048 -> any any (msg: "UDP ports")
log udp any !53 -> any any log udp
alert tcp any 80
-> 192.168.1.0/24 any (content-list: "porn-word"; msg:
"Porn word matched"; offset: 40; depth: 1000; nocase)
alert ip any any
-> any any (pcre:"/%[0-9.]*$?(i|n|x|s|h|e|g|a){3}/";
msg: "Format string")
alert tcp any any
-> any 80 (content:"(GET|HEAD|POST)"; nocase; msg: "Web
server on port 80")
alert ip any 80
-> any any (content:"Server: Microsoft-IIS"; nocase; depth:200;
msg: "Source is an IIS server")
alert tcp
any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg:
"mountd access")
alert tcp
any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; flags: PA;
msg: "CGI-PHF probe")
alert tcp
any any -> 192.168.1.0/24 21 (content: "USER root"; msg: "FTP
root login")
alert tcp
any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh";
msg: "IMAP buffer overflow!")
…
…
Користена литература:
http://www.snort.org
http://www.informit.com/articles/article.aspx?p=101171&seqNum=1
http://www.snort.org/docs/iss-placement.pdf
http://www.sans.org/resources/idfaq/snort.php
http://www.tcpdump.org
http://www.pcre.org
http://www.ussrback.com/docs/papers/IDS/snort_rules.htm
http://www.snort.org/docs/snort_htmanuals/htmanual_281/
O’Reilly –
Security Power Tools, 2007
McGraw Hill – GrayHat
Hacking 2nd Edition, 2007
The Tao of Network Security Monitoring : Beyond Intrusion Detection by Richard Bejtlich
http://public.lanl.gov/cpw/snort.conf.html