[이더리얼 강좌 4] 이더리얼 강자되기 위한 필수 문법 I

Posted by 잿빛푸우 greypoooh@daum.net
2007.06.11 10:17 IT 정보&리뷰
패킷 분석기로서의 이더리얼을 가장 사용하는 방법은 내가 필요한 패킷만을 골라서 잡아보는 것이다. 이런 방법에 앞서서 선행돼야 것은 TCP/IP 통신원리를 아는 것이고, TCP/IP 위에서 각종 애플리케이션들이 어떤 방식으로 동작하는가를 또한 익혀야 한다. 물론 처음부터 이런 부분들을 모두 수는 없겠지만 이더리얼을 통해서 내가 원하는 2,3,4계층의 정보를 살펴보면, 상위계층의 애플리케이션까지도 자연스럽게 파악할 있을 것이다.

 최근 웜바이러스가 또다시 극성을 부리고 있다. 네트워크 엔지니어이건 보안 엔지니어이건 간에 웜바이러스 때문에 골치를 앓기는 마찬가지일 것이다. 그런데 전문적으로 PC 보안을 다루는 사람이 아니라면 어떤 종류의 웜이 우리의 네트워크를 갉아먹고 있는지 수가 없다. 이더리얼에 대해 지금껏 학습한 관리자라면 이런 경우 이더리얼을 이용하는 것이 좋지 않을까라고 한번쯤은 생각해 것이다.

지금까지 3회에 걸친 강좌를 통해 이더리얼이라는 우수한 패킷분석기를 써서 패킷을 캡처하는 것에 대해 소개했다. 하지만 모든 패킷을 캡처해서 보기에는 등으로 인해 발생되는 패킷의 양은 너무나 많다. 때문에 이제부터는 내가 정말 필요로 하는 패킷들을 살펴보는 기능을 익혀야 한다. 그러기 위해서는 기본적인 이더리얼의 사용 문법을 알아야만 한다. 이더리얼이 어떤 특징을 지닌 패킷 분석기인가를 어느 정도 파악했다면 이제부터는 이더리얼 사용 문법을 손과 머리로 꾸준히 익혀서 거의 무의식적으로 사용할 있을 정도로 연습해 보도록 하자.

 조건에 따른 패킷의 캡처
이더리얼은 패킷의 캡처 필터에 libcap 필터 언어를 사용한다. 이것은 TCPDUMP tcpdump man page 설명돼 있다. 지금부터 이야기하는 이더리얼의 필터 문법을 익히고, 숙달하게 되면, 네트워크 상에서 필요한 알찬 정보만을 얻는 관리자가 것이다.
패킷캡처를 실행하기 필터옵션창의 Filter 항목에 캡처 필터 구문을 입력하게 되는데 (화면 1) 예에서 보이는 빈칸이 그것이다. 캡처 필터는 전체적으로 여러 개의 필터를 연결해서 복잡한 조건을 설정할 있는 'and/or' 불필요한 패킷을 제외해주는 'not' 결합 등을 통해 이뤄진다.

 

사용자 삽입 이미지
 

(화면 1) 이더리얼의 패킷 캡처 옵션 다이얼로그 박스

 

여기서 만약 특정 IP에서 발생하는 텔넷 패킷만을 캡처하고자 한다면 (화면 2) 같이 설정할 있다.
(
화면 2) 보면 개의 필터 문구와 결합조건구문인 'and' 어떻게 사용하는지를 있다. 이번에는 모든 텔넷 트래픽 중에서 특정 IP(목적지 주소 또는 출발지 주소를 모두 포함)만을 제외시키는 예를 한번 보도록 하자.

  

사용자 삽입 이미지
 

(화면 2) 특정 IP 텔넷 패킷만 캡처하기

 

 

(화면 3) 앞부분부터 해석하면 'tcp 23 포트를 가진 패킷들을 캡처해라. 그리고 이중 219.144.59.152 IP 출발지/목적지인 패킷은 제외하라' 된다. 우리가 영어를 해석하는 것처럼 정해진 문구들을 사용하기 때문에 이처럼 명확하고 자세하게 필터 명령(또는 옵션) 사용할 수가 있으며, and not 구문의 사용은 보다 세밀한 패킷캡처를 가능하게 한다.

  

사용자 삽입 이미지
 

(화면 3) 텔넷 패킷 특정 IP 오가는 패킷만 제외하기

 

 

앞서 언급했던 조합을 위한 'and, or, not' 지금부터 설명할 문구들을 도와주는 역할을 한다. 무엇보다 패킷을 캡처할 가장 기본이 되는 것이 다음에 이야기할 기본적이며, 세밀한 조절을 위한 문구들이다.
그럼 이제부터는 '어떤 대상(또는 호스트) 목표로 것인가?' 대해 정의돼 있는 구문을 살펴보자.

 

번째 구문 : 대상지정(Address 구분)

