'Python'에 해당되는 글 2건

반응형

Forensicscontest.com의 Puzzle #2 풀이 (스토리 살짝 변경~)

Link : http://forensicscontest.com/2009/10/10/puzzle-2-ann-skips-bail

Pcap Download : http://forensicscontest.com/contest02/evidence02.pcap

MD5 (evidence02.pcap) = cfac149a49175ac8e89d5b5b5d69bad3

   

1. What is Ann's email address?

2. What is Ann's email password?

3. What is Ann's secret lover's email address?

4. What two items did Ann tell her secret lover to bring?

5. What is the NAME of the attachment Ann sent to her secret lover?

6. What is the MD5sum of the attachment Ann sent to her secret lover?

7. In what CITY and COUNTRY is their rendez-vous point?

8. What is the MD5sum of the image embedded in the document?

   

1. What is Ann's email address?

: Ann's의 E-Mail 주소는 무엇일까요? 일단 다운받은 pcap파일을 열어서 확인해 보도록 하겠습니다.

E-Mali주소에 대해서 물었으니 패킷 모두 볼 필요 없이 SMTP Protocol만 필터링 해서 보면 되겠죠?

이렇게 smtp적어주시고 엔터!

그리고 아래처럼 나온 그림에서 맨 위에 나온 결과에 마우스 우클릭을 하여 Follow TCP Stream 기능을 사용합니다.

   

* Follow TCP Stream 기능이란?

와이어샤크의 가장 유용한 분석기능 중 하나는 어플리케이션 레이어 수준으로 TCP스트림을 볼 수 있는 것이다. 이 기능은 해당 패킷과 연관된 모든 정보를 조합해서 최종 사용자가 쉽게 어플리케이션의 흐름을 파악할 수 있게 해준다.

데이터를 볼 때 TEXT파일로 저장 하거나 프린트를 할 수도 있고, 데이터를 ASCII, EBCDIC, HEX, C배열과 같이 다양한 형태로 변형해서 볼 수도 있다.

   

   

열어보면 위와 같은 내용을 확인할 수 있습니다. 우리는 문제를 풀기 위해 내용을 살펴보죠. 조금 내려가다 보니 AUTH LOGIN 이라는 로그인 인증 관련말이 있네요. 그리고 그 밑에는 알 수 없는 내용이 나오다가 AUTHENTICATION SUCCESSFUL 이라면서 인증이 완료되었다고 말이 나옵니다. 좀 더 읽어보니 From과 To의 E-Mail 주소가 나와있네요.

일단 1번문제는 가볍게 확인되었습니다.

Answer : sneakyg33k@aol.com

   

2. What is Ann's email password?

E-Mail주소는 알았는데 Password까지 알아야 하니 AUTH LOGIN 아래부분의 내용을 살펴봐야겠군요.

일단 내용을 보니 문자로만 표시되어있고 마지막에 = 이 있네요. 이정도로 BASE64로 인코딩 되었겠구나 생각하고 디코딩 시켜보겠습니다.

   

VXNlcm5hbWU6

c25lYWt5ZzMza0Bhb2wuY29t

UGFzc3dvcmQ6

NTU4cjAwbHo=

   

   →

Username:

sneakyg33k@aol.com

Password:

558r00lz

필요한 결과가 나왔네요.

Answer : 558r00lz

   

3. What is Ann's secret lover's email address?

Follow TCP Stream 내용을 내려가다 보면 아래와 같은 메일 내용을 찾을 수 있습니다.

대충보니 약속을 취소하는 내용 같네요. 이게 과연 secet lover's 메일의 내용일까요?

의심스러워 SMTP로 Filter한 내용을 살펴봅니다.

NO.85번 라인에 보면 SERVICE CLOSING CHANNEL이라는 말이 있네요. 그아래에 있는 패킷의 Follow TCP Stream 내용을 살펴봅시다.

To의 메일 주소가 다른게 있네요. 내용을 살펴보니. "Hi sweetheart!..."라는 달콤한 말로 시작하는군요. 이게 secret lover's 메일이겠네요.

   

Answer : mistersecretx@aol.com

   

4. What two items did Ann tell her secret lover to bring?

2개의 아이템이라.. 숨겨놓은 애인(?)에게 보낸 메일 내용을 다시 봐야겠네요.

"Hi sweetheart! Bring your fake passport and bathing suit. Address attached. love, Ann"

Answer : fake passport, bathing suit

   

5. What is the NAME of the attachment Ann sent to her secret lover?

이번에는 첨부파일 이름을 물어보네요. 두 번째 편지내용이 있었던 부분에서 좀 더 내려보면 아래와 같은 부분이 있습니다. 바로 보이네요.

Answer : secretrendezvous.docx

   

6. What is the MD5sum of the attachment Ann sent to her secret lover?

첨부파일의 MD5sum을 알아내라고 하네요. 그럼 secretrendezvous.docx파일을 얻어야겠네요. Follow TCP Stream 내용중에 아래와 같은 부분이 있습니다.

.filename="secretrendezvous.docx" 아래에 있으니 이부분이 첨부파일 내용같은데

Content-Transfer-Encoding: base64 라고 되어있는 부분을 참고하니 BASE64인코딩으로 되어있는걸 알겠네요. 이 부분을 다 복사하여 메모장에 붙여넣고 저장합시다.

