Theori Offensive Security Researcher Hiring CTF 후기

Theori Security Assessment 팀의 Offensive Security Researcher Hiring CTF 리뷰! 채용 CTF 문제 출제 의도, 풀이 힌트, 참가 후기를 공개합니다.
Frontier Squad's avatar
Apr 24, 2024
Theori Offensive Security Researcher Hiring CTF 후기

들어가며

안녕하세요. 이번 포스트는 2023년 12월 20일부터 2024년 3월 31일까지 진행되었던 Theori Security Assessment 팀의 Offensive Security Researcher Hiring CTF에 대한 내용입니다.

Theori Offensive Security Researcher Hiring CTF
Theori Offensive Security Researcher Hiring CTF

이번 채용 CTF의 참가자는 총 338명이었습니다. 채용 CTF에 참여하여 문제를 해결하고, Write-Up을 제출한 지원자들에게는 Skill Test 면제 혜택이 주어졌으며, 이 과정을 통해 최종적으로 합류한 인원도 있었습니다.

Dreamhack 커뮤니티 최고 인기글
Dreamhack 커뮤니티 최고 인기글

Q. CTF를 잘하면 취업을 할 수 있나요?

A. 네, 그렇습니다! 이번 채용 CTF를 통해 SA 팀에 새롭게 합류한 연구원의 CTF 참가 후기도 있으니 기대해 주세요.

Offensive Security Researcher Hiring CTF의 문제들은 Security Assessment 팀에서 컨설팅을 수행하며 실제로 만난 문제 상황들을 기반으로 제작하였습니다. 본 포스트에서는 Security Assessment 팀의 연구원들이 어떤 의도로 문제를 출제했는지, 또 문제를 풀기 위해서는 어떠한 역량이 필요한지에 대해 중점적으로 살펴보며 채용 CTF에 대한 전체적인 리뷰를 진행하고자 합니다.

Write-Up 공개에 대한 요청이 있었는데, 내부 논의를 통해 전체 풀이를 공개하기보다는 풀이 아이디어를 제공하는 방향으로 결정을 했습니다. 이번 포스트가 올라간 이후부터는 채용 CTF에 나왔던 문제들을 Dreamhack 워게임에서 계속 풀어볼 수 있어요. 힌트를 이용해 문제 풀이를 시도해 보시고, 보다 자세한 풀이는 추후 Dreamhack에 올라오는 Write-Up을 확인해 주세요.

문제를 직접 해결하고 Dreamhack에 Write-Up을 작성해 주신다면, 가장 좋은 그림이 될 거라고 생각해요. 문제를 열심히 풀어주신 분들을 위해 저희 SA 팀이 준비한 이벤트도 있으니, 본 포스트를 끝까지 읽어주시길 바랍니다😊


문제 리뷰

이번 채용 CTF에서는 아래와 같이, 총 6문제를 만나볼 수 있었습니다.

채용 CTF 출제 문제 목록
채용 CTF 출제 문제 목록

그럼 각 문제에 대해 살펴보겠습니다.

문제의 제목을 클릭하면, Dreamhack 워게임에 올라온 문제를 확인할 수 있습니다. 리뷰를 보며 문제를 풀어본다면, 조금 더 수월하게 문제를 해결할 수 있을 거예요.

문제1: Piggybank-1

PiggyBank-1
PiggyBank-1

문제 요약

첫 번째로 살펴볼 문제는 Piggybank-1입니다. Piggybank-1은 단순한 기능을 가진 PiggyBank라는 은행의 관리자 계정을 탈취해서 flag를 획득하는 문제였어요. 큰 서비스의 기능과 흐름을 이해하고, 소스코드 분석을 통해 취약점을 찾을 수 있는 능력이 있는지 확인하기 위해 출제한 문제입니다.

함께 살펴보기

그럼 먼저, PiggyBank에 어떤 기능이 있는지 살펴보겠습니다.

회원가입 및 로그인

- Sing Up, Sing In을 통해 회원가입과 로그인을 할 수 있습니다.

- 회원가입 시 Username, Password, E-mail, Real Name, Registration Number, Memo를 입력해야 합니다.
  
  - 참고: 입력값에 대한 조건은 UserConstants.class 파일에서 확인할 수 있습니다.

- 로그인 시 Username, Password를 입력해야 합니다.

- 회원가입을 하면 10,000KRW가 지갑으로 지급됩니다.


비밀번호 재설정

- 로그인 과정에서 비밀번호를 잊어버린 경우, Username과 복구 코드 입력을 통해 비밀번호 재설정이 가능합니다.

- 비밀번호 재설정에 필요한 복구 코드는 회원가입 시 제공됩니다.


Bank

- 이용자 간 송금을 할 수 있습니다.

- KRW/USD 환전을 할 수 있습니다.


Shop

- 1,000,000KRW을 지불하고 flag를 구입할 수 있습니다.


계정 정보 확인

- 본인의 정보(회원가입 시 입력한 정보 및 잔고)를 확인할 수 있습니다.

문제에서 주어진 파일을 살펴보면 flag.properties라는 이름의 파일을 찾을 수 있습니다. flag = flag{first_flag}라는 메시지가 있으니, 해당 파일을 통해 얻을 수 있는 flag가 Piggybank-1 문제의 flag가 되겠네요.

이 내용을 바탕으로 파일의 코드를 확인하면, 관리자 계정의 Memo에 이 flag값이 저장되어 있다는 사실을 파악할 수 있습니다. 결국 문제를 해결하기 위해서는, 관리자의 계정으로 로그인을 성공하고, 계정 정보 확인 기능을 통해 Memo에 들어있는 flag를 확인해야 합니다.

