2012년 2월 1일 수요일

유용한 네트워크 분석 도구 소개와 패킷분석 입문

저번 네트워크 포렌식 의미와 패킷 구조를 살펴본 것에 이어, 다양한 분석도구를 소개한 글입니다.  월간 '안' 에 소개된 두 번째 연재 글이며, 이미 많은 내용들이 블로그에서 한번 언급한 내용들이기도 합니다. 또 블로그에 없었던 내용도 있습니다.

이미 한번씩 보셨던 분들이라면 다시 한번 리뷰 한다는 생각으로 읽어봐 주시면 좋겠습니다.

다음 월간 '안' 링크를 참고해 보셔도 좋습니다.

1) [Tech Report] 개발자를 위한 유용한 분석 도구 소개와 패킷 분석
2) 안철수연구소 보안매거진 월간 '安'


[1부] 네트워크 포렌식 의미, 그리고 패킷 해부

이번호에서는 패킷 분석 도구와 함께 분석에 도움이 될 만한 접근 방법을 소개하고자 한다. 패킷 분석이 익숙하지 않으면 어디서부터 어떻게 시작해야 할지 난감하다. 여기서는, 분석가들과 패킷 분석을 하기 위한 방법과 수많은 도구 중 분석가들에게 실질적으로 도움이 될 만한 몇 가지를 공유하고자 한다. 자신만의 방법으로 패킷 분석을 확립하는 계기가 됐으면 좋겠다.


패킷 분석 첫 경험

와이어샤크와 같은 패킷 분석 도구로 패킷 파일을 열어보기는 했는데, 어떻게 시작해야 할지, 또 여기서 무엇을 얻어내야 할지 모르겠다면 아래에서 말하는 다섯 가지만은 알고 시작하기를 추천한다.

첫째, 패킷 분석에 앞서 필요한 것은 도구의 선택이다.
도구 없이 분석하는 것은 현실적으로 어렵다. 선택한 도구는 자신의 것으로 만들어라. 사용하는 도구의 기능을 정확히 알아야 빠르고 효율적인 분석이 가능하다. 만약 와이어샤크를 선택했다면 이 도구가 지원하는 많은 기능을 가급적 자신의 것처럼 익히고 직접 실행하고 경험해 보아야 한다.

둘째, 분석의 목적이 무엇인지 명확히 판단하라.
패킷 분석을 통해 어떤 정보를 얻으려는 것인지 명확히 알고 있어야 한다. 목적에 따라 분석 방법이 달라진다. 수십 메가바이트에 이르는 데이터라면 분석하는 데 많은 시간이 소요된다. 왜(Why) 이것을 분석해야 하고 무엇을 얻어야 하는 것인지 확실하게 인지해야 한다.

셋째, 분석의 범위를 파악하라.
모든 패킷을 세부적으로 분석하는 데는 많은 시간이 필요하다. 분석의 범위를 한정해 필요한 내용만을 걸러내자. 예를 들어, 개발중인 특정 포트의 애플리케이션에 문제가 있다면 해당 포트 번호로 필터를 사용한다. 또 일반적으로 발생하는 브로드캐스팅 및 기타 프로토콜을 제외하고 시작하는 것만으로도 첫 접근이 더욱 쉬워질 것이다.

넷째, 끈기와 인내가 필요하다.
패킷 파일 분석을 시작했다고 해서 바로 해답을 얻을 수 있는 것은 아니다. 100메가바이트가 되는 패킷 파일의 분석을 의뢰 받았다고 가정해 보자. 100메가바이트! 생각만 해도 답답하다. 여기서 원하는 데이터를 찾기 위해서는 오랜 시간과 노력을 들여야 한다. 그만큼 끈기와 인내가 필요하다.

다섯째, 패킷 파일은 모든 문제의 해결책은 아니다.
패킷 파일을 들여다보면 문제의 원인이 다 해결될 것이라고 믿는 사람이 있다. 그러나 이것은 어디까지나 하나의 단서가 되거나 여러 가지 가능성 중 하나의 실마리만을 제공할지도 모른다. 문제의 해결은 종합적인 관점에서 접근해야만 한다.

이상 다섯 가지는 필자가 생각하는 패킷 분석 접근 방법이다. 패킷 분석에 앞서 기본 평가를 하는 것은 중요하다. 왜 이 데이터를 분석해야 하고, 분석 대상의 범위는 어디까지이며, 패킷 분석 대상의 네트워크 정보는 충분한가 질문해보아야 한다. 그리고 이어지는 단계에서는 데이터를 평가하고 표면 분석(Surface Analysis)이라고 할 수 있는 정도의 분석이 요구된다. 필자가 정의하고 있는 표면 분석은 세부 분석 전 단계의 과정이다.

