warGame/Dreamhack 문제 풀이

[Dreamhack] phpMyRedis 풀이

jalni_k 2023. 4. 4. 22:21

원래 워게임 문제는 왠만하면 힌트만 드릴려고 글을 작성하고 있지만 해당 문제를 풀지 못하면 다음 강의로 진행을 못하는(사실 할 수는 있지만) 일때문에 공유합니다.

문제

해당 문제는 Redis의 취약점을 사용하여 /flag 안에 있는 무언가를 탈취하는 것이 목표인 문제이다.

대상 분석

FROM php:7.1-apache

RUN apt-get update
RUN apt-get upgrade -y

RUN apt-get install -y zip unzip tzdata curl
RUN apt-get install -y redis-server

COPY ./src /var/www/html/
RUN chmod 777 /var/www/html/data/
COPY ./run-lamp.sh /usr/sbin/

RUN chmod +x /usr/sbin/run-lamp.sh

RUN pecl install redis \\
    && docker-php-ext-enable redis

# FLAG
COPY ./flag /flag

EXPOSE 80

CMD ["/usr/sbin/run-lamp.sh"]
  • dockerfile을 보면 apache와 redis-server을 이용하여 빌드하는걸 볼 수 있다.
  • /data 폴더 안에서는 권한이 777로 아무나 접근할 수 있다.

풀이

해당 웹서버는 두개의 페이지를 제공한다.

  • command page(index)- 실질적으로 데이터의 get과 set을 할 수 있는 페이지이다 (lua script를 이용)
  • config page- db서버 config를 할 수 있는 페이지이다

 

  1. 데이터베이스 저장소 설정 (config page)

  • 제공된 소소크드를 보면 해당 페이지는 redis에서 config 명령어를 사용하여 명령어를 실행한다 즉 SET {key} {value}가 아닌 config SET {key} {value}로 진행되는 것이다.
  • db저장소 설정을 한다. default 디렉터리가 /html이 아님으로 절대 경로를 사용하여 적어준다.
  • db파일은 이제 여기에 저장되게 된다.

2. 데이터베이스 이름 설정

CONFIG SET dbfilename webshell.php
  • data폴더에 webshell을 올리기 위해서 webshell.php로 등록한다.

 

3. savetime 설정

SAVE 1 10
  • 원래 redis의 경우에는 command로 save혹은 bgsave slaveof 등 db 명령어를 입력할 수 있지만 command page에서 pcall로 하나하나 실행시켜본 결과 다 막혀 있었다.

 

4. command를 통한 웹쉘 작성 및 업로드

  • redis에서는 eval함수와 lua script를 통해서 명령어를 작성할 수 있다.
redis.call(command, key, value)
  • 와 같이 key값이 shell인 웹쉘을 만들어서 기존에 만들어둔 webshell.php dbfile에 저장한다.

 

웹쉘 업로드에 성공한 모습