요즘은 시스템 공부를 하고 있다. BOF 원정대를 풀고 있었는데 Redhat 6.2 버전의 고질적인 버그로 인해 어떤 경우에는 /bin/bash2에서도 정확하게 메모리에 원하는 주소가 넣어지질 않았다. 날씨도 더운 상황에서 이러한 상황이 발생하니 짜증도 나고 하기 싫어지는 무기력함도 생겨 인터넷에서 여러 워게임을 찾아 보던 도중 해당 글에서 다룰 exploit-exercises 라는 워게임을 찾아 냈다. 문제는 BOF 원정대처럼 VM 이미지가 주어지며 각 레벨의 계정이 있고 그에 맞는 flag 계정이 존재한다. 각 레벨의 계정으로 로그인하여 각 레벨에 맞는 flag 계정의 쉘을 얻어 getflag 명령을 수행하는 것이 해당 워게임의 최종 목표이다. 문제들은 다음과 같이 3가지로 나누어져 있고 각 종류 별로 VM 이미지를 제공한다.


Nebula - 리눅스 환경에서의 여러가지 기초적인 문제들을 문제로 만들어 제공한다.


Protostar - Nebula 보다는 조금 더 심화된 문제들이 주를 이루는데, 메모리 구조에 대한 이해와 공격을 다루고 있다.


Fusion - 위 두가지를 합쳐 조금 더 심화 된 학습을 유도한다.


Nebula를 시작으로 문제를 풀어 블로그에 포스팅 할 예정인데 시간이 있어 꾸준히 포스팅을 할 수 있을지 모르겠다. 또 포렌식을 공부해야 하는 입장이고 연구도 해야 하는 입장이라 이걸 끝까지 풀 수 있을지도 모르는 상황이다. 하지만 할 수 있는데 까지 최선을 다할 생각이다.


문제 웹 사이트 : http://exploit-exercises.com/

'[+] Hacking > [-] ETC' 카테고리의 다른 글

[생각] 되도록이면 토렌트 프로그램은 정품을 쓰자.  (0) 2013.09.12
exploit-exercises Wargame  (0) 2012.07.25
HackJam!!!!!  (3) 2009.09.08
해커사전.  (0) 2009.08.24
어쩌다가 맵더소울 홈피가...  (1) 2009.07.23

주로 CTF 문제를 구할 때 방문하는 Shell-Storm 사이트에서 해당 문제를 발견하여 풀어보았다. 고급 기술을 요하는 문제는 아니고 어느정도의 노가다(?)를 요구하는 문제이다. 문제로는 packet 카테고리의 문제니 당연히 패킷 파일이 하나 주어진다.(처음에는 7z로 압축 되어 있음) 패킷을 열어보면 바로 첫페이지에 당당하게 key.jpg라는 파일 이름이 보인다.



[그림 1 - key 값이 들어있을 법한 jpg 파일명]


HTTP로 주고 받은 듯 하니 File Object 기능으로 해당 파일을 추출 해 보자.


[그림 2 - 나누어져 있는 jpg 파일]


주고 받은 파일은 key.jpg 파일 하나인데 여러개로 잘개 나누어져 있다.(문제 풀이 과정에서 pcap 파일에서 jpg 파일만 카빙을 시도했었지만 쓰레기 데이터가 존재해 카빙은 제대로 이루어지지 않았다.)

예상했겠지만 수작업으로 jpg를 복구해야 한다. Save All 버튼을 눌러 해당 파일들을 모두 저장하여 보면 다음과 같이 몇개는 정상적으로 보인다.


[그림 3 - pcap 파일에서 추출한 jpg 파일들]