즉, 기본 통계 정보 및 주요 사용 프로토콜 등 1차 정보 수집과 분석 대상 데이터의 전체적인 흐름 파악, 그리고 기본 트래픽 정보에서 의심 사항을 도출하는 것이다. 불필요한 패킷 데이터는 제외하고 빠르게 판단하여 분석 대상의 가치를 평가한 후에 세부 분석을 진행하는 것이 좋다. 그것은 분석 범위가 명확할수록 분석 속도와 정확성은 높아지기 때문이다.


패킷 분석 기본 정보를 얻고 시작하자!

패킷 분석 시작 전, 패킷의 기본 정보를 파악하는 것은 중요하다. 패킷 요약 정보를 통해 기본 정보를 얻고 시작하는 것만으로도 큰 도움을 받을 수 있다. 세부 분석에 앞서 패킷 파일에서 통계 정보, 주요 사용 프로토콜 정보 등을 1차적으로 수집하는 것이 필요하다.

[그림 1]은 패킷이 초당 평균 154개를 전송했고, 평균 전송된 바이트는 116Kbps 정도의 트래픽이다. 1분 1초 동안 9597개의 패킷을 캡처한 것이니 과도한 수준은 아니다. 물론, 이것은 캡처한 네트워크 환경에 따라 달라지므로, 분석 시점마다 판단 기준은 달라질 것이다.

이 정보는 와이어샤크 메뉴 Statistics->Summary를 선택하면 얻을 수 있으며, Displayed로 선택된 트래픽은 출력 필터를 적용한 정보만 보여주는 것이다. 이 정보는 유용하게 사용될 수 있는데, 만약 특정 사이트를 대상으로 임의의 패킷이 대량으로 발생됐다면 다른 패킷 정보는 제외하고 해당 패킷만을 대상으로 필터링해 아래와 같은 정보를 얻을 수 있으니 보고서 작성 등에 유용하다.

- 초당 전송된 평균 패킷 개수
- 초당 전송된 평균 패킷 사이즈
- 전체 바이트
- 초당 전송된 평균 바이트
- 초당 전송된 평균 메가비트(메가바이트가 아니라 Bit라는 점에 주의하자!)

[그림 1] 와이어샤크 트래픽 요약 정보 화면

트래픽 요약 정보와 기본적으로 살펴봐야 하는 것이 프로토콜별 상태 정보이다. [그림 2]는 90% 가까이가 TCP 정보임을 보여주고, 그 중에서도 데이터에 해당하는 것이 크다. 즉, 데이터 전송 페이로드가 꽤 큼직함을 보여주는데 실제로도 TCP 데이터 중 1280-2559 크기에 해당하는 것이 50% 정도 차지한다. 이렇듯, 프로토콜별 상태 정보를 보면 전체적으로 분석해야 할 대상을 인지하고 현재 상황을 예상할 수 있다.

[그림 2] 와이어샤크의 프로토콜 구조별 상태

기본 정보를 파악하는 것 외에 분석 과정에서 중요한 것이 ‘필터’를 적용하여 원하는 정보에 빠르게 접근하는 것이다. 필터는 크게 패킷을 덤프하는 과정에서 사용하는 캡처 필터와 출력된 패킷 정보에 적용하는 출력 필터로 나뉜다. 우선, 캡처 필터부터 알아보자.

패킷 덤프를 시작할 때 트래픽이 너무나 많은 구간에서는 눈으로 보기 어려울 정도로 빠르게 올라가는 스크롤 때문에 당황한 적이 있을 것이다. 트래픽이 많지 않은 경우에는 Full Dump를 수행해서 살펴볼 수도 있지만, 고속의 네트워크 구간에서는 흐르는 트래픽이 엄청나다. 또한 이 파일이 기록되는 파일은 빠르게 크기가 늘어난다. 분석할 데이터가 특정한 호스트나 포트, 프로토콜 등으로 한정되는 경우라면 패킷 덤프 시작 전부터 캡처 옵션을 반영하여 사용하는 것이 좋다. 와이어샤크의 경우 패킷 덤프를 시작하면 [그림 3]과 같은 화면을 볼 수 있으며, 이때 Capture Filter라는 부분에 필터를 넣어주면 된다.


[그림 3] 와이어샤크의 캡처 필터 옵션

필터는 tcpdump에서 사용하는 것과 같은 형태이므로 tcpdump에 익숙한 사용자라면 쉽게 사용할 수 있다. 필터를 정확히 모르더라도 Capture Filter를 누르면 [그림 4]와 같이 적용할 필터 내용이 나타나므로 선택해 반영하면 된다.