로그인을 위해서는 Username, Password가 필요하겠죠? 문제를 조금 살펴보면 관리자의 Username이 admin이라는 건 쉽게 알 수 있어요. 하지만, 관리자의 Password에 대한 정보는 찾을 수 없네요. 비밀번호 재설정 기능을 통해 비밀번호를 초기화하는 방법으로 관리자 계정을 획득해야 할 것 같아요.

아래 질문들에 대한 답을 찾을 수 있다면, 문제를 해결하실 수 있을 거예요. 저희가 드리는 문제를 풀기 위한 키워드와, 문제 출제 아이디어를 참고해서 방법을 찾아보시길 바랍니다.

해결해야 할 질문

비밀번호를 재설정하기 위해서는 관리자 계정의 복구 코드를 알아내야 합니다.

- 비밀번호 재설정 단계에서는 복구 코드의 일부를 요구하고 있어요. 복구 코드 전체를 알아낼 필요는 없을 수 있겠네요. 입력값으로 들어갈 수 있는 복구 코드 조합의 경우의 수는 얼마일까요?

  - 모든 경우의 수를 확인할 수 있나요? 제한된 입력 횟수 안에 모든 경우를 확인하려면 어떻게 해야 할까요?

    - 코드에 Race Condition이 발생할 수 있는 지점이 있을까요?

      - 만약 Lock이 걸려 있다면, unlock을 시도하기 위해서는 어떤 정보를 알아야 할까요? 

        - 서버가 이용자의 불필요한 정보를 응답하는 부분이 있나요?

문제를 풀기 위한 키워드

  • 다른 이용자의 불필요한 정보 노출(이용자의 고유한 uuid 값 노출)

  • 임시 발급 토큰 관리 미흡

  • Redis key manipulation

  • Time-of-check to Time-of-use (TOCTOU)

  • Brute Force

문제 출제 아이디어

실제로 서비스를 이용하다 보면, 인증 시도 횟수의 제한이 있는 경우를 많이 볼 수 있습니다. 과연 인증 시도 횟수를 제한하면, 우리는 Brute Force 공격으로부터 안전할 수 있을까? 인증 시도 횟수를 제한해도 Brute Force 공격이 가능할 수 있지 않을까?라는 생각이 문제의 아이디어였습니다.

출제자의 말

이 문제를 풀어보면서, 코드를 분석하는 능력을 향상 시킬 수 있기를 바랍니다. Piggybank-1는 이번 CTF의 문제 중에서 상대적으로 난이도가 낮은 편이고, Race Condition과 인증이라는 많은 웹 서비스에서 발생하는 빈번하게 발생하는 이슈를 다루고 있으니 꼭 풀어보시면 좋겠습니다.

문제2: Piggybank-2

Piggybank-2
Piggybank-2

두 번째 문제도 마찬가지로 PiggyBank에 대한 문제입니다.

사실 의도한 풀이는 Piggybank-1 문제를 풀며 획득한 관리자 계정을 활용하는 방식이었습니다. 그래서 Piggybank-1 문제를 먼저 해결해야 Piggybank-2를 풀 수 있을 거라고 생각했는데, Piggybank-2 문제의 정답을 찾아주신 분이 더 많았어요. 이게 어떻게 된 일일까요?

문제에서 발생한 의도하지 않은 버그를 이용해 문제를 해결한 분들도 계셨던, Piggybank-2 문제를 한번 살펴보겠습니다.

문제 요약

저희가 Piggybank-1 문제에서 기능을 살펴봤을 때, Shop에서 1,000,000KRW을 지불하고 구입할 수 있는 flag가 있었어요. Shop에서 팔고 있는 flag가 바로 이번 문제의 flag입니다. 결국 이 문제는 flag를 구입하기 위해 1,000,000KRW 이상을 모아야 하는 문제라고 할 수 있겠네요. 같은 PiggyBank에 대한 문제인 만큼, 문제를 해결하기 위해서는 기능에 대한 이해와 소스코드 분석 능력이 필요합니다.

함께 살펴보기

앞선 문제에서 저희는 지갑에 있는 10,000KRW과 Bank 기능을 이용하지 않았어요. 아마 이번 문제에서 지금 가지고 있는 이 10,000KRW과, Bank의 송금 및 환전 기능을 활용하여 1,000,000KRW을 모아야 할 것 같습니다. 해야 할 일은 직관적이고 명확하네요. 문제를 풀기 위한 키워드를 참고해서 해결해야 할 질문의 답을 찾아봅시다.

해결해야 할 질문

- 환전을 할 때 수수료를 지불해야 합니다. 수수료는 누가 가져가는 걸까요?

  - 관리자 계정으로는 flag를 구입할 수 없는 것 같아요. 그렇다면 Piggybank-2 문제에서 관리자 계정은 필요 없을까요?

- 판매 기능이 따로 없어서 처음 가입할 때 지급하는 10,000KRW이 획득할 수 있는 돈의 전부인 것 같아요. 그렇다면 가입을 100번해서 1,000,000KRW을 모으는 건 가능할까요?

  - 확인해 보니 가입자 수는 50명으로 제한되어 있어요. 이 돈을 불릴 수 있는 방법을 알아봐야 할 것 같아요. 

    - 다른 계정으로부터 돈을 받지 않고 한 계정에서 10,000KRW보다 많은 금액의 돈을 모을 수 있을까요?

      - 돈을 복사할 수 있는 방법이 있을까요?

        - 돈이 줄어들지 않고, 늘어나기만 하는 상황이 발생할 수 있을까요?

        - (Unintended) 데이터를 저장할 때 입력한 데이터 값이 정확하게 저장되나요?

          - 입력한 데이터 값이 저장된 데이터 값과 다르다면, 그 이유는 무엇인가요?

    - (Unintended) 가입자 수의 제한을 풀 수 있는 방법이 있을까요?