각 파일들의 크기를 보면 어떠한 파일들의 크기는 1MB를 넘어가지 않으며 어떤 파일들은 1KB를 훌쩍 넘겨버린다. 쓰레기 데이터라고 생각할 수도 있지만 이 파일들 모두 조각의 일부분이다. 현재 복구가 그나마 되어 있는 key(11)과 같은 jpg 파일에 다음에 오는 복구된 파일(key(26).jpg [그림 3]에서 잘려 보이는 복구된 파일이다.)의 앞 파일까지 바이너리 데이터를 모두 합쳐주면 어느정도 jpg가 복구 되는 것을 알 수 있다. key(1).jpg부터 key(100.jpg까지 복구한 이미지는 다음과 같다.(key(1).jpg는 헤더와 푸터가 뒤바껴 있어 푸터를 바이너리 데이터 뒤로 다시 삽입해주면 정상적으로 이미지가 보인다.)


[그림 4 - key(1~10).jpg]


이러한 노가다를 조금 하다보면 다음과 같은 이미지를 만들 수 있다.


[그림 5 - key(26~33).jpg]


이미지가 완벽하게 복구 되지는 않지만 대충 안젤리나 졸리의 사진인 것을 파악 할 수 있으며 키 값 또한 발견 할 수 있다.

이미지에 있는 키 값은 Base64 값으로 디코딩하면 다음과 같다.


Key : Submb4In60SHcondsOrBHGone



'[+] Hacking > [-] Challenge Report' 카테고리의 다른 글

exploit-exercises Nebula - Level01  (0) 2012.07.25
exploit-exercises Nebula - Level00  (0) 2012.07.25
GitS CTF Packet 200 풀이  (1) 2012.06.29
RootBSD Forensic Challenge 풀이  (2) 2012.06.16
Defcon 2012 CTF Forensic 400 Write-up  (7) 2012.06.06
  1. 익명 2012.07.12 21:36

    비밀댓글입니다

Google에서 포렌식 Challenge 목록을 크롤링 중 소규모 Forensic Challenge를 발견하였다. RootBSD 라는 곳에서 주최한 대회로 2010년에 열린 것 같다. 문제의 난이도는 쉬운 편이며, 참가 인원은 30팀 정도 된다고 한다. 대회 방식은 질/답 형식이 아닌 flag 값을 제일 먼저 정확하게 찾아 주최측에 메일로 인증을 받는 형식이다. 찾아야 할 해쉬 값은 총 10개이며 10개 모두 찾아 이메일로 한번에 보내야 한다.


문제 난이도는 어렵지 않으니 훑어 보기만 해도 될 것이다.


일단 문제 파일을 받아보면 tar.gz로 압축되어 있는데 압축을 해제 해 보면 [그림 1]과 같은 디렉토리들이 보이는 걸 확인 할 수 있을 것이다.



[그림 1 - 문제 목록]


각 디렉토리에 있는 파일들을 분석하여 해쉬 값을 찾아내는 것이 목표이니 Documents 디렉토리를 시작으로 하나하나씩 찾아 보도록 하겠다.


Hash Flag 1.

Documents 디렉토리로 이동해 보면 다음과 같은 파일들이 보인다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Documents$ ls -al

total 4560

drwxr-xr-x 2 sansforensics sansforensics    4096 2012-06-16 14:55 .

drwxr-xr-x 8 sansforensics sansforensics    4096 2010-07-16 07:04 ..

-rw-r--r-- 1 sansforensics sansforensics  370668 2010-07-15 06:38 03-icar-fractal.pdf

-rw-r--r-- 1 sansforensics sansforensics 1175682 2010-07-15 06:39 fractales.pdf

-rw-r--r-- 1 sansforensics sansforensics  965314 2010-07-15 06:39 fractal.pdf

-rw-r--r-- 1 sansforensics sansforensics  582934 2010-07-15 06:42 Fractal.pdf

-rw-r--r-- 1 sansforensics sansforensics  289244 2010-07-15 06:42 fractals2.pdf

-rw-r--r-- 1 sansforensics sansforensics 1262029 2010-07-15 07:04 World_of_Fractal.pdf

sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Documents$ file *

03-icar-fractal.pdf:  PDF document, version 1.3

fractales.pdf:        PDF document, version 1.4

fractal.pdf:          PDF document, version 1.6

Fractal.pdf:          PDF document, version 1.4

fractals2.pdf:        PDF document, version 1.3

World_of_Fractal.pdf: PDF document, version 1.3


여러 pdf 파일들이 보이는데 해당 파일들을 하나씩 열어보면 꽤(?) 공을 들인 문서라는 느낌을 받는다.

[그림 2 - 03-icar-fractal.pdf]


문제를 만들기 위해 이렇게 정성들여 pdf 파일을 만들 것 같지는 않아 혹시나 하고 원본 파일에 해쉬 값을 집어 넣은건 아닐지 해서 Google 검색 엔진을 이용해 검색을 시도 해 보았다.



[그림 3 - Google 검색 결과]


추측대로 원본 파일이 존재하였다. fractals2.pdf 파일을 존재하고 모든 문서 파일의 원본을 구 할 수 있다. 이제 동일 파일인지 확인하기 위해 md5 해쉬 값을 확인하여 보자.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Documents$ md5sum *

3dc8480a8762d1eb2af09482468b0298  03-icar-fractal_o.pdf

3dc8480a8762d1eb2af09482468b0298  03-icar-fractal.pdf

31fb327fcf1f128a7df102e4b13b7727  fractal-1_o.pdf

31fb327fcf1f128a7df102e4b13b7727  fractal-1.pdf

8dcdaea419993e2fdb7f736d539d94da  fractales_o.pdf

8dcdaea419993e2fdb7f736d539d94da  fractales.pdf

07528724e9c0aea37656e0c794ce30d7  fractal_o.pdf

07528724e9c0aea37656e0c794ce30d7  fractal.pdf

3801073a72e037ee60b532cb8a1254dc  fractals2.pdf

6263b0228a08fe3de7677ad2a5cba621  World_of_Fractal_o.pdf

bdbf94bb16895468409f68ecf9401e02  World_of_Fractal.pdf


md5 해쉬 값이 같은 문서들이 있는 것으로 봐서 해당 파일들은 인터넷에서 다운받아 아무런 조작도 가해지지 않았다는 것으로 이해 할 수 있다. 찾지 못한  fractals2.pdf 파일과 md5 해쉬 값이 다른 World_of_Fractal.pdf 문서가 의심스럽다. 하지만 fractals2.pdf는 찾지 못했을 뿐 찾았더라면 아마 같은 해쉬 값을 출력 했을 것으로 예상되니 해쉬 값이 다른 World_of_Fractal.pdf 문서 파일을 조사해 보도록 하겠다. 원본 파일에서 어느 부분을 조작 했는지 알아보기 위해 diff 명령으로 두 파일을 비교 해 보자.

sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Documents$ diff -u <(xxd World_of_Fractal.pdf) <(xxd World_of_Fractal_o.pdf)
--- /dev/fd/63 2012-06-16 15:45:10.157927386 +0900
+++ /dev/fd/62 2012-06-16 15:45:10.157927386 +0900
@@ -77537,9 +77537,9 @@
 012ee00: 6f62 6a0d 3c3c 200d 2f50 726f 6475 6365  obj.<< ./Produce
 012ee10: 7220 2841 6372 6f62 6174 2044 6973 7469  r (Acrobat Disti
 012ee20: 6c6c 6572 2035 2e30 205c 2857 696e 646f  ller 5.0 \(Windo
-012ee30: 7773 5c29 290d 2f41 7574 686f 7220 2866  ws\))./Author (f
-012ee40: 3138 3039 3834 3465 6161 3165 6265 3035  1809844eaa1ebe05
-012ee50: 3062 6434 3937 3361 3435 3662 3135 3029  0bd4973a456b150)
+012ee30: 7773 5c29 290d 2f41 7574 686f 7220 286d  ws\))./Author (m
+012ee40: 6f6f 6368 6929 0d2f 4372 6561 746f 7220  oochi)./Creator 
+012ee50: 2841 6372 6f62 6174 2050 4446 4d61 6b65  (Acrobat PDFMake
 012ee60: 7220 352e 3020 666f 7220 576f 7264 290d  r 5.0 for Word).
 012ee70: 2f4d 6f64 4461 7465 2028 443a 3230 3032  /ModDate (D:2002
 012ee80: 3034 3039 3137 3336 3233 2b30 3827 3030  0409173623+08'00

Author 부분에 원본에 있던 moochi 부분을 지우고 해쉬 값을 넣은 것을 볼 수 있다.


flag : f1809844eaa1ebe050bd4973a456b150


Hash Flag 2.

Download 디렉토리에 보면 pcap 파일만 존재한다. 간단하게 NetworkMiner로 열어보면 세션이 하나만 존재하는 것을 알 수 있다.


[그림 4 - NetworkMiner]


Files 탭을 보면 파일이 하나 존재하는 것을 알 수 있는데 해당 파일 이름이 flags.rar 이다. 이 파일 내용을 보면 flags.jpg라는 이미지 파일이 하나 압축되어 있는데 비밀번호가 걸려 있어 당장 해당 파일을 열어보지는 못한다. 비밀번호를 크랙해야 하는데 문제 설명 페이지에서는 다음과 같이 힌트를 제시하고 있다.


Petit indice pour eviter de perdre trop de temps sur le bruteforce :

- Les passes font maximum 5 charactere uniquement des lettres en minuscule.

- Pour le rar c'est quelque chose que j'affectionne tout particulierement en 5 lettres.


Brute Force에 너무 시간을 잃지 않길 바라면서 힌트를 준다 :

- 비밀번호는 소문자로 최대 5글자이다.

- 내가 좋아하는 것들 중 5글자 인 것(?)


두 번째 힌트는 외국인에게는 도움이 되지 않는 힌트이다. 첫 번째 힌트를 기억하고 Brute Force 공격을 하면 [그림 5]와 같이 비밀번호를 얻을 수 있다.


[그림 5 - Brute Force 결과]


rar 파일의 비밀번호는 biere(맥주) 이다.... -_-;;;;


비밀번호를 입력하고 해당 rar 파일을 확인하면 해쉬 값을 확인 할 수 있다.


[그림 6 - 해쉬 값]


flag : 203ec6cfbff8288c0ebeec8ea1e70144


Hash Flag 3 ~4.

이번에는 Image 디렉토리에 있는 이미지 파일들을 분석하여 보자.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Images$ ls -al

total 1612

drwxr-xr-x 2 sansforensics sansforensics   4096 2012-06-16 14:55 .

drwxr-xr-x 8 sansforensics sansforensics   4096 2010-07-16 07:04 ..

-rw-r--r-- 1 sansforensics sansforensics 211705 2010-07-15 06:16 fractale10.jpg

-rw-r--r-- 1 sansforensics sansforensics  32151 2010-07-15 06:16 fractale11.jpg

-rw-r--r-- 1 sansforensics sansforensics  54837 2010-07-15 06:14 fractale1.jpg

-rw-r--r-- 1 sansforensics sansforensics 159526 2010-07-15 06:15 fractale2.png

-rw-r--r-- 1 sansforensics sansforensics  95783 2010-07-15 06:15 fractale3.jpg

-rw-r--r-- 1 sansforensics sansforensics  59793 2010-07-15 06:15 fractale4.jpg

-rw-r--r-- 1 sansforensics sansforensics 407821 2010-07-15 06:15 fractale5.jpg

-rw-r--r-- 1 sansforensics sansforensics  64268 2010-07-15 06:15 fractale6.jpg

-rw-r--r-- 1 sansforensics sansforensics 114952 2010-07-15 06:15 fractale7.jpg

-rw-r--r-- 1 sansforensics sansforensics  72212 2010-07-15 06:16 fractale8.jpg

-rw-r--r-- 1 sansforensics sansforensics  37318 2010-07-15 06:16 fractale9.jpg

-rw-r--r-- 1 sansforensics sansforensics  28468 2010-07-15 06:14 fractale.jpg

-rw-r--r-- 1 sansforensics sansforensics 279641 2010-07-15 06:35 jpg_NDH080408ak.jpg


마지막 파일만 다른 파일들과 다르게 이름이 완전히 다르다. 해당 파일의 정보를 보면 다른 파일들과 사뭇 다르다는 것을 확신 할 수 있다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Images$ file *

fractale10.jpg:      JPEG image data, JFIF standard 1.01

fractale11.jpg:      JPEG image data, JFIF standard 1.00, comment: "LEAD Technologies Inc. V1.01"

fractale1.jpg:       JPEG image data, JFIF standard 1.02

fractale2.png:       PNG image, 600 x 600, 8-bit grayscale, non-interlaced

fractale3.jpg:       JPEG image data, JFIF standard 1.02

fractale4.jpg:       JPEG image data, JFIF standard 1.01

fractale5.jpg:       JPEG image data, JFIF standard 1.01, baseline, precision 0, 4360x498

fractale6.jpg:       JPEG image data, JFIF standard 1.01

fractale7.jpg:       JPEG image data, JFIF standard 1.02

fractale8.jpg:       JPEG image data, JFIF standard 1.01

fractale9.jpg:       JPEG image data, JFIF standard 1.02

fractale.jpg:        JPEG image data, JFIF standard 1.01

jpg_NDH080408ak.jpg: JPEG image data, EXIF standard 2.2


다른 파일들은 일반적인 이미지 파일구조를 가지고 있는데 비해 해당 파일만 EXIF 구조를 가지고 있다. 오프셋을 하나하나 분석하면 좋겠지만 도구로 분석하는 것도 좋은 방법 중 하나이다.(시간 절약)

인터넷에 온라인으로 EXIF를 분석해주는 Viewer들이 많다. 해당 도구 중 하나를 선택하여 사용 해 보자.


[그림 7 - EXIF Viewer]


썸네일에 해쉬 값 이미지가 있는 것을 볼 수 있다.


flag : f2c7ec9225e9158deb7ca7aad0f3504b


또 file * 명령 결과를 보면 EXIF 이미지처럼 어떤 부가 적인 정보를 가지고 있는 파일 두개가 더 있는데 하나는 코멘트를 나타내고 또 하나는 뭔지 모를 정보를 가지고 있다. 코멘트를 출력한 파일은 별볼일 없어보이므로 뭔지모를 baseline, precision 0, 4360x498 이라는 문자열을 출력한 fractale5.jpg 이미지를 한번 살펴보자. 일단 strings 명령어로 살펴보면 바로 처음에 해쉬 값으로 추정 되는 문자열이 보인다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Images$ strings fractale5.jpg | more

JFIF

"1dcd64e16d97507052d67a6d0557ee8d


좀 더 정확히 알아보기 위해 jhead 명령어를 사용 해 이미지 파일의 정보를 파싱하여 보면 코멘트에 해당 해쉬 값이 존재하는 것을 알 수 있다.

sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Images$ jhead fractale5.jpg 
File name    : fractale5.jpg
File size    : 407821 bytes
File date    : 2010:07:15 06:15:38
Resolution   : 664 x 498
Comment      : 1dcd64e16d97507052d67a6d0557ee8d

flag : 1dcd64e16d97507052d67a6d0557ee8d


Hash Flag 5.

이번에는 Musics 디렉토리로 가보자. 해당 디렉토리에도 mp3 파일 하나만 존재한다. 해당 파일의 속성 창을 열어 여러가지 정보를 봐 보면 앨범 필드에 base64 값으로 추정되는 값이 보인다.


[그림 8 - 속성 창]


하지만 해당 값을 디코딩 하게 되면 올바른 값이 아니라는 메시지와 함께 디코딩 되지 않는다. strings를 이용해 나머지 base64 값이 있는지 찾아보면 다음과 같이 발견 할 수 있다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Musics$ strings miel-vie.mp3

.................

VW4gZGUgcGx1cyAzMzA2ZWMwOTdmYz

gzMDgxNzE4MTUxNmVhMjhkZWQzOA==


디코딩 하면 다음과 같은 문자열을 볼 수 있다.  Un de plus 3306ec097fc830817181516ea28ded38

flag : 3306ec097fc830817181516ea28ded38


Hash Flag 6 ~ 7.

이번에는 Private 디렉토리로 가보자. 해당 디렉토리에는 숨겨진 파일 하나와 텍스트 파일 하나가 존재한다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Private$ ls -al

total 16

drwxr-xr-x 2 sansforensics sansforensics 4096 2012-06-16 14:55 .

drwxr-xr-x 8 sansforensics sansforensics 4096 2010-07-16 07:04 ..

-rw-r--r-- 1 sansforensics sansforensics   65 2010-07-15 09:00 .facile

-rw-r--r-- 1 sansforensics sansforensics   45 2010-07-15 07:06 priv.txt


먼저 txt 파일부터 보자. 텍스트 파일을 열어보면 다음과 같은 문자열 뿐이 보이지 않는다.

sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Private$ cat priv.txt 
Sh mshn lza 55ml6j0m75j563099l3k332m5j64l690

얼핏 보면 해쉬 값으로 보이지만 그렇지가 않다. 앞에 있는 문구를 보게 되면 일반적인 단어가 아니라는 것을 알 수 있다. 어떤 규칙으로 인코딩 되어 있는 듯 하다. 인코딩 방법에는 여러가지가 있지만 가장 기본적인 치환 방법을 적용해 보도록 하자.

치환 암호에는 대표적으로 ROT와 시저암호가 존재한다. ROT를 먼저 시도 해보면 해당 문자열이 ROT로 인코딩 되어 있었다는 것을 알 수 있다.(ROT-19)


[그림 9 - ROT-19]


flag : 55fe6c0f75c563099e3d332f5c64e690


또 숨겨져 있던 .facile 파일을 열어보면 해쉬 값이 존재하는 것을 볼 수 있다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/Private$ cat .facile 

Pour commencer le plus facile : 8cd4525b78f0488581316bba7734e758


flag : 8cd4525b78f0488581316bba7734e758

아무래도 먼저 이 해쉬를 찾고 기분좋게 시작하라는 의미에서 이렇게 해쉬 하나는 공짜로 주는 것 같다.


Hash Flag 8.

이번에는 숨겨져 있는 디렉토리인 .mozila 디렉토리로 가보자. 해당 디렉토리는 firefox의 Profile을 담고 있는 디렉토리인데 직접 분석을 해도 좋고 간단하게 Profile을 복구 하여 어떤 Profile인지 분석해봐도 좋다. 먼저 Profile을 불러와 어떤 Profile인지 확인 해 보도록 하겠다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge/.mozilla$ firefox --Profilemanager

(firefox-bin:2319): GLib-WARNING **: g_set_prgname() called multiple times


[그림 10 - Firefox ProfileManager]


ProfileManager로 해당 문제의 Profile을 불러와 히스토리를 한번 보면 방문 했던 웹 페이지들을 확인 할 수 있다.


[그림 11 - 히스토리]


방문 했던 페이지 중 flags.txt 페이지가 있다. 해당 페이지로 접속해 보면 404 페이지만 나와 아쉽게도 해쉬 값을 얻을 수는 없다. 참고로 히스토리 기록은 place.sqlite 파일에 기록되어 있다.


Hash Flag 9 ~ 10.

이번에는 마지막으로 남은 FS.dd 파일을 분석해 보자. file 명령어로 살펴보면 일반적인 data 파일로 부트 섹터가 포함된 볼륨의 파일시스템 이미지는 아닌 것 같다. 문자열을 뽑아 보면 다음과 같다.


sansforensics@maj3sty-desktop:~/Desktop/forensics_challenge$ strings FS.dd 

...............

lost+found

flags.jpg

.flags.txt.swp

flags.txtt.swx

JFIF

Created with GIMP

...............

root

kevin-laptop

/mnt/flags.txt

U3210#"! 

Joli : 2843062153121fed0558613602645f81

...............

일단 Joli 부분에 해쉬 값이 보인다.

flag : 2843062153121fed0558613602645f81

또 flag.txt, flags.jpg 가 보이는데 해당 문제 파일에서 foremost를 이용 해 flags.txt와 flags.jpg 파일을 카빙해 보도록 하자.
카빙을 시도하면 txt 파일은 카빙되지 않고 jpg 파일만 카빙되는데 해당 파일을 열어보면 해쉬 값을 확인 할 수 있다.

[그림 12 - 카빙 jpg]


flag : a84774bcf9e00b394d75e4367472e58e


이렇게 해서 해쉬 값 10개(하나는 환경 상 문제로... ㅠㅠ)를 찾아보았다. 별다른 기술을 요구하는 문제들이 아니기 때문에 실제 대회 당시에는 시간 싸움이었을 듯 하다. 개인적으로 포렌식 문제라고 하기에는 대부분 문제들이 맞지 않지 않나 싶다. 파이어폭스 Profile 문제를 제외하고는 말이다..(사실 대회라고 하기에 많이 부족한 것 같다.)


'[+] Hacking > [-] Challenge Report' 카테고리의 다른 글

exploit-exercises Nebula - Level00  (0) 2012.07.25
GitS CTF Packet 200 풀이  (1) 2012.06.29
RootBSD Forensic Challenge 풀이  (2) 2012.06.16
Defcon 2012 CTF Forensic 400 Write-up  (7) 2012.06.06
GitS 2012 - TeL aViv+  (5) 2012.05.05
  1. Favicon of https://tistory.hackerc.com BlogIcon 해커 C 2012.06.21 19:03 신고

    안녕하세요~ 해커 C 다녀갑니다. ㅎㅎ

    꼼꼼한 풀이 잘보고 갑니다. 꼼꼼이 훌터보느라 눈이 뱅글뱅글 ~ 열이 나네요 !!ㅎㅎ

    맛있는 저녁 시간 되세요 ~ ^^

해당 문제의 주제는 메모리에서 key 파일을 찾아 암호를 해독하는 것이 주제이며 목적이다. 일단 문제는 gzip과 tar로 압축되어 있어 압축을 해제하면 메모리 덤프가 하나 나온다. volatility로 스캔하여 보면 해당 메모리 파일을 자동으로 volatility가 파일 타입을 알지 못하여 파일의 프로필을 수동으로 지정해주어야 한다. 메모리 덤프 파일의 정보를 알기 위해서는 volatility의 imageinfo 옵션을 사용하면 된다.


[그림 1 - imageinfo]

출력 결과를 보면 지원가능한 Profile은 두개인데, Image Type을 보니 Service Pack 1이므로 Profile은 Win7SP1x86으로 해야 한다. 프로필을 옵션으로 지정하고 프로세스를 출력하여 보면 [그림 2]와 같이 출력 된다.

[그림 2 - pslist]

프로세스 목록을 보면 windows에서 사용하는 여러 프로세스를 볼 수 있는데 그 중 낯선 프로세스가 보인다. thenderbird.ex와 gpg.exe 인데 일단 이 두개의 프로세스가 무엇을 하는지 모르므로 검색을 시도해 보겠다.

[그림 3 - Google 검색 결과]

검색 결과의 링크를 클릭하여 보면 thunderbird.ex의 GUI 이미지가 보이고 PGP를 언급하고 있다. PGP 암호화와 관련된 프로그램인 것을 해당 링크를 통해 파악 할 수 있다. 이제 메모리 덤프 파일에서 PGP와 관련된 정보를 찾아야 한다. PGP 메시지는 "----- BEGIN PGP MESSAGE -----" 라는 header 시그니처와 "-----END PGP MESSAGE -----" 의 foot 시그니처를 가지고 있다. 해당 문자열들을 한번 검색 해 보자.
(관련 프로세스의 메모리 영역을 덤프해도 좋지만, 해당 프로세스들이 많기 때문에 메모리 덤프를 대상으로 분석하는것이 더 효율적이다.)

[그림 4 - strings memory.dmp | grep "BEGIN PGP MESSAGE" 검색 결과]

검색 결과를 보면 PGP 메시지 내용이 모두 출력 되지 않은 것을 알 수 있다. -C 옵션을 사용 해 검색 문자열 전후로 20줄 정도를 출력 해 보면 PGP 메시지의 전문을 볼 수 있다.

[그림 5 - PGP 메시지 전문]

해당 메시지는 따로 txt 파일등에 저장해 두도록 하고 이제 key 파일을 찾아야 한다. PGP에 사용되는 key 파일의 확장자는 .gpg로 일반 foremost나 scalpel 등 카빙도구에서는 .gpg 파일 카빙을 지원하지 않아 PhotoRec 이라는 도구를 사용하도록 하겠다. 사용법은 매우 간단하니 생략하도록 하겠다.

[그림 6 - 파일 카빙]

파일 카빙이 완료되면 여러개의 디렉토리가 생성되는데 find 명령으로 gpg 파일을 찾아주면 단 한개의 파일만이 나오고 해당 파일을 확인해보면 key 파일이란 것을 알 수 있다.

[그림 7 - key 파일 획득]

이제 리눅스에서 pgp 암호화를 지원하는 gpg 명령어로 해당 key 파일을 이용해 PGP 메시지를 복호화 하면 된다.

[그림 8 - PGP 메시지 복호화]

gpg 옵션에서 --no-default-keyring 옵션은 key 파일을 지정해 줄 때 무조건 지정해주어야 하는 옵션이며 --secret-keyring 또한 마찬가지이다. 

 - Key : as it turns out, Phil Zimmermann also likes sheep.

참고로 해당 문제의 PGP 메시지는 하나 더 있다. 하지만 그 메시지는 키 값과는 관련이 없어 풀이에서 언급하지 않았다. 해당 PGP 메시지를 복호화 하면 아스키 아트가 나오는데 그 내용은 조금.. 드럽다 ㅡㅡ;;


풀이에 도움이 되는 것들은 아래 주소를 참고 하였다.

'[+] Hacking > [-] Challenge Report' 카테고리의 다른 글

GitS CTF Packet 200 풀이  (1) 2012.06.29
RootBSD Forensic Challenge 풀이  (2) 2012.06.16
Defcon 2012 CTF Forensic 400 Write-up  (7) 2012.06.06
GitS 2012 - TeL aViv+  (5) 2012.05.05
Nuit du Hack Stega5 문제 풀이  (2) 2012.03.28
  1. BlogIcon 13lackc4t 2012.06.08 19:49

    프로세스를 하나하나 덤프뜬다고 시간을 다 보내버린 기억이 아직도 생생하네요....;ㅁ;

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.06.08 21:36 신고

      헉...;;;;

      프로세스 덤프 뜨는거 의외로 시간 오래 걸리는데... 그걸 하나하나 다 하셨군요;;;

  2. Favicon of http://feedbeef.blogspot.com BlogIcon n0fate 2012.06.12 18:11

    오 뎊콘에도 메모리 분석 문제가 나왔군요. 재미있네요 :-)

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.06.12 22:16 신고

      이거 말고도 재밌는 문제가 많아요 ㅎㅎ 특히 ZFS RAID 문제가 대박이죠 !

  3. Favicon of http://feedbeef.blogspot.com BlogIcon n0fate 2012.06.12 18:15

    모바일버전으로는 드러운 아스키 아트가 썸네일러 보이네요 ㅋㅋ

  4. 익명 2016.05.10 13:10

    비밀댓글입니다

