CTF خود را با استفاده از CTFd میزبانی کنید!

Summarize this content to 400 words in Persian Lang
میزبانی CTF: راهنمای جامع
اگر می خواهید به جزئیات فنی بروید، به پایین بروید.
پس زمینه
من یک مسابقه Capture The Flag (CTF) را برای حدود 300 نفر در محل کارم میزبانی و هماهنگ کردم. این یک تجربه یادگیری عالی برای من بود. این مقاله ممکن است به شما کمک کند که خودتان میزبانی برای تیم خود داشته باشید، و این نیز بسیار آسان است!
برنامه ریزی اولیه
ملاحظات بودجه
خوب، مثل همیشه ارزانتر، بهتر، یکی از چیزهایی که نقش مهمی داشت این است که من در یک تیم زیرساخت کار میکنم، بنابراین دسترسی به VM یک امر بدون هزینه بود. اما با کنار گذاشتن این موضوع، یک دستگاه رم کوچک 4vCPU 2GB میتواند به خوبی بار را تحمل کند و اگر بسته دانشجویی برای Azure/AWS/GCP داشته باشید رایگان است.
توسعه جدول زمانی
وقت گیرترین بخش CTF تشکیل سوالات است. از آنجایی که این اولین بار بود که افراد زیادی بازی می کردند، تصمیم گرفتیم از سوالات سطح متوسط استفاده کنیم. ما همچنین چند سوال غیر فنی قرار دادیم تا بازیکنان علاقه خود را به بازی از دست ندهند و رها نشوند.
این ایده خوبی است که بررسی کنید چند نفر به بازی CTF علاقه مند هستند. این به شما کمک می کند ترافیک روز واقعی و سطح شرکت کنندگان را تخمین بزنید، بنابراین می توانید سوالات را بر اساس آن چارچوب بندی کنید!
داشتن تیمی که سوالات را تشکیل می دهد بسیار مهم است، این ستون فقراتی است که CTF شما به آن بستگی دارد، همیشه سوالات را بررسی کنید، مطمئن شوید که از دسته های مختلف است و مهمتر از همه به راحتی توسط ChatGPT حل نمی شود 😛
معماری فنی
ما انتخاب کردیم که این را روی ماشینهای مجازی در محیط OpenStack میزبانی کنیم، اما این واقعاً نباید اهمیت زیادی داشته باشد، وقتی ماشین مجازی را تهیه کردید، همان فرآیند است.
VM روی شبکه مستقیم شرکت میزبانی می شد که فقط از طریق VPN قابل دسترسی است، بنابراین VM را از بازیگران خارج از شرکت جدا کرد.
انواع چالش
بهره برداری از وب
مهندسی معکوس
رمزنگاری
پزشکی قانونی / بازرسی بسته
متفرقه
اصول طراحی چالش
سناریوهای واقع بینانه
ارزش آموزشی
دشواری پیشرونده
دستورالعمل های واضح و بدون ابهام
تأیید چالش
همیشه سؤالات خود را بررسی کنید، یک حساب کاربری مخفی در پلتفرم ایجاد کنید و سؤالات خود را از ابتدا تا انتها آزمایش کنید، به احتمال زیاد تیمی وجود دارد که تمام سؤالات را چارچوب بندی می کند و مطمئن شوید که سؤالات یکدیگر را آزمایش می کنید تا احساس شرکت کننده را دریافت کنید. طرف هم!
تست کردن
من یک اسکریپت برای آزمایش اتصالات همزمان و میانگین زمان پاسخ نوشتم و با استفاده از آمار VM نظارت کردم htop
به عنوان یک سناریوی شکست، من یک ماشین مجازی دیگر در یک DC و شبکه دیگر به عنوان یدک داشتم (این کار را فقط به دلیل دسترسی به ماشین های مجازی رایگان انجام دادم) تا اگر اتفاق بدی رخ داد، مسابقه را ادامه دهم!
من همچنین وضعیت فعلی CTF را صادر می کردم تا بتوانم به راحتی آن را به VM جدید وارد کنم و بعد از ایجاد به روز رسانی DNS آن را ادامه دهم.
ارتباط قبل از رویداد
ما از یک ربات Webex برای ارسال ارتباطات استفاده کردیم، به عنوان مثال، هنگامی که سؤالات جدید حذف شدند، بهروزرسانیهای تابلوی امتیازات و آمارهای سرگرمکننده برای حفظ اشتیاق.
ما سعی کردیم تا حد امکان با قوانین موجود در خود سؤالات واضح باشیم. اگر یک سوال مکرر ظاهر شد، ما به همه اطلاع دادیم که آن را پاک کنند!
مدیریت مشارکت کنندگان
ما نمیخواستیم کاربران از شناسهها و رمزهای عبور خود استفاده کنند و زمان کافی برای درک اینکه چگونه میتوانیم OAuth شرکت خود را در این مورد ادغام کنیم، نداشتیم، بنابراین از APIهای CTFd برای ایجاد حسابهای محلی برای کاربران و ارسال آنها از طریق ربات برای همه استفاده کردیم. .
CTFd را بچرخانید
ارجاع از اسناد CTFd
من از VM با سیستم عامل اوبونتو استفاده کردم، میتوانید این مراحل را دنبال کنید یا آنها را مطابق با مدیر بستهای که سیستم عامل شما استفاده میکند تغییر دهید.
apt install python3-pip -y -q && apt install python3.10-venv -y && apt install python-is-python3 -y -q && apt install docker -y && apt install docker-compose -y
git clone https://github.com/CTFd/CTFd.git
cd CTFd/
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
docker-compose up
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
docker ps برای بررسی اینکه آیا ظروف آماده و کار می کنند یا خیر!
اکنون باید بتوانید به CTFd در http://localhost:8000 دسترسی داشته باشید
این باعث چرخش CTFd با wsgi می شود WORKERS=1
برای داشتن عملکرد بهتر بهتر است بیش از یک کارگر داشته باشید، برای راه اندازی بیش از یک کارگر نیز باید شامل SECRET_KEY در docker-compose.yml
بنابراین تنظیمات خود را پایین بیاورید docker-compose down و سپس تغییر دهید docker-compose.yml به صورت زیر فایل کنید
شما docker-compose هنگامی که آن را اضافه کنید، فایل به این شکل خواهد بود
services:
ctfd:
build: .
user: root
restart: always
ports:
– “8000:8000”
environment:
– SECRET_KEY=
– UPLOAD_FOLDER=/var/uploads
– DATABASE_URL=mysql+pymysql://ctfd:ctfd@db/ctfd
– REDIS_URL=redis://cache:6379
– WORKERS=3
– LOG_FOLDER=/var/log/CTFd
– ACCESS_LOG=/var/log/CTFd/access.log
– ERROR_LOG=/var/log/CTFd/error.log
– REVERSE_PROXY=true
volumes:
– .data/CTFd/logs:/var/log/CTFd
– .data/CTFd/uploads:/var/uploads
– .:/opt/CTFd:ro
depends_on:
– db
networks:
default:
internal:
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
برای فعال کردن HTTPS، باید یک گواهی تولید کنید و سپس آن را به عنوان حجم بر روی آن نصب کنید nginx ظرف
ما گواهی و کلید خصوصی را تولید کردیم و آن را در VM به عنوان ذخیره کردیم ./conf/nginx/fullchain.pem و ./conf/nginx/privkey.pem
میتوانید از Certbot برای تولید گواهی استفاده کنید یا از دستورالعملهای سازمان خود برای تولید گواهی و کلید خصوصی پیروی کنید.
برای تنظیم گواهینامه ها به این مقاله مراجعه کردیم
را nginx بخشی از docker-compose.yml حالا به نظر می رسد این است
nginx:
image: nginx:stable
restart: always
volumes:
– ./conf/nginx/http.conf:/etc/nginx/nginx.conf
– ./conf/nginx/fullchain.pem:/certificates/fullchain.pem:ro
– ./conf/nginx/privkey.pem:/certificates/privkey.pem:ro
ports:
– 80:80
– 443:443
depends_on:
– ctfd
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اسکریپت برای بارگیری استقرار CTFd خود را آزمایش کنید
import requests
import time
from concurrent.futures import ThreadPoolExecutor
import logging
from datetime import datetime
def setup_logging():
“””Configure logging to track performance metrics”””
logging.basicConfig(
level=logging.INFO,
format=’%(asctime)s – %(message)s’,
filename=f’load_test_{datetime.now().strftime(“%Y%m%d_%H%M%S”)}.log’
)
def single_request(url, session):
“””Make a single request and measure response time”””
try:
start_time = time.time()
response = session.get(url)
duration = time.time() – start_time
return {
‘status_code’: response.status_code,
‘duration’: duration,
}
except Exception as e:
logging.error(f”Request failed: {str(e)}”)
return None
def load_test(url, num_requests=100, max_workers=10):
“””
Perform load testing on a website
Parameters:
url: The URL to test
num_requests: Total number of requests to make
max_workers: Maximum concurrent requests
“””
setup_logging()
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
with requests.Session() as session:
futures = [
executor.submit(single_request, url, session)
for _ in range(num_requests)
]
for future in futures:
result = future.result()
if result:
results.append(result)
logging.info(
f”Status: {result[‘status_code’]}, ”
f”Duration: {result[‘duration’]:.2f}s”
)
# Analyze results
successful_requests = len([r for r in results if r[‘status_code’] == 200])
avg_duration = sum(r[‘duration’] for r in results) / len(results)
print(f”\nLoad Test Results:”)
print(f”Total Requests: {len(results)}”)
print(f”Successful Requests: {successful_requests}”)
print(f”Average Response Time: {avg_duration:.2f}s”)
test_url = “https://yourdomain/users” # Use your test environment
load_test(
url=test_url,
num_requests=3000,
max_workers=30
)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
قطعه ای از استفاده از VM در طول تست بار
اگر این راهنما به شما کمک کرد، لطفاً آن را لایک کنید.
میزبانی CTF: راهنمای جامع
اگر می خواهید به جزئیات فنی بروید، به پایین بروید.
پس زمینه
من یک مسابقه Capture The Flag (CTF) را برای حدود 300 نفر در محل کارم میزبانی و هماهنگ کردم. این یک تجربه یادگیری عالی برای من بود. این مقاله ممکن است به شما کمک کند که خودتان میزبانی برای تیم خود داشته باشید، و این نیز بسیار آسان است!
برنامه ریزی اولیه
ملاحظات بودجه
خوب، مثل همیشه ارزانتر، بهتر، یکی از چیزهایی که نقش مهمی داشت این است که من در یک تیم زیرساخت کار میکنم، بنابراین دسترسی به VM یک امر بدون هزینه بود. اما با کنار گذاشتن این موضوع، یک دستگاه رم کوچک 4vCPU 2GB میتواند به خوبی بار را تحمل کند و اگر بسته دانشجویی برای Azure/AWS/GCP داشته باشید رایگان است.
توسعه جدول زمانی
وقت گیرترین بخش CTF تشکیل سوالات است. از آنجایی که این اولین بار بود که افراد زیادی بازی می کردند، تصمیم گرفتیم از سوالات سطح متوسط استفاده کنیم. ما همچنین چند سوال غیر فنی قرار دادیم تا بازیکنان علاقه خود را به بازی از دست ندهند و رها نشوند.
این ایده خوبی است که بررسی کنید چند نفر به بازی CTF علاقه مند هستند. این به شما کمک می کند ترافیک روز واقعی و سطح شرکت کنندگان را تخمین بزنید، بنابراین می توانید سوالات را بر اساس آن چارچوب بندی کنید!
داشتن تیمی که سوالات را تشکیل می دهد بسیار مهم است، این ستون فقراتی است که CTF شما به آن بستگی دارد، همیشه سوالات را بررسی کنید، مطمئن شوید که از دسته های مختلف است و مهمتر از همه به راحتی توسط ChatGPT حل نمی شود 😛
معماری فنی
ما انتخاب کردیم که این را روی ماشینهای مجازی در محیط OpenStack میزبانی کنیم، اما این واقعاً نباید اهمیت زیادی داشته باشد، وقتی ماشین مجازی را تهیه کردید، همان فرآیند است.
VM روی شبکه مستقیم شرکت میزبانی می شد که فقط از طریق VPN قابل دسترسی است، بنابراین VM را از بازیگران خارج از شرکت جدا کرد.
انواع چالش
- بهره برداری از وب
- مهندسی معکوس
- رمزنگاری
- پزشکی قانونی / بازرسی بسته
- متفرقه
اصول طراحی چالش
- سناریوهای واقع بینانه
- ارزش آموزشی
- دشواری پیشرونده
- دستورالعمل های واضح و بدون ابهام
تأیید چالش
همیشه سؤالات خود را بررسی کنید، یک حساب کاربری مخفی در پلتفرم ایجاد کنید و سؤالات خود را از ابتدا تا انتها آزمایش کنید، به احتمال زیاد تیمی وجود دارد که تمام سؤالات را چارچوب بندی می کند و مطمئن شوید که سؤالات یکدیگر را آزمایش می کنید تا احساس شرکت کننده را دریافت کنید. طرف هم!
تست کردن
من یک اسکریپت برای آزمایش اتصالات همزمان و میانگین زمان پاسخ نوشتم و با استفاده از آمار VM نظارت کردم htop
به عنوان یک سناریوی شکست، من یک ماشین مجازی دیگر در یک DC و شبکه دیگر به عنوان یدک داشتم (این کار را فقط به دلیل دسترسی به ماشین های مجازی رایگان انجام دادم) تا اگر اتفاق بدی رخ داد، مسابقه را ادامه دهم!
من همچنین وضعیت فعلی CTF را صادر می کردم تا بتوانم به راحتی آن را به VM جدید وارد کنم و بعد از ایجاد به روز رسانی DNS آن را ادامه دهم.
ارتباط قبل از رویداد
ما از یک ربات Webex برای ارسال ارتباطات استفاده کردیم، به عنوان مثال، هنگامی که سؤالات جدید حذف شدند، بهروزرسانیهای تابلوی امتیازات و آمارهای سرگرمکننده برای حفظ اشتیاق.
ما سعی کردیم تا حد امکان با قوانین موجود در خود سؤالات واضح باشیم. اگر یک سوال مکرر ظاهر شد، ما به همه اطلاع دادیم که آن را پاک کنند!
مدیریت مشارکت کنندگان
ما نمیخواستیم کاربران از شناسهها و رمزهای عبور خود استفاده کنند و زمان کافی برای درک اینکه چگونه میتوانیم OAuth شرکت خود را در این مورد ادغام کنیم، نداشتیم، بنابراین از APIهای CTFd برای ایجاد حسابهای محلی برای کاربران و ارسال آنها از طریق ربات برای همه استفاده کردیم. .
CTFd را بچرخانید
ارجاع از اسناد CTFd
من از VM با سیستم عامل اوبونتو استفاده کردم، میتوانید این مراحل را دنبال کنید یا آنها را مطابق با مدیر بستهای که سیستم عامل شما استفاده میکند تغییر دهید.
apt install python3-pip -y -q && apt install python3.10-venv -y && apt install python-is-python3 -y -q && apt install docker -y && apt install docker-compose -y
git clone https://github.com/CTFd/CTFd.git
cd CTFd/
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
docker-compose up
docker ps
برای بررسی اینکه آیا ظروف آماده و کار می کنند یا خیر!
اکنون باید بتوانید به CTFd در http://localhost:8000 دسترسی داشته باشید
این باعث چرخش CTFd با wsgi می شود WORKERS=1
برای داشتن عملکرد بهتر بهتر است بیش از یک کارگر داشته باشید، برای راه اندازی بیش از یک کارگر نیز باید شامل SECRET_KEY
در docker-compose.yml
بنابراین تنظیمات خود را پایین بیاورید docker-compose down
و سپس تغییر دهید docker-compose.yml
به صورت زیر فایل کنید
شما docker-compose
هنگامی که آن را اضافه کنید، فایل به این شکل خواهد بود
services:
ctfd:
build: .
user: root
restart: always
ports:
- "8000:8000"
environment:
- SECRET_KEY=
- UPLOAD_FOLDER=/var/uploads
- DATABASE_URL=mysql+pymysql://ctfd:ctfd@db/ctfd
- REDIS_URL=redis://cache:6379
- WORKERS=3
- LOG_FOLDER=/var/log/CTFd
- ACCESS_LOG=/var/log/CTFd/access.log
- ERROR_LOG=/var/log/CTFd/error.log
- REVERSE_PROXY=true
volumes:
- .data/CTFd/logs:/var/log/CTFd
- .data/CTFd/uploads:/var/uploads
- .:/opt/CTFd:ro
depends_on:
- db
networks:
default:
internal:
برای فعال کردن HTTPS، باید یک گواهی تولید کنید و سپس آن را به عنوان حجم بر روی آن نصب کنید nginx
ظرف
ما گواهی و کلید خصوصی را تولید کردیم و آن را در VM به عنوان ذخیره کردیم ./conf/nginx/fullchain.pem
و ./conf/nginx/privkey.pem
میتوانید از Certbot برای تولید گواهی استفاده کنید یا از دستورالعملهای سازمان خود برای تولید گواهی و کلید خصوصی پیروی کنید.
برای تنظیم گواهینامه ها به این مقاله مراجعه کردیم
را nginx
بخشی از docker-compose.yml
حالا به نظر می رسد این است
nginx:
image: nginx:stable
restart: always
volumes:
- ./conf/nginx/http.conf:/etc/nginx/nginx.conf
- ./conf/nginx/fullchain.pem:/certificates/fullchain.pem:ro
- ./conf/nginx/privkey.pem:/certificates/privkey.pem:ro
ports:
- 80:80
- 443:443
depends_on:
- ctfd
اسکریپت برای بارگیری استقرار CTFd خود را آزمایش کنید
import requests
import time
from concurrent.futures import ThreadPoolExecutor
import logging
from datetime import datetime
def setup_logging():
"""Configure logging to track performance metrics"""
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
filename=f'load_test_{datetime.now().strftime("%Y%m%d_%H%M%S")}.log'
)
def single_request(url, session):
"""Make a single request and measure response time"""
try:
start_time = time.time()
response = session.get(url)
duration = time.time() - start_time
return {
'status_code': response.status_code,
'duration': duration,
}
except Exception as e:
logging.error(f"Request failed: {str(e)}")
return None
def load_test(url, num_requests=100, max_workers=10):
"""
Perform load testing on a website
Parameters:
url: The URL to test
num_requests: Total number of requests to make
max_workers: Maximum concurrent requests
"""
setup_logging()
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
with requests.Session() as session:
futures = [
executor.submit(single_request, url, session)
for _ in range(num_requests)
]
for future in futures:
result = future.result()
if result:
results.append(result)
logging.info(
f"Status: {result['status_code']}, "
f"Duration: {result['duration']:.2f}s"
)
# Analyze results
successful_requests = len([r for r in results if r['status_code'] == 200])
avg_duration = sum(r['duration'] for r in results) / len(results)
print(f"\nLoad Test Results:")
print(f"Total Requests: {len(results)}")
print(f"Successful Requests: {successful_requests}")
print(f"Average Response Time: {avg_duration:.2f}s")
test_url = "https://yourdomain/users" # Use your test environment
load_test(
url=test_url,
num_requests=3000,
max_workers=30
)
قطعه ای از استفاده از VM در طول تست بار
اگر این راهنما به شما کمک کرد، لطفاً آن را لایک کنید.