문제 정보

node와 mongodb로 구성된 게시판입니다.
비밀 게시글을 읽어 FLAG를 획득하세요.

  • MongoDB < 4.0.0

풀이 힌트

1. MongDB의 ObjectID 구조

참고 사이트 : https://docs.mongodb.com/manual/reference/method/ObjectId/

문제 풀이

더보기

문제 페이지에 들어가니, 서버가 생성될 때 자동으로 값들이 등록이 된 것을 볼 수 있었다.
현재 눈으로 보이는 특이점은 FLAG 게시물은 no가 없다는 것이다.

 

첫번째 페이지에 들어가니, 위와 같은 게시물 내용이 있었다.

 

FLAG 게시물은 Secret Document라는 Alert가 떴다.
여기까지 확인해본 결과, 이 페이지는 싱글 페이지로 제작된 페이지로 보였다.

 

개발자 도구를 이용하여 주고 받는 데이터가 있는지 확인해봤다.
index 페이지에선 JSON 형식으로 데이터의 주요 정보를 주고 받는 것이 확인됐다.

 

JSON 형식의 데이터를 넘겨준 서버의 주소를 확인해보니, api/board에서 넘겨주는 것을 볼 수 있었다.
이처럼 API 서버가 있다는 것은 혹시 no 값을 넘겨주면 내용도 넘겨주는 기능도 만들어서 게시물 내용을 채우도록 하지 않았을까? 라는 생각으로 발전하여 첫번째 게시물의 네트워크도 살펴봤다.

 

예상대로, 그런 기능으로 게시물 페이지가 동작하는 것으로 보인다.
내용을 API 서버로부터 넘겨받으려면 /api/board/no으로 넘겨줘야 한다는 것이다.

 

그러나 FLAG 게시물은 no가 없다.
하지만 나는 검색을 통해 MongoDB의 ObjectID가 어떤 구조로 이루어진 데이터인지를 안다.

618b62c96070fd2f29ed7bfa
timestamp를 뜻하는 자리

618b62c96070fd2f29ed7bfa
프로세스 당 한번 생성되는 임의의 값

618b62c96070fd2f29ed7bfa
counter를 뜻하는 자리

위 정보를 이용하여 나는 파이썬을 이용하여 FLAG의 no를 찾도록 하였다.

 

일단 다른 게시물에서 공통되는 부분은 임의의값 부분이 모두 같을 것이다.

또한 counter 자리는 한번 등록될 때마다 1씩 증가됨으로 FLAG 게시물의 counter는 ed7bfc로 추측된다.

 

Timestap는 두번째 게시물의 timestamp에서 +3을 하면 된다.
그 이유는 DB에 생성한 시간이 두번째 게시물과 3초 차이가 나기 때문이다.

 

timestamp = 0x618B62CE + 3
print(hex(timestamp)[2:] + "6070fd2f29ed7bfc")

위 코드로 FLAG의 ObjectID를 구하였고, 나는 API 서버에 값을 넣어서 FLAG의 내용을 요청해봤다.

 

다행히 아주 잘 추측하여 FLAG 게시물의 내용 속에 있는 값을 확인할 수 있었다.

복사했습니다!