[Dreamhack] weird lagacy

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