[src|dst] host <host>

 

위의 구문은 상당히 직관적이다. 출발지를 뜻하는 src(Source) 목적지를 뜻하는 dst(Destination) 그리고 해당 출발지/목적지의 실제 IP host 입력하면 내가 캡처하고자하는 대상에 대해 오고가는 모든 패킷들을 캡처할 수가 있다. 이때 host 대상은 hostname(이는 name resolution 되는 환경에서) 또는 IP 어드레스가 된다. 만약 MAC 어드레스로 대상을 구분하고자 한다면 다음과 같은 Form 따른다.

 

ether [src|dst] host <ehost>

 

여기서 다른점은 출발지와 목적지의 구분 앞쪽에 ether 써서 이더넷 어드레스인 MAC 사용한다는 것을 정의한다는 것이다. 나머지는 앞의 구문과 동일하다.

  

사용자 삽입 이미지
 

(화면 4-1)  IP 캡처하기

 

 

사용자 삽입 이미지

 

(화면 4-2)  MAC 캡처하기

 


게이트웨이로 설정된 호스트에 대한 패킷들을 캡처하는 필터명령 구문은 다음과 같다.

 

gateway host <host>

 

참고로 구문에서는 이더넷 어드레스와 IP 어드레스 모두 구분없이 사용된다. 그러면 이렇게 단일 호스트 단위로만 패킷캡처가 가능한 것인가? 당연히 아니다. 다음과 같은 구문을 이용해 네트워크 대역으로 패킷을 캡처할 있다.

[src|dst] net <net> [{mask <mask>}|{len <len>}]

 

보다 단순한 구문으로 예를 들어보자.

 

src net 192.168.0.0 mask 255.255.255.0

 

구문을 해석하면 ''출발지 네트워크가 192.168.0.0 네트워크(C 클래스) 포함되는 패킷들을 잡아라'이다. 여기서 좀더 유연한 운용을 위해서 CIDR Prefix 값도 사용할 있게 했다. 다른 예를 살펴보자.

src net 192.168.10.0/24

 

여기서 사례로 캡처 구문은 동일한 결과를 가져온다. 다시 한번 이야기 하지만 출발지와 목적지의 구분없이 특정 네트워크 대역을 캡처하려면 src/dst 없이 net부터 바로 시작하면 된다.


사용자 삽입 이미지
 

(화면 5-1) 네트워크 대역으로 캡처시 CIDR Prefix

 

 

사용자 삽입 이미지
 

(화면 5-2) 네트워크 대역으로 캡처시 netmask 이용


 

지금까지 호스트를 구분해 패킷을 캡처할 대상을 정하는 문법을 살펴봤다.

이제부터는 보다 자세히 패킷을 제어하기 위해 포트를 지정하는 방법을 알아보도록 하자.


 

< 번째 구문 : 보다 자세히(포트로 구분)>

 

[tcp|udp] [src|dst] port <port>

 

역시 문법적으로 비슷하기 때문에 예를 들어보도록 하겠다.

 

udp src port 135

 

구문을 해석하면 '지나가는 패킷 중에 UDP 프로토콜에 포트 번호가 135번인 패킷들을 모두 잡아라'이다. 여기에서 보듯이 구문 중에 가장 앞에 오는 것은 프로토콜의 형태(UDP 혹은 TCP)이다. 부분은 반드시 지켜야 하는 문법이며 사용시 유의할 필요가 있다.
다음은 패킷의 길이에 따른 구분을 통한 캡처를 해보자. 바이러스 패킷들은 보통 기본 패킷 길이가 64바이트 보다 작은 경우가 많기 때문에 이런 이상 패킷들을 감지할 사용할 있다.

 

< 번째 구문 : 크기로(패킷의 길이로 구분하기)>


less|greater <length>

 

구문은 지정한 길이보다 크거나(greater), 작은(less) 패킷을 캡처하는 것을 의미하며 다음과 같이 예를 들어볼 있다.

 

less 64

 

해석은 '64바이트 보다 작은 패킷들을 잡아라'이다. 참고로 패킷을 잡을때는 보통 48바이트 이하로 설정하는 경우가 많다.

 

< 번째 구문 : 특정 프로토콜로 지정해 캡처하기>

 

앞서 알아본 호스트(IP 또는 MAC) 포트(TCP 또는 UDP) 그리고 크기 이외에 이더리얼은 IP 계층 프로토콜이나 이더넷 계층 프로토콜(데이터 링크 계층 프로토콜) 지정해 캡처할 있다. 필터 형식은 다음과 같다.

 

ip|ether proto <protocol>

 

한가지 예를 들어보도록 하자.

 

ether proto 802.1

 

