김승현

[PicoGym] picoCTF caas 풀이 본문

Web/PicoGym

[PicoGym] picoCTF caas 풀이

kshind 2023. 5. 18. 15:22

caas라는 제목의 웹이 있따고 한다. 일단 웹사이트로 가보자.

주소에 /cowsay/{하고싶은말}을 적으면 소가 말을 해준다고 한다. 아무거나 입력해보자.

이렇게 그려진 소가 hi라고 말하게 한다. 문제에 같이 제공된 index.js를 확인해보자.

문제는 이렇게 생겼다.

const express = require('express');
const app = express();
const { exec } = require('child_process');

app.use(express.static('public'));

app.get('/cowsay/:message', (req, res) => {
  exec(`/usr/games/cowsay ${req.params.message}`, {timeout: 5000}, (error, stdout) => {
    if (error) return res.status(500).end();
    res.type('txt').send(stdout).end();
  });
});

app.listen(3000, () => {
  console.log('listening');
});

위에서 const로 exec를 정의했는데 이건 child_process 모듈에서 셸 스크립트를 실행하게 하는 exec를 받아오는 코드

exec함수에서 /usr/games/cowsay이 후 message라는 파라미터를 받아서 실행하는 걸 볼 수 있다.

명령어를 실행하는 문제이고 경로가 있는 것으로 봐선 현재 경로에 있는 파일들 중 flag를 읽으면 될 것 같고,

임의의 명령어를 실행시키기 위한 방법으론 command injection을 떠올릴 수 있다. 한번 시도해보자.

hi; ls를 입력하니까 해당 디렉토리에 존재하는 파일들을 나열해준다. falg.txt를 cat으로 읽어보자.