728x90
๋ฐ์ํ
1๏ธโฃ SNORT ๊ฐ์
๐น1. SNORT ๋์ ๋ฐฉ์
- ํจํท ์์ง
- ์ค์๊ฐ์ผ๋ก ํธ๋ํฝ์ ์์ง
- ์ ์ฒ๋ฆฌ ๊ณผ์
- ์์ง๋ ํจํท์ Preprocessor๋ก ์ ๋ฌ๋์ด ๋ถ์ ์ ํ์ํ ์ ์ฒ๋ฆฌ๋ฅผ ์ํ
- ๋ณ๋ ฌ ํจํด ๋งค์นญ
- SNORT์ ๋ฃฐ์ ๋ฐ๋ผ ํจํท ๋ด์ฉ์ ๊ฒ์ฌ
- ์ฑ๋ฅ ํฅ์์ ์ํด Aho-Corasick ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฐ์ ๋ณ๋ ฌ ๋ฌธ์์ด ๊ฒ์ ์ฌ์ฉ
- ๋งค์นญ ๋์์ด ๋๋ ๋ฃฐ์ด ๋ง์์๋ก ์๋๊ฐ ์ ํ๋๋ฏ๋ก, ์ ์ฒ๋ฆฌ์์ ์ผ๋ถ ํํฐ๋ง ๊ธฐ๋ฅ ์ํ
- ๋ฃฐ ํจํด ๋งค์นญ
- SNORT ๋ฃฐ ํ์ผ์ ์ ์๋ ์กฐ๊ฑด๊ณผ ํจํท์ ๋น๊ตํ์ฌ ๊ณต๊ฒฉ ์ฌ๋ถ๋ฅผ ํ์ง
- ํ์ง๋๋ฉด ๊ฒฝ๊ณ (Alert) ๋๋ ๋ก๊ทธ(Log)๋ก ๊ธฐ๋ก
๐น2. SNORT ๊ด๊ณ ๊ตฌ์กฐ
sensor (sid)
โ
โโโโโ
โผ
event (sid, cid) โโโโถ signature (sig_id)
โ
โโโโถ iphdr (sid, cid)
โโโโถ tcphdr / udphdr / icmphdr (sid, cid)
โโโโถ data (sid, cid)
ํ ์ด๋ธ | ์ฃผ์ ํ๋ | ์ค๋ช |
sensor | (๋๊ธฐํ ํ๋) ``sid`` |
|
``hostname``, ``interface``, ``filter`` ๋ฑ | ||
event | (๋๊ธฐํ ํ๋) ``sid``, ``cid`` |
|
``signature`` (ref > signaure.sig_id), ``timstamp`` | ||
signature | (๋๊ธฐํ ํ๋) ``sig_id`` |
|
``sig_name`` ๋ฑ | ||
iphdr | (๋๊ธฐํ ํ๋) ``sid``, ``cid`` |
|
``ip_src``, ``ip_dst``, ``ip_ver`` ๋ฑ | ||
tcphdr / udphdr / icmphdr |
(๋๊ธฐํ ํ๋) ``sid``, ``cid`` |
|
``_sport``, ``_dport``, ``_flags`` ๋ฑ | ||
data | (๋๊ธฐํ ํ๋) ``sid``, ``cid`` |
|
``data_payload`` |
๐น3. ์ฃผ์ ํ ์ด๋ธ / ํ๋ ๋ด์ญ
event
- ๊ฐ ํ์ง๋ ์ด๋ฒคํธ์ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ์ ์ฅ
- ํ๋ ์์:
- ``sid`` : Snort์์ ์ฌ์ฉํ๋ ๊ณ ์ ์๋ณ์ (Signature ID)
- ``cid ``: ์ฐ๊ฒฐ(Connection) ID
- ``signature`` : ํ์ง๋ ์๊ทธ๋์ฒ์ ์ฐ๊ฒฐ๋จ
- ``timestamp`` : ์ด๋ฒคํธ ๋ฐ์ ์๊ฐ
signature
- ํ์ง ๋ฃฐ์ ์๊ทธ๋์ฒ ์ ๋ณด๋ฅผ ์ ์ฅ
- ํ๋ ์์:
- ``sig_id`` : ์๊ทธ๋์ฒ ๊ณ ์ ID
- ``sig_name`` : ์๊ทธ๋์ฒ ์ด๋ฆ (๋ฃฐ ์ด๋ฆ)
- ``sig_priority`` : ์ฌ๊ฐ๋(Priority)
- ``sig_class_id ``: ๋ถ๋ฅ ID (sig_class ์ฐธ์กฐ)
sig_class
- ์๊ทธ๋์ฒ ๋ถ๋ฅ ์ ๋ณด ์ ์ฅ (์: ๊ณต๊ฒฉ ์ ํ)
- ํ๋ ์์:
- ``sig_class_id`` : ํด๋์ค ID
- ``sig_class_name ``: ํด๋์ค ์ด๋ฆ (์: "Attempted Admin")
iphdr
- IP ํค๋ ์ ๋ณด ์ ์ฅ
- ํ๋ ์์:
- ``ip_src``, ``ip_dst ``: ์ถ๋ฐ์ง/๋ชฉ์ ์ง IP ์ฃผ์
- ``ip_proto`` : ์ฌ์ฉ๋ ํ๋กํ ์ฝ (TCP/UDP/ICMP ๋ฑ)
tcphdr / udphdr / icmphdr
- ๊ฐ๊ฐ TCP, UDP, ICMP ํค๋ ์ ๋ณด๋ฅผ ์ ์ฅ
- ์์ ํ๋:
- TCP: ``tcp_sport``, ``tcp_dport``, ``tcp_flags``
- UDP: ``udp_sport``, ``udp_dport``
- ICMP: ``icmp_type``, ``icmp_code``
data
- ํจํท์ ``raw payload`` ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
sensor
- ์ด๋ฒคํธ๊ฐ ํ์ง๋ ์ผ์ ์ฅ๋น์ ๋ํ ์ ๋ณด ์ ์ฅ
- ํ๋ ์์:
- ``sid`` : ์ผ์ ID
- ``hostname``, ``interface``
๐น4. SNORT ์คํค๋ง
2๏ธโฃ SNORT ๋ฃฐ
๐น1. ๊ตฌ์ฑ ์์
ํค๋ (Header)
- ํจํท์ ๊ธฐ๋ณธ ์์ฑ์ ๋ํ ์กฐ๊ฑด ๋ฑ ํธ๋ํฝ ๋ฐ์ ์ฃผ์ฒด ๋ฐ ๋ฐฉํฅ ๋ฑ์ ์ ์ํ๋ค.
์์ | ์ค๋ช |
``action`` | ๋์ ์ข ๋ฅ (``alert``, ``log``, ``pass``, ``drop``, ``reject``, ``sdrop``) |
``protocol`` | ``tcp``, ``udp``, ``icmp``, ``ip`` ๋ฑ |
``src_ip`` | ์ถ๋ฐ์ง IP |
``src_port`` | ์ถ๋ฐ์ง ํฌํธ |
``->``, ``<-``, ``<>`` | ํธ๋ํฝ ๋ฐฉํฅ |
``dst_ip`` | ๋ชฉ์ ์ง IP |
``dst_port`` | ๋ชฉ์ ์ง ํฌํธ |
์ต์ (Options)
- ํจํท ๋ด์ฉ์ ๋ ์์ธํ ๋ถ์ํ๊ณ , ๊ฒฝ๊ณ ๋ฉ์์ง๋ ๋ฃฐ ์ ๋ณด ๋ฑ์ ์ค์ ํ๋ ๋ฑ ํธ๋ํฝ ์ธ๋ถ ํน์ง์ ์ ์ํ๋ค.
์ต์ | ์ค๋ช |
``msg`` | ํ์ง ์์ถ๋ ฅํ ๋ฉ์์ง |
``content`` | ํ์ด๋ก๋์์ ๊ฒ์ํ ๋ฌธ์์ด |
``sid`` | ๋ฃฐ ๊ณ ์ ๋ฒํธ (Signature ID) |
``rev`` | ๋ฃฐ ๋ฒ์ (Revision) |
``classtype`` | ๊ณต๊ฒฉ ์ ํ |
``priority`` | ์ฌ๊ฐ๋ (1=๋์, 2=์ค๊ฐ, 3=๋ฎ์) |
``flow`` | ํธ๋ํฝ ๋ฐฉํฅ ์กฐ๊ฑด (``to_server``, ``from_client``, ``established`` ๋ฑ) |
``depth/offset`` | content ๊ฒ์ฌ ๋ฒ์ ์ง์ |
``metadata`` | ๋ฃฐ ๊ด๋ จ ๋ฉํ ์ ๋ณด |
๐น 2. Payload ๊ฒ์ฌ ๋ฃฐ
- ํจํท์ ์ค์ ๋ฐ์ดํฐ ๋ถ๋ถ์ ๋ถ์ํด์ ๊ณต๊ฒฉ์ ํ์งํ๋ค.
์ฃผ์ ๋ฃฐ ์ต์
์ต์ | ๊ฒ์ฌ ๋ฒ์ | ๋น๊ณ |
content | ํ์ด๋ก๋ ์ ์ฒด | ์์ ๋ฌธ์์ด ๊ฒ์ฌ๋ง ์ง์ |
uricontent | URI | |
pcre | ํ์ด๋ก๋ ์ ์ฒด | ์ ๊ทํํ์ ์ง์ |
๐น 3. Non-Payload ๊ฒ์ฌ ๋ฃฐ
- Non-Payload ๋ฃฐ์ ์ ์ก๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ **ํค๋์ ํธ๋ํฝ ์ํ**๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ์ํ๋ค
์ฃผ์ ๋ฃฐ ์ต์
์ต์ | ์ค๋ช |
flow | ํธ๋ํฝ ๋ฐฉํฅ ์ ํ (SYN ํ๋๊ทธ ๊ธฐ์ค) |
flags | TCP flag bit ๊ฒ์ฌ |
dsize | ํ์ด๋ก๋ ์ฌ์ด์ฆ ๊ฒ์ฌ |
3๏ธโฃ Payload ๊ฒ์ฌ ๋ฃฐ ์ต์
๐น1. content/uricontent ์ต์
- ๋ฌธ์์ด ๊ธฐ๋ฐ์ ํ์ด๋ก๋ ํ์ง ์ต์
- snort ๋ฃฐ์์ ํจํท ๋ฐ์ดํฐ ๋ด ํน์ ๋ฌธ์์ด ์กด์ฌ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ
- ``content``: ํ์ด๋ก๋ ์ ์ฒด ์์ญ์์ ๋ฌธ์์ด์ ํ์ง
- ``uricontent``: HTTP ์์ฒญ URI ๊ฒฝ๋ก์์ ๋ฌธ์์ด ํ์ง
์ฃผ์ ์์ ์ (Modifier)
- ``nocase`` ๋์๋ฌธ์ ๊ตฌ๋ถ ํด์
- ์ ๋ ์์น
- ``offset`` ๊ฒ์ฌ ์์ ์์น
- ``depth`` ๊ฒ์ฌ ๋ฒ์
- ์๋ ์์น
- ``distance`` ๊ฒ์ฌ ์์ ์์น (์ด์ ๊ฒ์ฌ๊ฐ ๋๋ ์ง์ ๋ถํฐ)
- ``within`` ๊ฒ์ฌ ๋ฒ์
์์
- ํ์ด๋ก๋ ์ฒ์ 3๋ฐ์ดํธ ์์ ``"GET"`` ๋ฌธ์์ด์ด ์๋์ง ๊ฒ์ฌ
- ``"GET"`` ๋ฌธ์์ด ๋๋๊ณ 2๋ฐ์ดํธ ํ๋ถํฐ 7๋ฐ์ดํธ ์์ ``"rawdata"``๊ฐ ์๋์ง ๊ฒ์ฌ
alert tcp any any -> any 80 (
msg:"Test rule for GET and rawdata detection";
content:"GET"; offset:0; depth:3;
content:"rawdata"; distance:2; within:7;
sid:1000010; rev:1;
)
[ ํ์ด๋ก๋ ์์ ]
0000: 47 45 54 20 78 78 72 61 77 64 61 74 61
↑ "GET"
↑ (space)
↑ "x x r a w d a t a"
↑ rawdata๋ "GET" ์ดํ +2 ์์น๋ถํฐ +7 ์์ ์์ → โ
๋งค์นญ
๐น2. pcre ์ต์
- Perl-Compatible Regular Expressions
- ์ ๊ทํํ์์ ์ด์ฉํด ๋ณด๋ค ๋ณต์กํ๊ณ ์ ์ฐํ ๋ฌธ์์ด ํจํด์ ํ์ง
pcre ์์ ์
- ``/i`` ๋์๋ฌธ์ ๊ตฌ๋ถ ์ํจ
- ``/s`` ์ค๋ฐ๊ฟ ๋ฌธ์ ๊ฒ์ฌ
- ``/m`` ์ต์ปค ๋ฌธ์์ ์ค ๊ตฌ๋ถ ํด์
- ``/R`` 'distance:0`๊ณผ ๋์ผ (snort only)
4๏ธโฃ Non-Payload ๊ฒ์ฌ ๋ฃฐ ์ต์
๐น1. flow ์ต์
- ํจํท์ด TCP ์ฐ๊ฒฐ ๋ด์์ ์ด๋ ๋ฐฉํฅ์ผ๋ก, ์ด๋ค ์ํ๋ก ํ๋ฅด๊ณ ์๋์ง๋ฅผ ์ง์ ํ๋ ์ต์
- TCP SYN ํ๋๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฉํฅ์ ๊ตฌ๋ถ
- Client ↔ Server ๊ตฌ๋ถ์ด ๋ช ํํ ๋คํธ์ํฌ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๋จ์ ์ด ์์
์ฃผ์ ํค์๋
- ``to_server``: ํด๋ผ์ด์ธํธ → ์๋ฒ ๋ฐฉํฅ์ผ๋ก ํธ๋ํฝ
- ``from_client``: ํด๋ผ์ด์ธํธ์์ ์์๋ ํธ๋ํฝ
- ``to_client``: ์๋ฒ → ํด๋ผ์ด์ธํธ ๋ฐฉํฅ์ ํธ๋ํฝ
- ``from_server``: ์๋ฒ์์ ์์๋ ํธ๋ํฝ
- ``established``: TCP ํธ๋์์ดํฌ๊ฐ ์๋ฃ๋ ์ธ์ ์์๋ง ๋งค์นญ (SYN-ACK ํ)
- ``stateless``: ์ํ ์ถ์ ์์ด ๊ฒ์ฌ (UDP์ฒ๋ผ ์ธ์ ์์)
- ``not_established``: ์ธ์ ์ด ์์ง ์ค์ ๋์ง ์์ ์ํ์์๋ง ํ์ง (ex. SYN ํจํท ํ์ง ๋ฑ)
์์
- TCP SYN ํ๋๊ทธ๋ฅผ ์์ ํ ์๋ฒ๋ก ํฅํ๋ ํธ๋ํฝ๋ง ๊ฒ์ฌ
alert tcp any any -> any any (
flow:to_server;
content:”aaa”
)
๐น2. flags ์ต์
- TCP ํค๋์ ํ๋๊ทธ ๋นํธ๋ฅผ ๊ฒ์ฌํ๋ ์ต์
- SYN, ACK, FIN, RST ๋ฑ TCP ํต์ ๊ณผ์ ์์ ์ค์ ๋๋ ํ๋๊ทธ ์กฐํฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ์งํ ์ ์์
์ฃผ์ TCP ํ๋๊ทธ ๋ชฉ๋ก
- ``S`` SYN (์ธ์ ์์ ์์ฒญ)
- ``A`` ACK (์๋ต ํ์ธ)
- ``F`` FIN (์ธ์ ์ข ๋ฃ ์์ฒญ)
- ``R`` RST (์ธ์ ๊ฐ์ ์ข ๋ฃ)
- ``P`` PSH (์ฆ์ ์ ์ก ์์ฒญ)
- ``U`` URG (๊ธด๊ธ ๋ฐ์ดํฐ ์์)
- ``E`` ECN-Echo (Congestion Notification ์๋ต)
- ``C`` CWR (Congestion Window Reduced)
์์
- ์ข์ ์์ - SYN ํ๋๊ทธ + ํน์ ํ์ด๋ก๋ ํ์ง
- ``flags: S;`` → SYN ํ๋๊ทธ ์ค์ ๋ ํจํท๋ง ๋์์ผ๋ก
- ``"aaa"``๋ผ๋ ๋ฌธ์์ด์ด ์๋ ๋น์ ์ SYN ์์ฒญ ํ์ง
alert tcp any any -> any 80 (
flags: S;
content: "aaa";
msg: "SYN packet with suspicious payload";
sid:1000001;
rev:1;
classtype:attempted-recon;
)
- ๋์ ์์ – content ๋จผ์ ๊ฒ์ฌ (๋นํจ์จ์ )
- ์์์ ๋ฌธ์ ๋ก ๋ชจ๋ TCP ํจํท์ content๋ฅผ ๋จผ์ ๊ฒ์ฌ → ๋นํจ์จ
- ์ฑ๋ฅ ์ ํ ์ฐ๋ ค
alert tcp any any -> any 80 (
content: "aaa";
flags: S;
msg: "Inefficient order: content before flags";
sid:1000002;
rev:1;
classtype:bad-unknown;
)
- ๋ ๋์ ์์ – ์๋ฏธ ์๋ ์กฐํฉ
- ``flags: PA;``๋ ์ ์์ ์ธ ๋ฐ์ดํฐ ์ ์ก์ฉ ํจํท
- ``"aaa"``๊ฐ ๋ค์ด์์ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ → ํ์ง ์๋ ๋ถ์ ํ
alert tcp any any -> any 80 (
content: "aaa";
flags: PA;
msg: "Invalid flag-content logic";
sid:1000003;
rev:1;
classtype:bad-unknown;
)
๐น3. dsize ์ต์
- ํจํท์ Payload(๋ฐ์ดํฐ) ํฌ๊ธฐ๋ฅผ ๊ฒ์ฌํ๋ ์ต์
- ์ด์ํ๊ฒ ํฌ๊ธฐ๊ฐ ์๊ฑฐ๋ ํฐ ํจํท์ ํ์งํ๊ฑฐ๋, ๋ฌด์๋ฏธํ ํจํท, ์ค์บ๋ ์๋ ๋ฑ์ ์ก์๋ด๋ ๋ฐ ์ ์ฉ
์ฌ์ฉ ๋ฐฉ๋ฒ
- ๊ณ ์ ํฌ๊ธฐ ๊ฒ์ฌ
- ์ด์ ๊ฒ์ฌ
- ์ดํ ๊ฒ์ฌ
# ๊ณ ์ ํฌ๊ธฐ ๊ฒ์ฌ
dsize: 0; // ํ์ด๋ก๋ ํฌ๊ธฐ๊ฐ ์ ํํ 0๋ฐํธ์ผ๋ ๋งค์นญ
// ํํ Null ์ค์บ์ด๋, ์๋ฏธ ์๋ ํจํท ๋ฑ ํ์ง์์ ์ฌ์ฉ๋จ
# ์ด์ ๊ฒ์ฌ
dsize: >300; // ํ์ด๋ก๋ ํฌ๊ธฐ๊ฐ 300๋ฐ์ดํธ๋ณด๋ค ํด ๋ ๋งค์นญ
// ๋ณดํต์ ๋น์ ์์ ์ผ๋ก ํฐ ์์ฒญ, ์ฐํ ๊ณต๊ฒฉ ์๋ ๋ฑ์ ํ์งํ ๋ ์ฌ์ฉ
# ์ดํ ๊ฒ์ฌ
dsize: <10; // ํ์ด๋ก๋ ํฌ๊ธฐ๊ฐ 10๋ฐ์ดํธ ๋ฏธ๋ง์ผ ๋ ๋งค์นญ
// ์ค์บ์ด๋ ์ทจ์ฝํ ์งง์ ๋ช
๋ น์ด ์์ฒญ ํจํท ํ์ง
5๏ธโฃ Thresholds ๊ฒ์ฌ ๋ฃฐ ์ต์
- ๋์ผํ ์ด๋ฒคํธ๊ฐ ํน์ ์๊ฐ ๋ด์ ๋ฐ๋ณต๋ ๊ฒฝ์ฐ, ์๋ฆผ ๋ฐ์์ ์ ์ดํ๋ ์ค์
์ฌ์ฉ ๊ฐ๋ฅํ ํ์
- ``type`` ์
๊ณ๊ฐ ๋์ ๋ฐฉ์์ ์ง์
- ``limit`` ์ผ์ ํ์๋ง ํ์ฉํ๊ณ ๋๋จธ์ง๋ ๋ฌด์
- ``threshold`` ์ผ์ ํ์๋ง๋ค ํ ๋ฒ์ฉ ๊ฒฝ๊ณ ๋ฐ์
- ``both`` ์ผ์ ํ์ ๋๋ฌ ์ 1๋ฒ ๊ฒฝ๊ณ ํ ๋๋จธ์ง ๋ฌด์
- ``track`` ์๊ณ๊ฐ์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ถ์ ํ ์ง ์ง์
- ``by_src`` ์ถ๋ฐ์ง IP ๊ธฐ์ค
- ``by_dst`` ๋ชฉ์ ์ง IP ๊ธฐ์ค
- ``count`` ์ง์ ํ ``seconds`` ๋ด์ ์ด๋ฒคํธ๊ฐ ๋ช ๋ฒ ๋ฐ์ํด์ผ ๊ฒฝ๊ณ ๋ฅผ ๋ผ์ง
- ``seconds`` ์ด๋ฒคํธ ๋ฐ์์ ์ธก์ ํ๋ ์๊ฐ ๋ฒ์ (๋จ์: ์ด)
์์
- ๋์ผํ ๋ชฉ์ ์ง IP์ ๋ํด 3์ด ๋์ ping์ด 2ํ ๋ฐ์ํ๋ฉด → 1๋ฒ ๊ฒฝ๊ณ ๋ฐ์
- ์ดํ ์ถ๊ฐ์ ์ธ ping์ด ๊ณ์ ์๋ → 3์ด ์์ ๋ค์ 2ํ ์์ด์ผ ๋ alert
alert icmp any any-> any any (
msg:“threshold-test";
itype:8;
threshold:type threshold,
track by_dst,
count 2,
seconds 3;
sid:1000005;
rev:1;
)
๐ ๋ ํผ๋ฐ์ค
728x90
๋ฐ์ํ