CTF | wargame

nullcon17 / Misc 2 (ext artifact분석, unxz, extundelete)

nopdata 2017. 3. 10. 15:34
date : `17.02

Got an artefact file to be analysed. Can you please help me find the hidden data ?

artefact 파일 하나가 주어진다.


1
2
3
4
5
6
7
root@nopdata:/home/iy/ctf/nullcon# file artefact
artefact: XZ compressed data
root@nopdata:/home/iy/ctf/nullcon# mv artefact artefact.xz
root@nopdata:/home/iy/ctf/nullcon# unxz artefact.xz
root@nopdata:/home/iy/ctf/nullcon# file artefact
artefact: Linux rev 1.0 ext3 filesystem data, UUID=c6666f0c-f641-4958-be07-bcc6540fdafd (large files)
root@nopdata:/home/iy/ctf/nullcon# ls
cs

파일을 확인해보면 xz파일인 것을 알 수 있으며 unxz명령을 통해 압축을 풀면 ext리눅스 시스템인 것을 알 수 있다.

파일 시스템이므로 ftk를 이용하여 분석을 해 보았는데 root 하위 폴더에는 아무것도 존재하지 않았다.
해서, 파일이 삭제 되었을 것이라는 가정 하에 unallocated 영역을 조사하였다. ext 시스템의 경우 파일이 삭제되면 unallocated에 데이터가 남는 경우가 많았기 때문이다.

해서 조사를 해 보니 시작부분에 JFIF가 보였고 jpg로 변경을 하니 답을 얻을 수 있었다.


이는 ftk를 이용한 윈도우 상의 풀이이고, 콘솔 형태에서도 지워진 파일을 복구하는 것이 가능하다.


root@nopdata:/home/iy/ctf/nullcon# extundelete artefact --restore-all


이 명령을 이용하면 지워졌던 파일이 모두 복구가 되는데, 더미 쓰래기 파일까지 복구가 되므로 여기서 구하고자 하는 데이터를 잘 추려내는 것이 중요하다.
먼저 flag가  어디있는지 힌트 정도는 존재할 것이라고 생각하고 string에서 flag를 조회보면 다음과 같이 나온다.

1
2
3
root@nopdata:/home/iy/ctf/nullcon/RECOVERED_FILES# fgrep "flag" * -r
file_system/12 OcjNU .txt: flag text is somewhere inside
root@nopdata:/home/iy/ctf/nullcon/RECOVERED_FILES#
cs

 
filesystem폴더 하위에 존재한다는 힌트가 있으므로 이 곳을 보면 된다. 하지만 이 문제의 경우 데이터의 양이 적지만, 다른 문제의 경우에는 많을수도 있다.
그 때 조회하는 방법은 foremost * 또는 head를 확인해 보는 방법이다. 이 문제의 경우 파일 복구가 불가능 하도록 윗 부분이 깨져 있기 때문에 header를 조회하는 방법을 사용해야 한다. 

일단 이번 문제를 풀어보기 위해 간단히 작성한 소스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
import subprocess
 
res = list()
for ch in os.listdir('.'):
    try:
        data = subprocess.check_output('xxd "'+ch+'" | head -1', shell=True)
        if len(data) < 1:
            raise "no file"
        res.append((data,ch))
    except:
        pass
 
 
f=open('result.txt','wb')
f.write("res = "+str(res))
f.close()
cs

같은 경로에 파일들의 head를 확인하는 소스이다. 파이썬 콘솔형태가 편해서 다시 list사용이 가능하도록 만들어놨다.

답이 되는 flag파일은 ts8U 하위에 존재한다.
1
2
3
root@nopdata:/home/iy/ctf/nullcon/RECOVERED_FILES/file_system/ts8U# xxd c0pmcYvxe | head -1
00000000000 0000 0010 4a46 4946 0001 0101 0078  ......JFIF.....x
root@nopdata:/home/iy/ctf/nullcon/RECOVERED_FILES/file_system/ts8U

head를 보면 JFIF를 볼 수 있고 이를 보고 판단을 하여 jpg를 추출해주면 된다.

flag : flag{i_h@te_stupid_color$}