[그림 4] 와이어샤크 캡처 필터 프로파일 만들기

대표적인 캡처 필터 몇 가지를 살펴보면 다음과 같다.

캡처 필터가 올바르지 않은 경우에는 에러 메시지가 나타나고 캡처가 시작되지 않는다. 참고로, 와이어샤크의 메인 화면에서 사용할 수 있는 출력 필터는 캡처 필터의 문법하고는 다르니 혼동하지 않도록 주의한다. 출력 필터는 캡처된 데이터에서 보고 싶은 내용에 필터를 걸어 화면으로 출력하는 것이다.

현재 와이어샤크는 약 11만 3천 개의 출력 필터를 지원하며 지원하는 필터 정보는 다음 주소를 참고한다.


출력 필터는 와이어샤크 메인 화면에서 [그림 5]와 같이 적용할 수 있다. 필터를 적용 해제하는 경우 Clear를 선택하고 필터를 적용하는 경우는 Apply를 선택한다.


[그림 5] 출력 필터가 올바른 경우와 그렇지 않은 경우

필터가 워낙 많다 보니 일일이 다 외울 수 없어 몇 가지 편의사항을 제공한다.
•  필터에 표시되는 색상을 통해 문법이 올바른지 확인할 수 있다.
•  문법을 정확히 모르는 경우 Expression을 선택해 필요한 출력 필터를 만들 수 있다.
•  출력된 상세 정보에서 원하는 내용에 우측 클릭하여 Apply 또는 Prepare 필터를 적용할 수 있다. [그림 6] Prepare 필터를
    누르면 출력 필터 쪽에 선택된 내용이 입력돼 편하게 사용할 수 있다. 11만여 개의 필터를 다 외우지 않고, 필터를 몰라도 쉽
    게 사용이 가능하다([그림 7]).


[그림 6] 필터 문법 제작 기능


[그림 7] 상세 정보에서 필터 만들기


다음 몇 가지 출력 필터 예제를 참고해 보자. 

마지막으로 다시 언급하자면, 캡처 필터와 출력 필터는 문법이 다르다.


다양한 분석 도구를 이용해 분석 능률 UP!

패킷 분석은 앞서 언급한 것과 같이 도구의 도움 없이는 현실적으로 어렵다. 분석가들에게 분석 도구란 어떤 의미일까? 패킷 분석에 관련한 도구는 여기서 일일이 다 열거하기 힘들 만큼 너무나 많다. 하지만, 도구마다 사용 목적이 다르기 때문에 자기 업무에 맞는 도구 몇 개쯤은 익혀두는 게 좋다. 맥가이버 칼과 같이 필요에 따라 사용 도구를 꺼내 쓰면 되는 것처럼 말이다.

도구는 본인이 가장 자신 있게 사용할 수 있는 것이 최고이다. 겉핥기 식의 도구 사용보다는 단 한 개라도 내 것으로 만드는 것이 중요하다. 사용하는 도구의 기능을 정확히 알아야 빠르고 효율적인 분석이 가능하기 때문이다. 각 분야별로 자신이 생각하는 최고의 도구를 갖게 된다면 ‘패킷’ 분석만큼은 걱정이 없을 것이다.


[그림 8] 다양한 패킷 관련 분석 도구들

[그림 8]과 같이 패킷 분석에 다양한 도구들이 있는데 그 중에서 몇 가지만을 소개하겠다. 대표적인 분석 도구인 와이어샤크부터 패킷 파일의 자유로운 편집, 그리고 텍스트 파일을 PCAP으로 저장하는 것까지 알아보도록 하자.

1. 대표적 패킷 분석 도구 와이어샤크에서 국가 정보와 그래프를 출력해 보자. 

와이어샤크는 가장 대중적인 패킷 분석 도구 중의 하나이다. 와이어샤크의 기본 기능은 이미 사용하고 있으므로, 유용하면서도 쉽게 사용되지 않고 있는 기능 두 가지를 소개하겠다.

패킷 분석은 IP와 IP 간의 통신으로 가득 차 있다. 근데 해당 IP만 보고서는 도대체 이것이 어디 IP인지 알기가 힘들다. 일일이 후이즈(Whois)를 하자니 그것도 쉽지 않은 일이다. 이럴 때 유용하게 이용해 볼 수 있는 것이 IP 정보를 DB화 해놓은 데이터를 이용하는 것이다. GeoIP라고 무료로 사용 가능한 데이터를 제공해 주는 곳이 있다. 상용 버전도 있지만, GeoLite는 무료로 사용할 수 있다. 다음 주소에서 아래 파일들을 다운로드해 적절한 위치에 넣어두자.

