CTF/해외CTF

jade CTF 2022

Ron Weasley 2022. 10. 24. 04:34

10월 23일 참가한 jade CTF에서 DFIR 카테고리의 문제들을 풀어봤는데, 새로운 유형을 본 것 같아 풀이를 작성하려고 한다.

[LM 10]

문제를 보겠습니다.

네트워크 패킷을 분석하여 플래그를 찾는 문제이다.

패킷을 열어, HTTP object list를 열어보니 flag.txt가 보이길래 해당 패킷에 가서 데이터를 봤습니다.

URL이 하나 존재하며, 링크를 타고 들어가보니까 노래가 하나 나옵니다.

flag.txt는 가짜인 것으로 판별이 나서 jpg 파일들을 하나씩 카빙을 진행하였고, 사진속에 플래그 값이 있는 것을 확인할 수 있었다.

 

[Auto CAD]

문제를 보겠습니다.

문제를 해석해보면,  이벤트에 대한 포스터를 디자인하는 작업이 주어졌습니다. 디자인 도중, 당신은 잠시 휴식을 취했고, 돌아왔을 때, 누군가가 당신의 작품을 더럽힌 것을 보았습니다. 주최자가 알기 전에 빨리 고쳐야 된다고 합니다.

 

문제 파일을 실행시키면, 파일이 손상된 것을 확인할 수 있습니다.

hxd 에디터로 열어보니 IHDR 청크 부분에서 높이 넓이의 값이 00으로 채워져있는 것을 볼 수 있습니다.

그래서 다음과 같은 코드로 복원을 시켜주도록 합시다.

from zlib import crc32

data = open("poster.png",'rb').read()
index = 12 # IHDR chunk가 시작되는 인덱스

ihdr = bytearray(data[index:index+17]) # IHDR 시작부터 CRC 전까지의 범위
width_index = 7 # width 부분의 세 번째 바이트 인덱스
height_index = 11 # height 부분의 세 번째 바이트 인덱스

for x in range(1,2000):
	height = bytearray(x.to_bytes(2,'big'))
	for y in range(1,2000):
		width = bytearray(y.to_bytes(2,'big'))
		for i in range(len(height)):
			ihdr[height_index - i] = height[-i -1]
		for i in range(len(width)):
			ihdr[width_index - i] = width[-i -1]
		if hex(crc32(ihdr)) == '0x1763adc8': # CRC값
			print("width: {} height: {}".format(width.hex(),height.hex()))
	for i in range(len(width)):
			ihdr[width_index - i] = bytearray(b'\x00')[0]

코드를 돌린 값으로 고쳐주면 플래그 값을 찾을 수 있다.

근데..잘 안보이기 때문에 stegsolve로 이미지를 돌려보니 제대로 된 플래그를 찾을 수 있었다.

 

[Call Sandeep]

문제를 보겠습니다.

문제를 살펴보면, Pearl은 생일 파티를 열려고 하는데 Sandeep은 연락이 되지 않아 Jade를 불러서 Sandeep과 연락할 수 있게 도와달라고 한다.

그래서 Jade는 Pearl에게 메일을 보냈는데 Pearl의 PC가 고장난 상태이다. 그래서 정보들을 불러올 수 없으니 포렌식 분석을 부탁하는 시나리오이다.

 

링크를 통해서 파일을 다운받으면 메모리 덤프 파일이 하나 주어지기 때문에 volatility로 분석을 진행하였다.

먼저, 이미지 파일의 운영체제(프로파일)를 알기 위해서 imageinfo 플러그인을 사용하여 확인했다.

volatility_2.6_win64_standalone.exe -f sandeep.raw imageinfo

문제에서 봤다시피 메일을 보낸 것이니까 pslist를 통해서 덤프를 떴을 당시 실행되고 있던 프로세스들을 추출하였다.

volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 pslist

추출한 결과, thunderbird라는 이메일 프로그램이 하나 존재했고 pstree로 부모 프로세스를 확인하였다.

volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 pstree

thunderbird 프로세스 3개중 부모 프로세스가 3888로 된 프로세스라서 memdump를 통해서 3888 프로세스를 덤프떴다.

덤프를 뜨게 되면, 3888.dmp 파일이 하나 생성되는 것을 볼 수 있다.

volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 memdump -p 3888 -D ./

해당 파일을 분석하기 쉽게 strings 프로그램으로 문자열화 하여 분석을 진행했다.

strings.exe 3888.dmp > 3888.log

로그 파일이 생성 되었으면 notepad++ 로 파일을 열어봤는데, 엄청 많은 로그가 있어서 분석하기 쉽지 않았다.

