티스토리 뷰

2. 조회하는 동안 패킷들을 캡쳐하기

Ethereal은 두개의 필터링 언어를 가지고 있다. 한개는 패킷을 캡쳐할때 사용되고, 다른 한개는 패킷을 디스플레이할때 사용된다. 이 장에서는 필터의 두번째 타입을 조사할 것이다. 처음의 타입은 벌써 4장의 5. 캡쳐하는 동안 필터링하기 에서 다루어졌다.


디스플레이 필터들은 당신이 관심있어하는  패킷에 집중하는 것을 허락한다. 그것들은 당신이 아래와 같은 기준에 의해서 패킷을 선택하는 것을 허락한다.


프로토콜

필드 자체

필드들의 값

필드들간의 비교

그외 더 많은 것들..


프로토콜 타입에 근거해서 패킷을 선택하기 위해서는, 당신이 관심있어하는 프로토콜을 Ethereal 창의 필터 툴바의 Filter 필드에 간단히 타이핑해라. 그리고 필터를 시작하기 위해서 엔터를 쳐라. 그림 6.6. "TCP 프로토콜 필터링"는 당신이 필터 필드에 tcp를 타이핑할때 어떤 일이 일어나는지에 대한 예를 보여준다.


 주의!

모든 프로토콜과 필드 이름들은 소문자로 입력되어야 한다. 또한, 필터 표현을 입력한 후에 엔터 치는 것을 잊지마라.


그림 6.6 TCP 프로토콜 필터링

사용자 삽입 이미지


아마도 당신이 알아챈것처럼, TCP 프로토콜의 패킷들만이 지금 디스플레이되고 있다.(예로써, 1부터 10까지의 패킷들은 보이지 않는다.) 패킷 번호는 처음과 같이 그대로 유지되기 때문에, 가장 처음에 보이는 패킷의 번호는 11이다.


 주의!

디스플레이 필터를 사용할때, 모든 패킷들은 캡쳐 파일안에 (그대로) 남아 있다. 디스플레이 필터는 단지 캡쳐 파일의 디스플레이만 변경시키지, 그 내용물은 변경하지 않는다.


당신은 Ethereal이 판독할 수 있는 어떤 프로토콜에 대해서도 필터할 수 있다. 또한 당신은 해부자가 트리 뷰에 추가한 어떤 필드(단, 만약 해부자가 필드에 대하여 약자를 추가한 경우는 예외이다.)에 대해서도 필터할 수 있다. 그런 필터들의 목록은 Ethereal의 Add Expression... 다이얼로그 박스에서 사용 가능하다.


예로써, IP 주소 192.168.0.1로 주고받는 패킷들만으로 패킷 목록 창을 좁아지게 하기 위해서는 ip.addr==192.168.0.1을 사용한다.


 주의!

필터를 제거하기 위해서는, 필터 필드의 오른쪽에 있는 Clear 버튼을 클릭해라.



3. 디스플레이 필터 표현들 만들기

Ethereal은 간단하지만 강력한 디스플레이 필터 언어를 제공한다. 당신은 이것을 가지고 꽤 복잡한 필터 표현들을 만들 수 있다. 당신은 패킷들안의 값들을 비교할 수 있을뿐만 아니라, 표현들을 더 상세한 표현들속으로 결합할 수 있다. 다음의 섹션들은 이것을 수행하기 위한 더 많은 정보를 제공한다.


3.1. 필터 필드들을 디스플레이

패킷 상세 창안의 모든 필드는 필터 문자열로써 사용될 수 있고, 이것은 그 안에 이 필드들이 존재하는 패킷들만 보여주게 된다. 예로써, tcp 필터 문자열은 tcp 프로토콜을 포함하는 모든 패킷들을 보여줄 것이다.


메뉴 아이템 "Help/Supported Protocols"의 "Display Filter Fields" 페이지에는 사용 가능한 모든 필터 필드들의 완전한 목록이 있다.


3.2. 값들 비교

당신은 아주 많은 서로 다른 비교 연산자들을 사용하여 값들을 비교하는 디스플레이 필터들을 만들 수 있다. 그것들은 표 6.2. "디스플레이 필터 비교 연산자들"에서 보여진다.


 

당신은 English와 C-like 용어들을 같은 방법으로 사용할 수 있다. 심지어는 그것들은 필터 문자열안에 섞일 수도 있다.


테이블 6.2. 디스플레이 필터 비교 연산자들

English

C-like

설명 및 예

eq

==

같다

ip.addr == 10.0.0.5

ne

!=

같지 않다.

ip.addr != 10.0.0.5

gt

> 

크다

frame.pkt_len > 10

lt

< 

작다

frame.pkt_len < 128

ge

>=

크거나 같다

frame.pkt_len ge 0x100

le

<=

작거나 같다

frame.pkt_len <= 0x20


추가적으로 모든 프로토콜 필드들은 분류되어진다. 표 6.3. "디스플레이 필터 필드 타입들"는 타입들의 목록과 그것들을 어떻게 표현할 것인지에 대한 예제를 제공한다.


표 6.3. 디스플레이 필터 필드 타입들

