해당 문제에 해당하는 내용은 아래와 같다.
접속 정보에 나와있는 페이지를 들어가면 FLAG 게시글에 해당하는 'no' 부분은 값이 없는 것을 볼 수 있었다.
첫번째 게시글과 관련된 내용은 아래 사진과 같고, 'no'값이 없는 게시글을 제외하고는 아래 이미지처럼 화면에 메시지가 뜨는 것을 확인할 수 있다.
FLAG 게시글에 대한 정보를 얻고자 클릭해보았더니 다음과 같이 Alert로 경고문이 뜬 것을 볼 수 었다.
밑에 Write 버튼을 누르면 아래와 같은 화면이 나오고 게시판에 글을 등록할 수 있는 시스템인 것 같다.
새로운 게시물을 작성하여 업로드하고자 임의의 값을 넣어 게시물을 작성해주었다. 'Save' 버튼을 누르고 이전 화면으로 돌아가니 가장 마지막 줄에 내가 입력한 값들이 있는 것을 확인할 수 있었다.
이번에는 'secrect' 부분에 체크를 하고 임의의 게시판을 하나 만들어 보았다.
이후 아래 이미지를 통해 'Secret' 박스를 클릭한 후 생성된 게시물에는 'no' 값이 표시되지않고 있음을 확인할 수 있었다. 이 부분을 통해 FLAG에 해당하는 게시글도 'Secret'이 체크된 상태로 작성되었음을 추측할 수 있다.
여기서 더 찾을 수 있는 부분은 없을 것 같아서 문제에서 주어진 파일을 다운로드 받아 소스코드를 확인해보았다. 소스코드를 보면서도 어떻게 해결해야할지 감이 안와서 검색해서 알아보니 파이썬 코드를 작성하여 문제를 풀 수도 있고, 규칙성을 찾아서 대입해보며 풀 수 있다는 것을 발견하고 우선 파이썬 코드부터 시도해봤다.
파이썬 코드를 통해 문제를 해결하려고 하였으나 파이썬 코드를 넣었음에도 불구하고 문제가 해결되지 않아 우선 아래 파이썬 코드로 문제 해결하는 방식을 넣어두고 다른 방식으로 다시 접근해보고자 한다.
개발자 도구를 통해 JSON 형식의 데이터를 넘겨준 서버의 주소를 확인해보니, api/board에서 넘겨주는 것을 볼 수 있었다. 이처럼 API 서버가 있다는 것은 혹시 no 값을 넘겨주면 내용도 넘겨주는 기능도 만들어 게시물의 내용을 채울 수 있지 않을까 하는 생각해서 다음 내용을 진행하였다.
이 부분을 위해서는 내용을 API 서버로부터 넘겨받으려면 /api/board/bo으로 넘겨주어야 한다.
하지만 FLAG 게시물은 no가 없어 MongoDB의 ObjectID가 어떤 구조로 이루어진 데이터인지를 알아야 한다.
- 618b62c96070fd2f29ed7bfa : timstamp를 뜻하는 자리
- 618b62c96070fd2f29ed7bfa : 프로세스 당 한번 생성되는 임의의 값
- 618b62c96070fd2f29ed7bfa : counter를 뜻하는 자리
해당 정보들을 활용하여 파이썬 코드를 짜고 FLAG의 no를 찾아볼 수 있다.
우선, 다른 게시물에서 공통되는 부분은 임의의 값 부분이 모두 같을 것이라고 한다.
또한, counter 자리는 한번 등록될 때마다 1씩 증가됨으로 FLAG 게시물의 counter는 ed7bfc로 추측할 수 있다.
다음으로 Timestamp는 DB에 생성한 시간이 두번째 게시물과 3초 차이가 나기 때문에 두번째 게시물의 timestamp에서 +3을 하면 된다.
따라서 다음과 같이 파이썬 코드를 작성할 수 있고, 해당 코드로 FLAG의 ObjectID를 구하여 해당 값을 API 서버에 넣은 후, FLAG의 내용을 요청하면 FLAG 게시물의 내용 속에 있는 값을 확인할 수 있다고 한다.
timestamp = 0x618B62CE + 3
print(hex(timestamp)[2:] + "6070fd2f29ed7bfc")
[참고자료] https://lrtk.tistory.com/58
여기까지가 파이썬 코드를 활용하여 문제를 해결할 수 있는 풀이에 관한 내용이었다.
파이썬 코드로 해결이 안되었기 때문에 MongoDB의 ObjectID 개념을 사용하여 하나씩 대입해보면서 문제를 해결해보고자 한다.
- 6451cf70663c725d58a9214e
- 6451cf72663c725d58a9214f
- 6451cf7?663c725d58a921??
- 6451cf76663c725d58a92151
우선 0, 2, ?, 6을 보니 ?에는 4가 들어갈 것 같다.
마지막 두 자리인 4e, 4f, ??, 51 부분에서는 4h~50까지 모든 값을 넣어보았지만...
계속 이런 화면만 나오고 실패했다....
어디서부터 잘못된건지는 모르겠지만 다음에 다시 MongoDB에 대한 내용을 학습한 후에 다시 풀이를 진행해보아야 할 것 같다..
'CTF' 카테고리의 다른 글
[Dreamhack] [wargame.kr] login filtering (0) | 2023.05.03 |
---|---|
[Dreamhack] session-basic (0) | 2023.05.02 |
[Dreamhack] session (0) | 2023.04.12 |
[Dreamhack] image-storage (0) | 2023.04.12 |
[Dreamhack] command-injection-1 (0) | 2023.04.12 |