GeoIP.dat.gz
GeoLiteCity.dat.gz
GeoIPASNum.dat.gz


그리고 와이어샤크 메뉴에서 Edit->Preferences를 보면 Name Resolution이 있다. 거기에서 GeoIP database directories를 선택하면 다음과 같은 화면을 보게 된다. New를 눌러 다운로드한 데이터베이스 위치를 지정해 주고 저장하면 된다.


[그림 9] 와이어샤크 GeoIP 데이터베이스 경로 설정

저장 후에는 와이어샤크를 재시작해야 한다. 이후, 패킷 덤프를 시작하고 패킷 세부 정보를 보면 [그림 10]과 같이 GeoIP 관련 항목을 볼 수 있다.


[그림 10] 와이어샤크 세부 분석 정보에서 보이는 국가/지역 정보

하지만, 기본적으로는 세부 정보 화면에는 나타나지 않는다. 각 패킷 정보마다 GeoIP 정보를 표시하려면 성능에 영향을 주기 때문이다. 이를 표시하기 위해서는 세부 정보 화면의 Internet Protocol 섹션에서 마우스 오른쪽을 클릭하고 Protocol Preferences에 나타나는 메뉴 중 하나인 Enable GeoIP lookups를 체크해 주면 된다(또는 Edit->Preferences->Protocols->IP에서도 선택할 수 있다).

패킷 세부 정보 화면에서 일일이 보는 것이 불편하다면, 세부 정보에서 나타나는 출발지 또는 목적지 국가 정보를 선택하고 마우스 오른쪽 버튼을 클릭하여 'Apply as Column'을 선택해 보자. 이것을 선택하면 [그림 11]과 같이 패킷 리스트 화면에 국가 정보 칼럼이 추가된다. 라인별로 국가 정보를 바로 확인할 수 있으니 유용하게 사용할 수 있다.


[그림 11] 와이어샤크 패킷 리스트 칼럼에 국가 정보를 추가한 화면

국가, 지역, 서비스 제공자를 보는 것 외에도 이 정보를 이용해 필터를 적용할 수도 있다. 예를 들어, 한국만 필터를 적용하거나 지역 중에 울산만 적용한다면 아래와 같이 할 수 있다.


이외에도 사용 가능한 문법은 더 많으며 출력 필터 입력 창에서 ip.geoip라고 입력해보면 다양한 문법을 볼 수 있다. GeoIP 외 또 다른 유용한 기능으로 그래프 기능도 있다. 물론, 기본 기능의 그래프는 상용 프로그램과 같이 화려한 면은 없다. 간단한 그래프 형태지만, 전반적인 현황을 살펴보는 데 도움이 될 것이며 데이터를 CSV로도 저장할 수 있어 엑셀과 같은 프로그램에서 그래프를 만들면 보고서에 사용할 만큼의 깔끔한 그래프를 얻을 수 있다.

자, 일단 와이어샤크의 IO Graphs 기능을 이용해 표현해보자. 그 결과는 [그림 12]와 같다. 

 
[그림 12] 와이어샤크 IO 그래프 예제 화면

Filter 부분에 와이어샤크의 출력 필터를 이용하여 출력할 데이터를 선별할 수 있으며, 그래프 스타일은 Line, Impulse, FBar, Dot와 같이 4가지 중 하나를 선택할 수 있다.

그리고, 그래프에서 표현하는 데 중요한 X축과 Y축이 있다. X축은 시간 주기를 정한 것으로 1초부터 0.1, 0.01초 등으로 다양하다. View as time of day를 클릭하면 시간으로 표시되고, Y축은 패킷, 바이트, 비트로 나누어 표시된다. 위 예제에서는, 간단히 대표적 프로토콜만 필터에 입력하여 사용한 것으로 검정색 부분은 전체를 뜻한다. TCP 부분인 녹색을 보면 전체적으로 패킷이 TCP 형태임을 알 수 있고, 빨간색은 UDP로 전체 패킷에서 아주 일부분밖에 차지하지 않는다.

그래프는 쉽게 사용할 수 있지만, 표현하고자 하는 목적에 따라 달라진다. 다음과 같은 점을 주의하자!

• 그래프를 사용하고자 하는 목적에 따라 달라진다는 점
• 그래프에 포함시켜 출력하고자 하는 데이터는 무엇인가?
• 데이터의 범위는 어디까지인지 정해야 한다. 데이터의 범위라 하면 특정 프로토콜 또는 필터를 통해 일부 데이터로 한정한다.
  예를 들어, UDP 포트가 8338이라면 udp.port == 8338과 같이 사용한다.