문제를 보면 키워드를 하나 알 수 있는건 Jade, Pearl, mail, sandeep 의 키워드가 존재한다.

jade라는 키워드로 검색을 해본 결과, 이메일의 흔적을 볼 수 있었다. 하지만 중간에 조금 잘린 메일이기 때문에 원본 메일은 발견하지 못하였다.

원본 메일을 찾기 위해서 구글링을 하였고, 썬더버드는 메일의 내용을 Sent 파일에 저장을 하고 있다는 것을 알았고, Sent 파일을 검색 해보았다.

 volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 filescan | findstr "Sent"

volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007dec85f0 -D ./

Thunderbird 경로에 Sent 파일이 하나 있는것을 확인할 수 있다. 바로 추출을 하고 메모장으로 열어보니 원본 메일을 볼 수 있었다.

진짜 수상하게 base64로 인코딩 된 친구가 하나 있는 것을 볼 수 있다. 디코딩을 진행해보니 "5b2b7f05237305611f3368214d3a601d4325740f" 이런 값이 나왔고, Sent 파일을 더 분석해보면 C언어로 된 XOR 연산코드를 하나 볼 수 있다.

결국엔 디코딩해서 나온 값을 char flag[]에 넣어주라는 것으로 보여 값을 넣어주고 프로그램을 실행시켜봤다.

코드를 볼려보니 이상한 값이 나오길래 파이썬 코드로 다시 돌려보니 정상적으로 나오는 것을 확인할 수 있었다.

st = [0x5b,0x2b,0x7f,0x05,0x23,0x73,0x05,0x61,0x1f,0x33,0x68,
0x21,0x4d,0x3a,0x60,0x1d,0x43,0x25,0x74,0x0f]

def decode(encrypted_message):
    flag = ""
    for i, char in enumerate(encrypted_message):
        
        for j in range(256):
            byte = j
            if (i > 0):
                byte ^= encrypted_message[i-1]
            
            byte = byte ^ (byte >> 4)
            byte = byte ^ (byte >> 3)
            byte = byte ^ (byte >> 2)
            byte = byte ^ (byte >> 1)
            
            if byte == char:
                flag += chr(j)
                                
    print(flag)

decode(st)

하지만...jctf{} 형식이기 때문에 뒤에 부분을 찾은 것으로 확인이 되어 다른 로그들을 살펴봤다.

jade가 방문한 URL 정보이다. url을 따라가보면 reddit을 검색하고 pas를 검색하고 했던 정보들을 저장하고 있었다.

조금씩 로그들을 더 분석해보니까 jade의 컴퓨터 내부에 png파일, jpg파일, pdf들이 존재하는 것을 볼 수 있다. 

파일들의 이름이 sandeep으로 된 것으로 보아 sandeep과 관련된 파일임을 알고, 추출을 진행했다.

volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 filescan | findstr "png"

 

Part-1.png라는 파일만 출력 된 것을 볼 수 있다. 메모리 주소를 알았으니 파일을 덤프를 떠보았다.

volatility_2.6_win64_standalone.exe -f sandeep.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007ed6c9c0 -D ./

 

추출을 했는데 우리는 png 파일을 추출했기 때문에 png로 확장자를 바꿔주고 파일을 열어봤으나 열리지 않았다.

그래서 hxd에디터로 열어보니 시그니처랑 청크가 살짝 손상이 된 것을 볼 수 있었다.

정상적인 시그니처로 고쳐주고 파일을 열어보니 첫번째 플래그를 찾을 수 있었다.

그래서 두 개를 조합해보면, jctf{p34rl_1s_ybbx1at_s0e_Fnaqrrc}가 된다.

그러나 에러가 뜨기 때문에, 뭔가 뒤에 나오는 플래그 값에 문제가 있음을 직감하고 어떤 문자로 인코딩 된지 찾다가 ROT13으로 인코딩 됨을 알 수 있었다

ROT13으로 디코딩 시켜주면 look1ng_f0r_Sandeep} 이 값이 나오고 정상적으로 플래그를 찾았다.

 

FLAG : jctf{p34rl_1s_look1ng_f0r_Sandeep}

 

[La Tour]

문제를 보겠습니다.

링크를 통해서 문제 파일을 받아오면 메모리 덤프 파일이 하나 주어진다.

문제를 읽어보면 jade가 인터넷 상에 히든 메세지를 숨겨놨고, 그 메세지를 찾는 문제인 것으로 추정된다.

 

메모라 덤프 파일의 프로파일을 확인을 해보겠다.

volatility_2.6_win64_standalone.exe -f explore.raw imageinfo

