네트워크침입탐지시스템 기본구조와원리
개요 문서정보 작성자 : 양봉열 (xeraph@nchovy.com) 작성일 : 2009 년 9 월 12 일 라이센스 : 크리에이티브커먼즈저작자표시 - 비영리 - 변경금지 2.0 대한민국 목차 IDS 의정의와역사 NIDS 아키텍처 NIDS 배치 이더넷트래픽펌핑 IP 단편화와재조립 TCP 재조립 응용프로토콜디코딩 패턴매칭 룰및탐지회피 네트워크이상탐지 패킷덤프및로깅
IDS 의정의와역사 정의 컴퓨터시스템을대상으로인가되지않은데이터접근, 조작, 서비스방해등의침입시도를찾아내도록설계된소프트웨어나하드웨어 배포위치에따른구분 역사 네트워크기반침입탐지시스템 호스트기반침입탐지시스템 1980 년, James P. Anderson 이감사로그를이용한오용탐지기법제시 1990 년대초부터상업적침입탐지시스템의개발이시작됨 1997 년부터침입탐지시장이본격적으로성장함 (ISS, Cisco 등 ) 2000 년시큐어소프트수호신 IDS, 인젠네오와처, 윈스테크넷스나이퍼 IDS 출시 2003 년윈스테크넷스나이퍼 IPS 출시등 IPS 및 UTM 으로발전하면서 IDS 시장쇠퇴 http://www.securityfocus.com/infocus/1514
NIDS 아키텍처 센서 서버 로그발생및차단대응로그수싞로그축약경보대응 패턴매칭 정책배포 정책설정 통계생성 응용프로토콜디코딩 TCP 스트림재조립 IP 패킷재조립 콘솔 로그관제설정관리통계조회 이더넷프레임펌핑드라이버
NIDS 배치 폐쇄망 관제콘솔관리서버센서 패킷복사전달 네트워크탭 (tap) 더미허브 스위치 SPAN 포트 / 포트미러링
이더넷프로토콜 정의 LAN에서사용되는프레임기반컴퓨터네트워킹기술의집합 IEEE 802.3로표준화됨 : 물리계층과데이터링크계층의 MAC 부분을정의 프레임유형 Ethernet II (DIX frame): 16비트길이의 EtherType으로프로토콜번호지정 IEEE 802.3: EtherType을길이로대체하고 802.2 LLC 헤더가뒤에추가됨 LLC 헤더뒤에 SNAP 헤더가붙는경우도있음 프레임유형구분은관례에따라 EtherType 값의범위를이용함 64~1522의경우 802.3 Ethernet 1536(0x0600) 이상인경우 Ethernet II의프로토콜식별자로해석
이더넷트래픽펌핑 정의 이더넷네트워크인터페이스장치로부터이더넷프레임들을센서입력으로올리는작업 구현방식 커널에서제공하는네트워킹인터페이스를이용하는방식 기존에벤더에서제공하는드라이버를그대로이용할수있으므로높은호환성획득 커널에서불필요한작업이추가로수행되므로효율성저하 리눅스의경우 libpcap 및 libipq가널리사용됨 윈도우의경우 NDIS 프로토콜혹은인터미디엇드라이버를구현해야함 네트워크인터페이스장치를직접제어하는방식 특정 NIC용디바이스드라이버를자체제작하거나커스터마이징 장치의성능을최대한으로뽑아낼수있으며오버헤드역시최소화가능 윈도우의경우 NDIS 미니포트드라이버를구현해야함 하드웨어일체형보안장비의경우드라이버및운영체제까지자체개발함
이더넷트래픽펌핑 패킷손실 (Packet Loss) 네트워크인터페이스장치는수신한프레임들을 DMA로링버퍼에저장함 링버퍼가가득차면이후장치에서수신하는프레임들은그냥버려짐 프레임이손실되면해당세션은디코딩실패로인해제대로탐지할수없게됨 같은대역폭에서도프레임길이에따라처리량이달라짐 1Gbps의경우, 64바이트 : 195만 3125 fps 128바이트 : 97만 6562 fps 256바이트 : 48만 8281 fps 512바이트 : 24만 4140 fps 길이가짧을수록오버헤드가증가하므로손실가능성이높아짐
인터넷프로토콜 (IP) IP 헤더 Version: IP 버전 ( 이하버전 4 기준 ) IHL: IP 헤더길이 (4 바이트단위 ) Type of Service: QoS ( 대부분 0) Total Length: 전체길이 ( 헤더포함 ) Identification: 패킷식별자단편화된패킷들은식별자가동일함 Flags: More Fragment (001) Don't Fragment (010) Fragment Offset: 단편의상대적위치 Time to Live: 1 hop 지날때마다차감 Protocol: 페이로드의프로토콜번호 IANA 프로토콜번호할당문서참조 (ICMP 1, IGMP 2, TCP 6, UDP 17) Header Checksum: 헤더무결성확인 Source IP Address: 출발지주소 Destination IP Address: 목적지주소 IP Options: 선택적기능 IANA 옵션번호할당문서참조
인터넷프로토콜 (IP) IP 헤더체크썸계산 (RFC791) 헤더를 2 바이트단위로끊어서 1 의보수합을구한다음 1 의보수를취함. 1 의보수합은캐리발생시 LSB 에더함 효율적인체크썸계산 (RFC1071) [A, B] +' [C, D] +'... +' [Y, Z] + 는 1 의보수합을의미 교환, 결합가능 계산을임의로묶거나순서를바꿔서수행해도결과는바뀌지않음 ([A, B] +' [C, D] +'... [J, 0]) +' ([0, K] +'... +' [Y, Z]) 바이트순서독립성 [B, A] +' [D, C] +'... +' [Z, Y] 로나온결과도바이트순서만바뀔뿐동일 병렬연산 [A, B] +' [C, D] +' [E, F] +' [G, H] 을 [A, B, C, D] +' [E, F, G, H] 후절반으로접어서다시 +' 해도동일하게계산된다.
인터넷프로토콜 (IP) 체크썸계산코드 while( count > 1 ) { /* This is the inner loop */ sum += * (unsigned short) addr++; count -= 2; } /* Add left-over byte, if any */ if( count > 0 ) sum += * (unsigned char *) addr; /* Fold 32-bit sum to 16 bits */ while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16); 캐리발생시다시더해야함 checksum = ~sum;
인터넷프로토콜 (IP) 체크썸계산연습
인터넷프로토콜 (IP) IP 단편의재조립과정 경우의수 빈공간에완전히딱맞아떨어지는경우 앞이나뒤의일부분만채우는경우 중간에끼어들어서남은공간을둘로쪼개는경우 RFC815 패킷이도착하면 hole descriptor list 조회 빈공간이메워지는경우해당 hole descriptor를 list에서제거 hole descriptor list가완전히비워지는경우재조립처리가능 용어정의 hole.first: 빈공간의첫번째바이트번호 hole.last: 빈공간의마지막바이트번호 hole descriptor: hole.first와 hole.last의쌍 hole descriptor list: hole descriptor의목록
인터넷프로토콜 (IP) IP 단편의재조립과정 RFC815 알고리즘 1. hole descriptor list 에서 hole descriptor 선택, 더이상없으면 8 번단계로 2. fragment.first 가 hole.last 보다크면 1 번단계로 3. fragment.last 가 hole.first 보다작으면 1 번단계로 4. hole descriptor list 에서현재항목삭제 5. fragment.first 가 hole.first 보다크면, [hole.first, fragment.first 1] hole descriptor 를새로생성 6. fragment.last 가 hole.last 보다작고 More Fragment 가참이면, [fragment.last + 1, hole.last] hole descriptor 를새로생성 7. 1 번단계로 8. 재조립완료
인터넷프로토콜 (IP) IP 단편화공격 Ping of Death IP 패킷은헤더포함하여최대길이 65535로제한됨 (RFC791) Fragment Offset 필드는 13비트이고 8바이트단위이므로 65528까지표현가능 마지막 Fragment가최대길이를넘어가는경우재조립할때크래시발생가능 ping -l 65510 호스트주소 Teardrop 데이터영역이겹치는서로모순되는 Fragment를전송 MF = 1 Fragment Offset = 1400 MF = 0 Fragment Offset = 1300 테스트 fragrouter 모든패킷을지정된크기로분할하여전송 http://monkey.org/~dugsong/fragroute/
전송제어프로토콜 (TCP) TCP 헤더
전송제어프로토콜 (TCP) TCP 상태다이어그램 CLOSED SYN_RCVD appl: passive open LISTEN recv: SYN send: SYN, ACK SYN_SENT appl: close or timeout appl : close send: FIN ESTABLISHED recv: FIN send: ACK CLOSE_WAIT FIN_WAIT_1 recv: FIN send: ACK data transfer state CLOSING appl : close send: FIN LAST_ACK recv: ACK send: <nothing> recv: ACK send: <nothing> passive close FIN_WAIT_2 recv: FIN send: ACK TIME_WAIT 2MSL timeout active close
전송제어프로토콜 (TCP) 슬라이딩윈도우
응용프로토콜디코딩 주요대상프로토콜 HTTP, FTP, TFTP, DNS, WINS, NETBIOS, LDAP, SNMP, SMTP, IMAP, POP3 TDS, TNS, SSH, TELNET, RLOGIN, RSH, RWHO, FINGER, IRC, MSNP, ICQ... 응용프로토콜분석에기반한룰문법제공을통하여정교한룰제작가능 예 1) HTTP Cookie 헤더를통한 SQL 인젝션시도탐지 예 2) DNS 요청패킷타입이 NULL 인경우 예 3) SMB NetPathCanonicalize 함수호출매개변수에 \..\.. 패턴이있는경우 파일분석 네트워크프로토콜뿐아니라전송되는첨부파일등검사필요 (DLP 등 ) 오피스문서를이용한취약점공격증가 취약점예 ) CVE-2008-4841, CVE-2008-4837, CVE-2008-4026 비정상행위탐지 표준규약에위배되거나공격일가능성이높은메시지를탐지 비정상적으로길이가긴경우버퍼오버플로우공격의심 통상적으로사용되지않는값이거나범위를벗어나는값 헤더정보와페이로드의불일치나무결성오류등
패턴매칭 Aho-Corasick: Trie 빌드 h i s e r s s h e
패턴매칭 Aho-Corasick: Failure Link 연결 1 h i s e r s s h e
패턴매칭 Aho-Corasick: Failure Link 연결 2 h i s e r s s h e
패턴매칭 Aho-Corasick: Failure Link 연결 3 h i s e r s s h e
패킷덤프 PCAP 파일포맷 사실상패킷덤프표준으로사용되고있는파일포맷 tcpdump, tcpreplay, wireshark 등 Global Header magic number: 바이트오더판별용도 (0xa1b2c3d4) version_major, version_minor: 대부분 2.4 thiszone: GMT와지역시간대차이를초단위로표시 snaplen: 캡처시최대패킷길이제한 network: 데이터링크계층타입 ( 예를들면이더넷 1, 토큰링 6) Packet Header ts_sec, ts_usec incl_len: 캡처된패킷데이터길이 orig_len: 원래패킷데이터길이 (snaplen으로인해잘릴수있음 )
로깅 Syslog (RFC5424, RFC5426) UDP 514 번포트사용 전송크기 수신자는 2048 바이트이상의메시지를받을수있어야함 ( 최소 480 바이트 ) 송신자는 IP 단편화를피할수있도록가급적최소 MTU 값이하로보내야함 패킷손실발생시로그를재전송할방법이없음 헤더 RFC 와달리실제환경에서는헤더에 PRI 만들어가는경우가대부분 PRI 는 <> 안에최대 3 자리숫자로표시되고 Facility 와 Severity 를표현함 PRI 값 = Facility x 8 + Severity Facility 값은 local0 ~ local7 (16~23) 을주로사용자정의하여사용 Severity 는 8 단계표시 (Emergency 0 부터 Debug 7 까지 ) 본문 정해진양식은없으며가급적 UTF-8 인코딩사용 ( 이때 BOM 마크필수 ) 스노트 Syslog 예시 <129>snort[24858]: [122:17:0] (portscan) UDP Portscan[Priority: 3]: {PROTO:255} 220.45.142.139 -> 10.10.0.10
로깅 SNMP Trap 용도 에이전트에서이벤트발생시매니저에게트랩메시지를전송하여통보 전송및포맷 UDP 162 번포트사용 ASN.1 로정의되며주로 BER 이나 DER 로데이터인코딩 ASN.1 은데이터구성을표현하는문법이고 트랩타입 일반유형 (Generic) 과사용자정의 (Specific) 로나누어짐 Cold Start(0), Warm Start(1), Link Down(2), Link Up(3), Authentication Failure(4), EGP Neighbor Loss(5), Enterprise Specific(6) Generic Trap 타입이 6 인경우 Specific Trap 타입을이용함
로깅 SNMP Trap v1 PDUs ::= CHOICE { get-request GetRequest-PDU, get-next-request GetNextRequest-PDU, get-response GetResponse-PDU, set-request SetRequest-PDU, IMPLICIT SEQUENCE { enterprise OBJECT IDENTIFIER, agent-addr NetworkAddress, generic-trap INTEGER { coldstart(0), warmstart(1), linkdown(2), linkup(3), authenticationfailure(4), egpneighborloss(5), enterprisespecific(6) }, trap Trap-PDU } } specific-trap INTEGER, time-stamp TimeTicks, variable-bindings VarBindList
로깅 SNMP Trap v1 패킷예제 30 29 02 01 00 04 06 6E 63 68 6F 76 79 A4 1C 06 07 2B 06 01 04 01 96 26 40 04 0A 00 01 7B 02 01 06 02 01 00 43 03 13 65 3C 30 00 BER Type-Length-Value 구조 30 29: 시퀀스타입, 길이 41 (0x29) 02 01 00: INT 타입, 길이 1, 값 1 04 06 6E 63 68 6F 76 79: OctetString 타입, 길이 6, 문자열 NCHOVY A4 1C: Trap-PDU 타입, 길이 28 (0x1C) 06 07 2B 06 01 04 01 96 26 1 OID 타입, 길이 7, 첫 2개숫자는 X * 40 + Y로인코딩 2 큰숫자표현시 MSB를 MORE DATA 싞호비트로사용 3 96, 26 => 10010110, 00100110 => 101100100110 4 즉,.1.3.6.1.4.1.2854 5 길이에서도큰숫자표현시동일한기법사용 40 04 0A 00 01 7B: NetworkAddress 타입 43 03 13 65 3C: TimeTicks 타입 (1/100 초단위 ) 30 00: 시퀀스타입 (Variable Bindings 부분 )