2011년 10월 31일 월요일

안랩코어 '네트워크 포렌식' 강연 요약


안녕하세요,

안랩코어에서 발표한 '개발자도 알아야 할 네트워크 포렌식' 의 사용한 명령어들에 대해서 정리해 드리기로 하였습니다. 시연때 보여드렸던 명령어와 시간이 부족하여 소개해 드리고 싶었지만 하지 못했던 내용도 몇가지 추가하여 요약해 보고자 합니다.

간단히 사용명령어 들에 대해서 나열해 드리고, 추가적인 세부 설명이 필요한건
따로 주제로 빼서 다시 언급해 드리고자 합니다. 대부분의 많은 내용들은
이미 블로그에 포스팅 되어 있으므로 자세한 것은 블로그 내용을 참고해 보시면 됩니다.

일단, 초반에 보여드렸던 안드로이드 폰에서의 패킷덤프 잘 보이지 않았죠?
이것은 다음 링크를 보시면, 안드로이드 관련한 주제로 살펴볼 수 있습니다.
http://www.packetinside.com/search/label/android

TCP Connection Tunnel using ICMP 부분은 패킷 덤프만을 잠깐 보여드렸는데,
ptunnel 이라는 프로그램을 통해서 캡쳐한 것입니다. 이것은 추후 다시 방법을
세부적으로 소개해 드릴 예정입니다.

회사에서 운영중인 '패킷센터' 에 대해서도 더 보여드리고 싶었지만, 이것은
나중에 기회가 되면 더 소개해 드릴 시간이 있겠죠? 보관중인 패킷만 해도
국내에서 최대가 아닐까요? ^^ 이런 데이터를 통해 다양한 리서치를 진행하고 있습니다.

수집된 패킷파일에서 100기가 패킷 파일을 잠깐 언급해 드렸는데, 다음 포스팅을 참고해 보세요.

100 기가 가 넘는 패킷 파일이라고 ?


다양한 도구가 나열되어 있는 페이지에서는,
많은 것을 소개해 드리고 싶었지만 여건상 와이어샤크 정도만 소개해 드렸습니다.
일단 블로그에서 검색해 보셔도 많은 도구가 이미 언급되어 있는데,
몇 가지만 보면 아래와 같습니다.

[1] IPLocation 을 이용한 위치 추적

# ruby1.8 iploc.rb -r test.pcap

IP 주소의 위치정보를 활용하여 멋진 그래프 만들기

[2] Wireshark 기능 일부 소개

GeoIP 를 이용한 위치 정보 지정은 다음 블로그를 참고하면 됩니다.

와이어샤크에서 위치정보 이용하기 - 접속국가를 쉽게 알 수 있다면...

이외 HTTP 를 통한 데이터 오브젝트를 쉽게 추출하기 위한 방법은
메뉴에서 File->Export->Objects->HTTP 를 선택하면 됩니다.

[3] Tshark 기능 소개

블로그에서는 세부적으로 많이 다루지 않은 것인데요, 조만간 따로 언급해 드리겠습니다.
다량의 패킷파일을 포렌식 한다는 측면에서 보면 Tshark 가 상당히 유용하게 이용될 수 있습니다.
커맨드 기반으로 실행될 수 있으므로, 원하는 데이터만 쉽게 추출하여
스크립트화 시키면 다량의 패킷파일을 대상으로 포렌식이 쉬워집니다. GUI 상에서 할 수 있는
대부분의 많은 것들을 커맨드 기반으로 해서 얻을 수 있다는 점이 큰 매력입니다.

몇 가지 사용예를 언급해 봅니다.

# tshark -V -r test.pcap
# tshark -r test.pcap -e ip.src -e ip.dst -Tfields -E separator=,
IP 요청 주소와 DNS 쿼리 네임을 출력하는 것입니다.
# tshark -r test.pcap -e ip.src -e dns.qry.name -E separator=";" -Tfields dns
192.168.0.240;www.google.co.kr
168.126.63.1;www.google.co.kr
.
.

패킷 파일에서 HTTP TOP URL 을 뽑아내는 것입니다.

# tshark -r test.pcap -R http.request -T fields -e http.host -e http.request.uri | sed -e 's/?.*$//' | sed -e 's#^
\(.*\)\t\(.*\)$#http://\1\2#' | sort | uniq -c | sort -rn | head

# tshark -r test.pcap -Tfields -e ip.src -e http.user_agent -R "http.user_agent"

# tshark -r test.pcap -q -z ip_hosts,tree
===================================================================
 IP Addresses           value        rate     percent