듣도보도 못한 GitS CTF(이번년도에 열렸다고 함)에서 출제 된 문제라고 한다. 사실 이 문제는 외국에 있는 어떤 해커에게 멘붕을 겪어보라며 받은 문제인데 정말 이틀간은 멘붕을 경험하였다.


해당 문제는 패스워드를 찾는 문제이며 힌트로는 TeL aViv+이 나왔다고 한다.(힌트를 이용해 풀이하지는 못하였다.) 


그럼 문제풀이를 시작해보자.


일단 파일을 받아보면 bin 확장자 파일인데 이를 시그니처 식별이나 file 명령어로 확인하여 보면 금방 패킷 덤프 파일이란 것을 알 수 있다. 


그 후 Whireshark로 열어보면 정말 몇 안되는 패킷이 보이고 결국 이 패킷은 단 하나의 프레임만을 보여주고 있다.


[그림 1 - 전송되는 프레임 하나의 패킷들]


첫번째 단은 접속시 환영한다는 메시지처럼 보이며 두번째 단은 무언가 알 수 없는 문자들이 있으며 마지막 단에는 로그인 성공 메시지로 보이는 문자열들이 존재한다.


이렇게 봤을 때 당연히 패스워드는 가운데 단인 것을 추측할 수 있다. 하지만 패스워드라고 하기에는 조금 무리가 있는 듯 싶다. 패스워드는 일반적으로 평문 문자열들인데 위 값들은 hex 값들이기 때문이다.


