Defcon 22 NFPC 풀이

Network Forensics Puzzle Contest는 매년 열리는 데프콘에서 이벤트성으로 열리는 챌린지이다. 자세한 대회 소개는 다음 글을 읽어보기 바란다.

http://maj3sty.tistory.com/1083


 

[Round 1]

Password : izDEFCONf33ling22?#tSwift

 – 문제 지문

EFCON 2013 Network Forensics Puzzle Contest: From Pyongyang with Love

Thank you for accepting the case. Our Russian comrade has indicated that said documents released by Snowden may contain information about a bribery involving the 2015 Chess Boxing World Title. We've been monitoring Snowden's traffic, and need to know who all is involved. We suspect that there is a list of usernames, and we would like you to tell us who is the second name on the list.

Use the Round 1 packet capture in this folder to learn more about the case and answer the following question:

What is the second name on the list of usernames?

문제 지문을 보면, 스노덴의 트래픽을 감시하여 유저명의 목록을 획득하려고 하는데, 가장 중요하게 얻으려 하는 유저명은 목록 중 두 번째의 유저명이다. 유저명은 텍스트 또는 파일로 스노덴이 다른 사람에게 전송할 가능성이 많으므로, 먼저 전송되는 파일들을 살펴본다.

1

[그림 1 – SMB 프로토콜로 전송되는 파일 목록]

SMB 프로토콜로 전송되는 파일 오브젝트들을 보면 Documents.zip 파일이 존재한다. 해당 파일을 해제하면 다음과 같이 여러 폴더와 파일들이 나오는데, 파일들의 내용은 모두 base64 인코딩 방식으로 인코딩되어 있어 인코딩을 해제해야만 문서의 내용을 획득할 수 있다.

2

[그림 2 – 인코딩되어 있는 docx 내용]

그 중 track6.docx 파일의 내용을 디코딩하면 다음과 같은 목록을 획득 할 수 있다.

The Mystery of Chess Boxing:

(usernames)

Mr. Method

Kim Ill-Song

Mr. Razor

Mr. Genius

Mr. G. Killah

Matt Cassel

Mr. I. Deck

Mr. M Killa

Mr. O.D.B.

Mr. Raekwon

Mr. U-God

Mr. Cappadonna (possibly)

John Woo?

Mr. Nas

 
두 번째 유저명이므로 답은 "Kim Ill-song" 이다.
 
Answer : Kim Ill-song
 
 

[Round 2]

Password : #pshth@twaSteh3@$y1#

 – 문제 지문

We see that North Korea is in the running for hosting next year's title fight. Kim Ill-song might be exactly who we are looking for. We've taken a capture of Mr. Kim Ill-song's network traffic, and we see that he's been communicating with many people from different countries. We suspect that he is among those making bribes, but we need proof. Cash is relatively easy to move, but we've got word that one of the bribes was something else. Voting for the hosting city begins soon.

Use the Round 2 packet capture in this folder to learn more about the case and answer the following question:

What city's official is accepting a non-cash bribe?

이번에는 김일성이 제공한 뇌물을 받은 도시의 관계를 찾는 것이다. 패킷의 대부분은 IRC 패킷으로 이루어져 있어 TCP 스트림을 살펴보면 IRC 메시지를 모두 살펴 볼 수 있다.

IRC 메시지 중 PRIVMSG로 'Killah'란 닉네임을 가진 사용자에게 인코딩된 메시지를 전송하는 것이 여럿 보인다. 해당 메시지는 처음에는 base64로 인코딩되어 있으며, 그 다음에는 base32로 인코딩되어 있다. 인코딩을 모두 풀고나면 다음과 같이 md5 hash 값이 보인다.

3

[그림 3 – base32 디코딩 모습]

획득한 md5 hash 값을 크랙하면 다음과 같은 값이 나온다.

4

[그림 4 – md5 cracker]

Answer : Caracas

[Round 3]

Password : Ib3tuth0ughtQat@r&&

 – 문제 지문

Thank you for getting that information to us. We can clearly see that the briber, Ill-song, is communicating with the official from Caracas to set up a non-cash bribe. We need more than that, however. We need an idea of what Ill-song is using to bribe the official. Look through this capture and see if you can find out what the non-cash bribe is. Please hurry, the voting is about to begin!

