CTF/포렌식

[JISCTF] Colorfull - 포렌식 / Wireshark / John the Ripper / PIL

SecurityMan 2023. 1. 26. 11:00

 

조금 어려웠던 포렌식 문제

 

네트워크 트래픽을 캡쳐했는데 악성 행위가 있는거 같다고 찾아내보라고 한다.

 

반응형

 

 

문제에서 주어지는 것은 colorfull.pcapng 파일이다.

 

 

pcapng 파일은 Wireshark 도구를 이용해 열어볼 수 있다.

 

열어보면 위와 같은 화면이 나온다.

 

 

조금만 스크롤을 내려보면

 

FTP 프로토콜을 이용해

 

files.zip 파일을 내려받은 흔적을 확인할 수 있다.

 

 

해당 패킷에서 우클릭 - Follow - TCP Stream 버튼을 눌러 자세한 내용을 확인해 본다.

 

 

Show and save data as를 Raw로 선택해주고

 

Save as... 버튼을 눌러 데이터를 저장해준다.

 

데이터 맨 앞에 50 4b 03 04 로 시작하는걸 보니 ZIP 파일이 맞다.

 

 

저장한 files.zip 파일의 압축을 풀려고 보니

 

비밀번호가 걸려있다.

 

 

zip 파일 비밀번호를 crack 하는데는 John the Ripper 라는 도구를 이용했다.

 

여러가지 비밀번호를 crack 해주는 기능을 가지고 있다.

 

 

zip2john <파일명> > hash 명령어로

 

hash 파일을 생성해준 다음

 

 

john --wordlist=<rockyou.txt 파일 경로> hash 명령어로 비밀번호를 crack 해주면 된다.

 

해당 파일의 비밀번호는 labeba 이었다.

 

비밀번호를 크랙하는데 사용한 rockyou.txt 파일을 구글에 검색하면 쉽게 구할 수 있다.

 

 

압축을 푼 files.zip 파일 안에는 

 

secret_data.txt 파일이 들어있다.

 

txt 파일을 열어보면 뭔가 알 수 없는 세 개의 숫자가 여러개 적혀있는것이 보이는데

 

문제 제목이 colorfull 이었으니

 

세 개의 숫자가 각각 RGB 값이 아닐까 하고 추측했다.

 

 

RGB 데이터를 그림 파일로 만들려면 이미지의 사이즈를 알아야 한다.

 

사이즈를 계산하기 위해 RGB 데이터가 몇개인지 확인했다.

 

한줄에 한개가 있고 총 10,693 줄이니 10,693 개의 데이터가 있는 것이다.

 

 

온라인 소인수분해 계산기를 이용해 소인수분해를 해보니

(https://ko.numberempire.com/numberfactorizer.php)

 

10,693은 17 * 17 * 37 로 소인수분해 되었다.

 

이미지 크기는 17^2 * 37 또는 37 * 17^2 둘중 하나일 것이다.

 

이번 문제는 Python PIL 라이브러리를 이용해서 풀었다.

PIL은 Python Imaging Library의 약자로

파이썬으로 이미지 처리를 할 수 있도록 해주는 라이브러리이다.

 


pip install image

pip install pillow

두 명령어를 이용해서 다운로드 받아주면 된다.

 

from PIL import Image

xlen = 17 * 17
ylen = 37

new = Image.new('RGB',(xlen,ylen),(0,0,0))
rgbData = open('secret_data.txt', 'r')

x = 0
y = -1

for line in range(10693):
	R,G,B = rgbData.readline().split('-')
	
	x = line % (17 * 17)
	
	if (line % (17 * 17)) == 0:
		y = y + 1	
		
	new.putpixel((x,y),(int(R),int(G),int(B)))
	
new.save('new.png')

 

문제 푸는 코드는 위와 같다.

 

xlen과 ylen 으로 이미지 크기를 지정해주고

 

new 에다가 텅빈 이미지 하나를 생성해준다.

 

그다음 secret_data.txt 파일을 한줄씩 읽어와

 

각 줄에서 R, G, B 숫자값을 추출하고

 

new.putpixel 을 이용해

 

new 이미지의 해당하는 위치에 R, G, B 값을 이용해 색상을 넣어주면 된다.

 

 

생성된 이미지에 플래그가 적혀있다.

반응형