여기서부터 멘붕이 시작되었다. 처음에는 bruteforce 공격을 시도해 봤지만 무한 경우의수만 생산 할 뿐 딱히 이렇다 할 패스워드는 나오지 않았다.


hex 값들을 계속해서 정독하던 중 마지막 hex 값인 04 2f 04 0b 01이 눈에 들어왔다. 04가 마치 다음 이어지는 hex 값들의 개수를 나타내고 있는 것 같았다. 조금 더 앞으로 이동해 확인하여 보니 그 추측은 정확하였다.


[그림 2 - 정확한 규칙의 패킷 hex 값들]


일일이 수작업으로 하기 힘들어 간단히 python의 힘을 빌렸다. 처음에는 python의 파일 핸들 함수들로 하였으나 f.read()가 0x20을 만나는 순간 읽기를 그만두어 모든 패킷 hex 값들을 읽어들일 수가 없었다. 그래서 scapy 모듈의 힘을 빌리기로 하였다.

(scapy 모듈은 backtrack5에 기본적으로 존재함)


[그림 3]과 같은 소스로 규칙에 맞게 출력해 보았다.(소스는 최종 풀이소스이다.)


[그림 3 - 풀이 소스]


일단 출력 된 결과를 보면 다음과 같다.


packet Block Count : 37


