0. Intro

TeamH4C에 가입하여 처음으로 참가한 CTF 대회 입니다.

저는 웹만 풀었는데,, 다른 분들이 웹 외의 분야도 많이 풀어서 19등으로 마무리 되었네요.

 

 

웹 문제는 쉬운 문제를 제외하고, 풀이를 작성하려고 합니다.

 

 

1. web / point

이 문제는 golang 으로 작성된 web 문제 입니다. go 언어에 대해 지식이 없지만, 이번 기회를 통해 풀어보려고 했습니다.

 

 

POST 방식으로 전송하면, body에 특정 문자열이 있는지를 검증하고 있습니다. 아래 코드에서는 2번째 if 문에서 `what_point` 와 `\` 를 필터링 하고 있네요. 이후, `json.Unmarshal()` 함수를 통해 body 값을 json parsing 하고 있습니다.

 

 

json paring 결과는 `whatpoint` 변수에 저장되는데, 이 변수는 `importantStuff` 라는 구조체 변수입니다.

이 구조체는 아래 코드와 같습니다. 맴버 변수는 `Whatpoint` 이고, 값은 `what_point ` 기본값으로 설정되어 있습니다.

 

flag를 획득하기 위해서는 body 값에 `{"what_point" : "that_point"}` 로 전송해야 합니다. 하지만, if 문에서 `what_point` 라는 문자열을 필터링 하고 있습니다.

 

 

여기서 짚고 가야할 부분은 `json.Unmarshal()` 함수 입니다. 이 함수의 DOCS를 보면 다음과 같이 설명되어 있습니다.

https://pkg.go.dev/encoding/json#Unmarshal

JSON을 구조체로 분리하기 위해 Unmarshal은 들어오는 객체 키를 Marshal이 사용하는 키(구조 필드 이름 또는 태그)와 일치시키지만 대소문자를 구분하지 않는 일치를 선호합니다. 기본적으로 해당 구조 필드가 없는 개체 키는 무시됩니다.

 

즉, `json.Unmarshal()` 함수 실행 결과를 구조체에 넣게 된다면, key의 대소문자 일치 여부를 확인 하지 않는다고 합니다.

따라서 if 문을 우회하기 위해서는 `{"what_point" : "that_point"}` 에서 `{"What_point" : "that_point"}` 처럼 key에 대문자를 넣으면 우회 및 원하는 key의 값에 접근할 수 있습니다.

import requests

target = "https://point.mc.ax/"

payload = {"What_point":"that_point"}
res = requests.post(target, json=payload)

print(res.text)

`Congrats! Here is the flag: hope{cA5e_anD_P0iNt_Ar3_1mp0rT4nT}`

 

 

 

2. web / mk

이 문제는 CSP를 우회하여 admin의 cookie를 탈취하는 문제 입니다.

 

 

맨 처음, 이 문제에 CSP가 일치 하지 않았습니다. 문제 서버에 설정된 CSP와 첨부파일에 있는 CSP 가 달랐습니다. 

우선 로컬에서 테스트를 하면서 CSP 우회를 시도했습니다. 처음에는 Google recaptcha를 이용한 CSP 우회 방법인 줄 알았습니다. 그래서 찾아본 결과 Google recaptcha를 통한 CSP 우회 기법들이 존재 했습니다.

https://gist.github.com/terjanq/e2198440c4fdfbdec43e921b600d4a1d#recaptcha-for-the-rescue

 

하지만, 위 payload로는 단순 callback 함수를 실행하고, 더이상 추가적인 javascript 코드를 작성할 수 없었습니다.

위 링크에서는 DOM Clobbering을 통해 XSS를 시도했지만, 이 문제에서는 그러한 공격을 수행할 곳이 없었습니다. 

 

다시 초심으로 돌아가서 CSP를 천천히 의미를 해석하며 분석했습니다. 

default-src 'self';
base-uri 'self';
frame-ancestors 'none';
img-src 'none';
object-src 'none';
script-src 'self' 'unsafe-eval';
script-src-attr 'none';
style-src 'self' 'unsafe-inline'

 

 

Google CSP evaluator 에서는 script-src에서 보안 결함이 있다고 알려주고 있습니다.

이 문제 서버에는 js 파일을 업로드 할 수 있는 기능이 존재하지 않습니다. 따라서 `self` 에서는 attack vector가 없습니다.

남은건 `unsafe-eval` 입니다.

 

 

해당 문제는 MathJax라는 javascript 라이브러리를 사용하고 있습니다. 이 파일들은 CSP에 받지 않습니다. js 파일을 로드할 때도 문제가 없고, 실행할 때도 문제가 없습니다.

 

 

그렇다면, 해당 js 파일을 로드하고 `script` 태그 안에 javascript 코드를 작성하면 CSP에서는 MathJax 파일 안에서 javascript 코드를 실행한 것으로 간주해서 CSP를 우회할 수 있지 않을까라고 생각 했습니다.

 

아래 코드처럼 테스트를 해본 결과, CSP를 우회하여 XSS가 동작하는 것을 볼 수 있습니다.

<script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-MML-AM_CHTML">alert(document.domain)</script>

 

 

최종적으로 admin의 cookie를 탈취하면 flag를 얻을 수 있습니다.

`hope{make_sure_to_check_your_dependencies}`

'CTF' 카테고리의 다른 글

DiceCTF 2022 writeup  (0) 2022.07.25
[WACon 2022] yet_another_baby_web  (0) 2022.06.28
[WACon 2022] ppower write up  (2) 2022.06.28
[WACon 2022] Kuncɛlan write up  (0) 2022.06.27
zer0pts ctf 2022 GitFile Explorer write up  (0) 2022.03.27
hayyim CTF 2022 writeup  (0) 2022.02.13