Use the Round 3 packet capture in this folder to learn more about the case and answer the following question:

What is the non-cash bribe?

이번에는 김일성이 제공한 뇌물을 특정하는 문제이다. 패킷 파일을 열어보면 수많은 패킷들이 있어, 프로토콜로 일단 분석 포인트를 찾아보았다. 

5

[그림 5 – 프로토콜 정렬]

프로토콜을 기준으로 해당 패킷 파일에는 총 3개의 프로토콜이 존재한다. http, https, FTP가 그것인데, FTP의 내용을 보면 zip 파일을 전송하는 것을 볼 수 있다.

6

[그림 6 – FTP 내용]

zip 파일은 간단히 시그니처 카빙을 통해 추출하면 다음과 같은 파일들을 획득 할 수 있다.

7

[그림 7 – 카빙한 zip 파일 내용]

'sandofwhich.zip' 파일 말고도 여러 압축 파일들이 존재한다. 해당 파일들을 모두 카빙하면 동일하게 '.jpg' 확장자 파일들이 나오는데, 해당 파일들의 제목을 이어 붙이면 다음과 같은 문장이 만들어진다.

"I can’t in good conscience allow the U.S. government to destroy privacy, internet freedom and basic liberties for people around the world with this massive surveillance machine they’re secretly building."

그림 파일들을 보면 몇개의 파일들은 깨져보이며, 대부분의 파일들이 정상적으로 이미지를 보여주지 않는다. 위 문장의 처음인 "I"와 "building" 문자열의 파일을 보면 그림 파일의 헤더 시그니처와 푸터 시그니처를 가지고 있는 것을 볼 수 있다. 그러므로 각 단어들 제목의 파일 바이너리 데이터를 하나의 파일로 합쳐 보면 다음과 같은 이미지를 만들 수 있다.

8

[그림 8 – 조립된 이미지]

Answer : Chess Set

[Round 4]

Password : h0wd1dug3tth@t1?%

 – 문제 지문

Unfortunately, you were not quick enough and Pyongyang has been chosen for the Chess Boxing World Title. Furthermore, the chess set you uncovered was one of a very limited set and is incredibly expensive. To be frank, we're not sure how Kim Ill-song has the resources to obtain it. We've begun looking into Ill-song, but we can't seem to find anything on the guy. Rumor has it that he's trying to communicate with a particular individual, but we need to find out who and why. This capture shows him talking with someone else, but we're not sure how or what's being said. We need information on Ill-song before we can move on to his partner. Can you get us the device name of Ill-song's computer?

Use the Round 4 packet capture in this folder to learn more about the case and answer the following question:

What is the device name of Ill-song's computer?

김일성 컴퓨터의 이름을 파악하는 문제이다. 패킷 파일을 보면 기본적으로 http, https가 있는 반면에 STUN 프로토콜 패킷이 존재한다. STUN 프로토콜 패킷은 NAT 환경에서의 External IP/PORT를 P2P 단말이 알아볼 수 있도록 해주는 프로토콜이다. P2P 통신에 필요한 프로토콜이므로 컴퓨터에 대한 정보도 얻을 수 있지 않을까하여 해당 프로토콜에 분석 초점을 두고 분석을 시작 해 보았다. 또 문제 지문을 보면 개인적인 통신을 한다고 하니 STUN 프로토콜의 내용이 더욱더 의심이 간다.

문제 지문을 잘 읽어보면 해당 패킷 캡쳐를 통해 김일성이 누군가와 대화를 하고 있다고 한다. 그러므로 김일성의 통신 내용을 캡쳐했다고 볼 수 있다. STUN 프로토콜의 내용을 보면 다음과 같은 문자열이 전송되는 것을 볼 수 있다.

9

[그림 9 – 전송되는 컴퓨터 이름]

주소가 루프백이므로 주소 앞에 있는 값이 김일성 컴퓨터의 이름이다.

Answer : drpoppins-735

[Round 5]

Password : ur0nar0lln0w!@

 – 문제 지문