문제를 풀기 위한 키워드

  • 잘못된 논리 연산자 사용으로 인한 검증 우회

  • Exception & throw

  • 에러로 인한 코드 동작 중단에서 발생하는 취약점

문제 출제 아이디어

은행이나 거래소와 같은 디지털 자산 관련 서비스에서 시스템의 오류로 인해 데이터 상의 자산이 변경되는 상황은 피해가 직접적으로 돈과 연결되는 매우 심각한 문제입니다. 이번 문제의 아이디어는 시스템의 에러를 통해 돈을 복사할 수 있다면 재미있지 않을까?라는 생각에서 나왔고, 서비스 개발 과정에서 발생 가능한 취약점을 활용하여 문제를 구현했습니다.

출제자의 말

이번 문제의 경우 참가자 분들께서 저희가 의도하지 않았던 여러 풀이(DB에 금액이 들어갈 때 소수점 3자리에서 잘리는 버그를 이용한 풀이, 가입자 수 제한을 우회한 풀이)를 제출해 주셨습니다. 버그가 있어서 아쉬움이 남지만, 저희가 발견하지 못했던 버그를 찾으며 열심히 문제를 풀어주신 분들에게 감사하다는 말씀을 드리고 싶어요.
다른 풀이로 문제를 해결하신 분들도, 이번 포스트를 보며 저희가 의도한 방향으로 문제를 풀어보시기를 바랍니다. 다양한 관점의 접근은 좋은 경험이 될 수 있으니 여러 풀이를 시도해 보시되, 저희가 의도했던 Piggybank-1 문제를 풀고 획득한 관리자 계정을 활용하는 풀이도 꼭 도전해 보세요. 문제를 푸는 것도 중요하지만, 문제를 푸는 과정을 통해 많은 것을 얻어가셨으면 좋겠습니다. 이 문제가 코드 오디팅 실력 향상에 도움이 되었기를 바랄게요.

문제3: Fast XSS

Fast XSS
Fast XSS

문제 요약

세 번째로 살펴볼 문제는 Fast XSS입니다. 제목을 보니, XSS 공격을 성공시켜야 할 것 같아요. 문제에서 주어진 서비스를 살펴보면, FastAPI의 Jinja2Templates을 이용해서 사용자로부터 context를 입력 받고 렌더링을 하고 있습니다. 웹 서비스는 다양한 오픈소스 라이브러리와 프레임워크를 사용하는데, 사용자가 작성하는 코드가 아닌 오픈소스에서 취약점이 발견되는 경우도 있어요. 오픈소스에 존재하는 취약점을 찾아 XSS를 성공시키는 것이 Fast XSS 문제의 목표입니다.

함께 살펴보기

# app.py

from fastapi import FastAPI, Request, Response
from fastapi.templating import Jinja2Templates
import json

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.get("/")
async def index(request: Request, data: str = '{"context": {"user": "Guest"}}'):
    try:
        data = json.loads(data)
    except:
        data = {"context": {"user": "Guest"}}
    context = {"name": "index.html", "request": request}|data
    return templates.TemplateResponse(**context)

위 코드는 FastAPI를 기반으로 구현한 이용자 코드입니다. 이용자가 입력하는 data를 통해 만든 context 변수를 사용하여 템플릿을 렌더링하고, 결과를 클라이언트에 반환하는 단순한 과정을 가지고 있습니다. 문제를 풀기 위한 키워드를 참고해서, 아래의 질문들을 해결하면 flag를 획득할 수 있을 거예요.

해결해야 할 질문

XSS를 발생 시키기 위해서는 이용자가 데이터를 입력할 수 있는 부분을 확인해야 합니다.

- 이용자는 어떤 부분의 데이터를 조작할 수 있을까요?

  - 해당 데이터를 조작하면, 어떤 결과를 얻을 수 있을까요?

- 서비스는 어떤 라이브러리를 사용하고 있나요?

  - 해당 라이브러리와 의존성 관련이 있는 다른 라이브러리가 있나요?

     - 사용하는 라이브러리에 취약점으로 보이는 부분이 있나요?

      - 참고: 봐야 하는 코드가 너무 많다고 느낀다면.. 문제 출제 아이디어에서 힌트를 얻어보세요!

- injection은 어디에서 진행할 수 있을까요?

  - 입력에 대한 검증이 완전하지 않은 부분이 있나요?

    - 어떻게 하면 검증을 우회할 수 있을까요?

- XSS payload는 어떻게 만들 수 있을까요?

문제를 풀기 위한 키워드

  • Regular Expression

  • Header Injection

  • XSS (Cross-Site Scripting)

문제 출제 아이디어

이번 문제는 저희 SA 팀의 연구원이 FastAPI 오픈소스를 점검하는 프로젝트를 수행하는 과정에서 실제로 발견한 버그를 이용해서 제작하였습니다. 문제의 아이디어가 되었던 Uvicorn 버그(GitHub 정책에 의해 현재는 비공개 상태입니다.)는 채용 CTF 마감 이후 제보한 상황입니다.

출제자의 말

이번 문제는 라이브러리와 프레임워크에 대한 취약점 발생 여부 점검 능력을 보기 위한 목적으로 출제했습니다. 난이도가 있는 편이라 웹 문제들 중에는 정답자 수가 가장 적었어요.

