문제 설명
처음에는 이 웹 앱이 간단해 보이지만, 표면 아래에는 더 많은 것이 숨어 있습니다. 사용자 인증을 위해 토큰에 의존하지만, 모든 것이 보이는 것만큼 안전한 것은 아닙니다. 자세히 살펴보면 시스템의 신뢰가 조작될 수 있다는 것을 알 수 있습니다.
비밀은 이 토큰이 사용되는 방식 안에 숨겨져 있습니다. 숨겨진 것을 해제할 열쇠를 찾을 수 있나요? 도전은 당신이 그것을 깨기를 기다리고 있습니다.
문제 풀이
문제 페이지에 접속하면 아래 이미지와 같이 로그인을 하기 위해서는 /login 엔드포인트에 방문해야 한다는 사실을 알 수 있다.
/login 페이지에서는 JSON 페이로드와 같은 POST 요청을 보내야 한다고 이야기하고 있다.
{"user":"ace","pass":"ctf"}의 자격 증명에는 관심이 없기 때문에 칼리리눅스의 curl로 엔드포인트를 테스트한다.
※JSON 데이터로 요청을 보내기 위해서 Content-Type 헤더를 application/json으로 설정해야 한다.
토큰 값이 응답값으로 왔으며, 이는 jwt.io(https://jwt.io/)를 이용해서 내용을 확인할 수 있다.
위 JWT 알고리즘은 HS256이고, 현재 guest 사용자임을 알 수 있다. 문제점은 이 토큰을 보낼 엔드포인트를 모른다는 것이고, 이를 해결하기 위해 이 토큰으로 엔드포인트 /login에 POST 요청을 보내면 아래 이미지와 같이 반환한다.
그리고, user와 pass를 사용하여 토큰을 POST 요청하면 토큰이 다시 반환되는 것을 확인할 수 있다.
이외 소득이 없어 robots.txt 파일이 있는지 확인해 보기로 하였다.
robots.txt 파일이 존재했고, 이 페이지에서 /flag 엔드포인트가 있음을 알 수 있다. 이 엔드포인트에 POST 요청을 보내서 어떤 응답이 돌아오는지 확인해 보도록 하겠다.
반환값을 통해 토큰을 POST 요청해야 함을 알 수 있고, 이 엔드포인트로 보낼 데이터의 형식을 모르기 때문에 JSON 데이터로 시도한다.
admin이 아니기 때문에 실패하였다. 따라서 JWT의 user 키 값을 guest에서 admin으로 변경해야 한다. 변경한 토큰은 아래와 같다.
이제, 변경된 토큰을 /flag 엔드포인트에 다시 보낸다.
반환값으로 플래그 값이 나온 것을 알 수 있다.
ACECTF{jwt_cr4ck3d_4dm1n_4cce55_0bt41n3d!}
'CTF > Web' 카테고리의 다른 글
[ApoorvCTF 2025] SEO CEO (0) | 2025.03.03 |
---|---|
[ACECTF] Bucket List (0) | 2025.03.01 |
[ACECTF] Webrypto (0) | 2025.03.01 |
[ACECTF] Buried Deep (0) | 2025.03.01 |