레이블이 Packet Challenge인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Packet Challenge인 게시물을 표시합니다. 모든 게시물 표시

2010년 8월 22일 일요일

패킷포렌직 - '우리가 만날 카페의 이름을 알아내라' 문제풀이

두번째 패킷문제를 내고, 첫 문제보다 많은 분들이 답을 풀어주셨습니다. :-)

첫번째로 문제의 정답을 제출하신 분은 '무적코만도' 님 이십니다. 코만도님외 코알라님,불독형사님께서도 정답을 맞춰주셨습니다. 모두 축하드립니다 ^.^

이번 문제는 쉽게 출제하였는데요, 정답은 패킷인사이드 로고 파일안에 숨겨져 있습니다. 로고파일의 뒷 부분에
Secret Message: What is the worlds deepest sea? 문자열이 들어 있었습니다. 일반 이미지 파일안에 문자열을 숨겨서 넣은 것입니다. 이런 형태는 스테가노그래피(Steganography)로 불리는데 이미지나 오디오 파일과 같은 디지털매체에 메시지를 숨기는 것입니다.  문자열은 이미지파일만 열어봐도 아래그림과 같이 금방 확인이 됩니다:

[그림] 윈도우의 메모장을 통해 파일을 열어본 화면

만약, 이 문자열이 이렇게 바로 보이는 형태가 아니라 암호화 되어 있거나, 조금 다른 형태로 바뀌어져 있었다면 더욱 알기가 힘들었을 것이다.  첫 문제인 만큼 쉽게 알아볼 수 있도록 하였는데, 문제가 차츰 거듭될수록 더 어려워질 것이다. :-) 아, 문자열은 바로 정답을 넣은것이 아니라 세계에서 가장 깊은 바다가 어디인것인가를 물어보는 메시지였다. 구글링을 해 보면 '마리아나' 해구라는 것을 금방 찾을 수 있다. 즉, 문제에서 이미지 파일을 통해 만날 장소를 뜻하는 메시지를 넣어놓았고, 그들이 만날 최종 장소는 마리아나 카페가 되었던 것이다.

자 정답은 이렇다 치고, 어떻게 문제의 정답을 찾을 수 있을까 하는 부분에 대해서 얘기를 해보자. 문제는 사실 어렵지 않은데, 이것을 찾는 것이 다소 어렵게 느껴질 수 있다. 하지만, 처음에 패킷덤프를 해보라는 문제의 힌트를 제시하였다. 패킷덤프를 시작하고, 패킷인사이드에 접속하고 덤프 파일을 열어보자.

몇백개의 패킷으로 내용이 많긴 한데, 여기서 적절히 걸러낼 수 있는 경험치가 필요한 것이다. 패킷을 대충 훑어보면 이상한 점을 찾아볼 수도 있고, 너무 내용이 많아서 어려울수도 있다. 앞서 말한것과 같이 패킷인사이드 로고에 정답이 들어있는데, 이상하게도 해당 이미지파일이 조작된 형태라고 나오는 메시지를 확인할 수 있다. 추가힌트에서도 말했지만 Malformed Packet 이라는 것을 볼 수 있다. 이미지파일이 열려서 보이기는 하는데, 이미지 파일의 끝 부분에 그냥 추가한 형태다 보니 구조가 달랐던 것이다.  이렇게 일일이 다 봐서 찾을 수도 있지만, 더 쉬운 방법은 와이어샤크에서 Expert Infos 를 클릭해 보면 더 쉽게 찾아 볼 수 있다. 주욱 보다 보면, 유독 빨간색으로 선명하게 Malformed Packet 라인을 볼 수 있기 때문이다.

[그림] 와이어샤크의 Expert Infos 를 통해 찾아본 화면

이 기능을 통해 찾아보니 너무 쉽게 찾을 수가 있었다. 문제에서도 쉽게 정답이 들어있는 파일을 찾을 수 있도록 이런 힌트를 남겨놓은 것이다. 좀더 정교하게 파일을 작성할 수도 있겠지만, 의도적으로 Malformed Packet 형태가 보이도록 만들어 놓은 것이다.

