Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Hong5489/Custom-CTFd-Engine
Custom CTFd platform used in SKR CTF
https://github.com/Hong5489/Custom-CTFd-Engine
Last synced: 22 days ago
JSON representation
Custom CTFd platform used in SKR CTF
- Host: GitHub
- URL: https://github.com/Hong5489/Custom-CTFd-Engine
- Owner: Hong5489
- License: apache-2.0
- Created: 2019-06-20T05:24:01.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-05-02T15:21:25.000Z (7 months ago)
- Last Synced: 2024-08-05T17:45:05.600Z (4 months ago)
- Language: Python
- Homepage: https://skrctf.me
- Size: 5.13 MB
- Stars: 5
- Watchers: 0
- Forks: 4
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-hacking-lists - Hong5489/Custom-CTFd-Engine - Custom CTFd platform used in SKR CTF (Python)
README
# Custom CTFd engine
Custom made CTFd engine by SKR, live at [skrctf.me](https://skrctf.me). Upgraded to Python3!## Features
- Support SSL cert
- Flag Sharing Prevention
- Dynamic Flag for Web Challenges and Binary Challenges
- Web Shell login using Team Credentials
- Reverse Proxy for Web Challenges
- Webshell using shellinabox
- Arrange category priority
- Arrange challenges by difficulty
- Discord bot announce challenges
- Netcat container for multiple challenges
- Share writeup with other players
- Like challenge feature
- Show users IP country using IPinfo## How to Setup
Need install docker to run the platform`docker` and `docker-compose` (For Debian):
```
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
echo 'deb https://download.docker.com/linux/debian stretch stable' > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install docker-ce
pip install docker-compose
```
After that, download the zip file from the [release](https://github.com/Hong5489/Custom-CTFd-Engine/releases), then extract it.Change the `hostname` of proxy container in `docker-compose.yml` to match your website, if you run locally then change to `localhost`
After that, run this and wait for it to build!
```
docker-compose up
```
## SSL certYou can use your own SSL cert, just replace the cert in `CTFd/ssl` folder
If you wanna try without HTTPS, can change the `nginx.conf` to this:
```
user nobody nogroup; pid /tmp/nginx.pid; error_log /var/log/nginx/error.log;
# Best set to 1 as long as CTFd is served up from the same host
worker_processes 1; events {
worker_connections 1024; # increase if you have lots of clients
accept_mutex off; # set to 'on' if nginx worker_processes > 1
use epoll; # a fast event mechanism for Linux 2.6+
}
http {
resolver 127.0.0.11;
include mime.types;
# fallback in case we can't determine a type
default_type application/octet-stream;
access_log /var/log/nginx/access.log combined;
# Disable delayed sending of small packets
tcp_nodelay on;
upstream ctfd_app {
#fail_timeout=0 always retry ctfd even if it failed
server ctfd:8000 fail_timeout=0;
}
server {
# if no Host match, close the connection to prevent host spoofing
listen 8000 default_server;
return 444;
}
server {
listen 8000;
server_name $hostname;
keepalive_timeout 5;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://ctfd_app;
}
location /webshell {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://webshell/;
}location ~ "/ports/(?([a-f0-9]{32}))/(?(.*))" {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://web_$port/$path$is_args$args;
add_header X-debug $path always;
}
}
}
```## Themes
Currently skrctf is using the 8 bit theme
### 8 bit Theme
Go to /admin/config, enter the following code to Stylesheet editor and press **Update**:
```css
html,
body,
.container {
font-family: "Volter", "Volter", sans-serif;
}
body{
background-color: #0c0d16;
color: #e4e2ff;
}h1{
font-family: "fuck", "fuck", sans-serif;
}
h2{
font-family: "Volter", "Volter", sans-serif;
}
.btn{
font-size: 0.85rem;
}
.h1,h1 {
font-size: 4.25rem
}.h2,h2 {
font-size: 1.75rem
}
a {
color: #714cdf;
text-decoration: none;
background-color: transparent
}a:hover {
color: #4922bd;
text-decoration: underline
}
.modal-content{
background-color: #32334a;
}
.btn-info {
background-color: #714cdf !important;
border-color: #714cdf !important;
}
.btn-outline-secondary {
color: #17b06b;
border-color: #17b06b
}.btn-outline-secondary:hover {
color: #fff;
background-color: #17b06b;
border-color: #17b06b
}
.btn-outline-secondary.focus, .btn-outline-secondary:focus {
-webkit-box-shadow: 0 0 0 .2rem rgba(23, 176, 107, .5);
box-shadow: 0 0 0 .2rem rgba(23, 176, 107, .5)
}
kbd {
padding: .2rem .4rem;
font-size: 100%;
border-radius: .2rem
}
code {
font-size: 100%;
color: #17b06b;
}
.solved-challenge {
opacity: 1;
}.form-control:focus {
background-color: transparent;
border-color: #a3d39c;
box-shadow: 0 0 0 0.2rem #a3d39c;
transition: background-color 0.3s, border-color 0.3s;
color: white;
}
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}/* Hide default HTML checkbox */
.switch input {
opacity: 0;
width: 0;
height: 0;
}/* The slider */
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}input:checked + .slider {
background-color: #17b06b;
}input:focus + .slider {
box-shadow: 0 0 1px #17b06b;
}input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}/* Rounded sliders */
.slider.round {
border-radius: 34px;
}.slider.round:before {
border-radius: 50%;
}.card{
background-color:transparent;
border:4px solid #fff;
}.nav-pills .nav-link.active, .nav-pills .show>.nav-link{
background-color:transparent;
border: 2px solid #37d63e;
border-radius: 0;
}
```