0x8 0x2b 0x2e 0x1 0x17 0x10 0x1 0x5 0x1

0x7 0x57 0x21 0x57 0x1 0x1 0x12 0x1

0x6 0x4d 0x5d 0x1d 0x8 0xd 0x2

0x5 0x1b 0xa 0x18 0x2 0x1

0x4 0x5a 0x4 0x46 0x10

0x5 0x84 0x27 0x16 0x12 0x3

0x5 0x9d 0x22 0x5 0x1 0x1

0x4 0xb8 0x9 0x4 0x1

0x5 0x33 0x5d 0x38 0x5 0x1

0x4 0x5e 0xd 0x68 0x1f

0x7 0x50 0x2d 0x1a 0x20 0x2 0x9 0x2

0x6 0x90 0xc 0x20 0x10 0xf 0x1

0x4 0x3a 0x4 0x1 0x1

0x8 0x17 0x3b 0x34 0x18 0x37 0xf 0x1 0x1

0x4 0x21 0x78 0x25 0x8

0x5 0x1d 0x4b 0x8 0x3 0x1

0x4 0x1a 0x21 0x2 0x3

0x5 0x19 0x25 0x4 0x1 0x1

0x5 0x5c 0x17 0x12 0x2 0x1

0x8 0x5d 0x49 0x33 0x4 0x3 0x2 0x1 0x1