일반적으로 보안 컨설팅의 수행 대상이 되는 웹 서비스는 다양한 오픈소스를 사용하고 있습니다. 그렇기 때문에 오픈소스 자체에 취약점이 존재하는 경우, 해당 취약점은 관련된 많은 서비스의 보안 문제로 이어질 수 있어요. 또, 문제에서는 다루지 않았지만 오픈소스를 사용하는 방식에 따라 보안 문제가 발생하는 경우도 있습니다. 이처럼 웹 서비스에서 안전한 오픈소스의 사용은 중요한 고려 사항이기 때문에, 웹 보안에 관심이 있는 분들은 조금 어렵더라도 이번 문제를 꼭 풀어보시기를 바랄게요. 실제 서비스에서 이런 식으로 버그를 발견할 수도 있다는 것을 문제를 통해 알아가시면 좋겠습니다.

티오리와 SA 팀은 프로젝트를 수행하며 아직 발견되지 않은 Real world의 버그를 발견하고, 버그 제보를 통해 패치에 기여함으로써, 보다 안전한 세상을 만들기 위해 노력하고 있어요. 이 노력을 함께할 수 있는, 준비된 인재들의 연락을 기다리고 있습니다.

문제4: Dream DRM

Dream DRM
Dream DRM

문제 요약

네 번째로 살펴볼 문제는 Dream DRM입니다. 제목에서 알 수 있듯 DRM에 대한 문제였어요. 안드로이드 앱과 웹 서버로 구성된 문제로, DRM이 적용된 파일을 주어진 클라이언트에서만 복호화 할 수 있도록 설정한 모바일 서점 서비스를 모방하여 구현하였습니다. 클라이언트 앱은 웹 서버와 통신하며 파일 목록과 암호화된 PDF를 받아올 수 있고, 앱 내에서 받아온 내용을 복호화하여 사용자에게 보여줍니다.

정리하면, DRM 서버 내 취약점을 이용해 암호화된 flag 파일을 획득하고, 클라이언트 앱을 분석하여 파일을 복호화함으로써 flag 값을 획득하는 문제입니다.

함께 살펴보기

문제 풀이 방향은 크게 동적 분석과 정적 분석으로 나눌 수 있습니다. 풀이자의 선호에 맞게 방법을 선택하면 되지만, 동적 분석의 경우 에뮬레이터 또는 루팅 환경에서 동작시키기 위해 앱 보호기법을 우회하는 과정을 거쳐야 합니다. frida를 통해 루팅/위변조를 담당하는 클래스를 후킹할 수 있다면 앱의 보호기법을 우회할 수 있습니다.

문제를 해결하기 위해서는 다음의 두 가지가 필요합니다.

  1. 보편적인 앱 솔루션/보호기법들의 동작에 대해 이해하고, frida 및 리패키징을 이용해 우회할 수 있는 능력

  2. JNI 동작 구조와 난독화 방식에 대한 이해

문제를 풀기 위한 키워드에 대한 내용을 학습하고, 해결해야 할 질문을 따라가다 보면 이 두 가지를 갖춰 문제를 해결할 수 있을 거예요.

해결해야 할 질문

  • 일부 에뮬레이터에서 클라이언트 앱이 돌아가지 않는 케이스가 있었어요. 이 부분은 문제에서 의도한 설정은 아니었으니, 휴대전화나 다른 에뮬레이터에서 구동을 시도해 보세요.

서버에 존재하는 flag 파일을 다운로드 받고 복호화하기 위해서는 여러가지 단계의 작업이 필요합니다. 먼저 앱의 보호기법을 우회하여 서버와의 통신을 분석한 후 임의 파일을 다운로드 받아야 하고, 클라이언트 앱을 이용해 이를 복호화하는 작업을 수행해야 합니다.

- 클라이언트 앱은 어떤 엔드포인트로부터 파일을 받아오고 있나요?

  - 클라이언트 앱과 웹 서버의 통신에 대한 내용은 코드의 어느 부분에서 찾을 수 있을까요?

  - 엔드포인트에서 앱으로 어떻게 flag 파일을 다운로드 받을 수 있을까요?

    - 엔드포인트에서 앱으로 파일에 대한 내용을 어떻게 전달하고 있나요?

      - (flag 파일을 다운로드 받을 때 사용할 수 있는) 엔드포인트의 취약점이 있을까요? 취약점을 어떻게 이용할 수 있을까요?

- 암호화된 파일을 어떻게 복호화 할 수 있을까요?

  - 암호화 알고리즘에 대한 분석이 가능할까요?

    - 복호화 기능이 있는 함수를 호출할 수 있는 방법이 있을까요?

      - 아니면 복호화 함수의 파라미터를 변조할 수 있을까요?

      - 혹시 복호화 결과를 바로 확인하는 것도 가능할까요?

문제를 풀기 위한 키워드

  • SQL Injection

  • 루팅/에뮬레이터 탐지

  • 앱 위변조 검증

  • Frida

  • JNI 난독화

문제 출제 아이디어

컨설팅을 수행하며 고객사의 앱을 분석하는 경우가 있는데, 대다수의 고객사 앱에는 앱 보호 솔루션이 적용되어 있습니다. SA 팀에서 고객사 앱을 검수하고 테스트하는 컨설팅을 수행할 때는, 선제적인 대응을 통한 보안성 향상을 위해 고객사 앱의 안전성을 공격자의 시선에서 바라보며 판단하게 됩니다. 그 과정에서 솔루션 우회도 시도하고, 고객사 앱에서 어떤 취약점을 이용할 수 있을지에 대한 고민을 하기도 해요. 이번 문제는 컨설팅 경험을 통해 생각한, 저희 SA 팀의 업무 수행을 위해 필요한 역량을 판단하기 위해 출제하였습니다.

출제자의 말

