인증 메커리즘 취약점 - JWT
현대 웹 애플리케이션에서 JSON Web Token (JWT)은 사용자 인증과 권한 부여를 처리하는 데 널리 사용되는 기술입니다. JWT는 무상태 세션 관리와 효율적인 정보 교환을 가능하게 하여 많은 개발자와 기업에게 매력적인 선택이 되었습니다. 그러나, JWT도 완벽하지 않으며 잘못된 구현이나 관리 소홀로 인해 심각한 보안 취약점에 노출될 수 있습...
CTFd는 “Capture The Flag daemon”의 약자로, 정보 보안 기술을 경쟁적으로 연습하고 향상시키기 위한 웹 기반 플랫폼입니다.
정보 보안 관련 대회인 Capture The Flag (CTF)를 운영하고 관리하는 데 사용되며, 문제 생성, 점수 관리, 참가자 진행 상황 추적 등을 지원합니다.
Ubuntu 22.04 LTS으로 환경 구축 후 다운로드를 진행하였습니다.
인터넷에 Ubuntu 환경에 도커를 설치하는 과정이 매우 상세히 나와있기 때문에 도커 설치는 넘어가도록 하겠습니다.
git clone https://github.com/CTFd/CTFd.git
cd CTFd
head -c 64 /dev/urandom > .ctfd_secret_key
vi docker-compose.yml
services:
ctfd: ...
environment:
- SECRET_KEY=file:.ctfd_secret_key
...
CTFd 공식 문서에서 나온대로 head -c 64 /dev/urandom > .ctfd_secret_key
으로 Flask의 secret key
를 랜덤한 값으로 생성하여 compose 파일에 반영합니다.
docker-compose up -d
이후 localhost:8000
으로 접근하여 웹 페이지가 잘 뜨는지 확인합니다.
저는 여러 CTF 사이트들 처럼 컨테이너에 문제 환경을 구성하여 각 사용자 별로 개별 문제 환경을 제공하려고 합니다. 그러긴 위해선 CTFd Plugin을 사용해야 합니다.
몇 개를 찾아본 결과, phannhat17의 CTFd-Docker-Plugin이 잘 되는 것을 확인하였습니다.
cd ~
git clone https://github.com/phannhat17/CTFd-Docker-Plugin.git
cp -r ./CTFd-Docker-Plugin ./CTFd/CTFd/plugins/containers
CTFd
디렉터리에서 나온 다음, 해당 CTFd-Docker-Plugin
저장소를 다운로드하여 CTFd
의 plugins
디렉터리에 복사하였습니다.
vi ./CTFd/requirements.txt
...
docker
paramiko
apscheduler
...
CTFd-Docker-Plugin/requirements.txt
에서 사용하는 파이썬 라이브러리를 확인하여 CTFd/requirements.txt
에 추가합니다.
vi ./CTFd/docker-compose.yml
services:
ctfd: ...
volumes:
- /var/run/docker.sock:/var/run/docker.sock
...
vi /lib/systemd/system/docker.service
...
[Service] Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
....
CTFd
서비스에서 Docker 데몬을 제어하기 위해 compose 파일에 docker.sock
를 추가하였습니다. 또한 systemctl에서 동작 시 TCP 포트 2375와 Unix 소켓을 활성화하는 옵션(# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
)을 넣었습니다.
service dockerd restart
cd CTFd
docker-compose down
docker-compose build
docker-compose up -d
설정한 값을 반영하기 위해 docker 데몬 재시작 및 compose를 다시 올립니다.
이후, CTFd Admin에 접근하여 상단 메뉴의 Plugins > Containers로 이동하여 Settings 버튼을 클릭합니다.
설정에서 Docker Host와 컨테이너 만료 시간, 최대 램/CPU 설정을 하고 Submit를 클릭합니다.
설정이 잘 되었으면, 문제 생성 페이지 내 Image 항목에서 도커에 저장된 Image들을 확인할 수 있습니다.