0x4 0x96 0x1a 0x29 0x5

0x3 0x3a 0x5 0x1

0x6 0x39 0x4 0x53 0xa 0x1 0x1

0x7 0x79 0x2 0x7 0x1b 0x1 0x37 0x1

0x4 0x3 0xe 0x18 0x17

0x5 0x6e 0x11 0x9 0x3 0x1

0x9 0xb4 0x6 0x1 0x3 0x4 0x3 0x1e 0x2 0x1

0x7 0x2 0xa7 0x10 0x10 0x12 0x13 0x2

0x7 0x4c 0x9 0x43 0x7 0xd 0x4 0x2a

0x4 0xd 0x78 0x5f 0x2

0x4 0x2b 0x7 0xd 0x1

0x5 0x74 0xd 0xe 0x9 0x2

0x6 0x2d 0xa6 0xd 0xb 0x1 0x6

0x4 0x9d 0x39 0x5 0x1

0x2 0xd5 0x9

0x6 0x38 0x6 0x2 0x2 0x1 0x1

0x4 0x2f 0x5 0xb 0x1


맨 앞에는 hex의 개수를 나타내고 그 뒤부터가 그에 맞는 hex 값들이다. 여기에서 또 한번의 멘붕이 찾아왔다. 이 값들로 무엇을 어떻게 해야 할지 감이 오질 않는 것이다. 그러던 와중 힌트로 제공 된 TeL aViv+에서 +가 보였다. 각 자리를 합치라는 힌트 같았다. 모두 다 합쳐보니 다음과 같은 값들이 얻어졌다.


