
node와 mongodb로 구성된 게시판입니다.
비밀 게시글을 읽어 FLAG를 획득하세요.
- MongoDB < 4.0.0
이런걸 해본적이 없던 초심자의 입장에선 감이 안잡히는 문제였다.
모르면 풀기 어려운 문제이다.
빠르게 알아보자

문제파일 구조는 다음과 같다.
그런데 이번엔 코드에 FLAG가 적혀있지 않다.

FLAG를 어떻게 주는 정도 까지는 원래 다 알려주는거 아니였나
그럼 로컬에서 돌려봐서 어떻게 생겼는지 확인해보고자 실행해보았다

Index.html 파일이 없어서 불러오기가 실패했다. 이런 메인 html 파일 조차 주지 않았다.
사이트가 어떻게 생겼는지는 봐야하니 서버를 실행하고 들어가보자

FLAG 게시글은 클릭하니 들어갈 수 없고, 다른 게시글은 제대로 작동하니
Proxy로 게시판을 클릭할때 요청이 어떻게 들어가는지 알아보자.

GET 요청으로 api/board/id Hex 문자열 형태로 보드가 열리는 것 같다.
이거 그럼
FLAG보드의 id를 알면 내용 확인할 수 있는 것 아닐까?
목표를 정했으니
우리가 볼 수 있는 핵심 내용인 index.js를 살펴보자
module.exports = function(app, MongoBoard){
app.get('/api/board', function(req,res){
MongoBoard.find(function(err, board){
if(err) return res.status(500).send({error: 'database failure'});
res.json(board.map(data => {
return {
_id: data.secret?null:data._id,
title: data.title,
author: data.author,
secret: data.secret,
publish_date: data.publish_date
}
}));
})
});
app.get('/api/board/:board_id', function(req, res){
MongoBoard.findOne({_id: req.params.board_id}, function(err, board){
if(err) return res.status(500).json({error: err});
if(!board) return res.status(404).json({error: 'board not found'});
res.json(board);
})
});
app.put('/api/board', function(req, res){
var board = new MongoBoard();
board.title = req.body.title;
board.author = req.body.author;
board.body = req.body.body;
board.secret = req.body.secret || false;
board.save(function(err){
if(err){
console.error(err);
res.json({result: false});
return;
}
res.json({result: true});
});
});
}
보드를 불러오는 라우터들이 보인다.
이런게 있다면 우선 api를 호출해보는걸 참을 수 없다

주소창에 그대로 적어보자

게시판 정보들 json을 뱉어냈다.
우린 FLAG 게시판의 id를 알아낸다면 되니 FLAG 게시글의 id를 찾아보면...

이런 FLAG 게시글의 id가 null 값이다.
이정도 수준에서 보드 id를 순순히 내주었다면 B4 문제였겠지만. 쉽게 주지 않는다.
여기서 막혀서 검색해보았다.
https://www.mongodb.com/ko-kr/docs/manual/reference/method/ObjectId/
몽고DB는 ObjectID를 이렇게 생성한다고 한다.

구글번역 이슈로 알아듣기가 어려운데, 포인트는
라고 한다..
그니깐 이문제는 다른 보드 id 값을 보고 FLAG 게시글의 id를 유추하라는 문제였던 것이다.
바로 id 탐색 해보자

대충 메모장에 id 붙여넣어서 4바이트, 5바이트, 3바이트 단위로 끊어주니 패턴이 보인다.
중간 4바이트는 모두 똑같이 d35045223a 임을 알 수 있다.
3바이트는 1단위씩 늘어나고 있으니 중간에 낀 FLAG 게시글은 a9eaba이겠다.
앞에는 타임스태프에 의해서 바뀌고 있다는데,, 6a6c38부분은 똑같을테고
그 다음 한바이트만 바뀌고 있는데. 그냥 보면 83 ~ 88중 하나의 값임을 알 수 있었다.
그럼 83 ~ 88중 하나씩 요청을 보내면서 FLAG를 찾아보자

DH키워드 GREP이 잡혔다.

정답 요청을 찾아낼 수 있었고. FLAG도 찾아냈다.
교훈: id의 규칙성을 유추해낼 수 있다.