https://dreamhack.io/wargame/challenges/1050
weird legacy
산타할아버지가 작년에 빌었던 선물을 이제서야 주셨는데 상태가 legacy(유산)이네요.
dreamhack.io

서버 생성 후 접속해보니 Hello!라고 출력하는 페이지가 뜬다.
const express = require("express");
const node_fetch = require("node-fetch");
전체 코드를 살펴보니 express 모듈을 불러온다.
express는 node.js 기반의 웹 프레임워크로 라우팅, 요청/응답 관리, 미들웨어 사용 등 웹 서버 구현 시 기본으로 사용한다.
그리고 node-fetch 모듈을 불러오는데, node.js 환경에서 fetch() api처럼 http 요청을 보낼 수 있는 라이브러리이다.
const app = express();
const PORT = 3000;
const FLAG = "DH{dummy}";
express 애플리케이션 객체를 생성하고, 웹 서버가 사용할 포트를 지정한다.
또한 플래그 값이 저장되는 것을 볼 수 있는데, 이 값은 서버가 특정 요청을 보낼 때 쿠키로 포함한다.
app.get("/fetch", async (req, res) => {
const url = req.query.url;
/fetch 경로로 요청이 들어오면, req.query.url으로 쿼리스트링에서 url 값을 추출한다.
GET /fetch?url=http://localhost:3000/이면 url = "http://localhost:3000/"으로 추출하는 것이다.
const urlObject = new URL(url);
host = urlObject.hostname;
if (host !== "localhost" && !host.endsWith("localhost")) return res.send("rejected");
url의 유효성을 검사하는 코드이다.
hostname을 기준으로 검사하고 localhost 또는 xxx.localhost만 허용하고 있는 것을 알 수 있다.
let result = await node_fetch(url, {
method: "GET",
headers: { "Cookie": `FLAG=${FLAG}` },
});
전체적인 코드 개요는 전달받은 url로 서버가 직접 요청을 해서 클라이언트에게 돌려주는 구조이다.
중요한 포인트는 서버가 요청할 때 Cookie: FLAG=DH{dummy}를 붙인다는 점이다.
따라서 내부 요청 시 FLAG가 유출되 가능성이 있고, url 검증 로직이 허술하기 때문에 ssrf 가능성이 있다.
https://tools.dreamhack.games/main
dreamhack-tools
tools.dreamhack.games
이런 도구가 있는 줄은 처음 알았다.
아무튼 여기에 들어가서 무작위 url을 받아서, 그 주소를 포함해서 보내보았다.
주의할 점은 마지막이 localhost로 끝나야한다는 점이다.

그랬더니 요청이 잘 들어간건지 이렇게 ip 주소가 찍힌다.
그리고 다시 도구로 돌아가서 쿠키 값을 확인해보았다.

이렇게 플래그가 쿠키 값에 저장되어 있는 것을 확인할 수 있다.
https://toss.tech/article/nodejs-security-contribution
Node.js url.parse() 취약점 컨트리뷰션
토스 보안기술팀은 안전한 금융 서비스를 제공하기 위한 연구를 수행하고 있어요. 많은 서비스에서 사용되고 있는 Node.js의 취약점을 분석하고 안전하게 패치될 수 있도록 기여했던 과정을 소개
toss.tech
어떤 분이 올려주신 이 글이 정말 유익했다.

읽다보면 풀이한 문제와 상당히 유사한 상황이라고 느낄 수 있다.
'해킹 스터디' 카테고리의 다른 글
| [Dreamhack] node-serialize (0) | 2025.08.10 |
|---|---|
| [Dreamhack] Secure Secret (3) | 2025.08.03 |
| [Dreamhack] Stop before stops! (0) | 2025.07.27 |
| [DreamHack] easy-login (2) | 2025.07.24 |
| [DreamHack] Small Counter (0) | 2025.07.23 |