이 문제를 통해 클라이언트 앱 분석 방법을 학습하고, 클라이언트 보안보다 서버 보안에 집중하는 것이 더 중요하다는 점을 깨닫고 가시면 좋겠습니다. 클라이언트 앱 보안은 공격자의 공격 난이도를 일정 수준 증가시킬 수 있지만, 절대적인 해답이라고 할 수 없습니다. 궁극적으로 서버 단에서의 안전한 설계가 중요하기 때문에 앱 보안 솔루션에만 의존하는 것은 바람직하지 않다는 메시지를 전달하고 싶었습니다.

동적 분석으로 문제를 해결했다면, 정적 분석으로도 문제를 풀어보는 것을 추천드릴게요. 보안을 위한 보호 기법들은 계속 발전하지만, 최신의 보호 기법이 적용되어 있더라도 취약점이 발생할 수 있어요. 저희 SA 팀은 공격자보다 먼저 취약점을 찾아 선제적으로 보안을 강화하는 것의 중요성을 알고, 그럴 수 있는 역량을 가진 사람이 티오리에 합류하기를 기대하고 있습니다.

문제5: Protoss Baby & 문제6: Protoss Adult

Protoss Baby & Protoss Adult

저희 SA 팀은 웹 서비스에 대한 보안 컨설팅을 주로 하기 때문에, 원래 web 분야의 문제 위주로 출제하는 방향을 고려했었지만, 회사에서 일하며 발전하고 싶어하는 분들이 있을 수 있다는 생각에 pwnable, reversing 문제도 출제를 하게 되었습니다.

조금 전 살펴봤던 Dream DRM이 web + reversing 문제였고, 이번에 살펴볼 Protoss Baby, Protoss Adult가 바로 pwnable 문제입니다. 이 두 문제는 앞서 살펴본 Piggybank-1, Piggybank-2처럼 같은 코드(바이너리)를 사용하고 있습니다. 출제할 때 나름의 단계를 나누어 두기는 하였지만, CTF 기간 동안 Protoss Baby를 푸신 분들이 모두 Protoss Adult를 풀어주셨어요. 접근 방식이 비슷한 이번 두 문제는 같이 살펴보도록 하겠습니다.

문제 요약

이번 문제는 거래소 시스템에서 제공하는 회원 기능, 매수/매도, 조회, 주소록을 포함한 일부 기능을 간단히 구현한 문제였습니다. 바이너리에 포함된 Protocol Buffers 메시지의 원본을 획득하고, 거래소의 기능에 존재하는 취약점을 발견해야 하는 문제였어요.

  • Protoss Baby: 발견한 취약점을 공격하여 메모리에 로드되어 있는 flag를 획득하는 문제입니다.

  • Protoss Adult: 발견한 취약점을 공격해서 서버의 쉘을 획득하고, 파일 시스템에 존재하는 flag를 획득하는 문제입니다.

함께 살펴보기

우선 proto 확장자 파일을 제공하지 않고 있기 때문에 메시지에 대한 복원을 진행해야 합니다. 메시지 복원 후에는 거래소 기능의 취약점을 발견해야 해요.

그럼, 기능을 살펴보겠습니다.

회원 기능

- Sign-up, Sign-in을 통해 로그인을 하고, 거래소의 다른 기능을 이용할 수 있습니다.


매수/매도

- 바이너리에서 제공하는 코인 심볼에 대한 거래가 가능합니다. 거래 시에는 코인 심볼, 수량, 타임스탬프를 입력으로 받고, 거래 전 이용자 잔고 검사를 통해 잔고가 충분한 경우 매수/매도 처리를 완료합니다.

- 거래에 대한 기록은 INSERT 문을 통해 pt_tradehistory 테이블에 저장합니다.


조회

- 거래에 대한 기록을 조회할 수 있습니다.


주소록

- 타 거래소의 본인 지갑 주소 또는 지인의 지갑 주소와 같이, 이용자가 주로 재화를 송금하는 주소가 있을 수 있어요. 자주 사용하는 주소를 미리 저장하여 쉽게 불러올 수 있도록 주소록 기능을 제공합니다.

  - 주소록을 수정하면, 기존 주소록을 불러와 벡터로 저장한 뒤 수정 내용을 반영하여 UPDATE가 진행됩니다.

문제를 풀기 위한 키워드를 참고하여 거래소 기능에 존재하는 취약점을 찾아보고, 해결해야 할 질문의 답을 구해 보세요.

해결해야 할 질문

- 메시지를 복원할 수 있는 방법이 있을까요?

  - 바이너리에서 메시지의 메타데이터를 확인하려면 어떻게 해야 할까요?

    - 사용할 수 있는 오픈소스 도구가 있을까요?


Protoss-Baby

- 발생하는 취약점을 이용해서 메모리 주소를 획득할 수 있나요?

  - 기능의 어떤 부분에 취약점이 존재할까요?

    - 정보 획득을 위해 어떤 정보나 기능을 조작해야 할까요?

      - 변경할 수 있는 정보와 기능은 무엇인가요? 필요한 조작을 할 수 있나요?

    - 함수의 입력값과 출력값은 적절하게 설정되어 있나요?

      - mysql 함수에서, 설정 범위를 벗어난 값을 입력하는 경우 발생하는 문제는 없을까요?

    - 임의 주소 쓰기를 가능하게 하는 취약점이 있나요?

      - 이용자가 값이나 내용을 수정할 수 있는 기능이 있나요?

        - 해당 기능의 수정 과정에서 발견할 수 있는 취약점이 있나요?


Protoss-Adult