• 마지막으로 그래프의 스타일을 정해야 한다. 한 화면에 표현되는 내용이 많으면 그래프가 명확하게 보이지 않기 때문에, 어느
  것을 라인으로 표시하고 어느 것을 바 형태로 표현할지 정해야 한다.

2. 커맨드라인 TShark로 와이어샤크 매력을 100% 발산해 보자.

TShark는 와이어샤크의 커맨드라인 버전이다. 와이어샤크 GUI 버전을 주로 사용하지만, 리눅스 환경에서 TShark를 이용한다면 더욱 다양한 방법으로 사용할 수 있다. GUI 버전의 많은 기능을 TShark에서도 사용할 수 있다고 생각해 보고 아래 예제를 살펴보자.

(1) 각 패킷의 세부 정보를 살펴보자.

(2) 출발지와 목적지 IP 추출

-e로 추출할 필드를 정의했고 –T로 패킷 데이터를 출력한 포맷 형태를 지정한 것이다. -e 옵션과 함께 이용된다. 마지막으로 -E 옵션을 통해 각 값을 콤마(,)로 구분하였다.

(3) DNS를 질의한 클라이언트 IP와 쿼리명 추출하기

(4) 상위 10대 URL 추출

리눅스 기본 명령어로 사용 가능한 sed, sort, uniq 등을 조합하여 추출하는 것이다. Sed로 불필요한 문자열을 삭제하거나 치환했고 정렬 후 Unique한 문자열 카운트 값을 얻어 출력한 것으로 쉽게 URL 주소를 뽑아낼 수 있다.

5) HTTP 프로토콜에서 브라우저 정보 통계

-R 은 출력 필터를 지정한 것이며 -e로 UserAgent 필드를 뽑아내는 것이다.

6) 호스트별 패킷 전송 비율 트리 형태로 보기

-z 는 다양한 통계 정보를 얻는 옵션으로 아래 예제는 IP별 패킷 전송 정보를 얻는 것이다. -z 옵션을 통해 COUNT(), SUM(), AVG()와 같은 수학적 함수도 적용 가능하다.
  
7) TCP 프로토콜 IP별 대화 통신 현황 출력 

몇 가지 예제를 본 것만으로도 활용이 무궁무진하다는 생각이 들지 않는가? 텍스트 형태로 출력될 수 있고 커맨드 라인이라는 장점으로 자동화에도 응용할 수 있고, 데이터 추출이 아주 자유롭다. 와이어샤크 GUI 버전을 모두 옮겨다 놓은 TShark의 무한한 매력에 빠져들 것이다.

3. 패킷 파일의 편집과 생성까지 Bittwist로 쉽게 다뤄보자

패킷을 분석하는 과정에서 필요에 따라 패킷 파일을 편집하고 또는 생성해야 하는 경우가 발생한다. 이런 일을 쉽게 할 수 있는 도구가 바로 Bittwist이다. 사용법도 너무 쉬워서 예제를 한 번 보는 것만으로도 쉽게 이해될 것이다. 우선, Bittwist는 크게 3가지 파일로 나뉘어 있다. 

• bittwist  : PCAP 기반의 패킷 생성기
• bittwistb : PCAP 기반의 이더넷 브릿지
• bittwiste : PCAP 파일 에디터

파일은 다음의 경로를 통해 다운로드할 수 있다.


참고로, 리눅스 기반으로 예제를 소개하고 있지만 윈도우에서도 사용이 가능하다. 기본적으로 도움말은 -h를 통해서 볼 수 있고, 각 도구의 몇 가지 옵션을 살펴볼 것이다. 패킷 생성기인 bittwist는 -d 옵션을 사용하면 아래와 같이 현재 사용 가능한 네트워크 인터페이스를 보여준다. 

-i 를 통해 인터페이스를 정할 수 있고, 인자로 패킷 파일을 주면 해당 인터페이스로 패킷을 발송한다. 아래 예는 –m 옵션을 사용하여 전송 속도를 지정한 것이다. 속도를 0으로 지정하면 즉시 보낼 수 있도록 한다. 

또는 –c 옵션을 설정하여 전송 패킷 개수를 지정할 수 있다. 만약 test.pcap에서 10개의 패킷만을 전달하고 싶다면 -c 10을 사용하면 된다. 

간단한 옵션 몇 가지를 통해 패킷을 쉽게 전송할 수 있음을 보았다. 시그니처 제작 및 방화벽 테스트 용도 형태로 사용될 수 있으며 이와 비슷한 기능을 가진 도구로 tcpreplay도 있다. 자, 이번에는 편집 기능을 가진 bittwiste의 몇 가지 사용 예를 소개한다.

