안 쓰던 블로그

[Defcon DFIR CTF 2019] Memory Forensics 풀이 (volatility) 본문

CTF/Forensic

[Defcon DFIR CTF 2019] Memory Forensics 풀이 (volatility)

proqk 2021. 2. 28. 05:06
반응형

defcon2019.ctfd.io/challenges

 

Defcon DFIR CTF 2019

 

defcon2019.ctfd.io

데프콘 2019의 메모리 포렌식 문제들을 풀어본다

volatility를 사용할 건데, 주요 플러그인에 대한 설명이 여기여기에 잘 정리되어 있다

 

1. get your volatility on

triage.mem의 해시값 정보를 구하는 문제

volatility를 사용하여 이미지부터 확인한다

volatility_2.6_win64_standalone.exe -f "Triage-Memory.mem" imageinfo

1. 이미지는 윈7이나 윈2008 환경으로 구성되어 있다

2. KDBG(프로세스 정보 추적을 위함)의 주소 0xf800029f80a0L

3. 2019-03-22에 제작됨

 

win10에서는 마이크로소프트에서 제공하는 FCIV를 사용할 수 있다

en.wikibooks.org/wiki/File_Checksum_Integrity_Verifier_(FCIV)_Examples

사용법: fciv.exe -h

fciv.exe -sha1 Triage-Memory.mem

 

답: flag<c95e8cc8c946f95a109ea8e47a6800de10a27abd>

 

2. pr0file

프로필 정보들을 확인하는 문제

가상환경의 운영체제가 어떤 것으로 되어 있는지를 찾아야 한다

 

이또한 volatility의 imageinfo에서 확인할 수 있다

volatility_2.6_win64_standalone.exe -f "Triage-Memory.mem" imageinfo

Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418

이 부분이 프로필 정보인데, 운영체제가 여러 개가 떴다

어느 정도 추측이 필요하다. 맨 앞의 Win7SP1x64를 선택했다

 

답: flag<Win7SP1x64>

 

3. hey, write this down

notepad.exe의 PID를 구하는 문제

일단 메모장을 킨다

pslist, pstree를 사용할 수 있는데 자식이랑 부모 프로세스까지 보고 싶으므로 pstree로 확인한다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 pstree

. 0xfffffa80054f9060:notepad.exe                     3032   1432      1     60 2019-03-22 05:32:22 UTC+0000

 

3032이 프로세스 ID, 1432가 부모 프로세스 ID

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 pstree | findstr notepad

이렇게 한 번에 찾을 수도 있다

 

답: flag<3032>

 

4. wscript can haz children

wscript.exe의 자식 프로세스 이름을 확인하는 문제

아까 notepad찾은 그 창에서 wscript를 찾는다

wscript.exe - UWkpjFjDzM.exe - cmd.exe 순으로 부모-자식 관계를 가진다

5116(PID) 3952(부모PID)

3496(PID) 5116(부모PID)

4660(PID) 3496(부모PID)

이런 식으로도 연관성을 볼 수 있다

 

자식 프로세스의 이름은 UWkpjFjDzM.exe

이 값은 뭔가 랜덤인 값으로 보이는데, 조금 의심해 볼 필요가 있다. 일단 이 문제에선 이게 정답이다

 

답: flag<UWkpjFjDzM.exe>

 

5. tcpip settings

RAM 덤프가 된 시간대의 접속되어 있는 IP주소를 확인한다

즉, 네트워크에 연결되어 있는 정보가 필요하다

 

덤프한 시간을 확인하기 위해 다시 imageinfo를 본다

volatility_2.6_win64_standalone.exe -f "Triage-Memory.mem" imageinfo

Image date and time : 2019-03-22 05:46:00 UTC+0000
Image local date and time : 2019-03-22 01:46:00 -0400

 

참고로 아래 명령어로 도움말을 볼 수 있다

volatility_2.6_win64_standalone.exe -h

네트워크 관련이니까 connscan을 사용한다

그런데 win7, winserver2008에서는 connscan은 지원하지 않기 때문에(도움말에 나오지는 않지만) netscan을 사용한다

 

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 netscan

정보가 이것저것 많이 나오는데, 접속했던 머신의 IP주소를 찾아야 한다. 즉, 로컬 주소 쪽이다

그런데 Local Address에 IP주소라고 할 만한 게 맨 위 줄에서부터 나오는 10.0.0.101:55736 하나밖에 없다