- 획득한 메모리 주소를 이용해 쉘을 얻으려면 어떤 단계를 거쳐야 할까요?

  - 리턴 주소를 다른 내용으로 덮어서 쉘을 획득할 수 있을까요?

    - 스택 주소를 어떻게 얻을 수 있을까요?

      - 스택 주소를 얻기 위해 라이브러리 주소가 필요해요. 라이브러리 주소를 획득할 수 있는 방법이 있을까요?

        - 저희가 릭을 성공했던 힙 영역에서 라이브러리 주소를 확인할 수 있을까요?

    - 리턴 주소를 어떤 내용으로 덮어 씌우면 좋을까요?

      - system 함수를 비롯한 인자를 설정할 수 있는 가젯을 찾을 수 있나요?

문제를 풀기 위한 키워드

  • C++ 리버싱

  • protobuf 프로토콜

  • String 및 Vector 자료 구조

문제 출제 아이디어

혹시 protobuf라는 프로토콜에 대해 알고 계셨나요? protobuf는 최근에 많은 기업에서 사용하고 있는, 실무에서 자주 접할 수 있는 프로토콜입니다. 5번 문제 Protoss Baby와 6번 문제 Protoss Adult는 해당 프로토콜을 사용하는 바이너리를 분석했던 실무 경험에서 얻은 아이디어를 이용해 제작한 문제였어요. 메시지에 대한 내용이 정의되어 있는 proto 확장자 파일을 받지 못한 상황에서, 어떻게 메시지 원본을 획득하여 기능을 이용할 수 있을지 고민했던 과정과 거래소 시스템에 대한 이해를 바탕으로 기능적인 측면에서 분석을 했던 경험을 문제에 녹여 보았습니다.

출제자의 말

취약점 분석 경험은 있었지만 직접 개발을 할 기회는 많지 않았는데, 이번 문제를 출제하며 기술 스택(protobuf 프로토콜)을 더 깊게 이해할 수 있어 좋았습니다. SA 팀에는 시스템 취약점 분석을 좋아하는 연구원분들이 많이 계셔서, 다양한 경험을 통해 성장하고 싶으신 분들에게는 더 좋은 기회가 될 것이라고 생각해요. 이번 pwnable 문제의 경우 상대적으로 탄탄한 기본 지식을 필요로 하지만, 문제를 풀고 나면 실력의 성장을 많이 느낄 수 있을 테니 열심히 준비한 문제를 꼭 풀어보시면 좋겠습니다.


채용 CTF 후기

이렇게 이번 CTF에 나왔던 6개의 문제를 모두 살펴봤는데 어떠셨나요? CTF 문제로 만나볼 수 있었지만, 모든 문제들은 저희가 실제 업무에서 만날 수 있는 상황들에서 아이디어를 얻어 직접 제작했어요. 채용 CTF에서는 문제를 위한 문제가 아니라, 실제로 업무를 위해 필요한 역량을 물어보고 있으니 다음 CTF도 기대해 주시길 바랄게요.

문제 리뷰에 이어서, 이번에는 채용 CTF에 대한 후기를 들어보겠습니다.

채용 CTF 참가 후기

채용 CTF 기간 중에, CTF 문제를 해결하고 최종적으로 티오리 SA 팀에 합류하게 된 연구원님이 계세요. CTF 참가자의 입장에서 이번 채용 CTF 경험을 어떻게 느꼈는지, 새롭게 합류한 연구원님의 이야기를 들어볼게요.

Q. 안녕하세요. 이번에 채용 CTF를 통해 팀에 합류하게 되었는데, 채용 CTF는 어떻게 알고 참여하셨나요?

A. Dreamhack 배너를 통해서 채용 CTF에 대해 알게 되었어요. 해킹에 관심이 있고 공부해 보려고 찾아본 사람이라면 Dreamhack이라는 플랫폼을 아실 거예요. Dreamhack 홈페이지에 들어가자마자 보이는 배너에서 크게 광고를 하고 있어서, 티오리가 채용 CTF를 진행하고 있다는 사실을 어렵지 않게 알 수 있었습니다.

Q. 저희가 채용 CTF를 3달이 조금 넘는 시간 동안 진행했잖아요. 티오리에 합류하기까지 얼마의 기간이 걸렸나요?

A. 1월 초부터 2월 초까지 대략 한 달 정도의 시간 동안 문제를 풀었어요. 이후 푼 문제와, 풀이를 시도했던 문제에 대한 Write-Up을 작성해서 서류 지원을 진행했습니다. 스킬 테스트를 따로 진행하지 않은 덕에, 서류 지원 후 직무 인터뷰 결과를 받기까지 2주가 채 걸리지 않았어요. 직무 인터뷰 합격 이후에는 레퍼런스 체크와 컬쳐 인터뷰 과정을 거쳐, 최종 합격 결과를 받고 4월부터 출근을 시작하게 되었습니다.

문제 풀이를 포함한다면 3달 정도의 시간이 걸렸지만, 지원 이후로 보면 1달 안에 합류가 결정되었다고 할 수 있을 것 같아요. 합류에 소요되는 시간은 사람마다 다를 수 있지만, 채용 CTF 덕분에 조금 더 빠르게 합류한 것으로 알고 있습니다.

Q. 스킬 테스트가 없어 합류 과정이 빠르긴 했지만, 문제 풀이에 쓰신 시간을 포함하면 오히려 더 많은 시간을 투자하신 것 같기도 해요. 일반적인 채용 절차가 아닌 채용 CTF를 통해 지원한 이유가 있었나요?

A. 여러 상황이 복합적으로 저에게 맞았던 것 같아요. 보안에 관심이 있어 이 분야로 취업할 생각을 하고 있었는데, 마침 취업을 준비하는 시간에 채용 CTF가 진행 중이었어요. 저는 웹 해킹 문제를 푸는 걸 좋아해서 한번 풀어볼까?라는 생각으로 도전할 수 있었습니다.

