نحوه نوشتن Rule در Snort
Snort از یک زبان توصیف ساده و سبک برای تعریف قوانین خود استفاده میکند که بسیار انعطاف پذیر و قدرتمند میباشد. برای مثال در ورژنهای قبل از نسخه 1.8 بایستی هر قانونی در یک خط نوشته میشد. در حال حاضر و در نسخههای جدید Snort، میتوانیم یک Rule را با افزودن یک \ به انتها آن در چندین خط قرار دهیم.
ساختار منطقی قوانین
همه قوانین در Snort به دو بخش منطقی header و option تقسیم میشوند. قسمت header شامل نوع Action، نوع پروتکل، آدرس مبدا و مقصد، Netmask و آدرس پورت مبدا و مقصد میباشد. قسمت option نیز شامل پیام هشدار و اطلاعات مورد نیاز در مورد بخشی از بسته میباشد که باید بررسی و براساس آن اعمال شدن یا نشدن Action قانون تصمیمگیری شود.
از نظر نوشتاری در یک قانون، متن موجود در خارج از پرانتز، مربوط به header و بخش داخل پارانتز مربوط به option آن میباشد. همچنین به کلمات قبل از دو نقطه در قسمت option نیز کلمات کلیدی گفته میشود.
برای اینکه قانونی Fire شود بایستی همه عناصر موجود در آن برآورده شوند. بنابراین عناصر یک rule در کنار هم، یک عبارت منتطقی را تشکیل میدهند که تصمیم گیری برساس آنها انجام میشود. همچنین قوانین موجود در Snort را میتوانیم به صورت یک عبارت OR منطقی در نظر بگیریم که در صورت برآورده نشدن مقادیرهر کدام از آنها به ترتیب چک میشوند.
alert tcp any any -> 192.168.1.0/24 111 \
(content:"|00 01 86 a5|"; msg:"mountd access";)
هدر
در قوانین Snort، هدر rule شامل اطلاعاتی است که مشخص میکند چه کسی، کجا و چه چیزی را در یک بسته قرار داده است. همچنین مشخص میکند در صورتی که بستهای با تمام ویژگیهای مشخص شده در قانون شناسایی شد، چه عملی بر روی بسته باید انجام شود. اولین آیتم در هدر rule نوع action آن میباشد. به صورت پیشفرض 3 عملکرد alert, log, pass در Snort وجود دارد. علاوه براین، اگر Snort را در حالت inline mode پیکربندی کنیم، میتوانیم از گزینههای drop, reject و sdrop را نیز در قوانین خود استفاده کنیم.
- alert: در این حالت Snort ابتدا ایجاد هشدار کرده و در ادامه بسته را رویدادنگاری میکند.
- log: در این حالت اسنورت فقط بسته را رویدادنگاری میکند.
- pass: در این حالت اسنورت هیچ کاری بر روی بسته انجام نمیدهد.
- drop: در این حالت علاوه بر مسدودسازی بسته، آن را رویدادنگاری نیز میکند.
- reject: بعد از رویدادنگاری بسته و مسدود کردن آن، در صورت TCP بودن ارتباط یک پیام TCP reset یا در صورت UDP بودن آن یک پیام ICMP port unreachable ارسال مینماید.
- sdrop: بسته را بدون رویدادنگاری مسدود میکند.
همچنین میتوانیم علاوه بر موارد بالا انواعی از قوانین خود را تعریف و آنها را با یک یا چند افزونه خروجی مرتبط کنیم. سپس میتوانیم ازآنها به عنوان اقداماتی در action قوانین Snort استفاده کنیم. مثال زیر قانونی را ایجاد میکند که ترافیک را با فرمت Tcpdump رویدادنگاری میکند.
ruletype suspicious
{
type log
output log_tcpdump: suspicious.log
}
مثال زیر نوعی از قانون را ایجاد می کند که ترافیک شناسایی شده را با فرمت syslog و tcpdump رویدادنگاری میکند.
ruletype redalert
{
type alert
output alert_syslog: LOG_AUTH LOG_ALERT
output log_tcpdump: suspicious.log
}
پروتکل
قسمت بعدی در یک rule پروتکل میباشد. Snort در حال حاضر و در نسخه 2.9 فقط رفتار مشکوک چهار پروتکل اصلی یعنی TCP, UDP, ICMP و IP را تجزیه و تحلیل میکند. این ممکن است در آینده موارد بیشتری مانند ARP, IGRP, GRE, OSPF, RIP, IPX توسط Snort بررسی و آنالیز شود.
آدرسهای IP
بخش بعدی هدر rule شامل آدرس IP و اطلاعات پورت میباشد. در نوشتن قوانین، برای استفاده از همه آدرسهای IP از کلمه any استفاده میکنیم. توجه کنید که Snort هیچ سازوکاری برای جستجوی نام DNS در قسمتهای آدرس IP فایل پیکربندی ندارد.
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 \
(content:"|00 01 86 a5|"; msg:"external mountd access";)
alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> \
[192.168.1.0/24,10.1.1.0/24] 111 (content:"|00 01 86 a5|"; \
msg:"external mountd access";)
در ruleهای بالا عملگر ! به Snort میگوید که فقط بستهها از هر آدرسی به غیر از آدرس IP ذکر شده را با قوانین مطابقت دهد.
شماره پورت
شماره پورت ممکن است به روشهای مختلفی از جمله همه پورتها (any)، تعریف پورت استاتیک (با استفاده از یک عدد مانند 80)، یک رنج از پورتها (1:1024) و همچنین با استفاده از عملگر ! مشخص شود.
log udp any any -> 192.168.1.0/24 1:1024
log tcp any any -> 192.168.1.0/24 :6000
log tcp any :1024 -> 192.168.1.0/24 500:
عملگر جهت ترافیک
عملگر جهت -> در واقع جهت ترافیکی که قرار است قانون بر روی آن اعمال شود را نشان میدهد. آدرسهای سمت چب نشان دهنده مبدا ترافیک و سمت راست نشان دهنده مقصد ترافیک میباشد. میتوانیم از عملگر <> برای اعمال rule بر روی هر دو جهت ترافیک استفاده کنیم.
log tcp !192.168.1.0/24 any <> 192.168.1.0/24 23
option
قسمت option در واقع قلب موتور تشخیص نفوذ Snort را تشکیل میدهد. همه مولفههای option قانون Snort با استفاده از کاراکتر(؛) از یکدیگر جدا میشوند. کلمات کلیدی نیز با استفاده از کاراکتر(:) از آرگومانهای خود جدا میشوند. قسمت option دارای 4 دستهبندی زیر میباشد.
general
آرگومانهای مربوط به به این گزینه، اطلاعات مورد نیاز در مورد قانون را ارائه میدهند اما هیچ تأثیری در هنگام شناسایی ندارند.
payload
همه گزینههای موجود در این بخش برای بررسی دادههای قسمت payload استفاده میشوند و میتوانند با یکدیگر مرتبط باشند.
none-payload
این گزینهها برای بررسی دادههای قسمتهای غیر payload استفاده میشوند.
post-detection
این گزینهها محرکهای خاص منظوره قانون هستند که معمولا بعد از “fire” شدن یک قانون اتفاق میافتند.
general options
msg
msg به موتور رویدادنگاری و هشدار میگوید که پیام را به همراه محتوای dump بسته یا هشدار چاپ کند.
فرمت
msg:"<Text message>";
reference
کلمه کلیدی reference اجازه میدهد تا قوانین ارجاعاتی به سیستمهای شناسایی حمله خارجی داشته باشند. این افزونه در حال حاضر از چندین سیستم خاص و همچنین URLهای منحصر به فرد پشتیبانی میکند. این افزونه قرار است توسط افزونههای خروجی استفاده شود تا پیوندی به اطلاعات بیشتر درباره هشدار تولید شده ارائه دهد.
URL Prefix |
System |
http://www.securityfocus.com/bid/ |
bugtraq |
http://cve.mitre.org/cgi-bin/cvename.cgi?name= |
cve |
http://cgi.nessus.org/plugins/dump.php3?id= |
nessus |
http://www.whitehats.com/info/IDS |
arachnids |
http://vil.nai.com/vil/content/v |
mcafee |
http://osvdb.org/show/osvdb/ |
osvdb |
http://technet.microsoft.com/en-us/security/bulletin/ |
msb |
http:// |
url |
فرمت
reference:, ; [reference:, ;]
alert tcp any any -> any 21 (msg:"IDS287/ftp-wuftp260-venglin-linux"; \
flags:AP; content:"|31c031db 31c9b046 cd80 31c031db|"; \
reference:arachnids,IDS287; reference:bugtraq,1387; \
reference:cve,CAN-2000-1574;)
gid
کلمه gid برای شناسایی بخشی از Snort که هنگام فعال شدن یک قانون خاص، رویداد ایجاد میکند، استفاده می شود.
فرمت
gid:<generator id>;
alert tcp any any -> any 80 (content:"BOB"; gid:1000001; sid:1; rev:1;)
sid
کلمه sid به صورت منحصر به فرد تعریف شده و برای شناسایی قوانین Snort استفاده میشود. این اطلاعات به پلاگینهای خروجی کمک میکند تا قوانین را به راحتی شناسایی کنند. این گزینه باید با کلمه کلیدی rev استفاده شود.
- <100 برای استفادههای آینده رزرو شده است.
- 100-999،999 برای قوانین موجود در توزیع Snort استفاده شده است.
- > = 1،000،000 برای تعریف قوانین local استفاده میشود.
فایل sid-msg.map شامل نگاشتی از پیامهای هشدار به شناسههای قوانین Snort میباشد. این اطلاعات هنگام نگاشت یک شناسه به یک پیام هشدار استفاده میشود.
فرمت
sid:snort rule id;
alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;)
rev
کلمه rev برای تعریف اصلاحات قوانین Snort استفاده میشود. این کلمه همراه با شناسه قانون Snort، اجازه میدهد تا امضاها و توضیحات با اطلاعات به روز جایگزین شوند.
فرمت
rev:<revision intger>;
classtype
کلمه کلیدی classtype برای دسته بندی یک قانون به منظور شناسایی یک حمله که بخشی از یک کلاس کلیتر است، استفاده میشود. Snort یک مجموعه پیش فرض از کلاس حملات را ارائه میدهد که توسط مجموعه قوانین پیش فرض ارایه میشوند.
فرمت
classtype:<class name>;
alert tcp any any -> any 25 (msg:"SMTP expn root"; flags:A+; \
content:"expn root"; nocase; classtype:attempted-recon;)
کلاسهای مختلف حملات که توسط Snort تعریف شدهاند در فایل classification.config قرار دارند.
config classification: <class name>,<class description>,<default priority>
priority
تگ اولویت در واقع سطح شدت حملاتی که قرار است توسط قانون تعریف شده شناسایی شوند را نشان میدهد. در واقع اولویت موجود در classtype، اولویت پیشفرض برای قانون را تعیین میکند. این مقدار توسط طبقه بندی تعریف شده در فایل پیکربندی classification.config مشخص میشود و میتواند با اولویت تعرف شده در قانون جایگزین شود.
فرمت
priority:<priority integer>;
alert tcp any any -> any 80 (msg:"WEB-MISC phf attempt"; flags:A+; \
content:"/cgi-bin/phf"; priority:10;)
alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow"; \
dsize:>128; classtype:attempted-admin; priority:10 );
metadata
تگ متادیتا به نویسنده قانون اجازه میدهد تا اطلاعات اضافی در مورد قانون را در داخل آن و در قالب مقدار کلیدی تعبیه کند.
فرمت
metadata:key1 value1;
metadata:key1 value1, key2 value2;
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; \
metadata:engine shared; metadata:soid 3|12345;)
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; \
metadata:engine shared, soid 3|12345;)
alert tcp any any -> any 80 (msg:"HTTP Service Rule Example"; \
metadata:service http;)
payload detection options
content
کلمه کلیدی محتوا یکی از مهمترین ویژگیهای قوانین Snort میباشد. این گزینه به کاربر اجازه میدهد تا قوانینی براساس محتوای (payload) بستهها ایجاد کند. دادههای مربوط به قسمت محتوا تا حدودی پیچیده میباشد. مقدار محتوا میتواند ترکیبی از دادههای متنی و باینری باشد. دادههای باینری معمولاً درون (|) قرار میگیرند. در قسمت محتوا، دادههای باینری به صورت اعداد هگزا دسیمال نشان داده میشود. این یک روش مختصر برای توصیف دادههای باینری پیچیده است.
فرمت
content:[!]"content string";
alert tcp any any -> any 139 (content:"|5c 00|P|00|I|00|P|00|E|00 5c|";)
alert tcp any any -> any 80 (content:!"GET";)
تغییر رفتار محتوا
کلمه کلیدی محتوا دارای تعدادی کلمه کلیدی اصلاح کننده نیز میباشد. این کلمات نحوه کار محتوای مشخص شده را تغییر میدهند.
http header | http cookie | http client body | within | distance | offset | depth | rawbytes | nocase |
http raw cookie | fast pattern | http stat msg | http stat code | http raw uri | http uri | http method | http raw header |
protected content
کلمه کلیدی محتوای محافظت شده، بیشتر قابلیتهای کلمه کلیدی محتوا را فراهم میکند، با این وجود عملکرد آن بسیار متفاوت است. مزیت اصلی محتوای محافظت شده نسبت به محتوا این است که محتوای محافطت شده این امکان را میدهد تا محتوای هدف را با استفاده از مقدار هش آن پنهان کنیم.
در حال حاضر میتوان از الگوریتمهای هش MD5 ،SHA256 و SHA512 با کلمه کلیدی محتوای محافظت شده استفاده کرد. اگر الگوریتم هش به صورت پیشفرض در تنظیمات Snort تعریف نشده باشد، باید با استفاده از کلمه hash در داخل rule یک الگوریتم هش مشخص شود. علاوهبراین، به یک اصلاح کننده طول نیز برای مشخص کردن طول دادههای خام نیاز میباشد.
فرمت
protected_content:[!]"", length:orig_len[, hash:md5|sha256|sha512];
alert tcp any any <> any 80 (msg:"MD5 Alert";
protected_content:"293C9EA246FF9985DC6F62A650F78986"; hash:md5; offset:0; length:4;)
alert tcp any any <> any 80 (msg:"SHA256 Alert";
protected_content:"56D6F32151AD8474F40D7B939C2161EE2BBF10023F4AF1DBB3E13260EBDC6342";
hash:sha256; offset:0; length:4;)
hash
کلمه کلیدی hash برای تعیین الگوریتم هش، مورد استفاده قرار میگیرد تا هنگام مطابقت با یک قانون محتوای محافظت شده استفاده شود. در Snort در حال حاضر الگوریتمهای MD5, SHA256 و SHA512 پشتیبانی میشوند.
فرمت
hash:[md5|sha256|sha512];
length
کلمه کلیدی length برای تعیین طول اصلی محتوای مشخص شده در قانون محتوای محافظت شده استفاده میشود. مقدار آن باید بیشتر از 0 و کمتر از 65536 باشد.
فرمت
length:[<orginal_lenght>];
nocase
کلمه کلیدی nocase به نویسنده قانون اجازه میدهد تا بدون توجه به حروف بزرگ، مشخص کند که Snort باید به دنبال الگوی خاصی باشد. nocase کلمه کلیدی محتوای قبلی را در قانون اصلاح میکند.
فرمت
nocase;
alert tcp any any -> any 21 (msg:"FTP ROOT"; content:"USER root"; nocase;)
rawbytes
کلمه کلیدی rawbytes به قوانین اجازه میدهد تا بدون توجه به دیکدینگ انجام شده توسط پیش پردازندهها، دادههای خام بسته را بررسی کنند.
پیش پردازنده HTTP Inspect دارای مجموعهای از کلمات کلیدی برای استفاده از دادههای خام HTTP میباشد. از جمله http raw cookie, http header header, http raw uri و غیره که با بخشهای خاصی از درخواستها و پاسخهای HTTP خام مطابقت دارند.
فرمت
rawbytes;
alert tcp any any -> any 21 (msg:"Telnet NOP"; content:"|FF F1|"; rawbytes;)
depth
کلمه کلیدی depth مشخص میکند که snort الگوی مورد نظر را در چه عمقی از بسته جستجو کند. برای مثال عمق 5 به معنی این است که snort در 5 بایت اول payload به دنبال الگوی مشخص شده بگردد.
این کلمه کلیدی مقادیر بزرگتر یا مساوی با طول الگو را جستجو میکند. حداقل مقدار مجاز 1 و حداکثر مقدار مجاز برای این کلمه کلیدی 65535 میباشد.
فرمت
depth:[<number>|<var_name>];
offset
کلمه کلیدی offset به ما اجازه میدهد تا مکان شروع جستجو برای یک الگو را در یک بسته مشخص کنیم. offset با مقدار 5 به Snort میگوید که پس از 5 بایت اول payload شروع به جستجوی الگوی مشخص شده کند.
فرمت
offset:[<number>|<var_name>];
alert tcp any any -> any 80 (content:"cgi-bin/phf"; offset:4; depth:20;)
distance
کلمه کلیدی distance به ما اجاز میدهد تا مشخص کنیم که Snort قبل از شروع جستجوی الگوی مشخص شده چه مقدار از بسته را باید صرف نظر کند.
فرمت
distance:[<byte_count>|<var_name>];
alert tcp any any -> any any (content:"ABC"; content:"DEF"; distance:1;)
Non-Payload Detection Rule Options
fragoffset
کلمه کلیدی fragoffset به ما اجازه میدهد تا فیلد افست قطعه IP را با یک مقدار اعشاری مقایسه کنیم. برای به دست آوردن اولین قطعههای یک جلسه IP، میتوانیم از کلمه کلیدی fragbits استفاده کنیم و به دنبال گزینه More fragments همراه با fragoffset 0 باشیم.
فرمت
fragoffset:[!|<|>]<number>;
alert ip any any -> any any \
(msg:"First Fragment"; fragbits:M; fragoffset:0;)
ttl
کلمه کلیدی ttl برای بررسی مقدار time-to-live بسته IP استفاده میشود. این کلمه کلیدی برای تشخیص تلاش برای ردیابی استفاده میشود. این کلمه کلیدی مقادیری از 0 تا 255 میگیرد.
فرمت
ttl:[<, >, =, <=, >=]<number>;
ttl:[<number>]-[<number>];
ttl:<=5;
ttl:>=5;
ttl:=5;
tos
کلمه کلیدی tos برای بررسی فیلد IP TOS برای یک مقدار خاص استفاده میشود.
فرمت
tos:[!]<number>;
tos:!4;
rpc
کلمه کلیدی rpc برای بررسی یک برنامه RPC، نسخه و اعداد رویه در درخواستهای SUNRPC CALL استفاده می شود. استفاده از Wildcard برای چک کردن نسخه و شماره رویه و با استفاده از ‘*’ معتبر میباشد.
فرمت
rpc:<application number>, [<version number>|*], [procedure number|*]>;
alert tcp any any -> any 111 (rpc:100000, *, 3;);
Post-Detection Rule Options
logto
کلمه کلیدی logto به Snort میگوید که تمام بستههایی را که باعث فعال شدن قانون میشوند را در یک فایل خروجی خاص رویدادنگاری کند. این مورد به ویژه برای ترکیب دادههایی مانند فعالیت NMAP، اسکنهای HTTP CGI بسیار مفید است.
فرمت
logto:"filename";
برای اطلاعات بیشتر در مورد نحوه نوشتن قوانین در اسنورت میتوانید به سایت اسنورت مراجعه کنید.
دیدگاهتان را بنویسید