CTF | wargame

insomnihack 2017 final / Secr3tMgr Lock? (안드로이드 메모리 포렌식, 비밀번호 crack, LiME, volatility)

nopdata 2017. 4. 10. 05:39


[ from cert-devoteam.fr ]
+++ 지문? +++
...Waiting for tasks release but I have a file Secr3tMgr_680932f10ed4bb347dec46bdd8a34de487df1d13.tar.bz2 and a clue that the password is in the format INS{XXXXX}...

ctf와 같은 날 진행되었던 insomnihack의 본선 문제중 하나이다. 
제공되는 파일은 System.map, module.dwarf, i9100-CM.bin 세가지 파일이 주어진다.
처음보는 파일 형태였으나 하나씩 보면 다음과 같다.

dwarf파일은 symbol table을 생성하기 위한 data format 이라고 한다. 여기서는 디바이스 profile의 명세로 사용되는 듯 하다.(ref : http://visu4l.tistory.com/400)

System.map은 대충 훑어보면 각 메모리에 어떤 데이터가 있는지에 대한 메모리 정보임을 파악할 수 있다.

문제는 약 1기가정도가 되는 i9100-CM.bin 파일인데 시그니쳐를 보면 EMiL로 되어 있다.
이 파일은 LiME파일로, Joe Sylve가 만든 안드로이드를 주 타겟으로 한 리눅스 기반 메모리 덤프 도구이다.(ref : http://forensic.korea.ac.kr/DFWIKI/index.php/메모리_획득_도구, http://forensic.korea.ac.kr/DFWIKI/index.php/LiME)

제작자의 컨퍼런스 영상 및 발표 pdf (DMD == LiME)

volatility 설치부터 LiME을 사용한 예제는 다음 링크를 보면 된다.

문제를 풀기 위해서는 제공된 메모리 덤프 파일을 분석해야 한다. volatility로 LiME으로 덤프를 뜬 파일을 분석할 수 있지만, 분석을 위해서는 타겟을 잡아주는 profile 설정을 해 주어야 한다.
profile은 System.map과 module.dwarf를 묶인 zip형태가 사용된다.


root@nopdata:~/tool/android-volatility/volatility/plugins/overlays/linux# ls
System.map  __init__.py  __init__.pyc  elf.py  elf.pyc  linux.py  linux.pyc  module.dwarf
root@nopdata:~/tool/android-volatility/volatility/plugins/overlays/linux# zip android_profile module.dwarf System.map
  adding: module.dwarf (deflated 89%)
  adding: System.map (deflated 73%)
root@nopdata:~/tool/android-volatility/volatility/plugins/overlays/linux# ls
System.map  __init__.py  __init__.pyc  android_profile.zip  elf.py  elf.pyc  linux.py  linux.pyc  module.dwarf
root@nopdata:~/tool/android-volatility/volatility/plugins/overlays/linux#

profile은 volatility/overlays 하위에 os별로 저장하면 된다. 제대로 적용이 되었는지 확인하기 위해서는 다음 명령으로 확인할 수 있다.

root@nopdata:~# vol --info | grep android
Volatility Foundation Volatility Framework 2.6
Linuxandroid_profileARM - A Profile for Linux android_profile ARM
root@nopdata:~#

이제 메모리 분석을 진행하면 된다. 일반적인 volatility와 비슷하지만, profile환경에 따라 사용가능한 명령이 다르므로 help옵션으로 명령을 확인해 보는것이 좋다.

Secr3tMgr Lock 문제는 lock을 풀 수 있는 비밀번호를 찾는 문제이다. android arm 기반이였으므로 비밀번호는 패턴, PIN 형태가 있을 것이다.
비밀번호는  linux_recover_filesystem 명령을 이용하면 시스템 관련 파일과 함께 비밀번호가 저장된 파일도 획득할 수 있다.

일반적인 안드로이드에서 system폴더의 비밀번호 관련 파일은 다음과 같다.

/data/system/gesture.key : 패턴 비밀번호 저장 데이터
/data/system/password.key : PIN 비밀번호 저장 데이터
/data/system/device_policies.xml : PIN 입력 요약
/data/system/locksettings.db : 비밀번호 salt 저장 데이터



먼저 패턴형태의 경우 gesture.key파일만 획득하면 쉽게 풀어낼 수 있다. [ XCZ.kr / Prob4 (안드로이드, AVD, 패턴 뚫기) 참고 ]
문제 파일에서 gesture.key파일을 추출해서 확인을 해 보았으나 패턴 데이터를 찾을 수 없었다. 해서, PIN형태의 비밀번호를 뚫어내야 한다.

/data/system/password.key의 파일형태는 sha1과 md5가 단순히 붙어있는 형태인데 비밀번호 획득을 위해서는 md5만 brute force를 통해 알아내면 된다. 아무런 기준점 없이 하기엔 부담이 있으나
device_policies.xml이 범위를 좁혀준다.

[ /data/system/device_policies.xml ]

파일을 보면 비밀번호를 특정해준다. 총 길이는 10이며, 대문자 5, 소문자 2로 이루어졌으며 숫자는 1개, 특수기호는 2개라고 특정을 지어준다.
insomnihack의 flag 형태를 보면 'INS{flag값}' 형태가 된다. 여기서 특수기호 2개를 뺄 수 있고, 대문자 3개를 뺄 수 있으므로, 괄호 안에 들어가는 flag값은 대문자 2, 소문자2, 숫자 1로 이루어졌음을 알 수 있다.

다음으로 비밀번호가 들어있는 password.key 파일은 다음과 같은 데이터가 들어있다.

A66A4A34A78AEC1A7058C8FA3BB3B0F1CC537DD042F0F3F909F87D0706DCF139AB37F86E
[ /data/system/password.key ]

sha1과 md5가 붙어 있다고 하였다. 따라서 뒤에서 32자리인 '42F0F3F909F87D0706DCF139AB37F86E'를 가지고 비밀번호를 알아내면 된다.
md5는 password+salt값이 이용되는데 salt값은 locksettings.db에 존재한다.


트랜젝션에 문제가 있었는지 wal에 데이터가 존재하였고, 확인된 salt값은 'aac6d16df244374b'가 된다. 이제 password+salt값이 password.key에서 찾은 md5값과 맞는 것을 찾아내면 된다.
예제와 writeup을 보면 john the ripper를 사용하였으나 설치되어있지 않아 그냥 파이썬 코드를 사용하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import string, itertools, hashlib, time
 
start = time.time()
 
md5hash = '42F0F3F909F87D0706DCF139AB37F86E'.lower()
 
repeat = itertools.product(string.letters+string.digits, repeat = 5)
 
for ch in repeat:
        if hashlib.md5("INS{%s}aac6d16df244374b"%(''.join(ch))).hexdigest() == md5hash:
                print "INS{%s}"%(''.join(ch))
                print time.time()-start
                break
 
cs


john the ripper는 얼마나 걸리는지는 모르겠으나 소스코드는 262초 가량 소요된 것 같고 위와 같이 flag를 얻을 수 있다.

flag : INS{t1MmY}

아 재밌었다.


추가적으로 프로세스 목록을 보면 문제의 이름과 동일한 secr3tmgr을 확인할 수 있으며 덤프를 통해 획득할 수 있다. 아마도 다음 문제에 사용된 파일인 것 같다.