| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- dreamhack #rev-basic #reversing
- Layer7 #해킹 #동아리 #시연회 #부엉이
- Systemhacking #Pwnable #CTF #Write-up #WolvCTF
- pointer
- 이너
- amd64 #x86-64 #x64 #레지스터 #컴퓨터 구조
- 포인터_보고서
- Webhacking #CTF #Write-up #WolvCTF
- Today
- Total
stxxp
[WolvCTF] Web: The Gauntlet write-up 본문

Gauntlet의 의미 그대로 웹페이지 10개를 클리어해야 flag를 얻을 수 있는 문제였다. 각 페이지마다 차근차근 작성해보려고 한다.

주어진 링크를 클릭하면 위와 같은 페이지가 나온다.

Elements에서 코드를 확인해보면 주석에 다음 페이지로 넘어갈 수 있는 키가 냅다 보인다.

이렇게 하면 첫 번째 페이지가 나온다. 읽어보니 HTTP Request에 주어진 헤더를 추가하면 숨겨진 페이지로 이동할 수 있을 것 같다.
burp suite의 proxy를 사용했다. (접은 글 참고)




헤더를 주면 새로운 페이지로 넘어갈 수 있게 된다.

넘어온 두 번째 페이지다.

첨부되어 있는 링크를 따라 들어가면 HTTP Request 메서드들과 각각의 쓰임에 대해 정리되어 있는 페이지가 뜬다.
여기서 OPTIONS 메서드는 브라우저가 서버에게 지원하는 옵션들에 대해 미리 요청하고 허가된 것을 확인할 요청에 한해 전송할 때 사용된다. 보안상의 목적으로 존재하는 것 같은데 이 메서드를 Request에 넣어 보내면

위와 같이 새로운 페이지가 주어진다.

세 번째 페이지다. "wolvsec"라는 이름의 파라미터를 Query String으로 "c#+l"라는 값을 넣어 전달하면 숨겨진 페이지를 확인할 수 있다는 것 같다.
?wolvsec=c#+l
처음엔 별 생각없이 이를 그대로 붙여넣었는데 '#'이 주석으로 인식되어 뒷부분이 출력되지 않았다.
c%23%2Bl (디코딩된 값)
'#' 이후를 디코딩하여 다시 보내면

다음 페이지로 넘어갈 수 있게 된다.

네 번째 페이지다. POST 방식으로 위와 같은 헤더를 붙이면 바디에 wolvsec=rocks를 삽입했을 때 문제가 해결될 듯 보인다.

Burp Suite에서 파라미터를 추가해주면

헤더와 Content 길이까지 자동으로 붙여줘서 편하게 링크를 얻을 수 있다. 참고로 헤더와 바디는 엔터(\n)로 구분되어 있으니 바디 부분에 추가되어야 하는 wolvsec=rocks는 한 칸 띄어서 넣어줘야 한다.

다섯 번째 페이지는 main 페이지에서와 같이 그냥 주어졌다.

여섯 번째 페이지에 들어왔는데 본문을 읽어보니 URL 주소가 5번 페이지에서 얻은 주소와는 다르다는 것을 말해주고 있다.
5번 페이지에서 얻은 주소: /hidden~9
6번 페이지 주소: /hidden~7
여기서부터 기억이 잘 안나서 좀 헤맸다. 갈 길이 멀었는데

분명 Network에서 리다이렉트 하는 것을 확인했는데 이상하게 이번엔 보이지 않았다.

Burp Suite로 난리치다가 문득 5번 페이지로 돌아가야 했던 것 같아 5번 페이지 창에서 6번 페이지로 새로고침하니 드디어..! ~9로 진입하는 순간 ~9 >> ~8 >> ~7 순서로 리다이렉트했기 때문에 6번 페이지가 뜬 것이었다.

중간에 순식간에 리다이렉트하여 보이지 않았던 ~8 주소를 Request에 넣어주면 새로운 페이지로 넘어갈 수 있다.

일곱 번째 페이지다. 처음 접속했던 page 1을 500번 접속하면 해결되는 것 같다.

접속 정보를 저장하고 있는 cookie-counter의 값을 500으로 넣어주면

다음 페이지로 넘어갈 수 있다.

여덟 번째 페이지다. 아까와 비슷하게 현재의 페이지를 500번 방문하면 해결될 것 같다.

문제에서 주어진 JMT 사이트에서 위와 같이 파라미터를 변경하는 payload를 인코딩하여 얻을 수 있다.
참고로 secret-key는 8번 페이지의 html 주석을 확인하면 알 수 있다.

Cookie에 인코딩된 값을 넘기면 새로운 페이지로 넘어갈 수 있다.

마지막 관문이다. 9번 페이지를 1000번 방문하면 flag를 얻을 수 있을 것이다. 다만, 방금 사용했던 JMT는 이번 문제에서 적용할 수 없을 것 같아 보인다.. 직접 1000번 새로고침할 수도 있지만.. 좀 무리이니 자동으로 1000번을 방문하는 매크로를 돌려보자.
python의 requests 모듈을 사용하면 쉽게 해결할 수 있다. 직접 돌려보면 생각보다 시간이 오래 걸린다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import requests
# 요청을 보낼 URL
url = 'https://gauntlet-okntin33tq-ul.a.run.app/hidden83365193635473293'
# 초기 쿠키 설정
ckie = {'jwt-uncrackable-cookie-counter':'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb3VudGVyIjoyfQ.mmGFwHhAssPPS6Xq3ptN1ViB7T4B_3KaAKySvnhdlUk'}
for i in range(1000):
# HTTP GET 요청
r = requests.get(url, cookies=ckie)
# 응답에서 받은 쿠키 저장
ckie = r.cookies.get_dict()
print(i)
print(ckie)
|
cs |

드디어 마지막 페이지로 갈 수 있다!

flag 획득!!
wctf{w3_h0p3_y0u_l34rn3d_s0m3th1ng_4nd_th4t_w3b_c4n_b3_fun_853643}
'Security > WebHacking' 카테고리의 다른 글
| HackCTF(Web) | 보물 & login (0) | 2020.11.06 |
|---|