SNORT
Дмитрий
Рожков
UNIX
администратор в ИД „Питер“
rojkov@piter.com
29
януари 2001 || Библиотека
ЛинуксЦентър
Колкото и
добре да е защитен един web-server или шлюз
към Internet, винаги съществува възможност
за пробив в него. И за системният
администратор ще е по-добре да разбере
за тези опити още преди да е осъществен
самият пробив. Затова средствата,
позволяващи не само откриването на
факта на проникване в системата, но и
способни да предупреждават за подобни
нахлувания, са от особена важност.
Съществуват
два вида системи за откриване на
нарушители
– към първите спадат програмите,
откриващи аномалии във функционирането
на системите, например необичайно голямо
количество едновременно работещи
процеси, увеличен трафик през интерфейсите
на системата и други подобни. Към вторите
се отнасят системите за откриване на
нарушители, работата на които се състои
в търсенето на предварително известни
признаци на атаки. Що се отнася до
програмата Snort, тя смело може да бъде
причислена и към двата вида. Благодарение
на своята отворена архитектура, Snort може
лесно да бъде разширена и допълнена за
решаване на различни задачи.
Тази
статия
не претендира да е всеобхватно ръководство
по Snort, а е един доста свободен превод
на ръководството, написано от Martin Roesh,
смесен с моите собствени мисли.
Изчерпателна информация за това, какво
представлява Snort и как да го използвате,
може да се намери на http://www.snort.org/.
Какво
представлява Snort? Snort е мрежова система
за откриване на нарушители, способна
да извършва в реално време анализ на
трафика, предаван по контролирания
интерфейс, с цел откриване на опити за
пробиви или опити за търсене на уязвимости
(такива като препълване на буфера,
сканиране на портове, CGI-атаки,
идентифициране на операционната система,
идентифициране на версиите на използваните
мрежови услуги и други такива). Гъвкавостта
и удобството на Snort са основани на
следните три фактора:
наличие
на език за създаване на правила,
използван за описване на свойствата
на подозрителен и потенциално опасен
трафик;
механизъм
за известяване при откриване на атака;
модулна
архитектура на кода, анализиращ трафика,
основан на концепцията за допълнително
включвани модули.
Трябва да
отбележим, че процедурите, декодиращи
мрежовия трафик, работят в каналния
през мрежовия и транспортния до приложния
слой.
В момента Snort поддържа декодиране за
протоколите Ethernet, SLIP и PPP.
Нека
разгледаме най-важният от гледна точка
на потребителя компонент – езика за
създаване на правилата. Правилата се
задават в конфигурационния файл на
Snort, като техният синтаксис е достатъчно
прост:
ACTION
PROTO IP_ADDR1 PORT1 DIRECTION IP_ADDR2 PORT2
[ (OPTIONS)
ACTION
Има три
основни директиви, определящи последващите
действия при откриване на мрежов пакет,
отговарящ на някое от правилата – pass,
log и alert.
Директивата
pass означава пакета
просто да бъде игнориран. Директивата
log определя пакетът
да бъде подложен на процедурата за
запис, избрана от потребителя за последващ
запис в дневника. И последната директива
– alert
генерира съобщение за открит пакет,
който удовлетворява правилото – пак
по определен от потребителя начин и
след това предава пакета на процедурата
за записване в дневника за по-късен
анализ.
Могат да
се
използват още две директиви – activate
и dynamic. Те
позволяват
за някакво множество пакети, удовлетворяващи
някакво правило да бъде повикано друго
правило. Например, може
да се наложи при откриване на пакет с
явни признаци за атака с препълване на
буфера, да се генерира съобщение за
атаката и да се запишат в дневника
няколко от следващите пакети за последващ
техен анализ. Тази функционалност се
постига със съвместното използване на
директивите activate и
dynamic. Освен това, има
възможност за създаване на собствени
директиви, асоциирайки ги с една или
няколко процедури на запис в дневника.
Например, определението
ruletype redalert
{
type alert
output alert_syslog: LOG_AUTH
LOG_ALERT
output database: log, mysql,
user=snort
dbname= snort host= localhost
}
създава
нова директива redalert,
генерираща съобщение, което се предава
на syslog и записваща
след това информацията за открития
пакет в база данни MySQL.
PROTO
В момента,
за анализ са достъпни
три протокола и съответно, са
допустими три значения на този параметър
– tcp,
udp и icmp.
Възможно е в бъдеще да се появи поддръжка
и на arp, ipx,
igrp, gre,
rip,
ospf и други.
IP_ADDR
В Snort
няма
механизъм за разпознаване на имена (и
надали ще се появи някога – от съображения
за производителност), затова е необходимо
за задаване на хостовете да се използват
техните IP адреси. Ключовата дума any
позволява задаването на всички възможни
адреси, а за задаване на подмрежи се
използва CIDR запис.
Символът ! обръща
обратно условието – !192.168.3.0/24
означава всеки непринадлежащ на
подмрежата 192.168.3.0/24
IP адрес. Освен това може да се задават
и списъци от адреси, разделяйки ги със
запетайка и затваряйки ги в квадратни
скоби – например [192.168.2.0/24,
192.169.3.54/32].
PORT
Посочването
на портовете се извършва по същия начин,
както и при ipchains. Освен един единствен
порт, може да задаваме и диапазон от
портове, като ги разделим с двоеточие,
например 6000:6010 –
портове от 6000 до 6010 включително, :1024
– всички портове от 1 до 1024, 1024:
– всички портове от 1024 до 65535. Както при
задаването на IP адресите, символът !
обръща обратно условието, а ключовата
дума any означава всички
портове.
DIRECTION
Този
оператор
позволява да определим посоката на
движение на пакета:
->
(едностранно) – правилото ще се прилага
само върху пакети, идващи от IP_ADDR1 към
IP_ADDR2;
(двустранно) – направлението на движение
на пакета е без значение.
OPTIONS
Затворените
в кръгли скоби параметри са незадължителни
части от правилото и в същото време са
най-важната част от системата за откриване
на нахлуване. Параметрите могат да
определят текста на съобщението за
заплаха от нахлуване, д задават
допълнителни действия при задействане
на правилото, както и допълнителни
условия за съответствие на анализираните
пакети на дадено правило.
Параметрите
се отделят един от друг с точка и запетая,
а ключовата дума на параметъра се отделя
от неговия аргумент с двоеточие. До
момента съществуват 24 параметъра, като
тяхното количество се увеличава с всяка
нова версия на програмата.
Параметрите,
задаващи допълнителни условия на
съответствие на правилото са:
ttl
– задава стойността на полето TTL в
заглавието на IP пакета;
tos
– задава стойността на полето TOS в
заглавието на IP пакета;
id
– задава стойността на полето за
фрагментиране в заглавната част на IP
пакета;
ipopts
– задава стойността на полето на
параметрите на IP пакета;
fragbits
– задава битовете на фрагментация на
IP пакета;
dsize
– задава размера на IP пакета;
flags
– задава условието за наличие или
отсъствие на определени TCP флагове;
seq
– задава номера на сегмента на TCP пакета
в последователността [от TCP пакети];
ack
– задава стойността на полето за
потвърждение в TCP пакета;
itype
– задава стойността на полето за тип
на ICMP пакета;
icode
– задава стойността на полето за код
на ICMP пакета;
icmp_id
– задава стойността на полето ICMP ECHO
ID в ICMP пакета;
icmp_seq
– задава [поредният] номер на ICMP ECHO
пакета в последователността от пакети;
content
– задава шаблон за търсене в съдържанието
на пакета, а не в неговото заглавие
(шаблона може да се задава както в
текстов, така и в шестнадесетичен вид);
content-list
– този параметър е аналогичен на
параметъра content, с
изключение на това, че списъка с
търсените шаблони се взема от файл;
offset
– използва се съвместно с параметъра
content за
определяне
на изместването в пакета, от където ще
се провежда анализ на неговото
съдържание;
depth
– аналогичен е на параметъра offset
и определя положението в пакета, до
където ще се провежда анализ на
съдържанието му;
nocase
– изключва чувствителността към
регистъра на буквите при анализа на
съдържанието на пакета;
rpc
– позволява по-точно задаване на
характеристиките на програмните или
процедурни извиквания на RPC услугите.
Както може
да се забележи, изброените параметри
позволяват създаването на правила за
прехващане практически на всякакви
пакети, които могат по някакъв начин да
застрашат сигурността на системата. А
ако отчетем, че Snort може да прехваща
пакети и от каналния слой, то неговото
използване е особено интересно на
хостове, защитени със защитни стени,
тъй като отхвърлените от защитната
стена пакети все едно ще попадат в
неговото полезрение.
Параметрите,
стойностите на които имат смисъл при
търсене на съответствие на анализирания
пакет на всички условия са:
msg
– съдържа текста на съобщението;
logto
– задава алтернативен файл за запис
в него на съдържанието на пакета;
session
– този параметър позволява включването
на една много интересна възможност на
Snort – извличането на потребителските
данни от TCP сесия, например за следващ
анализ на това, какви команди е въвеждал
потребителя по време на telnet сесия;
resp
– ако пакета отговаря на правилото,
тогава Snort ще изпълни едно от посочените
действия – например ще затвори връзката,
изпращайки TCP-RST пакет към единия от
хостовете;
react
– ще блокира посочените в правилото
web сайтове, затваряйки връзките с тях
и/или отправяйки предварително написано
съобщение към браузъра, от който е
предприет опита за достигане на някой
от посочените сайтове.
По-долу са
показани някои примери за създаване на
правила.
log
tcp any any -> 192.168.1.0/24
6000:6010
Съгласно
това правило, всички пакети, адресирани
до обикновено използваните от системата
X Windows портове на хостове от някаква
подмрежа ще бъдат записвани в дневника.
alert
tcp !192.168.1.0/24 any -> 192.168.1.0/24
any (msg:"IDS004
- SCAN-NULL Scan";flags:0; seq:0;
ack:0;)
Това правило
открива опитите за така нареченото
NULL-сканиране на портове.
alert
tcp !192.168.1.45/32 any ->
192.168.1.45/32 80
(msg:"IIS-_vti_inf"; flags:PA;
content:"_vti_inf.html";
nocase;)
Адресираните
към web сървър пакети, съдържащи в себе
си обръщение към файла _vti_inf.html се
разглеждат като опит за използване на
една от уязвимостите на Internet Information
Server и ще предизвикат при откриване на
такива пакети генериране на съобщение
за това събитие, като самият пакет ще
бъде записан в дневника.
alert
tcp any any any 6688
(msg:"Napster Client Data";
flags:PA; content:".mp3"; nocase;
resp: rst_all)
В случай
на откриване на обръщение към Napster
сървър, връзката се затваря принудително.
Както се вижда, с помощта на Snort може
да се организира по-ефективна филтрация
на нежелан трафик, отколкото ако се
затворят съответните портове с помощта
на защитна стена, тъй като имаме
възможност да
въведем
допълнително условие за съдържанието
на пакетите.
alert
tcp any 80 192.168.1.0/24 any
(content-list: "adults.txt";
msg: "Not for children!"; react:
block, msg;)
С това
правило се блокира достъпа до web сайтове,
адресите на които са описани във файла
adults.txt.
При откриване
на заявка към нежелан сървър, връзката
с него се затваря и се генерира съобщение
„Not for children!“, което освен към
дневника,
се насочва и към браузъра. По този
начин, Snort може да изпълнява функциите
на web филтър.
activate
tcp !192.168.1.0/24 any -> 192.168.1.0/24
143 (flags: PA;
content: "|E8C0FFFFFF|\bin|";
activates: 1; msg: "IMAP
buffer overflow!";) dynamic
tcp !192.168.1.0/24 any ->
192.168.1.0/24 143 (activated_by: 1; count:
50;)
Директивата
activate не
се отличава
по нищо от alert с
изключение на това, че в секцията за
параметри на правилата на директивата
activate
винаги присъства
правилото activates,
предназначено за извикване на друго
правило за изпълнение. По този начин
могат да се извикват само dynamic
правила. Директивата dynamic
от своя страна не се отличава по нищо
от директивата log. Тя
също е предназначена за запис на
пакетите в дневника, но има два
допълнителни параметъра – activated_by,
който асоциира правило dynamic
с правило activate и
count, който
указва
какво количество пакети трябва да
обработи правилото, тоест колко пакета,
следващи след прехванатия пакет трябва
да бъдат записани в дневника. Показаното
по-горе правило activate
анализира пакетите за опити за атака
с препълване на буфера и в случай, че
открие такъв пакет, извиква правило
dynamic,
което да запише
в дневника следващите 50 пакета. Ако
атаката е била успешна, анализирайки
след нея този файл, може да се установи
какви точно загуби са нанесени.
log
tcp any any 192.168.1.0/24 23
(session: printable;)
Подобно
правило винаги е полезно, когато се
налага да запазим в дневника в четлив
вид всичко, което въвежда или вижда
потребителя по време на telnet, ftp, rlogin
или
даже web сесия.
На сайта
http://www.snort.org/ има
създаден набор от готови правила, който
може да използваме за свои собствени
цели, като правилата са разделени на
няколко групи:
BackDoor
Activity;
BackDoor
Attempts;
Backdoor
Sig. Based;
Exploits;
Finger;
FTP;
ICMP;
MISC;
NetBios;
RPC;
Rservices;
Scans;
SMTP;
Sysadmin;
TELNET;
Virus - SMTP
Worms;
Web-CGI;
Web-ColdFusion;
Web-FrontPage;
Web-IIS;
Web-Misc.
Както се
вижда от наименованията на групите,
областта на приложение на Snort е много
широка. За да не се изчаква обновяването
на набора правила след публикуването
на нов, много опасен експлойт, може много
бързо самостоятелно да се състави ново
правило. За това е нужно да намерим в
Internet експлойта, да го използваме срещу
хост – опитно зайче, като запишем целия
трафик между атакуващият хост и
хоста-жертва. След това, анализирайки
дневника е необходимо да намерим уникална
сигнатура на експлойта. Например, в
следващия пакет
052499-22:27:58.403313
192.168.1.4:1034 -> 192.168.1.3:143 TCP TTL:64 TOS:0x0 DF
***PA*
Seq: 0x5295B44E Ack: 0x1B4F8970 Win: 0x7D78 90 90 90 90 90 90
90 90
90 90 90 90 90 90 EB 3B ...............;
5E
89 76 08 31 ED 31 C9 31 C0 88 6E 07 89 6E 0C ^.v.1.1.1..n..n.
B0
0B 89 F3 8D 6E 08 89 E9 8D 6E 0C 89 EA CD 80 .....n....n.....
31
DB 89 D8 40 CD 80 90 90 90 90 90 90 90 90 90 1...@
...........
90
90 90 90 90 90 90 90 90 90 90 E8 C0 FF FF FF ................
2F
62 69 6E 2F 73 68 90 90 90 90 90 90 90 90 90 /bin/sh.........
редът
/bin/sh/ явно изглежда
подозрителен. По този начин, този ред и
няколкото байта преди него ще представляват
сигнатурата на експлойта и новото
правило за Snort ще изглежда примерно по
този начин:
alert
tcp any any -> 192.168.1.0/24 143 (content:"|E8C0
FFFF
FF|/bin/sh"; msg:"New IMAP Buffer Overflow
detected!";)
ВЪЗМОЖНОСТИ
ЗА РАЗШИРЕНИЕ НА SNORT
В състава
на пакета Snort влизат както спецификации,
така и препоръки за разработването на
допълнителни модули, предназначени за
странични автори. В момента Snort подържа
три вида допълнителни модули – детектори,
препроцесори и модули за извеждане на
информация.
Детекторите
са предназначени за откриване на някакъв
уникален аспект на пакета, като по този
начин разширяват набора от възможни
параметри, определящи условията за
съответствие на правилата. Например,
параметъра flags, задаващ
условията за наличие или отсъствие в
пакета на конкретни TCP флагове, е
реализиран с помощта на откриващ модул.
Препроцесорът
се извиква за изпълнение след декодирането
на пакета и преди изпълнението на
детектора. Чрез неговия механизъм е
възможно да модифицираме пакетите,
например за повторно събиране на TCP
потока, за дефрагментация на пакетите,
за нормализация на HTTP заявките, като е
възможен и допълнителен анализ извън
основния код, както е възможно и
изпълнението на задачи за събиране на
статистика.
В
частност,
процедурата за определяне дали се
осъществява сканиране на портовете е
реализирана именно с помощта на
препроцесор. Под „сканиране на портове“
този препроцесор разбира изпращането
от един и същ IP адрес на SYN-, FIN-, NULL-, SYNFIN-
или XMAS пакети към контролирания хост
на повече от P порта, за време по-малко
от T или към един порт едновременно на
няколко хоста. Следващите версии на
Snort ще могат да откриват и разпределено
сканиране на портове, когато пакетите
към сканираните хостове се изпращат от
няколко атакуващи хоста. Ползата от
този препроцесор е в това, че при откриване
на атака няма нужда да се генерира
съобщение за всеки пакет, а може да се
генерира едно единствено съобщение за
цялата атака.
Много
интересен модул е препроцесорът SPADE на
фирмата Silicon
Defence. SPADE е абревиатура на Statistical Packet
Anomaly Detection Engine – Система
за откриване на статистически
аномални пакети. Този модул е част от
проекта SPICE (Stealthy Portscan and Intrusion Correlation
Engine).
Spade
следи
трафика, открива пакетите, които съгласно
някакви статистически критерии се
приемат за аномални и предава информацията
за тях на процедурата за запис в дневника.
Отделянето на аномалните пакети може
да става по следния примерен начин: на
всеки пакет се дава оценка за неговата
аномалност, основана на историята на
прегледания трафик. За тази цел се
създава таблица с оценките на вероятността
за поява на различните видове пакети,
основана на честотата им на поява за
известен период от време и времето на
поява (на по-свежите пакети се присвоява
по-голямо тегло). Например, за web сървър
P(dip=198.168.1.1,
dport=80)= 0.3 и
P(dip=198.168.1.1,
dport=12543) =0.001.
Оценката
на аномалността се пресмята непосредствено
от вероятността за поява на пакета:
A(X)=
-log2(P(X))
По този
начин, аномалността на пакет, насочен
към порт 80 на хост 198.168.1.1 ще бъде 1,737, а
аномалността на пакет, насочен към порт
12543 на същия хост ще е 9,97.
Колкото е
по-висока оценката на аномалността на
пакета, толкова повече внимание заслужава
той, като при надхвърляне на някакъв
праг се генерира съобщение за подозрителен
пакет, а в перспектива информацията за
него ще се подава и към така наречения
portscan-корелатор за последващ анализ и
откриване на добре маскирани атаки.
От версия
1.7 е възможно едновременното използване
за извеждане на информация на няколко
допълнителни модула:
alert_syslog
– този модул, както се вижда от името
му, извежда информация в дневника през
демона syslog. Съществува
възможност да се настрои нивото на
записване и приоритета на съобщенията;
alert_fast
– извежда в посочен файл информация
за възможна атака в кратък, едноредов
формат;
alert_full
– същото, както при alert_fast,
но в посочения файл се записва и
прехванатия пакет. Добра идея е
полученият по този начин файл да бъде
преглеждан с помощта на perl скрипта
SnortSnarf
на вече споменатата фирма Silicone Defense.
Резултатът от работата на скрипта е
много подробен и удобен за използване
отчет;
alert_unixsock
– същото, както при alert_full,
но цялата информация се предава в друг
процес през Unix-сокет. С този модул може
лесно да бъде организирана активна
реакция на системата срещу провежданата
атака, например блокиране на атакуващия
хост в таблицата за маршрутизация или
чрез промяна във веригите на ipchains;
alert_smb
– изпраща съобщение за атаката по
протокол WinPopup на описаните
NETBIOS-хостове;
log_tcpdump
– записва прехванатите пакети във
файл с формата на програмата
tcpdump;
database
– много интересен модул, позволяващ
съхраняването на цялата информация
за прехванатите пакети в база данни.
В момента се поддържат базите данни
PostgreSQL, MySQL, Oracle, а също така и
ODBC-съвместими
бази данни.
На основата на информацията, запазена
в базата данни, е много удобно да се
създадат различни отчети, например,
за най-досадните атакуващи хостове,
за типични атаки, за най-вероятното
време за провеждане на атаките и други
такива;
XML
– този модул беше разработен в
координационния център CERT като част
от проекта AIRCERT. Неговата основна цел
е създаване на цяла инфраструктура за
откриване на прониквания вътре в
локална мрежа, където стартираните на
няколко компютъра копия на Snort изпълняват
ролята на сензори.
От всичко,
казано по-горе, може да направим извода
за изключително голямата полезност на
програмата Snort. Във всеки случай,
използването на тази програма ще направи
живота на кракерите по-труден, което е
една от целите на всеки системен
администратор.
Превод:
Николай Ангелов