우리 스파이가 Etulosba CDN의 소스 코드를 훔치는 데 성공했습니다.
해당 서버에서 플래그를 가져오려면 여러분의 도움이 필요합니다.

주어진 main.js 파일 먼저 확인해보도록 하겠습니다.

 

 

main.js 파일입니다.

const fs = require("fs");
const path = require("path");
const express = require("express");

const server = express();

server.get("/", function (req, res) {
    res.end("<html><body>etulosba</body></html>");
});

server.get("/files/images/:name", function (req, res) {
    if (req.params.name.indexOf(".") === -1) {
        return res.status(400).json({ error: "invalid file name" });
    }

    res.sendFile(__dirname + path.join("/files/images/", req.params.name));
});

server.get("/files/binary/:name", function (req, res) {
    if (req.params.name.indexOf(".") !== -1) {
        return res.status(400).json({ error: "invalid file name" });
    }

    res.sendFile(path.resolve(__dirname, "/files/binary/", req.params.name));
});

fs.writeFileSync(path.join(__dirname, "flag.name"), process.env.FLAG_NAME);
fs.writeFileSync(path.join("/tmp", process.env.FLAG_NAME), process.env.FLAG);

server.listen(process.env.HTTP_PORT);

 

특정 주소로부터 flag.name 파일을 가져와야 하고 후에 값을 사용하여 /tmp 안에 있는 플래그 파일을 가져올 수 있습니다.

 

 

think1  이는 LFI를 이용하는 문제로 보입니다. 우선적으로 /files/images/에서 파일을 획득해야됩니다.

약간의 조건이 걸려 있습니다. 

/files/images/:name

위 형식을 유지해야 하며 indexof의 결과 값 즉, 일치하는 결과 값이 없어 -1이 나오게 하면 error을 뿜습니다.

 

 

때문에 아래와 같이 위 형식을 유지하되 index of('.')를 우회 하도록 하여야합니다.

/files/images/%2E%2E%2F%2E%2E%2Fflag%2Ename

그럴 경우 txt 하나를 획득하게 됩니다.

 

 

 

 

think2  이제 폴더명을 획득했으니 위와 유사한 방식으로 /files/binary/에서 파일을 획득해야됩니다.

/tmp 파일 안에 있다고 위에서 언급했으니 다음과 같은 url을 입력해줍니다.

/files/binary%2Ftmp%2Fimaflagimaflag

그 결과 아래와 같이 flag를 획들할수 있었습니다.

 

'Challenge > CTF' 카테고리의 다른 글

[DefCamp CTF 21-22] web-intro  (0) 2022.02.15
[Intent CTF] Graphics  (0) 2021.11.30
[Intent CTF] Careers  (0) 2021.11.22
[Intent CTF] Door (un)Locked  (0) 2021.11.22
[2021 hspace] Baby_Crypto  (0) 2021.05.07

+ Recent posts