-------------------------------------------------------------------
 IP Addresses            134       0.043431              
  192.168.0.240           134       0.043431         100.00%
  168.126.63.1             16       0.005186          11.94%
  72.14.213.99             55       0.017826          41.04%
  74.125.127.102            7       0.002269           5.22%
  72.14.213.103            32       0.010372          23.88%
  72.14.213.100            24       0.007779          17.91%

===================================================================

# tshark -r test.pcap -q -z conv,tcp

[4] bittwist
 
패킷파일 편집 및 생성으로 아주 유용한 도구 입니다.

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

test.pcap 데이터를 dummy0 인터페이스로 전송시킨 것입니다.
bittwist -i dummy0 test.pcap

이것은 tcpreplay 인 다음과 같은 결과입니다.

tcpreplay -t -i dummy0 test.pcap

1) 패킷에서 1-2 까지만의 패킷을 뽑아내 저장해 보자.

# bittwiste -I test.pcap -O rigel.pcap -R 1-2

2) IP 를 변경해 보자.
# bittwiste -I test.pcap -O test2.pcap -R 1 -T ip -s 192.168.1.5,192.168.50.50

3) 포트번호 변경
# bittwiste -I test2.pcap -O test3.pcap -T udp -d 53,8080

4)  페이로드 데이터 입력
echo "ahnlab_core" | xxd
bittwiste -I test2.pcap -O test3.pcap -L 4 -X 61686e6c61625f636f7265 -T udp
tcpdump -r test3.pcap -XX

Bit-Twist 로 패킷파일의 편집과 생성까지 자유자재로..

[5] Scapy

패킷파일을 프로그래밍 하는 관점에서 아주 유용한 도구입니다.

a=rdpcap("test.pcap")
>>> a
>>> a.nsummary()
>>> a[5].show()
>>> hexdump(a[5])
>>> lsc()
>>> b=Ether()/IP(dst="192.168.1.1")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>> b
<Ether  type=0x800 |<IP  frag=0 proto=tcp dst=192.168.1.1 |<TCP  |<Raw  load='GET /index.html HTTP/1.0 \n\n' |>>>>

'Scapy' 레이블을 보시면, Scapy 의 기본적인 것을 배워볼 수 있는 세가지의 이야기가 있습니다.

http://www.packetinside.com/search/label/scapy


[6] Tcpdpriv

패킷파일을 분석 의뢰할때 민감한 정보가 포함되어 있는 경우가 있습니다. 예를들어, 사내 IP
가 해당될 수도 있겠지요.

# ./tcpdpriv -A 50 -P 99 -w test2.pcap -r test.pcap

-A 는 IP 주소 변경
-P 는 포트 번호
0 은 최대한 Private 한 것이고 99 는 정보를 보여주는

패킷파일의 민감한 정보를 지우고 전달하고자 하는 경우에는 이 방법을!


[7] 텍스트 내용을 PCAP 파일로 -  text2pcap

text2pcap 을 이용하면 텍스트 내용도 PCAP 파일로 변환할 수 있습니다. 때로는
분석과정에서 유용하답니다.

-l Link 레이어 타입 지정 (기본은 이더넷이다)
-e <l3pid> -e 옵션 뒤에 이더넷 헤더를 지정할 수 있다. -e 0x806 이면 ARP 패킷을 뜻한다.
-i <proto> 프로토콜을 지정
-m 최대 패킷 길이
-u <srcport>,<destport> UDP 출발지,목적지 포트를 지정
-T <srcport>,<destport> TCP 출발지,목적지 포트를 지정

# od -Ax -tx1 tcpdpriv > in.txt
# text2pcap in.txt out.pcap
# text2pcap -T8888,9999 in.txt out.pcap
# tcpdump -r out.pcap
reading from file out.pcap, link-type EN10MB (Ethernet)
22:27:49.000000 IP 10.1.1.1.8888 > 10.2.2.2.9999: Flags [], seq 0:576, win 8192, length 576

http://www.packetinside.com/search/label/text2pcap

자, 그리고 CaseStudy 에서 언급한 것들을 한번 살펴보죠.
UDP Flooding 에서 보여준 패킷파일에서 이미지 데이터 추출은 foremost 를
이용했습니다.

-i 로 로우파일을 지정하고 -o 로 출력될 경로를 지정합니다. 주의할 점은
입력데이터가 패킷 파일이 아니라, 스크림한 데이터에서 저장옵션에 보면
RAW 형태로 저장하는 것이 있습니다. RAW 형태로 저장된 파일을 뜻합니다.

만약, 입력파일이 패킷 데이터면 Tcpxtract 를 이용해 볼 수 있습니다.

네트워크 패킷 캡쳐 파일에서 파일 추출하기 (using Tcpxtract)