이제 이 부분을 BASE64 디코딩을 하여 secretrendezvous.docx 파일로 만들어야 할테니 간단한 코딩을 하도록 하겠습니다.

   

#!/usr/bin/python
# -*- coding: cp949 -*-
import base64
import os

def main(): 
    print '________________' 
    print '|Select number |' 
    print '|              |' 
    print '| 1 : Encode   |' 
    print '| 2 : Decode   |' 
    print '| 3 : Directory|' 
    print '|     Search   |' 
    print '| 0 : End      |' 
    print '|______________|' 
    print '==>',
   
selnum = raw_input()

    if selnum == '1':
       
Encode()
       
main()

    elif selnum == '2':
       
Decode()
       
main()

    elif selnum == '3':
       
print 'Directory location : ',
       
print os.getcwd()
       
dirlist = os.getcwd()
       
print 'Directory list' 
        
print os.listdir(dirlist)
       
main()

    elif selnum == '0':  
        pass

   
else:
       
print 'Invalid number. Please try again'
       
main() 
   

def Encode():
   
try :
       
print 'FileName :', 
       
filename = raw_input() 
       
print 'Extension : ', 
       
ext = raw_input()

        input = open(filename+'.'+ext, 'rb') 
       
data = input.read() 
       
encode = base64.b64encode(data) 
       
output = open(filename+'_'+ext+'.txt', 'w') 
       
output.write(encode) 
       
input.close() 
       
output.close()

    except
       
print 'Error'
       
main()

def Decode():
   
try :
       
print 'FileName :', 
       
filename = raw_input() 
       
print 'Extension :', 
       
ext = raw_input() 

       
input = open(filename+'.txt', 'r') 
       
data = input.read() 
       
decode = base64.b64decode(data)         
       
output = open(filename+'.'+ext, 'wb') 
       
output.write(decode) 
       
input.close() 
       
output.close() 
   
    except :
       
print 'Error'
       
main()

main()   

일단 Python으로 작성하였습니다. 괜히 깔끔하게 만들려다가 코드만 더 길어졌네요.(능력부족-전 코더가 아님) 뭐, 암튼 프로그램을 실행시켜 디코딩 하도록 하겠습니다.

 

디코딩할거니 2번선택하고 파일명 적고, 생성될 확장자 docx적어주면 파일이 생성이 완료되었습니다.

생성된 파일을 열어보도록 하겠습니다.

제대로 열린 것 같군요. 그럼 md5값을 구해보도록 하겠습니다.

md5sum프로그램을 받아서 돌려보니 아래와 같은 결과가 나오는군요.

Answer : 9e423e11db88f01bbff81172839e1923


7. In what CITY and COUNTRY is their rendezvous point?

만날약속 장소를 묻네요. docx파일을 열었을 때 지도가 나왔었는데 point지점이 Mexico에 있는 Playa del Carmen이네요.

Answer : Playa del Carmen, Mexico

8. What is the MD5sum of the image embedded in the document?

docx문서에서 이미지파일의 MD5sum값을 구하라고 하네요. 이 문제를 풀기위한 방법은 여러 가지가 있습니다. 가장 쉽게 해결하는 방법은 docx파일을 빵집등으로 압축해제 하시면 이미지 파일을 추출하실 수 있습니다.

word폴더안에 media폴더안에 들어가면 image.png파일이 있네요. 이 파일의 MD5sum값을 구하면 정답이 됩니다.

압축을 못 푼다는 가정하에 문제를 풀어보겠습니다.

먼저 docx파일 속에 삽인된 이미지의 확장자를 파악합니다. bmp,jpg,gif,png등의 확장자 마다 각각의 매직넘버(각 파일의 고유 헤더값)가 있기 때문에 이 매직넘버를 조사하여 docx파일안에서 이미지를 나타내는 시작점을 찾습니다. png파일을 하나 만들어 winhex로 매직넘버를 확인한 결과 89 50 이라는 hex값이였습니다.

이 값과 같은 부분을 docx에서 찾으면 아래와 같이 찾을 수 있습니다.

마찬가지 방법으로 이미지가 끝나는 부분을 찾아 이 부분의 값만 따로 저장합니다.

 

 .
 
.
 
.
 

그리고 추려낸 부분에 대해서 다른 이름으로 png 파일로 저장 후 MD5sum값을 구하면 같은 결과를 얻을 수 있습니다.

Answer : aadeace50997b1ba24b09ac2ef1940b7

반응형
블로그 이미지

NINEx

일상과 IT의 만남

,
반응형
#!/usr/bin/python
# -*- coding: cp949 -*-

import base64

def main():

    print '======================'
    print '1 : base64 encoding'
    print '2 : base64 decoding'
    print '======================'
    print 'select number :',

    select = raw_input()
    
    if select == '1':
        b64_encode()
    elif select == '2' :
        b64_decode()
    else:
        ex()
   
def b64_encode():
    print 'base64로 인코딩 할 값을 적어주세요'
    print '==>  ',
    b64str=raw_input()

    encode_str = base64.encodestring(b64str)
    print 'result ==>  ', encode_str

    main()

def b64_decode():
    print 'base64로 디코딩 할 값을 적어주세요'
    print '==>  ',
    b64str=raw_input()

    decode_str = base64.decodestring(b64str)
    print 'result ==>  ', decode_str

    main()

def ex():
    pass

main()
반응형
블로그 이미지

NINEx

일상과 IT의 만남

,
-->