이번 문제를 통해 다음을 익힐 수 있도록 한 것이다.
- 조작된 형태의 파일  
- 스테가노그래피
- 패킷파일 분석능력
- 어떤 방법을 통해 빨리 정답을 알아낼 수 있는가? (Expert Infos, 필터 등)
- 끈기

P.S 문제 정답자 분들에게 선물이라도 드릴 수 있으면 좋을텐데, 아직은 마련되어 있지 않습니다.^^ 기회가 되면 선물도 준비해 보겠습니다. 선물 후원이 가능하신분은 댓글 부탁드립니다 :-)
아, 그리고 아직 이미지파일은 그대로 이니 아직 문제를 풀어보시지 못했다면 지금 해보세요.

[참고]
1. 마리아나 해구
2. 스테가노그래피
3. 무적코만도님의 문제풀이 요약

다음은 첫번째로 정답을 제출하신 무적코만도님이 기술하신 내용을 요약한 것입니다.
패킷인사이드에 올려져 있는 여러 내용들이 참고가 되어 아래와 같은 방법으로 확인하였다고 합니다.
처음에는 찾느라, 눈이 벌개질 만큼 뚫어져라 보셨는데 그래도 첫번째 정답 제출의 영광을 가지셨습니다.

- 덤프된 패킷을 와이어샤크로 열어서 Statistics > Conversations > TCP 부분확인하며
각 연결된 세션을 하나하나 Follow TCP Stream 보면서 확인
- 패킷인사이드 이미지의 속성을 확인, 에디터로 열어서 확인
- 와이어샤크의 File -> Export ->Objects -> HTTP 순으로 오브젝트 리스트를 뽑아서 확인
- Malformed Packet : PNG 파일 확인

이전에 소개한 포스팅에서 HTTP 의 오브젝트를 확인하는 방법을 이용하셨는데,
빨리찾기 위한 좋은 방법입니다 :-)

2010년 8월 15일 일요일

패킷포렌직 두번째 이야기, 우리가 만날 카페의 이름를 알아내라

주말들은 잘 보내셨는지요? 요새 참 더운 날씨죠.
패킷인사이드에서 패킷 Contest 로 문제 한번을 낸적이 있습니다. 재미있어 하시는 분들고 있고,
앞으로 계속 해달라는 요청도 있기에 짬짬히 계속 해 보려고 합니다. 문제를 통해서 패킷 분석에
더 쉽게 다가갈 수 있기도 하고, 거기에 재미까지 더할수도 있으니까요.

두번째 문제 아주 쉽게 준비해 보았습니다. 다음의 문제를 한번 들어보세요.

패킷인사이드를 운영하는 R씨에게 어느날 연락이 왔다. 연락온 사람은 R 씨와도 친하게 지내는 A씨.
큰 사업을 운영하고 있는 A 씨는 최근 큰 기업인수를 앞두고 기업간 신경전이 치열하다고 한다.
그리고 내부에 스파이가 있는거 같다고 한다. 만나서 자세한 이야기를 하자고 하고, 만나기로 한다.
R 씨는 만날 장소는 자기가 운영하는 사이트에 2010년8월15일 XX 경에 올려 놓겠다고 한다.
그들은 인터넷,통신 감청의 이유로 지금까지 이런 방법을 통해 만날 장소를 결정했다고 한다. 사업가인
A 씨도 쉽게 알 수 있었던 이 통신 방법은 간단한 것이라 생각된다. 하지만, 남들은 이렇게 하고 있을줄은
생각을 못했겠지?

메인 페이지라 해봤자 평소와 다른 것은 없다. 이번에 만날 장소는 카페라고 하며, 이 카페의 이름을
알 수 있다고 한다.  과연 어디일까?

문제를 풀어서 어떤식으로 알 수 있었는지 댓글을 달아주세요. 모범 답안은 문제풀이때
소개하도록 하겠습니다.