88 e4 de 40 b4 d6 c6 c6 ce f2 c4 dc 40 e6 c6 74 40 44 88 e4 de 40 9c d6 40 8c e6 f0 da e6 40 9a f2 dc de 44 40


각 hex 값을 10진수로 변환하여 보니 다음과 같았다.


136 228 222 64 180 214 198 198 206 242 196 220 64 230 198 116 64 68 136 228 222 64 156 214 64 140 230 240 218 230 64 154 242 220 222 68 64


아스키코드를 안다면 이 값들은 아스키 코드에 해당하지 않는 값들 이란 것을 알아 볼 수 있을 것이다. 하지만 큰 값들이 200대로 2로 나누면 아스키코드 값에 포함되는 값들인 것을 금방 알 수 있었다.


[그림 4 - 2로 나눈 모습]


이를 기반으로 모든 값을 더하고 2로 나누어 아스키코드 값으로 변환하는 소스를 작성해 풀어보면 다음과 같다.


packet Block sum and char: 68 ==> D

packet Block sum and char: 114 ==> r

packet Block sum and char: 111 ==> o

packet Block sum and char: 32 ==>  

packet Block sum and char: 90 ==> Z

packet Block sum and char: 107 ==> k

packet Block sum and char: 99 ==> c

packet Block sum and char: 99 ==> c

