NewAPI
가장 먼저 소스코드를 확인할 수 있지 않을까 해서 url에 /source를 넣어보았지만 볼 수 없었다.
피들러들 켜서 패킷을 잡고 응답창에 raw를 자세히 보니 uvicorn이라는 처음 보는 단어가 있었다.
바로 구글링을 해보았다.
uvicorn 구글링 결과)
uvicorn은 비동기 웹 어플리케이션을 실행하기 위한 고성능 서버이다. 이는 FastAPI와 같은 비동기 프레임워크와 함께 사용하기에 적합하며, 일반적이라고 한다.
그렇다면 FastAPI는 무엇인지 구글링 해보았다.
결과) FastAPI는 파이썬 3.6+에서 작동하는 웹 프레임워크이다. FastAPI의 장점 중 하나는 문서 자동화로 코드를 작성하면 자동으로 대화형 API문서를 제작해 준다고 한다. -> docs(대화형 API문서)와 redoc(대안 API문서)
먼저 docs로 들어가려고 시도해 봤지만 막혀있는 것을 확인하였다.
다음으로 redoc로 들어가 봤더니 위 사진처럼 API 문서가 나오는 것을 확인할 수 있었다.
API 문서를 쭉 확인하다 보니 url을 통해 로그인할 수 있는 부분을 발견하여 바로 url에 넣어보았다.
가장 간단하게 /loginAction을 통해 들어가 보려고 하였지만 실패하였다.
어떻게 하면 들어갈 수 있을까 고민하다가 API 문서를 자세히 보니 로그인하기 위한 url이 GET이 아닌 POST 방식으로 이뤄지고 있다는 것을 확인할 수 있었다.
POST http://localhost:5010/loginAction HTTP/1.1
Host: localhost:5010
Content-Type: application/json; charset=UTF-8
{
"user_id": "guest",
"password": "guest"
}
이후 GET 방식이 아닌 POST 방식으로 변경하는 코드를 작성해주었다.
구글링을 통해 피들러에서 요청 패킷을 사용자가 작성해서 보낼 수 있는 composer 기능을 알게 되었고, 여기서 Raw에 작성한 함수를 넣어준 뒤 Execute를 눌러서 요청을 보내줬다.
다시 돌아와서 응답창을 확인해보니 드디어 토큰을 볼 수 있었다...!
<해당 내용>
{"user_id":"guest","password":"guest","success":true,"msg":"welcome guest! This is our new service!",
"Token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZ3Vlc3QifQ.JFXLkhEJI6cwZYsIDW6smJjJ5qg18x4GeiFmH7mzVIM"}
원래 내가 알던 토큰의 형식이 아니라서 찾아보니 이 토큰은 JWT이라는 것을 알게 되었다.
+) JWT : Json Web Token은 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.
자세한 설명은 따로 정리한 티스토리 참고하기
<JWT 디코딩 해주는 사이트>
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
JWT를 디코딩 할 수 있는 사이트를 찾아서 얻은 토큰을 디코딩해보았다.
페이로드 부분에서 user_id를 guest -> admin으로 변경하여 얻은 토큰값이다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYWRtaW4ifQ.eIoIhSYmcaKDgn5ADDldZIbE4444NkglSgPrZJAF68Y
토큰값과 아이디, 시스템 명령어를 넣을 수 있는 url을 활용하여 flag 값을 알아볼 것이다.
url을 그대로 넣어보았더니 위 사진처럼 막혀있는 것을 확인할 수 있었다.
POST http://localhost:5010/s3cr3t/WDJ11wiao223wWJ24d41jnW5K1Ja7do98AO HTTP/1.1
Host: localhost:5010
Content-Type: application/json; charset=UTF-8
{
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYWRtaW4ifQ.eIoIhSYmcaKDgn5ADDldZIbE4444NkglSgPrZJAF68Y",
"user_id": "admin",
"cmd": "ls"
}
API 파일의 내용을 이용하여 해당 함수를 작성하였다.
작성한 함수를 loginAction과 같은 방법으로 적용시켜보았지만 실패하였다.
구글링을 해보니 관련 문제는 Burp Suite를 사용하여 JSON Web Tokens 도구를 사용하면 JWT None 알고리즘 공격을 쉽게 할 수 있다고 나와있었다. 그래서 설치 후 작성한 함수를 넣고, Signature를 none로 변경하는 None 알고리즘 공격을 시도해 보았지만 none, None, NONE, nOnE 모두 먹히지 않았다.
문제점을 파악하고자 피들러에서 가능했던 구문을 Burp Suite에 넣어보았더니 여기서는 안 되는 것을 확인할 수 있었다.
무엇이 문제일까 고민을 하면서 이것저것 시도해 보다가 다시 처음으로 돌아가서 함수를 다시 작성한 후 넣어주니 피들러에서 얻었던 것과 똑같이 토큰 값을 얻을 수 있었다.
앞 과정에서 만들었던 함수를 이용하여 토큰 값과 아이디, ls 명령어를 사용하는 함수를 만들어주었다.
이를 통해 flag가 있다는 것을 알아낼 수 있었다.
이후 cat 명령어를 통해 flag의 내용을 보려고 시도해보았으나 실행할 권한이 없다고 나왔다.
cat과 거의 비슷한 역할을 하는 명령어인 more를 넣어보았다.
그랬더니 드디어 플래그 값을 얻을 수 있었다.
“::::::::::::::\nflag\n::::::::::::::\nseKUCTF{H3!L0_@dm1n_!Ts_M3_MARIo}"

이 문제를 풀면서 느낀 점 : 너무 힘들었다... 그냥 너무 힘들었어요...
'Web - 실습' 카테고리의 다른 글
forcelogin 2 (0) | 2023.04.05 |
---|---|
forcelogin 1 (0) | 2023.04.02 |
forelength (0) | 2023.03.26 |
pingservice (0) | 2023.03.21 |
HelloCTF (0) | 2023.03.19 |