(1) 패킷 파일 첫 번째부터 두 번째까지만 패킷을 뽑아내 저장해 보자.
참고로 -I 옵션은 Input 파일 -O 옵션은 Output 파일을 뜻한다.

(2) 패킷 덤프할 시간을 지정해 저장하기
-S 옵션을 사용해 시작시간과 끝 시간을 지정하여 사용한다. 

(3) IP 주소를 변경해 보자. 

(4) 80 포트 번호를 8080 포트 번호로 변경 

(5) 특정 Payload 삽입하기 

패킷을 편집하고 생성하는 기능을 원한다면 이 도구가 큰 도움이 될 것이다.

4. 패킷 파일의 민감한 내용은 Tcpdpriv로 사전에 제거하자

패킷 파일을 외부에 전달해야 하는 경우가 있다. 하지만, 패킷 파일은 다양한 트래픽 정보를 포함하고 있다. 단지 IP주소, 포트 정보라 할지라도 보는 관점에 따라서 이 정보가 중요한 것이 될 수 있다. 앞서 배운 Bittwist를 이용해 각 정보를 일일이 변경할 수도 있지만, 좀더 쉽고 빠른 방법이 있다. 바로 Tcpdpriv라는 도구를 이용하면 패킷 파일에서 민감한 정보를 제거할 수 있다. 

이 프로그램의 옵션은 다음과 같다:

-A : IP 주소를 어떤 식으로 표현할지를 결정한다. 레벨이 99인 경우 IP 주소는 변하지 않는다.
-c : 지정한 패킷 카운트 후에 종료한다.
-F : 사용할 필터를 지정
-i : 네트워크 인터페이스 정의
-p : TCP, UDP 포트 주소를 매핑한다.
-r : 읽어들일 패킷 파일을 지정
-w : 출력할 파일을 지정

위 옵션을 보면 각각의 옵션마다 특정 값을 지정하게 되어 있어 얼핏 복잡해 보인다. 하지만 간단하게 생각하면 아주 단순하다. 숫자가 적은 값에 근접할수록 안전한 옵션이라 생각하면 된다. 예를 들어, 민감한 정보를 최대한 제거한다면 0에 근접한 값을 사용하고, 최대한 많은 정보를 보여준다면 99에 가까운 값을 사용하면 된다. 다음은 정상적인 패킷 내용으로, Tcpdpriv를 통해서 민감한 정보를 제거할 것이다. 

특별한 옵션을 사용하지 않고 -r 옵션을 통해 읽어 들일 파일과 새로 저장할 파일을 지정하였다. 기본 옵션은 최대한 정보를 제거하는 것으로 설정되어 있기 때문에 설정 값이 0이다. 

새롭게 저장된 test2.pcap 파일을 열어보면 IP 주소가 완전히 다른 주소 값으로 변경된 걸 볼 수 있다. 처음 정상 패킷 데이터에서 보았던 IPv6와 ARP 정보도 보이지 않는다. 또한, 헤더 정보에 NOP이 많이 보인다. 

이번에는 다른 옵션을 사용해 보자. IP 주소에 조금 변화를 주고, -P를 통해 포트 번호가 바뀌지 않도록 99를 주었다. 

그러면, 위와 같이 IP는 무작위로 변했지만, 포트 번호는 그대로 유지하고 있다. 포트 번호는 유지하면서 IP 주소만 변경하여 패킷 파일을 전달할 경우에 사용될 수 있다.

Tcpdpriv는 간단하고 쉽게 사용할 수 있는 만큼, 패킷 파일에서 민감한 내용을 제거할 때 유용하다.

※ 다음의 경로에서 프로그램을 다운로드할 수 있다:
http://fly.isti.cnr.it/software/tcpdpriv/

5. 문자열 HEX 값을 PCAP 파일로 변환하기 Text2pcap

와이어샤크에서 제공하는 유틸리티 중 text2pcap이라는 것이 있다. 이름만 보아도 텍스트 파일에서 pcap으로 변환한다는 의미임을 짐작할 수 있다. text2pcap은 od -Ax -tx1로 생성된 형태의 HEX 값을 이해할 수 있다. 여기서 od 명령어는 바이너리를 덤프할 때 많이 사용하는데, Octal(8진수)로 덤프해서 보여주는 것이다. 앞서 사용한 -Ax 옵션은 오프셋 표현을 16진수로 하고 -tx1은 출력 형태를 지정한 것이다. -t는 출력될 형태를 지정하는데 아래 표와 같이 타입을 16진수로 하고 그 크기는 1로 한다는 의미이다. 

