CTF/포렌식

[TGHACK] poke - 포렌식 / 스테가노그래피 / stego-lsb

SecurityMan 2022. 4. 14. 15:30

 

재미있는 포렌식 문제

 

개인적으로 이때까지 CTF 문제풀면서 만났던 문제중에 가장 재미있는 문제라고 생각한다.

 

요원의 USB에서 복원된 파일에서 플래그를 찾아보라고 한다.

 

주어지는 문제파일은 unowns.png 사진파일 하나이다.

 

 

unowns.png 파일을 열어보면 이런 그림이 나온다.

 

아는 사람은 알겠지만 얘네들은 포켓몬 '안농' 이다.

 

안농의 특징은 알파벳 모양으로 생겼다는 것이다.

 

저기 안농들의 모습을 알파벳으로 그래도 옮겨적어보면

 

REMEMBER TO EXAMINE THE 가 된다. 이부분을 잘 기억해두자.

 

반응형

 

이 문제를 풀때 한가지 알아야하는건 PNG 파일의 구조이다.

 

 

다른 포스팅에서도 잠깐 언급한적이 있는데 PNG 파일은 항상

 

89 50 4E 47로 시작한다. 아스키 텍스트로 보면 ‰PNG 이런 형태이다. 

 

이런걸 파일 시그니처라고 한다.

 

그리고 이 뒤쪽에는 이미지에 대한 정보를 담고 있는 청크(chunk) 라는것으로 구성되어있는데

 

거의 필수적으로 세가지 청크가 사용된다.

 

 

가장먼저 오는게 IHDR 이다.

 

IHDR은 이미지의 사이즈, 비트 수, 컬러타입을 알려주는 역할을 한다.

 

 

그다음 나오는건 IDAT 청크이다. 

 

IDAT 는 실제 이미지를 담고 있는 청크라고 생각하면 된다.

 

 

마지막으로 오는 청크는 IEND이다.

 

IEND가 보이면 PNG 이미지가 끝났다고 생각하면 된다.

 

 

unowns.png 파일이 특이한건 IEND 청크가 나온 뒤에, 파일이 끝나지 않고

 

다시 PNG 파일 시그니처와 IHDR 청크가 나오고 있는걸 볼 수 있다.

 

 

칼리 리눅스에서 binwalk 라는 도구를 이용해서도 확인할 수 있다.

 

binwakl unowns.png 라고 입력해주면

 

분명 우리가 볼때 하나의 PNG 파일이었지만 안에 2개의 PNG 파일이 더 있는것을 확인할 수 있다.

 

 

이 이미지들은 foremost unowns.png 명령을 이용해서 추출할 수 있다.

 

 

추출하면 이렇게 두 개의 PNG 파일을 얻을 수 있다.

 

 

첫번째 이미지는 이거다.

 

누가봐도 피카츄 울음소리인데 

 

사실 이건 프로그래밍 언어이다.

 

esoteric programming language 라고 해서 사람들이 장난으로 만든 프로그래밍 언어라고 생각하면 된다.

 

피카츄 울음소리를 흉내내서 만든 이것은 pikalang 이라고 한다.

 

인터넷에 찾아보면 이걸 쉽게 디코딩 해주는 사이트들이 많다.

 

문제는 디코딩 할려면 이 그림파일에 적혀있는 문자들을 일일이 옮겨적어야 한다는 것인데...

 

일단 텍스트가 너무 많고 비슷한 글자가 반복되어서 실수할 확률이 매우 높다..

 

일단은 보류하고 조금 더 살펴본다.

 

 

pikalang 이 적혀있는 PNG 파일을 HxD 프로그램으로 열어서

 

맨 밑으로 내려가보면 이상한 부분이 보인다.

 

무언가 base64로 인코딩된것 같은 문자들이 들어가있다.

 

 

Cyberchef에서 해당 문자열을 base64로 디코딩해본다.

 