One of your colleagues was able to intercept messages between Ill-song and Ann Dercover, a professional chess boxer. The Chess Boxing World Title will be held in Pyongyang next year, and we know that this is only because of a bribe from a "Kim Ill-song". We now believe that this is an alias. Whoever it is has relations with Ann Dercover, and we believe that that Ill-song is using the Title to get her into North Korea. Since "Ill-song" is so determined to contact Ann, we've begun investigating her. So far we've just been tapping her phone and home network traffic. Based on their conversation, we believe that Mr. Ill-song (or whoever he is) will try to contact her in the near future and set up a time to meet. Look through this capture and let us know if you find out a meeting time. Remember, we need the date AND time.

Use the Round 5 packet capture in this folder to learn more about the case and answer the following question:

What is the month, date, and time of their meeting?

어떤 여자와의 만나는 일자를 알아내는 것이 이번 문제의 목표이다. http 패킷의 대부분 내용이 SMS 메시지이다. 하지만, 메시지 대부분은 내용이 없는데, 몇 개의 메시지는 내용이 들어 있어 http 패킷 여러개를 보면 다음과 같은 패킷을 볼 수 있다.

10

[그림 10 – SMS 메시지]

"still we should be careful. Pay attention. I want to meet in September at 5PM" 이라는 메시지를 보면 September 5PM이란 대략적인 날짜와 시간을 알 수 있다. 하지만 정확한 기간은 다른 메시지들을 본 후 파악이 가능하다. 해당 메시지는 다음과 같다.

11

[그림 11 – 위치 표시 값]

[그림 11]을 보면 위도/경도 값이 보인다. 위 패킷 다음으로 계속해서 위도/경도 값이 나오는데, 해당 값들을 모두 조회하여 보면 다음과 같은 형태가 된다.

12

[그림 12 – 위도/경도 조회 결과]

Answer : September 17th at 5 PM

[Round 6]

Password : gud$luk^^0nth1s1

 – 문제 지문

Since the meeting time between Ann and Ill-song isn't for another month, we've continued monitoring their traffic and communications. This information led investigators to a hotel in Pyonyang. After a failed attempt to apprehend Ill-song in his hotel room, a detective found a thumb drive he left behind. One of your colleagues has discovered what appears to be encrypted data on the thumb drive. We don't know if there will be anything useful on it yet, but we think the data might be from an Apple device. If so, there may be network credentials from his personal network on the device. We'd like you to get the SSID from the network he was using. You can do that, right?

Use the Round 6 zip file in this folder to learn more about the case and answer the following question:

What is the Wifi SSID from the device?

이번 문제는 Wifi SSID를 찾는 문제이다. 이번 문제는 처음에 패킷파일이 바로 주어지지 않는다. 조각난 것처럼 보이는 파일들이 압축되어 있는 압축파일 하나가 주어진다. 하지만 주어진 문제를 풀기전에 이전 문제 파일들로부터 얻어야 할 정보들이 있다.

먼저, Round 1에서 획득 했던 Documents.zip의 압축 파일들 중 "More Document" 디렉터리에 파일들에서 "NorthKorea.jpeg" 파일에 끝에 붙어 있는 "untitled.zip" 파일을 획득한다.

13

[그림 13 – 압축파일 획득]

압축 파일에는 "broken.py" 파일이 존재한다. 파이썬 스크립트 파일까지 획득 했다면, 이제는 Round 3 문제에서 획득 했던 이미지를 대상으로 스테가노그래피 기법을 이용 해 숨겨진 메시지를 획득해야 한다. 여러번 시도한 결과 "Slient eye" 도구를 이용 해 획득 할 수 있었다.

14

[그림  14 – 스테가노그래피 해제]

"i2454 2497d2496n2502 2470 2500 2507o2436s2452 2500s2503n2502l2487e2456 2497 2500h2485l2487 2470b2490e2491a2501m2466 2483a2501a2501e2505 2497 2500a2486"

"broken.py" 스크립트는 현재 스크립트로 정상 동작하기 위한 조건을 가지고 있지 않아 조금의 수정이 필요하다. 다음은 수정 전의 스크립트 코드이다.

———–———–———–———–———–———–———–———–———–———–

def fileToString(pathToFile):

    f = open(pathToFile, "r")

    strs = ""

    #adds each line of the file to the strs string

    for line in f.readlines():

        strs+=line

    return strs

def ASCII():

    #number of ASCII characters

    NumOfASCII == 0

    #returns list of all ASCII characters

    return "".join([chr(i) for i in range(NumOfASCII)])

