Logo
CTFd #1 - Bước đầu setup

CTFd #1 - Bước đầu setup

November 4, 2023
5 min read
Table of Contents
index

Chắc hẳn khi mọi người đang đọc những dòng này thì không xa lạ gì với các giải CTF rồi nhỉ, đặc biệt là Jeopardy CTF - thể loại CTF phổ biến nhất. Khi chơi Jeo, mỗi team sẽ cố gắng giải các thử thách (challenges) mà ban tổ chức đưa ra. Mỗi team sẽ có thể xem các challenge, submit flag, xem scoreboard và hàng trăm hành động khác đòi hỏi phải có một trang web CTF dễ sử dụng cho cả admin lẫn player và CTFd là một framework đáp ứng đủ các tiêu chí đó.

Trong bài viết này (hoặc chuỗi bài viết) mình sẽ hướng dẫn cách setup và config CTFd để bạn có thể tự mình host các cuộc thi CTF của riêng mình.

Môi trường

Ở đây mình sẽ sử dụng Ubuntu Server 22.04.3 LTS chạy trên một máy ảo VMware với cấu hình 4GB ram.

Đồng thời máy ảo phải được cài docker engine các bạn có thể cài theo hướng dẫn ở đây. Hoặc ngắn gọn là chạy tuần tự các dòng lệnh sau:

Terminal window
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
Terminal window
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Terminal window
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Add user vào docker group để dùng lệnh mà ko cần sudo

Terminal window
sudo usermod -aG docker $USER

Vì máy ảo này được thiết lập network dạng NAT nên nó sẽ share chung IP với máy host (ở đây là window 11). Để xem được IP của máy ảo, hãy chạy lệnh

Terminal window
ip a | grep 192

Với IP 192.168.204.133 mình có thể truy cập vào máy ảo từ máy host.

Setup CTFd

Cách 1: Thông qua prebuilt docker image

CTFd đã cung cấp sẵn image built sẵn, việc của mình là vào link chọn phiên bản mong muốn, pull image đấy về rồi run lên là được. Mình chọn phiên bản 3.6.0 cũng như là phiên bản mới nhất. Quá trình thực hiện như sau:

Câu lệnh mình đã sử dụng:

  • docker pull ctfd/ctfd:3.6.0: dùng để pull image về local

  • docker run -d -p 8000:8000 ctfd/ctfd:3.6.0: dùng để khởi chạy container với mode detach tức là container sẽ chạy nền và không chiếm cửa sổ dòng lệnh hiện tại (-d) và map cổng 8000 của ubuntu vào cổng 8000 trong container (-p 8000:8000)

  • docker ps: list tất cả các container đang chạy trên máy

Sau các bước trên mình đã có thể truy cập http://192.168.204.133:8000/ từ máy host (máy windows) và có thể thấy CTFd đã được khởi chạy thành công với không có một lỗi nào xảy ra =))

Cách setup này là cách đơn giản nhất, ít lỗi lầm nhưng đồng thời độ linh hoạt không cao, cụ thể là mình sẽ khó tùy biến được (khó thôi nhé chứ không phải không thể). Việc này sẽ được khác phục bởi cách số 2 đề cập ngay sau đây.

Cách 2: Build image từ src

Truy cập github CTFd - releases. Tìm phiên bản muốn cài, mình vẫn sẽ dùng bản 3.6.0, kéo xuống chuột phải vào dòng Source code (zip hay tar.gz cũng được nhưng ở đây mình dùng zip), chọn sao chép địa chỉ liên kết. Xong bước này bạn sẽ thu được đường link để tải trực tiếp file zip của bản 3.6.0 này.

Tiếp theo ở máy ubuntu thực hiện như sau:

Các lệnh mình đã dùng:

  • wgethttps://github.com/CTFd/CTFd/archive/refs/tags/3.6.0.zip: dùng để tải file src

  • unzip3.6.0.zip: giải nén src

  • cd CTFd-3.6.0/: chuyển working directory và CTFd-3.6.0

  • head -c 64 /dev/urandom > .ctfd_secret_key: tạo file .ctfd_secret_key random, file này sẽ chưa secret key của CTFd

  • docker compose up -d: khởi chạy tất cả các service được định nghĩa ở trong file compose với mode detached (-d)

Sau khi chạy các lệnh trên thì chúng ta có thể thấy được 4 container được khởi chạy

Các container này khởi chạy với config mặc định, vì thế nên port của web đang là 8000 vậy nên để truy cập CTFd thì cần vào http://192.168.204.133:8000/

Kết quả sẽ giống như cách 1 tuy nhiên với cách này chúng ta có thể tùy biến nhiều thứ như thêm plugin hay theme.

Tổng kết

Vậy là chúng ta đã hoàn thành việc khởi chạy CTFd. Về các lựa chọn config cho một cuộc thi CTF mình sẽ đề cập ở một bài viết khác. Hy vọng rằng thông qua bài viết này, các bạn đã nắm bắt được các bước cơ bản để thiết lập một cuộc thi CTF sử dụng CTFd. Hẹn gặp các bạn ở bài viết tiếp theo!