예로 od 명령어를 이용해 살펴보면 아래와 같이 출력된다. 

텍스트를 패킷 파일로 바꾸기 위한 text2pcap의 몇 가지 옵션을 살펴보면 다음과 같다.

 

예제로 in.txt라는 파일에 HEX 덤프 형태로 아래와 같이 저장되어 있다고 가정해 보자.

그리고 text2pcap을 이용해 in.txt를 out.pcap으로 변환하는 것이다. 이때 출발지와 목적지 포트를 8888과 9999로 함께 변경한다. 

tcpdump로 out.pcap을 확인해 정상적으로 패킷 파일이 만들어졌고, 포트가 변경된 것을 확인할 수 있다.


또 다른 예로, -e를 통해 ARP 이더넷 더미 헤더를 생성할 수 있다. 

이외 직접 파일을 이용한 변환뿐만 아니라 아래와 같이 od로 출력된 정보를 리다이렉션하여 바로 text2pcap으로 출력할 수도 있다. 즉 stream 파일을 읽어 들여 stream.pcap으로 저장하는 것이다. 

6. 패킷 정보로 원격지 시스템의 운영체제를 추정해 본다.

패킷 분석 과정에서 IP를 추적하다 보면, IP에 대해 더 많은 정보가 필요할 때가 있다. 예를 들면, 해당 IP에서 운영되는 서비스 종류, 운영체제 종류 등과 같은 것들이다. 이런 정보들은 네트워크 포렌식 과정에서 중요한 정보 중의 하나가 될 수 있다. 서비스 종류는 NMAP 같은 도구를 이용해 스캐닝을 해보면 알 수 있지만, 운영체제는 어떻게 알 수 있을까? TCP/IP Fingerprint를 이용하면 가능하다.

단어의 뜻만 보면 '지문'이다. 즉, 네트워크상에서 갖는 각 특성, 지문이라고 할 수 있는 이 정보들을 이용하여 OS를 추측하는 것이다.

어떻게 이런 것이 가능할까? 운영체제마다 네트워크 통신 과정에서 사용되는 각 값들이 약간씩 차이가 있고 바로 이런 정보를 이용하는 것이다. TCP/IP Fingerprinting의 경우 다음과 같은 값들이 이용된다:

• Initial packet size(16 bits)
• Initial TTL(8 bits)
• Window size(16 bits)
• Max segment size(16 bits)
• Window scaling value(8 bits)
• "don't fragment" flag(1 bit)
• "sackOK" flag(1 bit)
• "nop" flag(1 bit)

위와 같은 정보가 사전 정의돼 있어 추정할 수가 있는 것이다. 대표적인 도구인 p0f라는 도구를 이용할 것이며, 다운로드는 다음의 경로에서 할 수 있다(윈도우 환경에서도 cygwin을 이용하면 사용 가능하다).


사용 방법은 간단하다. 기본적으로 옵션 없이 실행하면, 기본 인터페이스에서 흐르는 트래픽을 검증하여 보여준다. 이렇게 되면 너무나 많은 정보가 나타나므로 필터를 사용하여 제한할 수가 있다. 이 필터는 tcpdump에서 사용하는 스타일의 것과 같다(와이어샤크에서는 출력 필터가 아닌 캡처 필터와 같다).

아래 옵션은 인터페이스 eth0에서 호스트 주소가 192.168.115.5번으로 필터를 한 것이다. –i로 인터페이스를 지정했으나, -s를 사용하여 패킷 파일을 지정할 수도 있다. 

해당 IP의 운영체제가 윈도우 2000 SP4 또는 XP SP1 이상이라고 표시를 하였다. 이렇게 탐지된 정보는 아래와 같은 룰이 있기 때문이다. 

각 의미는 무엇일까? p0f를 설치한 파일에 이런 Fingerprint 정보가 있는데, 파일을 열어보면 아래와 같은 형태를 볼 수 있다(/etc/p0f에서 p0fa.fp, p0f.fp, p0fr.fp 파일을 볼 수 있다). 

위와 같이 정의된 정보를 이용해 살펴보면 윈도우 사이즈는 65535이고, TTL값은 128, Fragment 값이 설정되어 있고 SYN 패킷 사이즈는 48바이트라는 것이다. 실제 각 포맷을 알아보면 이렇게 간단하다. 그럼 탐지된 패킷을 [그림 13]에서 세부적으로 살펴보자.


[그림 13] 192.168.115.5에서 탐지된 패킷 세부 정보

