Capture The Flag (CTF) – это отличный способ отточить навыки кибербезопасности. Часто для организации челленджей используют Docker‑контейнеры, которые позволяют изолировать среду и гарантировать воспроизводимость. В этой статье мы покажем, как полностью построить процесс разработки и деплоя CTF‑задач прямо на Android‑устройстве, используя Termux и Docker. Такой подход идеален для мобильных исследователей, преподавателей и небольших команд, которым нужен быстрый и лёгкий способ развернуть свои задачи без доступа к полноценному серверу.
Подготовка окружения в Termux
Для начала необходимо установить Termux из официального репозитория Google Play или F-Droid и выполнить базовую настройку.
pkg update && pkg upgrade -y
pkg install -y git curl wget proot-distro
Далее установим proot-distro, который позволит нам запускать полноценный Linux‑дистрибутив внутри Termux.
proot-distro install ubuntu-20.04
proot-distro login ubuntu-20.04
После входа в Ubuntu у вас будет обычный Linux‑терминал, где мы будем ставить Docker.
Установка Docker в контейнере Ubuntu
Docker официально не поддерживается в Termux, однако в Ubuntu‑контейнере всё работает корректно.
apt update && apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
apt update && apt install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
Если systemctl недоступен, можно запустить Docker в режиме демона:
dockerd &
Проверьте, что Docker работает:
docker run --rm hello-world
Структура CTF‑челленджей
Для удобства будем использовать следующую файловую структуру:
ctf-challenges/
├── web-recon/
│ ├── Dockerfile
│ ├── src/
│ └── README.md
├── rev-eng/
│ ├── Dockerfile
│ ├── src/
│ └── README.md
└── common/
└── flag.txt
Папка common содержит единую флаг‑строку, которую будет проверять каждый сервис.
Создание Docker‑образа для веб‑челленджа
Возьмём простой Flask‑приложение, которое будет выдавать флаг только при выполнении определённого запроса.
# src/app.py
from flask import Flask, request, abort
app = Flask(name)
FLAG = open('/flag.txt').read().strip()
@app.route('/')
def index():
return "Welcome to the web challenge!"
@app.route('/secret')
def secret():
token = request.args.get('token')
if token == 'letmein':
return f"Here is your flag: {FLAG}"
abort(403)
if name == 'main':
app.run(host='0.0.0.0', port=8080)
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY src/ .
COPY ../common/flag.txt /flag.txt
RUN pip install flask
EXPOSE 8080
CMD ["python", "app.py"]
Соберём образ:
cd ctf-challenges/web-recon
docker build -t ctf-web-recon:latest .
Тестирование образа локально
Запустим контейнер в интерактивном режиме, пробросив порт 8080 на хост:
docker run -d -p 8080:8080 --name web-recon ctf-web-recon:latest
Проверьте работу:
curl http://127.0.0.1:8080/
curl http://127.0.0.1:8080/secret?token=letmein
Если всё корректно, вы увидите флаг в ответе.
Автоматизация сборки и деплоя (CI/CD)
Для упрощения процесса можно использовать простой скрипт, который будет автоматически пересобирать образ после изменения кода.
# build_and_deploy.sh
#!/usr/bin/env bash
set -e
CHALLENGE=$1
if [[ -z "$CHALLENGE" ]]; then
echo "Usage: $0 "
exit 1
fi
cd "ctf-challenges/$CHALLENGE"
IMAGE="ctf-$CHALLENGE:latest"
echo "Building $IMAGE..."
docker build -t $IMAGE .
echo "Stopping previous container..."
docker rm -f $CHALLENGE || true
echo "Running new container..."
docker run -d -p 0.0.0.0:$(shuf -i 8000-9000 -n 1):8080 --name $CHALLENGE $IMAGE
echo "Deployment of $CHALLENGE completed."
Запуск скрипта:
bash build_and_deploy.sh web-recon
Скрипт автоматически выбирает свободный порт в диапазоне 8000‑9000, что удобно при одновременном запуске нескольких челленджей.
Организация сети и безопасность
- Используйте отдельный bridge‑сетевой интерфейс Docker (
docker network create ctf-net) и подключайте все контейнеры к нему, чтобы изолировать их от основной сети устройства. - Ограничьте ресурсы контейнеров:
--memory 256m --cpus 0.5– это предотвратит перегрузку смартфона. - Включите
userns-remapв Docker‑демоне, чтобы процессы внутри контейнера не имели привилегий root на хосте. - Регулярно проверяйте уязвимости образов с помощью
docker scanилиtrivy.
Пример развертывания нескольких челленджей
Допустим, у вас есть два челленджа: web-recon и rev-eng. Выполните:
bash build_and_deploy.sh web-recon
bash build_and_deploy.sh rev-eng
После этого в браузере вашего телефона откройте http://127.0.0.1:<порт_для_web-recon> и http://127.0.0.1:<порт_для_rev-eng>. Вы получите полностью изолированные сервисы, готовые к сдаче участниками CTF.
Отладка и логирование
Для быстрого доступа к журналам используйте:
docker logs -f web-recon
Если необходимо зайти внутрь контейнера, выполните:
docker exec -it web-recon /bin/bash
Заключение
Технологический стек «Termux + Docker» открывает новые возможности для разработки и развертывания CTF‑челленджей прямо на мобильных устройствах. Вы получаете полную гибкость Linux‑окружения, изоляцию Docker‑контейнеров и возможность автоматизировать процесс сборки и деплоя.
Если вы хотите вывести свои CTF‑мероприятия на профессиональный уровень, команда RybinskLab готова помочь: мы предоставляем консалтинг по архитектуре безопасных игровых площадок, разрабатываем кастомные Docker‑образы под ваши задачи и обеспечиваем поддержку CI/CD пайплайнов. Свяжитесь с нами, и ваш CTF‑проект будет работать безупречно, где бы вы ни находились.