옆에 시간대도 보면 2019-03-22 그쯔음이 맞다

 

답: flag<10.0.0.101>

 

6. intel

악성코드로 의심되는 PID를 확인하고 공격자의 IP 주소를 찾는다

아까 PID 정보들을 다시 보면서 ESTABLISHED 즉 연결되어 있는 프로세스만 뽑는다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 netscan | findstr ESTABLISHED

이 셋 중에 의심스러운 프로세스를 찾는다

딱 봐도 OUTLOOK.EXE보다 UWkpjFjDzM.exe가 더 의심스럽다

그리고 포트도 4444포트를 사용하고 있는데, 백도어를 의심해 볼 수 있다

이 프로세스의 IP는 10.0.0.106 이다

 

답: flag<10.0.0.106>

 

7. i <3 windows dependencies

VCRUNTIME140.dll 이걸 사용하고 있는 프로세스 이름을 찾는 문제

dll은 동적 링크 라이브러리이다. 프로그램을 하나 만들 때 모든 라이브러리를 파일 하나에 넣기에는 비효율적이기 때문에 외부에다 놓고 여러 파일들이 가져다가 쓰는 개념이다(foxtrotin.tistory.com/331)

여기서 중요한 건, 여러 파일들이 공유하기 때문에 어디서 공유되어 실행되든 dll파일 정보가 메모리에 남게 된다

그걸 찾는 게 이 문제의 핵심이다

 

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 dlllist > dlllist.txt

명령어는 dlllist를 사용하면 되는데, 너무 많은 정보가 뜨기 때문에 txt파일로 출력한다

그렇게 뽑은 txt파일에서 VCRUNTIME140.dll를 찾는다

딱 하나의 검색결과가 나오며, 경로를 보면 ClickToRun이 사용하고 있다

ClickToRun을 돌리는 프로세스 이름은 OfficeClickToR이다

 

아니면 어차피 시간 오래걸릴 거 위에서처럼 findstr로 검색한다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 dlllist | findstr "VCRUNTIME140.dll"

 

답: flag<OfficeClickToR>

 

8. mal-ware-are-you

의심되는 악성코드의 md5 해시값을 찾는 문제

사실 의심되는 악성코드는 앞선 문제에서 UWkpjFjDzM.exe 라고 찾았다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 pstree

그런데 이건 메모리 정보에 이런 파일이 심어져 있다 정도까지만 알 수 있는 것이고, 해시값까지 체크하려면 이걸 떼내야 한다. 메모리 상태에서 해시값을 알 수 없기 때문이다

일단 구조를 생각해 본다. 메모리의 어느 공간에서 실행되었기 때문에 이미지 파일이 덤프될 때 따라 들어왔다고 할 수 있다

참고로 여기서 알 수 있는 덤프로 하는 메모리 분석의 좋은 점이, 아무리 실행되어 기록에 남았다고 해도 컴퓨터가 꺼졌다가 켜지면 기록이 사라지거나 프로그램이 더 이상 실행되지 않아 백도어를 찾을 수 없기도 한데, 전부 박제를 시켜버리니 계속 분석을 할 수 있다. 즉, 주기억장치(메모리)에 존재하는 휘발성 데이터를 덤프(물리 메모리에 존재하는 모든 흔적을 박제-비휘발성 정보로 변환)하여 분석한다

 

UWkpjFjDzM.exe가 메모리에 남아 있는 이유는 실행되었기 때문이다. 덤프를 떴기 때문에 메모리 주소에 가서 가져오기만 하면 된다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 procdump -p 3496 -D .

프로세스 아이디가 3496인 파일을 현재 디렉토리에 덤프한다

이 파일은 악성코드라서 백신의 실시간 검사를 끄고 하지 않으면 파일이 바로 삭제되어 버린다

해시값은 fciv.exe로 구할 수 있다

fciv.exe -md5sum executable.3496.exe

 

답: flag<690ea20bc3bdfb328e23005d9a80c290>

 

9. lm-get bobs hash

bob 계정의 LM 해시값을 찾는 문제

LM 해시는 윈도우즈에서 사용하는 암호 방식이다

윈도우즈에서 어떤 계정을 만들거나 사용한다면 관련값이 저장된다. 그래서 누군가 공격으로 LM 해시값을 얻었다면 패스워드 크랙으로 비밀번호도 알 수 있게 된다

 