운영체제가 Win7임을 알 수 있었고, 문제에서 인터넷이라고 했으니 iehistory 플러그인을 사용해서 인터넷 사용기록을 봤으나 아무런 값도 나오지 않았고, 직접 인터넷 익스플로러 히스토리를 분석해야 되는건가 싶어서 실행되고 있는 프로세스를 검색하였다.

 volatility_2.6_win64_standalone.exe -f explore.raw --profile=Win7SP1x64 pstree

인터넷 익스플로러가 실행이 되고 있음을 확인했고, PID인 2008을 메모리 덤프 떠서 분석을 진행하였다.

 volatility_2.6_win64_standalone.exe -f explore.raw --profile=Win7SP1x64 memdump -p 2008 -D ./

 

로그를 살펴보기 전에, 방문을 한 인터넷 브라우저이기 때문에 http로 키워드 검색을 해봤다.

방문 흔적들을 찾아 볼 수 있었고, 나와있는 https://pastebin.com/8kcW6Xgg 를 들어가면 다음과 과 같은 사이트를 볼 수 있다.

패스워드를 입력하는 칸이 하나 있는 사이트를 볼 수 있는데, 여기에다가 패스워드를 숨긴 것으로 추정된다.

 

이제는 패스워드를 찾아야 되는데, 보통 사람의 심리상 사이트마다 계정의 아이디와 패스워드를 동일하게 쓰는 습관이 있기 때문에 jade 계정의 패스워드를 알기 위해서 hashdump 플러그인을 사용하였다.

volatility_2.6_win64_standalone.exe -f explore.raw --profile=Win7SP1x64 hashdump

Jade의 패스워드가 36190865427581166c4b557937a8159e로 인코딩 된 것을 볼 수 있다.

디코딩을 시켜주는 사이트에서 디코딩을 진행해보았다.

디코딩 한 값은 history이고 찾았던 사이트에 입력을 하니 플래그를 얻을 수 있었다.

진짜 어려운...마지막 문제를 풀어보도록 하겠습니다. (어드민이 약간의 힌트를 알려줘서 접근을 했던 문제입니다)

 

[Affair]

문제를 보겠습니다.

문제를 해석하면, 제이드가 아내의 컴퓨터에서 암호화된 파일을 가져왔고, 파일을 분석할 수 없으니 분석을 의뢰하는 문제이다.

링크를 통해서 다운 받으면, 100MB의 크기의 파일을 하나 얻을 수 있는데, 확장자가 없어 hxd로 열어보니 알아볼 수 없는 값으로 되어 있었다.

 분석을 위해 칼리 리눅스로 들고가서 file 명령어로 파일을 확인한 결과도 마찬가지로 data 파일임을 알려주고 있다.

문제를 다시 한번 살펴보니 아내의 컴퓨터에서 암호화된 파일 키워드와 추가 정보에 패스워드라는 키워드가 있어서 디스크 파일임을 추측할 수 있었다.

그래서 패스워드를 크랙하기 위해 구글링을 해보니까 hash값으로 크랙을 하는 hashcat이 존재했고, 한번 사용을 해보았다.

hashcat으로 해쉬 알고리즘을 찾아보니 VeraCrypt와 TrueCrypt가 존재하였고, 디스크 파일인 것이 추측이 아니라 확정이 되었다.

사용법은 다음 블로그를 통해서 배워보시는 것이 좋을 것 같다.

https://hyunmini.tistory.com/132

패스워드를 크랙하기 위해서 다양한 명령어들을 써봤지만, 답을 찾을 수 없어서 어드민한테 여쭤보니 4글자 숫자 패스워드라고 알려줬다.

그렇기 때문에 "?d?d?d?d" 옵션을 사용하는 것을 알 수 있었고, 크랙을 바로 시도했다.

패스워드가 크랙되기 까지는 오래 걸리기 때문에, 그때 당시에 나온 패스워드는 6996이다.

veracrypt 프로그램에 마운트를 하고 6996을 입력하면 된다.

마운트가 정상적으로 이루어졌고, 디스크를 분석하러 가봅시당.

사진 파일과 txt 파일이 하나 있는데, 사진 파일에서는 아무것도 보이지 않았고 txt파일에는 숨어있는 공백 문자들이 있었다.

화이트스테가노 기법으로 보여지며, 프로그램을 돌렸으나 아무것도 안 나오는 것을 확인했다.

흠...그래서 고민을 하던 중, jpg 파일 hxd값에서 base64로 된 인코딩이 하나 있었다.

디코딩을 해보니 "57pearljam7" 이란 값으로 디코딩이 되었으며, 이게 패스워드 일것이라 생각해서 칼리 리눅스에서 stegsnow로 패스워드를 입력했다

플래그를 찾을 수 있었다.