Output에서 보면 맨 앞글자에 PK... 이라고 오는걸 볼 수 있는데

 

PK로 시작하는 파일은 십중팔구 ZIP 파일이라고 생각하면 된다.

 

오른쪽 중간에 저장 버튼을 눌러서 파일을 저장해준다.

 

 

저장 버튼을 누르면 파일이름을 정하라고 창이 하나 뜨는데

 

zip으로 확장자를 지정해서 저장하면 된다.

 

 

다운받은 zip 파일을보면 안에 hidden_pika.txt 파일이 들어있다.

 

압축풀려고하면 비밀번호를 요구한다.

 

아마도 마지막 PNG 파일에서 비밀번호를 찾을 수 있는것 같다.

 

 

마지막 PNG 파일은 가디의 사진인것 같다.

 

 

가디 PNG 파일을 역시 HxD로 열어보면

 

맨 아래쪽 IEND 청크 뒤에 파일이 끝나지 않고 뭔가 텍스트가 쓰여있는걸 볼 수 있다.

 

sls lqvwdoo vwhjr-ove <3 라고 적혀있는데 일단 영어는 아닌것 같다.

 

이런 암호문 같은걸 풀때 아주 유용한 도구가 있다.

 

CrypTool 이라는 도구인데 이곳에서 다운로드 가능하다.

(https://www.cryptool.org/en/ct1/downloads)

 

 

해당 도구를 다운받아 설치하고, 실행시킨 뒤에

 

새 문서를 만들고 해독하고 싶은 암호문을 넣어준다.

 

 

그다음 Analysis - Symmetric Encryption (classic) - Ciphertext-Only - Vigenere 를 선택해준다.

 

보통 저렇게 영어만 있는 암호문의 경우 Caesar 아니면 Vigenere 인 확률이 높기 때문에

 

두개를 가장 먼저 테스트해본다.

 

일단 이번에는 Vigenere 로 분석을 해본다.

 

 

분석을 누르면 툴에서 알아서 키 길이와 key값까지 구해서 해독해준다.

 

키 길이는 1이고 key값은 'D' 로 해석이 된다.

 

참고로 Vigenere 암호는 프랑스 외교관 블레즈 드 비제네르가 개발한 암호이다.

 

시저 암호보다 진화된 형태라고 생각하면 된다.

 

pip install stego-lsb 라는 평문이 나오는데

 

pip 는 파이썬을 써본 사람들이라면 알겠지만 파이썬에서 패키지를 다운로드해주는 명령어이다.

 

 

칼리 리눅스에서 해당 명령어를 쳐보면 stego-lsb 라는 툴이 다운로드 되는걸 볼 수 있다.

 

 

stego-lsb 도구는 이렇게 사용하면 된다.

 

-r 옵션은 이미지 파일에서 데이터를 recover 하라는 의미이다.

 

-i 옵션은 데이터를 추출할 이미지 파일(가디 이미지)를 지정해주고

 

-o 옵션으로 추출한 데이터를 저장할 파일을 지정해준다.

 

 

추출한 txt 파일을 열어보면 비밀번호가 적혀있다.

 

아까 zip 파일의 비밀번호인듯 하다.

 

 

이렇게 zip 파일에 비밀번호를 넣어주면

 

 

hidden_pika.txt 파일이 열리고, 아까 PNG 파일로 봤던 pikalang이 텍스트로 적혀있는걸 볼 수 있다.

 

이걸 그대로 복사해서

 

온라인 pikalang 인터프리터에 넣어 실행시켜 준다.

(https://www.dcode.fr/pikalang-language)

 

 

복사 붙여넣기 한 후, EXECUTE 버튼을 누르면

 

왼쪽에 실행결과가 출력된다.

 

출력되는 값은 foo bar dog closely 이다.

 

맨 처음에 안농을 통해서 봤던 문장과 방금 pikalang으로 찾은 문장을 합친

 

remember to examine the foo bar dog closely 가 이번 문제의 플래그였다.

반응형