보안을 공부하는 입장에서 티오리는 정말 잘하는 사람만 갈 수 있는 곳이라는 이미지가 있었어요. 그래서 지원하려면 더 실력을 길러야 한다는 생각이 있었는데, 채용 CTF는 시간이 될 때 문제를 풀어보고 혹시 문제를 많이 풀지 못한다면 지원을 하지 않으면 된다는 생각으로 임할 수 있어 부담감이 적어 좋았습니다.

이번 채용 CTF가 아니었다면 저는 티오리에 합류하지 못했을 수도 있다고 생각해요. 제 실력에 대한 확신이 없었기 때문에, 일반 채용 절차에서 짧은 제한 시간이 주어지는 스킬 테스트에 지원할 마음을 가지기는 어려웠을 것 같아요.

💬 SA 팀의 이야기

물론 이번에 CTF를 통해 합류한 연구원님은 뛰어난 실력을 가지고 계셨습니다. 하지만, 1주일 정도의 짧은 시간이 주어지는 스킬 테스트와 비교해 볼 때, 3달이 넘는 시간이 주어졌던 채용 CTF는 공부를 한다는 생각을 가지고 시간에 대한 부담 없이 참여할 수 있었다는 결론이네요. 실제로 상대적으로 실력이 부족하다고 느끼시는 분들도, 많은 시간을 투자한다면 충분히 문제 풀이에 도전할 수 있었을 거예요.

취업을 준비하는 기간에는 시간을 비워둬야 하는 스킬 테스트 일정이 많이 부담이 되기도 하는데, 공부해서 실력을 쌓고 지원해 보자는 생각을 가지신 분들에게는 채용 CTF가 좋은 기회가 되었을 것 같아요. 저희 SA 팀도 실제로 티오리의 Dreamhack을 열심히 이용해 주신 분들에게 감사한 마음이 있어서, CTF와 워게임에 관심과 열정을 가진 팀원을 찾고 싶다는 생각이 있어 이번 채용 CTF를 기획하게 되었어요.

Q. 적절한 시기에 CTF를 진행해서 다행이었네요. 채용 CTF를 통해 합류하신 소감을 말씀해 주세요.

A. 취업 준비를 하고 있던 저에게 티오리가 채용 CTF를 진행하는 것은 정말 기쁜 소식이었어요. 저는 평소에 워게임 문제를 푸는 것을 좋아해서 도전해 보자는 마음을 먹었습니다. 6문제 중 pwnable 문제 2개를 전혀 풀지 못해 지원해도 될까 고민을 조금 했지만, 문제 풀이를 시도한 과정도 받아준다는 말에 자신감을 얻어 지원할 수 있었어요. 조금의 불안감은 있었지만 그래도 다른 문제들을 풀지 못한 건 아니니 지원해 보자는 생각으로 지원하였고 Write-Up도 열심히 작성한 덕분에 최종 합격이라는 좋은 결과를 얻을 수 있었습니다.

저의 경우, 제가 좋아하는 워게임 문제 풀이 방식을 통하여 제가 가진 역량을 잘 보여드릴 수 있어서 채용 CTF를 통한 채용 과정이 정말 좋았어요. 평가하시는 분들 입장에서도 일반 채용과 비교했을 때 지원자의 역량을 더 잘 알 수 있었는지도 궁금하네요.

💬 SA 팀의 이야기

단순히 문제를 풀 수 있는 능력보다도, 문제의 정답을 맞추기 위해 어떤 근거를 가지고 논리적으로 접근 했는지 보고 싶었는데, 저희가 직접 출제한 문제를 바탕으로 한 덕분에, Write-Up과 인터뷰를 통해 그 부분을 파악할 수 있어서 더 수월한 평가가 가능했어요. 채용하는 입장에서도 이번 채용 CTF 경험을 긍정적으로 생각하고 있습니다👍

Q. 양쪽 모두에게 만족스러운 채용 경험이었던 것 같아 다행이에요. 채용 CTF 후기 포스트를 읽어보실 독자분들에게 하고 싶은 말이 있다면 자유롭게 부탁드려요.

A. 너무 두려워 하지 말고, 자신감을 가지고 일단 도전해 보시면 좋겠습니다. 채용 CTF의 경우 기간이 길어서 충분히 필요한 내용을 학습하며 진행하는 것도 가능했어요. 저는 이번에 문제를 풀며 스프링 프레임워크를 처음 접했는데, 채용 CTF에 참여하며 새로운 기술 스택에 대해 공부할 수 있어서 너무 좋았습니다. 문제를 다운로드 받고 무엇을 해야 할지 몰라 처음에는 엄청 막막했는데, 이 파일을 어떻게 분석해야 하지? 생각하는 과정에서 다양한 개념과 도구를 찾아보며 자연스럽게 공부를 할 수 있었어요.

IT 분야의 취업을 준비하시는 분들은 자격증 공부, 대외활동, 코딩테스트 준비를 포함한 여러 활동들을 하며 넓은 영역을 어디부터 공부해야 할지 방향성을 잡는 것도 쉽지 않잖아요. 이렇게 문제를 풀 때 필요한 내용을 공부하며, 다음에 무엇을 해야 할지 고민하고 공부 방향성을 잡을 수 있다면 자신이 성장하는 것도 빠르게 느낄 수 있고, 또 팀 합류 이후에 업무 적응도 수월하니까 장점이 많은 것 같아요. CTF에 참여했던 경험이 사라지는 것이 아니니, 열심히 준비하며 꼭 도전해 보시면 좋겠습니다.

채용 CTF 운영 후기

지금까지 채용 CTF를 통해 티오리에 합류하신 연구원님의 후기를 들어봤어요. SA 팀에서도 이렇게 성공적으로 회사와 팀에 도움을 줄 수 있는 새로운 연구원을 찾았다는 점이 만족스러울 것 같은데, 채용 CTF 운영을 담당하셨던 연구원님의 후기도 한번 들어보겠습니다.