메모리에는 어떤 계정이 로그인한 상태이기 때문에 그런 정보들도 그 안에 포함되어 있다

(악성코드에 걸리면 계정이 다 탈취당하는 이유이다)

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 hashdump

hasdump로 계정 정보를 확인하여 bob의 계정이 있는지 확인한다

 

답: flag<aad3b435b51404eeaad3b435b51404ee>

 

10. vad the impaler

0xfffffa800577ba10 의 VAD node가 어떤 보호기법을 사용하고 있는지 찾는 문제

VAD(Virtual Address Descriptor)는 페이지 폴트 발생 시 메모리 관리자가 프로세스 주소 공간에서 어떤 가상 주소가 예약되어 있는지 여부를 추적할 수 있게 관리하는 데이터 구조체 집합이다. 각 프로세스가 주소 공간 상태(길이, 보호 기법 등)를 서술하며, 자체 균형 AVL Tree(foxtrotin.tistory.com/191) 형식으로 구성되어 탐색이 용이하다

 

vadinfo로 정보를 볼 수 있다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 vadinfo | findstr "0xfffffa800577ba10"

아니면 이왕 한 번 실행하는 거 txt파일로 저장해 둘 수 있다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 vadinfo > vadinfo.txt

 

0xfffffa800577ba10 주소를 검색해서 보호기법이 PAGE_READONLY 가 되어 있음을 확인한다

 

답: flag<PAGE_READONLY>

 

11. more vads?!

0x00000000033c0000 로 시작하고 0x00000000033dfffff로 끝나는 VAD의 보호기법을 찾는 문제

아까 파일에서 찾아주면 된다

 

답: flag<PAGE_NOACCESS>

 

12. vacation bible school

작동하는 머신에 VBS 스크립트가 있는데, 그 스크립트의 이름을 찾는 문제

VBS 스크립트는 비주얼 베이직 스크립트이고, 윈도우 로컬에서 스크립트를 쓰게 해 주는 게 바로 wscipt

wscipt.exe는 아까 찾은 적 있다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 pstree

PID는 5116

 

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 memdump -p 5116 --dump-dir=.

이 PID로 wscipt.exe 메모리 덤프를 한다

 

strings와 findstr로 vbs 확장자를 찾아주면 끝

윈도우 strings: docs.microsoft.com/en-gb/sysinternals/downloads/strings

 

답: flag<vhjReUDEuumrX>

 

13. thx microsoft

2019-03-07 23:06:58 UTC에 실행된 앱의 이름을 찾는 문제

실행 시간은 shimcache로 알 수 있다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 shimcache

 

답: flag<Skype.exe>

 

14. lightbulb moment

메모리 덤프를 할 때 notepad.exe에 적혀 있던 내용을 찾는 문제

 

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 pstree

notepad.exe의 PID는 3032

 

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 memdump -p 3032 --dump-dir=.

역시 memdump(메모리에 있는 페이지를 파일로 추출)로 메모리 덤프를 한다

 

이제 strings로 내용을 찾으면 되는데, 위의 문제와 달리 무엇을 찾아야 하는지 명확하지 않다

메모장에 쓰여져 있는 게 당연히 flag겠지 하며 flag를 찾는다

strings.exe 3032.dmp | findstr flag

 

답: flag<REDBULL_IS_LIFE>

 

15. 8675309

파일 레코드 59045에 있는 shortname을 찾는 문제

File Record는 MFT Recrod 또는 MFT 엔트리(Entry)라고 한다 참고

그리고 MFT(Master File Table)는 NTFS 파일 시스템에서 파일의 메타 데이터를 저장하는 파일이다

mftparser 플러그인으로 메모리 덤프 당시의 MFT 파일을 스캔 및 출력할 수 있다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 mftparser > mft.txt

 

txt로 추출한 파일에서 레코드 번호 59045를 검색한다

이름은 EMPLOY~1.XLS이다

 

답: flag<EMPLOY~1.XLS>

 

16. whats-a-metasploit?

이 박스는 공격당했고 meterpreter을 실행 중이다. 감염된 PID가 무엇인지 찾는 문제

아까 pstree로 악성 파일의 PID를 찾은 적 있다

volatility_2.6_win64_standalone.exe -f Triage-Memory.mem --profile=Win7SP1x64 pstree

PID는 3496

 

답: flag<3496>

반응형
Comments