해석은 '이더넷 프로토콜 802.1 잡아라'이다. 여기서 필자는 처음에 이야기 했던 "보다 자세히 알기 위해서는 프로토콜에 대한 공부부터 해야 한다" 말을 되새겨 본다. 같은 프로토콜에 대한 기본 지식을 바탕으로 내가 캡처해야 패킷이 어떤 것이며, 또한 프로토콜은 어떤 형식을 가지는가를 있다.
OSI 7
계층의 구분과 함께 실제 TCP/IP 구조에서 소켓 통신을 위해 사용하는 포트번호까지, (그림 1) 통해 대략적인 그림을 살펴보기 바란다. 모두 알고 있지만 잊기 쉬우므로 항상 기본적인 그림을 머릿속에 그려놓고 통신과 관련해 생기는 문제를 해결하는 단서로서 사용하도록 하자.

 

사용자 삽입 이미지
 

(그림 1)처럼 네트워크에서 이야기하는 OSI 7계층 구조는 TCP/IP 4계층으로, 실제 사용이 되며, 이런 TCP/IP 통신은 (그림 2)에서 있듯이 'IP + 포트번호' 조합인 소켓통신으로 이뤄진다.

  

사용자 삽입 이미지
 

(그림 1, 2) 통해 기본 사항은 살펴봤다. 해당 프로토콜의 포맷 등에 대한 예는 다음 소개할 확장 표현을 통해 살펴보기로 하자. 지금까지 앞서 살펴본 표현 양식과는 다른 표현 양식으로, 브로드캐스트와 멀티캐스트 패킷을 구분해 캡처할 있는 구문이 있는데 다음과 같다.

 

ether|ip broadcast|multicast

 

IP 어드레스로 멀티캐스트 패킷을 모두 캡처하는 예를 들면 다음과 같다.

 

ip broadcast

 

캡처 구문을 통해 잘못된 서브넷 마스크가 설정된 호스트가 있을 경우 해당 증상을 확인할 있다. 어떤 호스트가 같은 네트워크 대역이 아닌 다른 호스트와 통신을 해야 하는데 호스트의 서브넷 마스크가 제대로 설정돼 있지 않고 다른 네트워크 대역에 있는 호스트를 포함하는 서브넷 마스크로 설정돼 있을 경우에 게이트웨이로 패킷을 포워딩하지 않고 계속해서 arp broadcast 한다.
경우 이와 같은 패킷캡처를 통해 해당 문제를 확인하거나 해결할 있다. 이때 해당 패킷을 파악할 있기 위해서는 멀티캐스트 MAC 어드레스 형식이나 브로드캐스트 어드레스 형식, IP 이더넷 어드레스 모두를 알고 있어야 한다.
캡처하는 마지막 문법으로, 캡처한 패킷에서 자신이 원하는 특정 조건을 검색해 내는 expression 조합해서 사용할 있는 필터 구문이 있는데, 형식은 다음과 같다.

 

<expr> relop <expr>

 

표현이 조금 어렵지만 예를 통해 살펴보자.

 

ether[0] & 1!=0

 

필터의 해석은 '모든 멀티캐스트 MAC 가진 트래픽을 잡아라'이다. 앞서와 달리 상당히 생소하고 어려운 구문인데, 이유는 C프로그래밍에서 사용하는 숫자구문들을 expression으로 사용하기 때문이다.
프로그래밍을 어느 정도 해봤던 프로그래머라면 복잡하지만 방법이 오히려 확실하고 빠를수 있을 것이다. 여기서 relop 해당하는 것이 "&" "!="인데 사용할 있는 rellop로는 ">, <, >=, <=, =, !=, " 등이 있다. 그리고 앞뒤의 expression C 언어에서 사용하는 정수의 표현문구들이다.

  

사용자 삽입 이미지

 

(화면 6) 복잡한 숫자 표현 문구를 통한 필터 방식

 

그러나 대부분의 네트워크/보안 엔지니어에게 이런 표현을 사용하는 것은 조금 낭비적 요소가 있다. 이유는 같은 표현인 "ether multicast"라는 보다 쉽운 구문이 있기 때문이다.
이번호에서 우리는 이더리얼로 패킷을 캡처하는 상황에서의 기본 구문을 알아봤다. 다시 한번 간단히 정리하면 어떤 대상을 캡처할때, 대상이 되는 패킷이 단일 호스트인지, 네트워크 대역인지 그리고 어떤 포트를 사용하며, 크기로 구분할 때는 어느 크기 이상/이하인지를 가지고 각각 구문을 이용할 있으며, 이에 따라서 "and, or, not" 중에서 어느 문구를 사용해 조합을 것인지 등을 결정해야 한다. 결정이 다음에는 지금껏 설명한 기본적인 문구들을 능숙하게 조합헤 캡처하면 된다. 다음 시간에는 캡처할 패킷이 아닌 캡처된 패킷을 구분해내기 위한 조금은 복잡한 명령구문들을 살펴볼 것이다.


출처 : www.ionthenet.co.kr

이 댓글을 비밀 댓글로