Type

예제

Unsigned intege

(8-bit, 16-bit, 24-bit, 32-bit)

당신은 integer들을 10진수 또는 8진수 또는 16진수로 표현할 수 있다. 다음의 디스플레이 필터들은 모두 같은 값들이다.

 

ip.len le 1500

ip.len le 02734

ip.len le 0x436

Signed integer

(8-bit, 16-bit, 24-bit, 32-bit)

 

Boolean

boolean 필드는 만약 그 값이 true일 경우만, 프로토콜 디코드에서 존재한다. 예로써, tcp.flags.syn는 만약 SYN 플래그가 TCP 세그먼트 헤더에 존재할 경우만, 존재하며, 그 값은 true이다.

 

따라서 필드 표현 tcp.flags.syn는 이 플래그가 존재하는 패킷들만 선택한다. , 그 패킷들은 세그먼트 헤더가 SYN 플래그를 포함하는 TCP 세그먼트들이다. 비슷하게, 소스가 라우팅되는 토큰 링 패킷들을 발견하기 위해서는 tr.sr 필터 표현을 사용하라.

Ethernet address(6 bytes)

eth.addr == ff:ff:ff:ff:ff:ff

IPv4 address

ip.addr == 192.168.0.1

IPv6 address

 

IPX network number

 

String(text)

 

Double-precision floating point number

 

 

3.3. 표현들의 결합

당신은 표 6.4. "디스플레이 필터의 논리적 연산자들"에서 보여지는 논리적 연산자들을 사용함으로써 Ethereal의 필터 표현들을 결합할 수 있다.

 

6.4 "디스플레이 필터의 논리적 연산자들"

English

C-like

설명 및 예

and

&&

논리적 AND

ip.addr == 10.0.0.5 and tcp.flags.fin

or

||

논리적 OR

ip.addr == 10.0.0.5 or ip.addr == 192.1.1.1

xor

^^

논리적 XOR

tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29

not

!

논리적 NOT

not 11c

[]

 

하위 문자열 연산자

Ethereal은 당신이 보다 정교한 방법들로 순서의 결과들을 선택할 수 있게 한다. 라벨을 한 이후에 콤마로 분리된 범위 열거자들의 목록을 포함하는 꺾쇠괄호 [] 한 쌍을 놓아 둘수 있다.

 

eth.src[0:3] == 00:00:83

위의 예제는 하나의 범위를 상세화하기 위해서 n:m 포맷을 사용한다. 이 경우에 n은 시작 offset이고 m은 상세화된 범위의 길이이다.

 

eth.src[1-2] == 00:83

위의 예제는 하나의 범위를 상세화하기 위해서 n-m 포맷을 사용한다. 이 경우 noffset의 시작이고 moffset의 끝이다.

 

eth.src[:4] == 00:00:83:00

위의 예제는 :m 포멧을 사용한다. 이것은 순서의 시작으로부터 offset m까지의 모든 것을 가진다. 이것은 0:m과 동일하다.

 

eth.src[4:] == 20:20

위의 예제는 n: 포멧을 사용한다. 이것은 offset n으로부터 순서의 마지막까지의 모든 것을 가진다.

 

eth.src[2] == 83

위의 예제는 하나의 범위를 상세화하기 위해서 포멧을 사용한다. 이경우에 offset n의 순서안의 엘레먼트는 n이 선택된다. 이것은 n:l과 동일하다

 

 

3.4. 공통된 실수

종종 사람들은 ip.addr == 1.2.3.4와 같은 필터 스트링을 사용한다. 이것은 IP 주소 1.2.3.4를 포함하는 모든 패킷들을 디스플레이할 것이다.

 

그 다음에 당신은 IP 주소 1.2.3.4를 포함하지 않는 모든 패킷들을 보기 위해서 ip.addr != 1.2.3.4를 사용한다. 불행히도, 이것은 예상한대로 작동하지 않는다.

 

대신에, 그 표현은 소스나 목적지 IP 주소가 1.2.3.4와 동일한 패킷들에 대해서도 true이다. 이것에 대한 이유는 ip.addr != 1.2.3.4 표현은 틀림없이 "패킷은 1.2.3.4와 다른 값을 가진 ip.addr로 불리는 필드를 포함한다."로써 읽혀지기 때문이다. IP 데이터그램은 소스와 목적지 주소 모두를 포함하기 때문에, 그 표현은 최소한 두 주소중 한군데라도 1.2.3.4와 다르면 true로 평가할 것이다.

 

만약 당신이 소스와 목적지가 IP 주소 1.2.3.4인 IP 데이터그램들을 포함하는 모든 패킷들을 여과하기를 원한다면, 그때의 정확한 필터는 !(ip.addr == 1.2.3.4) 이다. 이것은 "나에게 1.2.3.4 값을 가진 ip.addr로 불리는 필드가 존재한다라는 것이  true가 아닌 모든 패킷들을 보여라" 또는 "1.2.3.4 값을 가진 ip.addr이라고 불리는 필드가 발생하지 않는 모든 패킷들을 여과하라" 로써 읽기 때문이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크