Tag Archives: ctf

2016 TrendMicro CTF PREQUAL – FORENSIC 100 (team bob)

지난 주말(07.30~31) 글로벌 백신 회사 Trend Micro에서 운영하는 2016 Trend Micro CTF (이하 TMCTF)에 HACKLAB 멤버들과 BOB출신 멤버들이 “team bob”팀으로 함께 참여했습니다.

0. TrendMicro CTF

최근 다양한 형태의 CTF가 운영되고 있습니다. 그 중 TMCTF는 예선(prequal)은 온라인 상에서 Jeopardy (문제풀이) 형태로 진행되었습니다. 출제된 문제는 다음과 같이 5가지 종류로 이루어졌습니다.

  • Analysis – Offensive
  • Analysis – Defensive
  • Forensic
  • Reversing
  • SCADA
  • Misc(IoT and Network)

직접 CTF에 참가한 분들은 비슷한 생각을 가졌을텐데요. 실제로 CTF 이후에 ctftime.org에 남겨진 weight vote에도 다음과 같이 비슷한 의견들이 있었습니다.[1]

  • nobody would be able to solve Forensic 100 without the hint
  • Offensive/Defensive categories are good, but some problems have too much guessing(ex. For 100/SCADA 100)
  • I was mostly focused on the defensive category and had quite some fun, it almost felt like reversing typical malware.
  • Challenges didn’t look very interesting. Was there even an irc channel?
  • average ctf, offense/defense categories close to real, scada/misc are bullshit, some tasks are “borrowed” (like scada200 is from S4x15)

최신 보안 이슈인 IoT, SCADA 관련한 컨셉이나 실제 악성코드와 같은 형태의 문제는 다소 놀라웠습니다. 하지만, 일부 문제는 Guessing 성격이 강해서 좋지 못하다는 생각을 했습니다.
그 중 하나가 바로 FORENSIC 100 (이하 for_100)문제였습니다. 초반에 문제를 다 풀고 이제 끝났다고 생각했는데, 결국 인증을 하지 못한 한(?)을 풀기위해 이렇게 Write-Up을 적으면서 위안을 삼으려고 합니다. 아래에서 해당 문제에 대하여 자세하게 설명하도록 하겠습니다.


1. 문제 설명

주어진 문제 지문은 다음과 같습니다.

Category: Forensic
Points: 100
It seems that C, who is a black hat, come up with a tremendous idea and wants to share it with B.
Let’s find out where the meeting place is from their email.
I will give you “victim.cap” for investigation.
Download the fileDecrypt the downloaded file by the following command.
> openssl enc -d -aes-256-cbc -k siTI9G3i4JIhQGkXhhDr -in files9.enc -out files9.zip
> unzip files9.zip

지문을 읽어보면 다음과 같은 내용입니다.

  • 블랙햇(악의적인 해커) C가 어마어마한 생각을 가지고 B와 함께 공유하기를 원하고 있는 것으로 보이는데,
  • 이들이 주고 받은 이메일에서 미팅 장소를 찾으라는 내용입니다.
  • 그리고, 조사를 위해 주어진 파일은 “victim.cap” 입니다.

2. 문제 풀이

지문에 제공된 openssl 명령어를 이용하여 복호화를 하면 files9.zip 파일이 나타납니다. 이 파일의 압축을 해제하면 지문에서 언급했던 victim.cap 파일이 나타납니다.

즉, 네트워크 패킷 파일인 걸 알 수 있는데요. 네트워크 패킷 파일이 분석 대상 파일이므로 본능적으로(?) Wireshark로 열어봤습니다.

2.1. 패킷 파일 확인

20160803_190514

일반적인 네트워크 패킷에서 보았던 TCP/UDP 프로토콜과는 다른 802.11이라는 것을 확인 할 수 있습니다.

여기서 잠깐, 802.11 이란? [2]