Q. 채용 CTF를 운영하신 소감과 후기를 말씀해 주세요.

A. 이번 채용 CTF는 지원을 독려하기 위한 목적을 가지고 저희 Security Assessment 팀원 모두가 함께 기획한 CTF였어요. 이번에 출제한 모든 문제는 실제 컨설팅을 수행하면서 얻은 경험을 바탕으로, 재미 요소를 결합하여 제작했습니다. 저희 나름대로 어떻게 해야 많은 분들이 참여하고, 또 지원으로 이어질 수 있을지에 대해 많은 고민을 했던 이벤트였다고 생각해요.

CTF가 시작되고, 저희가 예상했던 것보다 훨씬 많은 분들이 채용 CTF에 참여해 주셨어요. 중반 시점에는 많은 분들이 밤낮을 가리지 않고 문제 풀이를 시도해 주셨는데, 로그 기록을 보며 그 열정에 놀라고, 또 동시에 감사했습니다. 이벤트 종료 기간까지 300명이 넘는 분들이 문제 풀이 시도를 해 주셔서 정말 영광스럽게 생각하고 있고, 더 나아가서 CTF를 통해 우리 팀과 함께 사이버 보안의 난제를 해결해나갈 인재분들을 만나게 되어 너무 감사한 시간이었습니다.

바쁜 와중에서 기획부터 출제까지 전 과정을 도맡아 마무리까지 완벽하게 해준 우리 SA 팀과, 이번 채용 CTF의 운영과 지원에 힘써주신 Dreamhack 팀, P&C 팀에게 모두 고생 많으셨고 감사하다는 말씀을 전하고 싶습니다.

참여해 주신 분들에게도 다시 한번 감사하다는 말씀을 드리고 싶어요. 다음 채용 이벤트를 진행할 때는 보다 나은 기획 또는 다른 방법을 통해 더욱 매력적이고 재미있는 이벤트가 될 수 있도록 노력하겠습니다. 모두 감사합니다!


마치며

이렇게 저희 티오리 SA 팀에게 채용 CTF는 팀이 필요로 하는 인재를 선발할 수 있었고, 또 선발 과정에서 많은 보람을 느낄 수 있었던 감사한 경험이었습니다.

아마 이번 채용 CTF에 참여하신 분들 중 다수가 ‘티오리에 합류하려면 어느 정도 실력이 되어야 할까?’를 궁금해 하셨을 것 같아요. 저희는 항상 실력이 뛰어난 분들을 모시고 싶은 마음을 가지고 있지만, 지금 조금 부족한 점이 있더라도 티오리의 가치에 공감하고, 성장하고 싶은 마음을 가진 분들의 지원도 기다리고 있어요. 이번 CTF와, 이 포스트를 통해 그 마음이 잘 전달되었기를, 그리고 필요로 하시는 부분에 대한 도움이 되었기를 바랍니다.

🎁 SA 팀 Hiring CTF 문제 풀이 이벤트(~ 2024년 6월 30일)

비록 이번 채용 CTF는 끝이 났지만, 이번 포스트를 통해 전해드린 힌트를 바탕으로 이번 CTF에 나왔던 6문제를 모두 풀고, Dreamhack에 Write-Up을 등록한 후 연락을 주신 분들에게는 감사의 의미로 SA 팀과 함께하는 점심🍱 또는 카페☕ 타임을 제공하려고 합니다. 많은 관심 부탁드려요!

  • Dreamhack 워게임에 올라온 이번 채용 CTF 문제 6개를 모두 풀고 Write-Up을 등록하신 후, Dreamhack 닉네임과 이메일을 적어 [SA 팀 Hiring CTF 문제 풀이 이벤트 참여 신청]이라는 제목의 메일을 withtheori@theori.io로 보내주시면 됩니다.

채용 CTF 시스템(by Dreamhack)

또, 이번 기회에 회사의 Dreamhack 팀이 자랑하는 채용 CTF 시스템을 이용해 볼 수 있었는데요. 회사가 필요로 하는 좋은 인재들을 만날 수 있는 기회이니 인재를 필요로 하는 보안 회사에서는 꼭 한번 고려해 보셨으면 좋겠습니다. 저희 SA 팀의 경우 기획하고 싶은 문제들이 있어 채용 CTF의 문제를 직접 제작했지만, 문제를 출제하는 것에 부담이 있다면 티오리 연구원들의 도움을 받아 기업에서 필요로 하는 인재를 선발하기 위한 문제를 맞춤 제작할 수도 있습니다. 채용 CTF 개최에 관심이 있으시다면 dreamhack@dreamhack.io로 문의를 남겨주세요.


About Theori Security Assessment

티오리 Security Assessment 팀은 실제 해커들의 오펜시브 보안 감사 서비스를 통해 고객의 서비스와 인프라스트럭처를 안전하게 함으로써 비즈니스를 보호합니다. 특히, 더욱 안전한 세상을 위해 난제급 사이버보안 문제들을 해결하는 것을 즐기며, 오펜시브 사이버보안의 리더로서, 공격자보다 한발 앞서 대응하고 불가능하다고 여겨지는 문제를 기술중심적으로 해결합니다.

  • Security Assessment 팀의 오펜시브 보안 감사 서비스에 대해 더 궁금하시다면? contact@theori.io 로 문의 바랍니다.

세계 최고 보안 전문가와 서로를 존중하며 함께 성장하는,
티오리는 지금 인재 영입 중입니다 😎

We are hiring! 🔗 https://theori.io/ko/career/hiring

Share article

관련 콘텐츠

See more posts

Theori © 2025 All rights reserved.