지금 PacketInside.com 메인 페이지에서 정답을 찾아보세요. 패킷 덤프를 해 보면 문제의 정답을 찾는데
수월하겠죠?
   
8월22일(일) 까지 받도록 하겠습니다. 댓글로 정답을 남길시에는 비밀댓글로 남겨주세요. 상황에 따라서는 더
빨리 종료할 수도 있습니다.


2010년 2월 25일 목요일

[Packet Contest #1] 문제 정답풀이 - 문자열의 패킷 HEX 값 변환하여 암호알아내기

아쉽게도 첫번째 콘테스트에 정답을 제출해 주신 분들은 없었다. 일단, 풀이과정을
설명해 보도록 하겠다. 문제였던 다음의 HEX 코드 값을 패킷 파일로 변경하면
문제의 반은 해결한 것이다. 일단, 다음 패킷내용을 challenge.txt 로 저장해 보자.

00 05 b5 02 02 02 01 01 01 01 01 01 08 00 45 00
00 79 12 34 00 00 ff 06 a3 45 01 01 01 01 c0 a8
03 02 04 d2 16 2e 00 00 00 00 00 00 00 00 50 00
20 00 65 53 00 00 55 47 46 6a 61 32 56 30 53 57
35 7a 61 57 52 6c 4c 6d 4e 76 62 53 41 78 63 33
51 67 55 47 46 6a 61 32 56 30 49 45 4e 6f 59 57
78 73 5a 57 35 6e 5a 53 42 54 62 32 78 32 5a 57
51 73 49 45 4e 76 62 6d 64 79 59 58 52 31 62 47
46 30 61 57 39 75 0a

일전에 text2pcap 을 통해 변환하는 방법에 대해서 설명하였지만, OD 의 특정 포맷에
맞춰서 해야 하다 보니 약간 귀챦은 부분이 있다. 하지만, 생각을 좀더 달리하면 한
라인으로 해당 HEX 값을 나열하는 방법도 있다. 이럴때 쉽게 사용해 볼 수 있는 방법이
tr 을 통해 \n 을 제거해 주고, sed 를 이용해 제일 처음에 00000 를 넣어 주어서 text2pcap
이 인지할 수 있는 포맷형태로 만든다.

$ cat challenge.txt | tr '\n' ' ' | sed 's/^/00000 /' | text2pcap - result.pcap
Input from: Standard input
Output to: result.pcap
Wrote packet of 175 bytes at 0
Read 1 potential packet, wrote 1 packet

위 명령을 통해 result.pcap 으로 쉽게 패킷 파일이 만들어졌다. 위 팁은 가끔 HEX 형태의
아스키 형태만 가지고 분석을 해야 하는 경우 유용하게 사용할 수 있을 것이다.

result.pcap 을 tcpdump 를 통해 읽어 보자.  출발지 IP 1.1.1.1 에서 목적지 IP
192.168.3.2 로 TCP/5678 번에 데이터를 전송하였다.

# tcpdump -XX -r result.pcap
reading from file result.pcap, link-type EN10MB (Ethernet)
10:22:41.000000 IP 1.1.1.1.1234 > 192.168.3.2.5678: . 0:81(81) win 8192
        0x0000:  0005 b502 0202 0101 0101 0101 0800 4500  ..............E.
        0x0010:  0079 1234 0000 ff06 a345 0101 0101 c0a8  .y.4.....E......
        0x0020:  0302 04d2 162e 0000 0000 0000 0000 5000  ..............P.
        0x0030:  2000 6553 0000 5547 466a 6132 5630 5357  ..eS..UGFja2V0SW
        0x0040:  357a 6157 526c 4c6d 4e76 6253 4178 6333  5zaWRlLmNvbSAxc3
        0x0050:  5167 5547 466a 6132 5630 4945 4e6f 5957  QgUGFja2V0IENoYW
        0x0060:  7873 5a57 356e 5a53 4254 6232 7832 5a57  xsZW5nZSBTb2x2ZW
        0x0070:  5173 4945 4e76 626d 6479 5958 5231 6247  QsIENvbmdyYXR1bG
        0x0080:  4630 6157 3975 0a                        F0aW9u.

tshark 를 통해서도 한번 형태를 자세히 들여다 보자

# tshark -V -r result.pcap
Frame 1 (135 bytes on wire, 135 bytes captured)
    Arrival Time: Feb  8, 2010 10:22:41.000000000
    [Time delta from previous captured frame: 0.000000000 seconds]
    [Time delta from previous displayed frame: 0.000000000 seconds]
    [Time since reference or first frame: 0.000000000 seconds]
    Frame Number: 1
    Frame Length: 135 bytes
    Capture Length: 135 bytes
    [Frame is marked: False]
    [Protocols in frame: eth:ip:tcp:data]
Ethernet II, Src: Private_01:01:01 (01:01:01:01:01:01), Dst: Broadcom_02:02:02 (00:05:b5:02:02:02)
    Destination: Broadcom_02:02:02 (00:05:b5:02:02:02)
        Address: Broadcom_02:02:02 (00:05:b5:02:02:02)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    Source: Private_01:01:01 (01:01:01:01:01:01)
        Address: Private_01:01:01 (01:01:01:01:01:01)
        .... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    Type: IP (0x0800)
Internet Protocol, Src: 1.1.1.1 (1.1.1.1), Dst: 192.168.3.2 (192.168.3.2)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 121
    Identification: 0x1234 (4660)
    Flags: 0x00
        0... = Reserved bit: Not set
        .0.. = Don't fragment: Not set
        ..0. = More fragments: Not set
    Fragment offset: 0
    Time to live: 255
    Protocol: TCP (0x06)
    Header checksum: 0xa345 [incorrect, should be 0xe39e]
        [Good: False]
        [Bad : True]
    Source: 1.1.1.1 (1.1.1.1)
    Destination: 192.168.3.2 (192.168.3.2)
Transmission Control Protocol, Src Port: search-agent (1234), Dst Port: rrac (5678), Seq: 1, Len: 81
    Source port: search-agent (1234)
    Destination port: rrac (5678)
    Sequence number: 1    (relative sequence number)
    [Next sequence number: 82    (relative sequence number)]
    Header length: 20 bytes
    Flags: 0x00 ()
        0... .... = Congestion Window Reduced (CWR): Not set
        .0.. .... = ECN-Echo: Not set
        ..0. .... = Urgent: Not set
        ...0 .... = Acknowledgment: Not set
        .... 0... = Push: Not set
        .... .0.. = Reset: Not set
        .... ..0. = Syn: Not set
        .... ...0 = Fin: Not set
    Window size: 8192
    Checksum: 0x6553 [correct]
        [Good Checksum: True]
        [Bad Checksum: False]
Data (81 bytes)

0000  55 47 46 6a 61 32 56 30 53 57 35 7a 61 57 52 6c   UGFja2V0SW5zaWRl
0010  4c 6d 4e 76 62 53 41 78 63 33 51 67 55 47 46 6a   LmNvbSAxc3QgUGFj
0020  61 32 56 30 49 45 4e 6f 59 57 78 73 5a 57 35 6e   a2V0IENoYWxsZW5n
0030  5a 53 42 54 62 32 78 32 5a 57 51 73 49 45 4e 76   ZSBTb2x2ZWQsIENv
0040  62 6d 64 79 59 58 52 31 62 47 46 30 61 57 39 75   bmdyYXR1bGF0aW9u
0050  0a                                                .
    Data: 5547466A613256305357357A6157526C4C6D4E7662534178...

추가적인 정보를 더 볼 수 있는데, 들여다 보니 출발지와 목적지의 맥주소가 어딘가 이상하다.

Private_01:01:01 (01:01:01:01:01:01), Dst: Broadcom_02:02:02 (00:05:b5:02:02:02)

조작된 것임을 쉽게 추정해 볼 수 있다. 목적지의 맥주소는 제조회사가 Broadcom
으로 보이는데 출발지와 목적지를 맥을 봤을때, 목적지의 Broadcom 부분도 의도적으로
고쳐진 것으로 보인다. (실제 필자가 고치기도 하였지만 ㅋㅋ )
또 IP 헤더의 체크썸을 보면 값이 잘못 되어 있다.

Header checksum: 0xa345 [incorrect, should be 0xe39e]

원래는 0xe39e 의 값을 갖고 있어야 하지만 0xa345 로, 조작될 가능성이 높은 부분임을
알 수 있다. 자, 그리고 데이터를 보면 81 바이트로 암호같은 문자열이 연속으로 놓여있다.
많이 접해 보신분들은 쉽게 눈치를 챌 수 있겠지만, BASE64 로 인코딩된 데이터이다.
BASE64 는 이메일에서 인코딩 방법으로 많이 쓰인다.  자, 그럼 BASE64 데이터임을
추정하였으니 아래와 같이 해독해 보자.

$ perl -MMIME::Base64 -e 'print decode_base64("UGFja2V0SW5zaWRlLmNvbSAxc3QgUGFja2V0IENoYWxsZW5nZSBTb2x2ZWQsIENvbmdyYXR1bGF0aW9u")'
PacketInside.com 1st Packet Challenge Solved, Congratulation

펄의 MIME:Base64 모듈을 이용해 위 데이터를 디코딩하면 위와 같은 결과를 얻을 수 있다.
바로, 이번 문제의 정답이다.

이번 문제는 앞서 배운 text2pcap 의 사용방법과 효과적으로 쓸수 있는 방법을 통해
패킷파일로 만들어보고 그 안에서 문제의 정답과정을 찾고 패킷의 잘못된 부분을
추정해 볼 수 있다.

2010년 2월 18일 목요일

[Packet Contest #1] 문자열의 패킷 HEX 값을 분석하라!

모두들 구정 명절은 잘 보내셨는지요? 패킷과 관련한 내용을 다루고 있는
패킷인사이드(packetinside.com)도 블로그를 개설한지 2달이 넘었습니다.
앞으로 게시한 글을 좀더 쉽게 접근해 볼 수 있도록 Contest 형태의 문제를 내보려고 합니다.

과거에 게시된 글을 읽어보고 문제를 풀어나가며, 패킷 분석을 쉽게 이해해 볼 수 있도록
하고자 함입니다.  그 첫번째 대상으로 쉬운 주제를 잡아보았습니다.

문제) 다음은 패킷의 HEX 값 이다. 다음 값을 통해 암호화된 문자열을 해독하고,
풀이과정을 최대한 세부적으로 기술하시오.
의도) 스트링으로 기술된 HEX 값을 분석하는 과정을 배워보자.

00 05 b5 02 02 02 01 01 01 01 01 01 08 00 45 00
00 79 12 34 00 00 ff 06 a3 45 01 01 01 01 c0 a8
03 02 04 d2 16 2e 00 00 00 00 00 00 00 00 50 00
20 00 65 53 00 00 55 47 46 6a 61 32 56 30 53 57
35 7a 61 57 52 6c 4c 6d 4e 76 62 53 41 78 63 33
51 67 55 47 46 6a 61 32 56 30 49 45 4e 6f 59 57
78 73 5a 57 35 6e 5a 53 42 54 62 32 78 32 5a 57
51 73 49 45 4e 76 62 6d 64 79 59 58 52 31 62 47
46 30 61 57 39 75 0a

재미삼아 해 보시고요, 문제를 푸신 분들은 그 과정을 댓글로 남겨주세요.
풀이과정을 게시할 때, 정답을 보내신 분들의 풀이 과정을 추가로 만들어
함께 공유할 수 있도록 하겠습니다.

다만, 우려되는건 아직 이 블로그의 방문자가 많지 않아 얼마나 참여를 할지가
의문이네요. 그렇지만 꾸준히 계속 한다면 분명 많아지겠죠! :-)

@Rigel