80번 포트로 전달된 SYN 패킷이고 패킷 길이, TTL, Fragment 값 등을 보면 사전에 정의된 룰 파일과 동일하다. 운영체제마다 다른 이런 정보들만 알 수 있다면 대략 추정할 수 있는 것이다. 하지만, 이 정보만으로 100% 단정할 수는 없다. 그러므로 이 정보만을 믿고 운영체제를 결정해서는 안되지만 넓은 관점에서 윈도우, 리눅스 정도로는 추정할 수 있다.

다음 예는 윈도우 7에서 탐지된 정보지만, p0f에서 탐지되는 것은 Windows XP/2000이다. 

확실하게 운영체제를 단정할 수는 없지만 이런 정보가 네트워크 포렌식을 하는 데 도움이 된다.


트래픽에 대한 오해


네트워크 포렌식을 진행하는 과정에서 잘못된 판단으로 문제 해결의 첫 단추를 엉뚱한 곳에서 찾는 경우가 있다. 그 중의 하나가 알 수 없는 프로토콜이 등장하면서부터 발생하는 오해의 시작이다.

네트워크를 분석하다 보면 수많은 프로토콜을 보게 된다. 한 예로, 기업 내부에서 이전부터 사용되던 프로토콜이 있었지만 분석가가 평상시에는 관찰하지 못했고 보지 못했던 형태였다고 가정하자. 그런데, 공교롭게도 문제 발생 시점에 해당 프로토콜이 나타났고, 새로운 형태라 의심해 계속 엉뚱한 방향으로 분석해 나가는 것이다.

또 다른 경우에, 급격한 트래픽 증가를 보고 악성코드부터 의심하는 경우가 많다. 악성코드가 일반화됨에 따라 관리자가 파악하지 못하는 트래픽은 일단 악성코드로 간주하는 경향이 커진 것이다. 하지만, 막상 분석해보면 내부 테스트용 장비로 인한 트래픽 급증, 내부 네트워크 연결이 잘못되어 발생되는 루프(Loop) 현상 등 다양한 원인이 드러난다. 회사 규모가 큰 경우에는 각 팀 간의 협업도 절대적으로 필요하다. 네트워크 이슈가 발생할 경우 패킷만 보고 문제를 파악하기 힘든 경우도 많기 때문이다. 패킷에 문제를 해결할 모든 정보가 담겨있지는 않다.

지금까지 알아본 분석 도구는 다양한 분석 접근 방법 중 일부일 뿐이다. 제일 중요한 것은 분석 대상을 다각도로 판단하고 접근 방법을 결정해 빠르게 분석할 수 있는 경험을 쌓는 것이다. 경험은 단시간에 만들어지는 것은 아니며 부단한 노력이 필요하다. 지금 이 네트워크 포렌식 연재도 그 과정의 하나이다. 다시 말하지만, 패킷 파일 자체만으로 해결책이 될 수 없다. 그리고 잘못된 시작은 분석을 어렵게 만든다는 점을 잊지 말자!

다음 호에서는 실제 패킷 사례를 중심으로 분석해 나가는 방법을 설명하겠다.@

댓글 10개:

  1. 매번 좋은글 잘 읽는데 댓글을 안달았었네요 ㅎㅎ;;

    text2pcap tool은 처음보는군요 ㅎ!

    답글삭제
  2. 도움이 되었으면 좋겠습니다. :-)
    아직도 소개해 드릴 도구가 많이 남아 있습니다. 자주 방문해 주시고 의견 주세요 ^^

    답글삭제
  3. 답글
    1. 나나아빠님 감사합니다. ^^

      삭제
  4. 소중한 정보감사합니다...^_^ 자주 들르겠습니다 페벗...

    답글삭제
    답글
    1. 앞으로 자주 뵙겠습니다 :-)

      삭제
  5. 거짓말 아니라 주인장님 블로그 보고 도움 많이 받습니다.
    완전 감사합니다.

    답글삭제
    답글
    1. 피도리님, 방문해 주셔서 감사합니다.
      그리고, 정말 도움을 많이 받으셨다고 하니 앞으로 계속 블로깅을 해 나갈 힘을 받네요 :-)

      저도 완전 감사드립니다.

      삭제
  6. 대단하십니다. ^.^

    답글삭제
  7. 많은 도움 받았습니다.

    리눅스(커널 3.0이상)와 안드로이드(4.0버전이상)를 패킷만으로 운영체제구분이 가능한가요? 참고로 브라우저정보는 사용하지 말구요. 제가 p0f 를 가지고 분석한 결과 우분투최신버전과 안드로이드(4.0버전이상) 의 결과는 linux kernel 3.X 라고 나오고 있습니다.
    어떻게 하면 패킷으로 리눅스와 안드로이드를 구분할수 있을가요?
    방법을 알려주시면 감사하겠습니다.

    답글삭제