app.get('/api/local/flag', requireLocal, async (req, res) => { //Cproxy: forge
return res.send(await fs.readFile('/flag_forge', { encoding: 'ascii' }));
});
const requireLocal = async (req, res, next) => {
if (req.socket.remoteAddress === '127.0.0.1') {
next();
} else {
res.sendStatus(403);
}
}
(https://lock.cmpxchg8b.com/rebinder.html)
위 사이트를 공격에 이용하고 편의상 attack tool이라 부르겠습니다.
index.js의 일부 코드입니다. requireLocal 조건을 충족하기 위해서
단순하게 생각하면 /proxy페이지에서
attack tool의 2개의 입력 칸 중 한쪽에는 루프백 주소를 넣고
http://host3.dreamhack.games:(port)에 해당하는 ip를 넣으면 될텐데
이 ip를 직접 넣는건 어렵다고 판단했습니다.
그래서 개인서버 ip를 attack tool의 다른 한 쪽에 넣고
우분투 개인 서버의 페이지에 <script>location.href=host3.~/api/local/flag를 입력하고
(/proxy) - (내 개인서버 페이지에서 스크립트 실행) - (host3.dreamhack.games)로 redirect
과정으로 추측하고 있는데 개인서버가 반드시 필요한가요?
attack tool을 이용해서 공격한다면 반드시 입력되는 ip는 80포트인데, 이럼 또 모순이 생겨버려서 아닌 것 같기도 합니다.
생각한대로 시도해보려고 개인서버 우분투로 포트포워딩 시도했는데, 개인이 80포트를 여는건 어렵다는 것을 알게 되었고, 외부접속도 안되서 헤메다가 질문드립니다..
+)burp suite로 request 과정 하나씩 보다가 REFER: http://210.117.~.~/로 드림핵vm ip같아보여서 시도해봤지만 이것도 아닌 것 같네요..
Level 3이면 이렇게 복잡하진 않을 것같은데 말이죠....
안녕하세요 zkvlkat님!
해당 attack tool을 이용해야겠다고 생각했다면, 문제의 취약점을 이해하신거라고 생각됩니다.
물론 생략된 부분도 있지만 올려주신 코드상에서 검증하는 부분은 ip지 포트는 따로 검증하지 않습니다.
- 개인서버는 반드시 필요하지 않습니다.