악성코드 트래픽 분석에서 Slammer 는 패킷파일에서 바이너리 데이터 부분만을
떼어내어 해당 코드를 디스어셈블해서 본 것입니다.
와이어샤크에서 데이터 부분에서 오른쪽을 클릭해 보면 Export 를 할 수 있는 부분이
있습니다. 데이터를 Export 하고 objdump 를 이용해 -D 로 디스어셈블 하면 됩니다.
이것은 추후 세부적인 내용을 다시 설명드릴까 합니다.

마지막으로 Suspicious Payload Analysis 에서
마찬가지로 의심 데이터를 추출하고 Ollydbg 로 분석을 한 것입니다. 해당 데이터는
취약점을 이용한 공격코드에서 전송된 '쉘 코드' 부분만을 떼어내어
바이너리 형태로 만들고, Olly 에서 로드하여 스텝별 분석을 한 것입니다. 추출한
데이터는 아래와 같은 형태로 컴파일을 한 것입니다.

char sc[] = {
0xeb, 0x03, 0x5d, 0xeb, 0x05, 0xe8, 0xf8, 0xff
0xff, .................................. };

int main() {
        int *ret;
        ret = (int *)&ret + 2;
        (*ret) = (int)sc;
}

이 부분 또한 궁금해 하실 부분 중에 하나이어서, Slammer 와 함께 세부적으로
다시 설명드릴 예정입니다.

발표 및 시연은 모두 리눅스 기반으로 진행되었습니다. 그래서 Ollydbg 가
리눅스에서 동작하는 걸 보고 의아해 하신 분도 있습니다. Ollydbg 는
WINE 을 통해 실행시킨 것입니다. 설치된 리눅스는 BackTrack5 입니다.
많은 것들이 이미 설치되어 있어서 시연하기에 편해
선택한 것입니다. 리눅스에서 발표에 이용한 유용한 도구도 시간이 나는대로
공유해 드릴 예정입니다.

제가 마지막 페이지에서 사용한 문구가 다음과 같습니다.

Share What you know, Learn What you don't
From PacketInside.com

큰 의미는 '정보의 공유' 입니다. 리눅스를 선택한 것도 오픈소스를 통해서
얼마나 많은 것들을 할 수 있는지 보여드리려 했던 것이고,
정보도 공개할 수 있는 수준의 범위내에서는
블로그로 많이 포스팅하여
네트워크에 관심있는 많은 분들이
참고하실 수 있도록 하려고 합니다.

마지막으로 네트워크 포렌식이 모든 문제해결의 '열쇠'가 되지는 않습니다.
하지만 큰 방향을 결정하는 중요한 '열쇠'가 되기도 합니다.
이 점을 잊지마시고요,
제가 또 언젠가 여러분들과 만날기회가 있다면
더 많은 이야기를 나눠보고 싶네요. :-)

행사에 와 주셨던 모든 분,
그리고 재미있고 알차게 들었다고 해 주신 모든 분들
감사합니다.

항상 행복하세요.

[참고]
1. 개발자도 알아야 할 네트워크 포렌식 분석 기술, '안랩코어 2011' 컨퍼런스

댓글 3개:

  1. 포렌식은 사이버 범죄의 증거물인 디지털 자료가 소송에서 법적효력인 증거의 증명력일 인정받기 위한 절차입니다.

    본 내용에서는 그런부분은 전혀 않보이고 정보보호 관점에서 패킷분석을 포렌식이라고 햇군요

    답글삭제
  2. 포렌식 단어의 의미를 범적증거 자료 수집으로 한정지을 수 없습니다. 해외에서도 이미 분석이라는 관점에서 포렌식이라는 단어를 많이 사용하고 있고, 제가 사용하는 이 단어의 의미도 분석과정 까지 모두 포함되는 넓은 범위로 보고 있습니다. 포렌식을 한가지 의미로 생각해서는 안될것 같습니다.

    이번 세미나도 기술적인 관점에서 기술한 것이며, 법적증거 수집 관련해서는 제가 지식이 없기 때문에 앞으로도 계속 '분석' 이라는 관점에서 포스팅을 할 계획입니다.

    포렌식은 법적 증거수집만을 뜻하지 않으며 분석방법, 과정등 증거/흔적을 찾기 위한 모든 범주를 포함합니다.

    답글삭제
  3. forensic은 굉장히 넓은 분야를 포괄하는 정보보호의 한 분야입니다. 단순히 법적 절차로만 한정짓는 것은 너무 목적에 치우친 소견 아닌가 싶네요.
    현상을 좀 더 넓게 보는 시야가 필요해 보입니다.

    답글삭제