def sumName(name):

    sums=0

    #sums the indices in ASCII of all the characters in name

    for x in name:

        sums+=ord(x

    return sums

def indexInFile(password):

    indices = []

    ASCIIArray = ASCII()

    #populates an array of indices to be used by the encoder

    for chrs in password:

        indices.append(ASCIIArray.index(chrs)+sumName(name)*2

    return indices

def indexInASCII(name):

    indices = []

    ASCIIArray = ASCII()

    #split on all non-numeric characters

    #remove first index because it is blank

    indexList = re.split("[^\d]”,encoded)[1:]

    #converts encoded characters to ASCII

    for index in indexList:

        indices.append(ASCIIArray[int(index) – (sumName(name)*2)])

    #returns decoded message

    return "".join(indices)

def encode(name):

    #returns a list of indices to be used for encoding

    indices = indexInFile(password,name)

    #convert file associated with name to a string

    bill = fileToString("./%s.txt"%name)

    encoded = ""

    #add letter in file plus index of the letter in the file to the encoded string

    for index in indices:

        encoded+=bill[index]+str(index)

    return encoded

———–———–———–———–———–———–———–———–———–———–

다음은 수정 후의 스크립트 코드이다.

———–———–———–———–———–———–———–———–———–———–

import re

def fileToString(pathToFile):

f = open(pathToFile, "r")

strs = ""

#adds each line of the file to the strs string

for line in f.readlines():

strs+=line

return strs

def ASCII():

#number of ASCII characters

NumOfASCII = 128

#returns list of all ASCII characters

return "".join([chr(i) for i in range(NumOfASCII)])

def sumName(name):

sums=0

#sums the indices in ASCII of all the characters in name

for x in name:

sums+=ord(x)

return sums

def indexInFile(password, name):

indices = []

ASCIIArray = ASCII()

#populates an array of indices to be used by the encoder

for chrs in password:

indices.append(ASCIIArray.index(chrs)+sumName(name)*2)

return indices

def indexInASCII(password, name):

indices = []

ASCIIArray = ASCII()

#split on all non-numeric characters

#remove first index because it is blank

indexList = re.split("[^\d]",password)[1:]

#converts encoded characters to ASCII

for index in indexList:

indices.append(ASCIIArray[int(index) – (sumName(name)*2)])

#returns decoded message

return "".join(indices)

def encode(name):

#returns a list of indices to be used for encoding

indices = indexInFile(password,name)

#convert file associated with name to a string

bill = fileToString("./%s.txt"%name)

encoded = ""

#add letter in file plus index of the letter in the file to the encoded string

for index in indices:

encoded+=bill[index]+str(index)

return encoded

def decode(password, name):

    return indexInASCII(password, name)

———–———–———–———–———–———–———–———–———–———–

획득한 문자열을 위 스크립트 코드에 넣고 디코딩하면 다음과 같이 패스워드가 출력된다. 인코딩 키는 "BillOfRights"이다.

15

[그림 15 – 패스워드 복호화]

복호화 문자열 : DontTry2BruteForceThisPassword

이제부터 이번 라운드 문제를 살펴보도록 하겠다. 이번 문제의 파일들은 모두 조각 형태로 이루어져 있다. 해당 파일들은 iPod touch의 iOS backup 파일들이 암호화되어 있는 파일들이다. 암호화를 풀기위한 도구들의 설치 과정 설명은 생략하도록 하겠다.

iphone-dataprotection 도구를 이용 해 복호화를 시도하면 다음과 같은 화면이 나오는데, 패스워드는 위에서 복호화한 문자열을 사용하면 된다.

16

[그림 16 – 복호화]

복호화를 진행하면 다음과 같이 복호화된 파일들이 생성된다.

17

[그림 17 – 복호화되어 생성된 파일들]

이번에는 복호화된 백업 파일들을 대상으로 키체인을 찾아야 한다. 키체인 역시 iphone-dataprotection 도구의 키체인 스크립트를 사용하면 된다.

18

[그림 18 – 복호화 완료]

Answer : LeakingSecrets

[Round 7]

Password : !LA$$t0n3!!

 – 문제 지문

The International Chess Boxing Association is reviewing the decision to let Pyongyang host the Title, but we're still not sure of the true indentity of Mr. Ill-song. We did, however, manage to get ahold of a FireTV left behind back in the hotel in Pyongyang. We want you to look for any videos he might have been watching, and see if there isn't a more personal one with intimate information on it. Hopefully something with a meeting location in it. Our sources tell us that this location is probably in the US. We don't need to know the exact location, but we need the state that's mentioned in the video. This is the final task and it is very important, so please don't just try guessing the states starting with Alabama.

Use the Round 7 file in this folder to learn more about the case and answer the following question:

What is the name of the state mentioned in the video?

이번 문제는 동영상 파일에서 언급하는 주 이름을 찾는 문제이다. 문제 파일은 압축파일로, 압축파일을 해제하면 iOS 계열 폴더들과 파일들이 나오는데 "/usr/share/networkFiles/" 디렉터리 아래에 "amazon.pcap" 파일과 "trekking.pcap" 파일이 존재한다. 일단 두 파일을 분석하는데에 초점으로 맞추고 분석을 진행한다.

"trekking.pcap" 파일을 보면 다음과 같이 "jumbled.mp3.zip" 파일을 하나 추출할 수 있다.

19

[그림 19 – 압축파일 전송 스트림]

압축 파일에는 mp3 파일이 압축되어 있고, 해당 mp3 파일을 들어보면 어떤 여성의 목소리가 들린다. 이외에는 해당 패킷 파일에서 획득할 정보가 없어 다음 패킷 파일 분석으로 넘어간다.

"amazon.pcap" 파일은 무선 네트워크 패킷을 캡쳐한 파일이다. 그러므로 우선적으로 802.11 프로토콜 패킷을 복호화 해야만 한다. 해당 프로토콜의 복호화는 와이어샤크에서 기본으로 제공해주는 기능을 이용해 복호화할 수 있다. 이전 문제에서 획득한 SSID의 비밀번호인 "UncrackableNetwork75"를 이용하여 복호화를 시도한다.

암호화는 WPA-PWD 방식으로 되어 있어, 다음과 같이 키를 추가한 후 복호화를 시도하면 복호화가 완료된다.

20

[그림 20 – 키 추가]

복호화를 하면 "synergy" 프로토콜이 많이 보인다. "synergy" 프로토콜은 키보드와 마우스를 공유해주는 소프트웨어에서 사용하는 프로토콜로, 패킷을 보면 키보드에서 전송된 문자가 무엇인지 파악 할 수 있다.

techno viking

nyam cat ncat nick cage

cats and bears and stuff

carve 0x250c6

carve 0xa250c5

defcon 22

stewie madT

stuart

대략 위와 같은 문자가 전송된 것을 파악할 수 있는데, 오프셋 카빙을 지시하는 말 같은것이 전송된 것을 볼 수 있다. mp3 파일을 대상으로 오프셋을 이용 해 카빙하면 바이트 분포도가 일정한 파일이 나오는데 이것으로 보아 해당 파일은 Truecrypt 컨테이너 파일로 의심할 수 있었고, 비밀번호는 앞서 획득한 mp3 파일의 음성을 들어보면 획득할 수 있다. 여성이 말하는 단어들은 모두 NATO의 Phonetic code로 해독하면 "True HOOHA."라는 문자열을 획득 할 수 있다. 이를 이용하여 컨테이너 파일을 복호화하면 다음과 같이 비디오를 획득 할 수 있다.

21

[그림 21 – 비디오 획득]

Answer : New Jersey

이번 챌린지의 주요 문제는 Round 7이 끝이다. 보너스 문제로 Round 8이 존재하며 문제 파일은 Round 4의 문제파일로 진행된다. 해당 문제는 아직까지 챌린지가 진행되고 있어 풀이를 공개하지 못하는 점 이해하기 바란다.

이번 챌린지 문제는 다양한 난이도와 다양한 컨텐츠로 인해 재미있었다는 것이 지금 느끼는 가장 큰 소감이다. 하지만, 힌트 없이는 조금 풀기 어려울 수도 있다는게 개인적인 생각이며, 오프라인으로 챌린지를 진행하게 되면 많이 당황했을 수도 있겠다는 생각이 든다.

이 글을 보는 사람들도 한번쯤은 문제 풀이를 실습할 겸 풀어보는 것도 좋을 것 같다.