packet Block sum and char: 103 ==> g

packet Block sum and char: 121 ==> y

packet Block sum and char: 98 ==> b

packet Block sum and char: 110 ==> n

packet Block sum and char: 32 ==>  

packet Block sum and char: 115 ==> s

packet Block sum and char: 99 ==> c

packet Block sum and char: 58 ==> :

packet Block sum and char: 32 ==>  

packet Block sum and char: 34 ==> "

packet Block sum and char: 68 ==> D

packet Block sum and char: 114 ==> r

packet Block sum and char: 111 ==> o

packet Block sum and char: 32 ==>  

packet Block sum and char: 78 ==> N

packet Block sum and char: 107 ==> k

packet Block sum and char: 32 ==>  

packet Block sum and char: 70 ==> F

packet Block sum and char: 115 ==> s

packet Block sum and char: 120 ==> x

packet Block sum and char: 109 ==> m

packet Block sum and char: 115 ==> s

packet Block sum and char: 32 ==>  

packet Block sum and char: 77 ==> M

packet Block sum and char: 121 ==> y

packet Block sum and char: 110 ==> n

packet Block sum and char: 111 ==> o

packet Block sum and char: 34 ==> "

packet Block sum and char: 32 ==>  


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

Dro Zkccgybn sc: "Dro Nk Fsxms Myno" 

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


무언가 나왔지만 아직 평범한 문자열로 보이지 않는다. 하지만 깨진 문자열이 없어 일반적인 치환암호로 생각 할 수 있어 ROT 암호 알고리즘을 적용해 보았다.


[그림 5 - ROT16]


많은 ROT 알고리즘 결과 중에서 정상적인 문자열을 출력한 알고리즘은 ROT16 알고리즘이었고 결국 패스워드는 The Da Vinci Code이다.






잡담 : 이 문제에서 사용 된 알고리즘이 다빈치 코드 알고리즘?! 그리고 저 힌트는 뭐지... ㅜㅜ;;

  1. TriumphD 2012.05.17 11:33

    오오.. 뭔가 흥미로운 내용이군요...

    뜬금 없으실지도 모르겠습니다만;;

    이런걸 공부하거나 배우려면 뭘 어떻게 해야 할까요 ^^;;

    책이라도 읽어야 할까요 ㅜㅜ;;

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.05.17 15:41 신고

      IT 분야에 기초적인 프로그래밍을 일단 배우셔야겠죠? ㅎ

    • TriumphD 2012.05.31 00:19

      아참.. 한가지 궁금한 점이 있는데 ^^;;

      ROT 알고리즘 결과를 출력해주는 프로그램이나 소스 같은게 혹시 따로 있을까요..?

      해킹대회나 그런 대회를 많이 나가려고 하는데 하나쯤 있으면 많이 유용할 것 같아서요 ^^;;

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.05.31 12:38 신고

      직접 만들어 보시는것도 좋은 방법중 하나 입니다 ^^

      제가 만들어 놓은 스크립트도 있고(http://maj3sty.tistory.com/794)

      웹으로 제공 되는 디코더도 있구요(http://theblob.org/rot.cgi)

    • TriumphD 2012.06.01 04:00

      오오..정보 정말 감사합니다 ^^

      열심히 공부해서 나중에라도 마제스티?(맞나요? 하하^^;;)님 반만이라도 따라갈 수만 있다면 좋겠네요 ㅎㅎ;;

      항상 포스팅해주시는 내용 정말 도움이 많이 되고 감사합니다 ^^

+ Recent posts