IEEE 802.11 Working Group에서 “Wireless LAN”이란 용어를 사용하였고, 이 표준에서는 주로 무선랜(무선 구간)에 대한 MAC과 PHY 계층을 다루고 있습니다. (http://www.ieee802.org/11/)

 

2.2. 암호화 방식 확인

위와 같이 Protocol에서 802.11은 무선랜 환경을 나타내는 것입니다. Wireshark에서 제공하는 기능을 이용하면 좀 더 쉽게 확인이 가능합니다.

(1) Statistics > Capture File Properties

20160804_150404

(2) Wireless > WLAN Traffic

20160804_150608

위의 2가지 기능을 통해 확인한 결과, 해당 패킷은 WLAN(무선랜) 환경에서 수집 된 패킷으로 ssid는 “victim0″이고, WEP방식의 암호화가 적용된 것을 알 수 있습니다. 즉, WEP방식으로 암호화가 되어있어서 현재 패킷상에서 평문 데이터가 보이지 않는 것입니다. 하지만, WEP로 암호화 된 데이터에서 비밀키(암호키)가 노출되면 평문을 알 수 있고, 비밀키를 모르더라도 알려진 여러가지 방법들을 통해 복호화 가능합니다.[3-5]. WEP를 공격하는 기법들은 다음과 같습니다.

  • 전수조사 공격 (Brute Force Attack)
  • 키 스트림 재사용 공격
  • 재전송 공격 (Replay Attack)
  • FMS 공격 (Fluhrer,Mantin,Shamir Attack)
  • KoreK 공격
  • 단편화 공격

2.3. WEP 크래킹

공개된 WEP 공격(크래킹)도구 또한 다양합니다. 그 중 WEP와 WPA (Dictionary attack)키를 크랙 할 수 있는 aircrack-ng를 이용하여 WEP 크래킹을 시도했습니다.[6]

(1) 분석 환경 :

jack2@box:~$ cat /etc/issue
Ubuntu 16.04.1 LTS \n \l
jack2@box:~$ uname -a
Linux box 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

(2) aircrack-ng 설치 :

jack2@box:~$ sudo apt install aircrack-ng

(3) aircrack-ng를 이용한 KEY 값 획득

jack2@box:~/ctf/trendmicro/forensic/100$ aircrack-ng -b 00:07:40:61:28:56 victim.cap

-b 옵션은 다음과 같습니다.
-b <bssid> : target selection: access point’s MAC

BSSID(basic service set identification)는 쉽게 AP의 MAC주소를 의미합니다. 현재 분석 대상인 victim.pcap 파일에서 MAC 주소(00:07:40:61:28:56)는 확인 가능합니다.

20160804_185719

위와 같이 13byte KEY값 [ 41:41:41:41:41:41:41:41:41:41:41:41:41 ] (ASCII: AAAAAAAAAAAAA )을 획득 할 수 있습니다.

(4) 전체 패킷 복호화

앞서 획득한 KEY를 이용하여 victim.cap 파일을 복호화 가능합니다. 복호화 할 때 사용하는 도구는 Aircrack-ng에 포함된 도구 중 하나인 airdecap-ng를 이용했습니다.
(*참고로 Wireshark를 이용한 복호화 방법도 있으니 참고하시면 좋을 것 같습니다. [7])

jack2@box:~/ctf/trendmicro/forensic/100$ airdecap-ng -w 41414141414141414141414141 victim.cap

-w 옵션은 다음과 같습니다.
-w <key>   : target network WEP key in hex

HEX형태로 WEP KEY를 입력하여 airdecap-ng를 통해 복호화 한 결과, 다음과 같이 victim-dec.cap 파일이 추출됩니다.

20160804_193314

2.4. 복호화 패킷 분석

앞서 복호화하여 획득한 패킷인 victim-dec.cap 파일을 Wireshark로 확인한 결과, 다음과 같이 복호화되어 프로토콜이 TCP와 같은 형태로 출력되고 좀 더 상세한 정보를 확인 할 수 있습니다.

(1) 유용한 정보 확인

20160804_193614

문제 지문을 떠올리면서, B와 C가 주고 받은 메일 정보에 집중하여 분석을 진행했습니다. (*Let’s find out where the meeting place is from their email.) 전체적인 흐름을 확인하기 위해 네트워크 포렌식 도구인 NetworkMiner [8]를 이용한 결과, 아래와 같이 흥미로운 정보를 볼 수 있습니다.

20160804_203135

– [FROM] : brute_1023@example.com
– [TO] : caesar_03_15@example.com
– [SUBJECT] : Re: deal
– [Protocol] : SMTP
– [Frame #] : 97029

Wireshark에서 97029에 해당 하는 패킷을 살펴본 결과, 앞서 확인한 동일한 정보 + 압축파일(location2.zip)이 첨부되어 있습니다.B와 C가 이야기한 위치 정보가 담겨 있을 것이라는 생각이 듭니다. (*지문 : Let’s find out where the meeting place is from their email.)

20160804_220829

해당 스트림을 살펴보면 다음과 같이 location2.zip 파일이 base64로 인코딩되어 있습니다.
tcp.stream eq 134

(2) base64로 인코딩 된 파일 획득 및 복호화

base64로 인코딩되어 있는 부분을 복사하여 HxD[9]와 같은 헥스에디터 도구를 사용하여 파일로 생성합니다. (파일명 예시: location2.zip.bs64)
location2.zip.bs64

생성한 파일은 base64로 인코딩이 되어 있기 때문에 간단하게 디코딩하는 스크립트를 이용해서 디코딩을 합니다.

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import base64
input_bs64 = open("location2.zip.bs64",'r')
output_zip = open("location2.zip",'w')
base64.decode(input_bs64, output_zip)

디코딩 한 결과 획득한 파일을 확인하면 다음과 같이 정상적인 압축파일 입니다.
20160805_003311

(3) 복호화 한 파일 압축해제 시도

해당 파일의 압축해제를 시도해 봤습니다. 그런데, 다음과 같은 오류가 발생해서 찾아본 결과 7z 명령어를 이용해서 해결 가능하다는 내용이 있습니다[10].

20160805_004231

그래서 7z 명령어로 압축 해제를 시도한 결과, 다음과 같이 압축파일에 비밀번호가 걸려져 있었습니다.

20160805_004314

2.5. 압축해제를 위한 비밀번호 정보 검색

이제부터 압축파일을 풀 수 있는 비밀번호와 관련된 정보를 얻는 것에 집중하여 분석을 진행합니다. 이전에 확인한  Re :deal 이라는 메일 제목에서 알 수 있듯이 deal에 대한 답장으로 보입니다.참고로 발/수신인 메일 정보는 다음과 같습니다.

  • FROM : brute_1023@example.com
  • TO : caesar_03_15@example.com

(1) 수/발신인 정보를 이용한 이전 메일 정보 검색

비밀번호와 관련된 이야기를 앞의 메일에서 나누었을 거라는 유추가 됩니다. 그래서 관련된 내용이 있는지 다시 패킷 분석을 진행했습니다.

위에서 언급한 답장에 대한 수신인의 메일 주소가  caesar_03_15@example.com 이었기 때문에 처음 메일보낸 발신인이 해당 메일 주소를 가질 것이라는 생각을 가지고 97029 보다 상위 패킷에서 해당 정보를 찾아봤습니다. 그 결과, 다음과 같이 caesar_03_15@example.com가 보낸 메일에 대한 정보를 찾을 수 있습니다. (Frame # : 57775)

20160805_005506

해당 부분에 대한 tcp stream을 확인한 결과, 다음과 같이 명확하게 주고 받은 내용을 확인 할 수 있습니다.

20160805_005711

(2) deal 메일 관련 정보

위에서 확인한 메일의 내용을 살펴보면 다음과 같습니다.

Hi B,

I got a big deal for you about “big bucks.”

I think it’s not a good idea to discuss via email, so let’s meet at the place

in the attached file.

P.s. I remember that you love Shakespeare’s play, so I will give you

this word, “Right Niece Dreams”

C

큰 거래를 원하는데 이메일을 통해 이야기하는 것은 좋지 않으므로, 만나서 이야기 하자는 내용입니다. 그리고 첨부 파일이 있다고 합니다.

그러면서 추신(P.S.)에 셰익스피어를 좋아하는 것을 기억해서 “Right Niece Dreams”이라는 문구를 주었습니다.


3. 멘붕의 시작 (a.k.a 개삽질) 

당연히, 앞에서 찾은 “Right Niece Dreams”가 압축 파일을 해제하는 비밀번호라는 생각을 했지만,  압축 해제를 시도한 결과 풀리지 않았습니다.

3.1. 구글링 시도

그래서 “Shakespeare” + “Right Niece Dreams” 를 이용해서 구글에 검색을 했지만, 한 여름 밤의 꿈(Midsummer Night’s Dream) 외에는 딱히 나오는 정보가 없었습니다.

20160805_012742

3.2. 주최측에 메일 보내기

다 끝났다고 생각했는데, ‘여기서부터 시작인가?’ 라는 생각이 들정도로 많은 시간이 흘렀습니다. 이건 ‘문제에 문제가 있다’는 생각이 들어서 비루한 영어실력이지만 다음과 같이 주최측에 메일을 보냈습니다.

20160805_013108

다른 팀들은 잘 푸는가 봤는데, 순위권에 있는 어느 팀도 해당 문제를 풀지 못하고 있었습니다. 그래서 웬만하면 답장으로 힌트에 대한 공지가 올 것이라는 생각을 했습니다. 하지만 답장으로 조금 더 열심히 해보면 좋은 결과가 있을 것이라는 답장만 왔습니다. ㅋ

20160805_013414

그래서 좀 더 삽질해보자는 생각으로 “Midsummer Night’s Dream”“Right Niece Dreams” 문자열에 대하여 대/소문자 치환, 띄워쓰기 없애기와 같은 방법으로 압축해제를 시도했지만, 압축은 풀리지 않았습니다.

3.3. 힌트?!

많은 삽질을 하면서 시간이 경과 된 뒤, 삽질을 좀 더 열심히 하라고 했던 주최측에서 결국은 힌트를 공지했습니다.

[HINT] “Et tu Brute, Then FALL C,A,E,S,A,R”

힌트로 나온 내용은 시저의  구글에 검색해보면 셰익스피어의 “율리우스 카이사르” 연극 中 시저가 죽을 때 남겼던 “브루투스 너마저?”라는 대사였습니다. 그래서 이 힌트를 보면서 여러가지 추가 삽질을 했습니다.

  • 시저 암호를 이용한 문자열 암호화 후 비밀번호 대입 (ROT-13)
  • 시저의 조카딸(Niece)이 누군지 검색
  • “율리우스 카이사르” 연극 대본에 언급된 Niece, Dreams 와 같은 문자 검색
  • 그냥 무작위 전수 조사 공격 (rarcrack)

이처럼 말도 안될 정도의 여러가지 방법을 시도했지만, 압축 비밀번호를 해제하지 못했습니다.


4. 대회 후 정리

결국, 포렌식 100 문제는 풀지 못하고 대회가 종료되었습니다. 다른 팀원들이 맡은 부분을 잘 해결해서 좋은 성적으로 본선에 진출하게 되었습니다 +_+

20160805_015732

하지만, 대회 후에 다 푼 문제를 못 푼 것 같아 해당 문제를 정리하면서 다시 보면서 힌트를 본 결과. 무릎을 탁 치게 되면서, 힌트가 없었으면 풀리지 않는 문제였나 싶을 정도로 Guessing 성격이 강한 문제라는 생각이 들었습니다.

4.1. 힌트 다시 짚어보기

마지막에 획득한 정보를 다시 보면 다음과 같습니다.

  • Right Niece Dreams
  • [HINT] “Et tu Brute, Then FALL C,A,E,S,A,R”

문제를 풀 당시에도 왜 CAESAR에 각각 , 를 넣어서 힌트로 주었을까? 라는 생각을 했지만, 뭐 특별한 생각은 들지 않았습니다. 하지만, 정리하는 시점인 지금에서야 눈에 들어온 부분은 힌트 중 대문자로 작성된 이 부분 이었습니다.

  • [HINT] “Et tu Brute, Then FALL C,A,E,S,A,R

메일로 알려준 문자열인 Right Niece Dreams 에서 C,A,E,S,A,R 각각의 문자를 떨어트리면(FALL) 다음과 같은 문자가 나옵니다. 비교를 위해 편의상 _ 문자로 치환을 했습니다.

  • [원본] :  Right Niece Dreams
  • [치환] :  _ight Ni___ D___m_

FALL하고 남은 문자들을 조합하면 miDNight 라는 문자열이 됩니다. (제가 하면서도 참 말도 안된다. 라는 생각을 하면서도 이렇게 블로깅을 하고 있습니다 @_@)

설마 이걸로 풀릴까? 했는데 다음과 같이 풀려버렸습니다(?)

20160805_021621

4.2. 그림파일(location.jpg) 확인

압축을 해제하여 나온 파일을 확인하면 다음과 같이 위도, 경도 정보가 담겨있습니다.

location2

  • [위도] : 48.924472
  • [경도] : 2.360083

4.3. 구글맵스에서 장소 확인 (meeting place)

B와 C가 접선하기로 한 장소가 정확히 어디인지 알기 위해 구글 맵스를 이용해서 앞서 확인한 위도, 경도 정보를 입력한 결과, 경기장으로 보이는 장소가 나왔습니다.

20160805_022311

해당 장소의 정확한 이름을 확인하기 위해 해당 장소를 선택한 결과, 1998 FIFA 월드컵이 개최된 경기장인 Stade de France라는 것을 알 수 있었습니다. 즉, B와 C는 스타드 드 프랑스 경기장에서 접선한다는 것임을 알 수 있습니다.

4.4. (인증하지 못한) FLAG

이제 접선 장소 정보는 획득했으므로 (인증 하지 못했던) FLAG에 대해서 적어보려고 합니다. ㅋ

모든 문제의 플래그 형태는 다음과 같이 TMCTF{FLAG} 로 입력하면 된다고 했습니다.

Please type in the flag in the ‘TMCTF{<flag>}’ format.
Please replace <flag> with the actual flag you would like to submit.
Example: If your flag is abc, then please type in TMCTF{abc}.

실제 대회 시간 내에는 인증하지 못했지만 인증 플래그는 TMCTF{Stade de France} 인 것을 알 수 있습니다.


5. 후기

851408951_16158_9491791521707380372

대회 때 인증을 못해서 점수를 획득하는데 실패했지만, 같은 팀원들 덕분에 잠시 잊고 있었던 함께 CTF를 하는 재미를 느낄 수 있어서 좋았습니다. 11월에 있을 본선을 위해 준비하는 “team bob” 멤버들 화이팅입니다.
(*사진은 오프라인으로 모여서 CTF 한 멤버들 밖에 못 찍었네요ㅋ 온라인으로도 함께 했던 멤버들도 본선 전에 식사하면서 같이 사진 한 방 남겨요 ㅎㅎ )

그리고, 막상 모여서 CTF 할 장소를 구하기 힘든데 hackerspace에서 대회 및 연구 할 수 있게 좋은 장소를 제공해주신 HARU( HAckers ReUnion)분들께도 감사드립니다. ^_^

또한, 국내에서 개최되는 다양한 CTF 중 PLAINBIT에서 출제한 2015 WHITEHAT CONTEST 예선이 포렌식 컨셉의 문제로 정말 잘 짜여있다는 것을 알 수 있었습니다. 다시 한 번 PLAINBIT 분들에게 RESPECT를 보냅니다 +_+

P.S.  caesar_03_15@example.com 에서 03월 15일은 시저(caesar)가 암살당한 날이라고 하네요. 만약에 HINT도 안 나왔다면? 이 정보로 guessing을 해서 C,A,E,S,A,R 를 FALL 하는 것을 생각해 낼 수 있었을까요?ㅋ


[References]

  1. CTFtime.org,Trend Micro CTF 2016 Online Qualifier Weight Vote , https://ctftime.org/event/340/weight/
  2. NETMANIANS BLOG, 무선랜 (Wi-Fi) 표준과 기본 용어 설명, http://www.netmanias.com/ko/post/blog/5343/wi-fi/wireless-lan-wi-fi-standard-and-basic-terms
  3. N3015M INNOVATION[PERSONAL LABORATORY],무선랜 WEP 암호화 알고리즘 취약점 , http://n3015m.tistory.com/3
  4. Toorcon 2008, Retrieving WEP Keys From Road-Warriors, http://ppt-online.org/5951
  5. Talk About Something (NetAdmin’s Weblog),802.11 WEP유효성 검증 , http://blog.netadmin.kr/16
  6. Aircrack-ng, https://www.aircrack-ng.org/
  7. Wireshark, How to Decrypt 802.11, https://wiki.wireshark.org/HowToDecrypt802.11
  8. NETRESEC, NetworkMiner, http://www.netresec.com/?page=NetworkMiner
  9. mh-nexus, HxD, https://mh-nexus.de/en/downloads.php
  10. Ubuntu Forum,[SOLVED] unzip message need PK compat. v5.1 (can do v4.6),https://ubuntuforums.org/showthread.php?t=1416364