Renamed `skeleton` folder to `ctf_skeleton` and made it clear it is a separate project in the README
|
@ -12,9 +12,9 @@ I plan to do this project in [Python] with [Flask].
|
|||
File & Directory Information
|
||||
----------------
|
||||
|
||||
* [`skeleton/`](skeleton/)
|
||||
* [`ctf_skeleton/`](ctf_skeleton/)
|
||||
|
||||
This directory holds some code from a recent CTF platform I tried to build on my own. I am using elements from it, so I just snagged to code to be able to cherry-pick off of it and change what I need to get this project rolling.
|
||||
This directory holds some code from a recent CTF platform I tried to build on my own. I am using elements from it, so I just snagged to code to be able to cherry-pick off of it and change what I need to get this project rolling. __Do not consider it a part of this project; it is _not_. It is just included as a convenience for me while the BearShop project is still be developed.__
|
||||
|
||||
* [`schema.sql`](schema.sql)
|
||||
|
||||
|
@ -22,7 +22,8 @@ File & Directory Information
|
|||
|
||||
* [`setup.sh`](setup.sh)
|
||||
|
||||
This is the [`bash`][bash] script that I planned on using to initially create the server. It sets up the database, creates private keys to be used, and modifies a "base" rendition of the server [Python] script to add all of the configuration variables that can be set _in the [`setup.sh`](setup,sh)_ script.
|
||||
This is the [`bash`][bash] script that I planned on using to initially create the server. It sets up the database, creates private keys to be used, and modifies a "base" rendition of the server [Python] script to add all of the configuration variables that can be set _in the_ [`setup.sh`](setup.sh) script.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,176 @@
|
|||
#!/usr/bin/env bash
|
||||
# Author: John Hammond
|
||||
# Date: 11JAN2016
|
||||
# Description:
|
||||
# This script should install all the necessary dependencies and generate a self-signing
|
||||
# certificate to be used by a CTF server you can run on your own local machine.
|
||||
# If you configure your own CTF with a .json file, you can give that to the server
|
||||
# script and it will easily spin up a CTF competition for everyone in the local
|
||||
# network.
|
||||
#
|
||||
|
||||
# Optional variables: this should be modified by the commandline arguments
|
||||
DATABASE=""
|
||||
CONFIGURATION=""
|
||||
|
||||
# Internal variables; do not edit.
|
||||
DEPENDENCIES="python-pip sqlite3 python-flask python-passlib"
|
||||
SERVER_FILE="server_base.py"
|
||||
NEW_SERVER_FILE="server.py"
|
||||
SCHEMA_FILE="schema.sql"
|
||||
PRIVATEKEY_FILE='privateKey.key'
|
||||
CERTIFICATE_FILE='certificate.crt'
|
||||
|
||||
CURRENT_USER=`logname`
|
||||
RED=`tput setaf 1` # code for red console text
|
||||
GREEN=`tput setaf 2` # code for green text
|
||||
NC=`tput sgr0` # Reset the text color
|
||||
|
||||
function display_help() {
|
||||
cat <<EOF
|
||||
usage:
|
||||
$0 -d DATABASE -c CONFIGURATION
|
||||
parameters:
|
||||
-d
|
||||
Specify the database file that will be created and used for this server.
|
||||
Example: '/tmp/ctf-practice.db'
|
||||
-c
|
||||
Specify the configuration file that will be used for this server.
|
||||
Example: 'ctf_practice.json'
|
||||
-h
|
||||
Display help message
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
function install_dependencies(){
|
||||
|
||||
echo "$0: ${GREEN}installing dependenices...${NC}"
|
||||
apt-get update || panic
|
||||
apt-get -y install $DEPENDENCIES || panic
|
||||
}
|
||||
|
||||
function create_certificate(){
|
||||
|
||||
echo "$0: ${GREEN}creating HTTPS certificates...${NC}"
|
||||
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout $PRIVATEKEY_FILE -out $CERTIFICATE_FILE || panic
|
||||
|
||||
sed "0,/\$CERTIFICATE_FILE/{s/\$CERTIFICATE_FILE/$CERTIFICATE_FILE/}" $SERVER_FILE > $NEW_SERVER_FILE || panic
|
||||
sed -i "0,/\$PRIVATEKEY_FILE/{s/\$PRIVATEKEY_FILE/$PRIVATEKEY_FILE/}" $NEW_SERVER_FILE || panic
|
||||
|
||||
|
||||
}
|
||||
|
||||
function create_database(){
|
||||
|
||||
echo "$0: ${GREEN}creating sqlite3 database...${NC}"
|
||||
|
||||
rm -f $DATABASE
|
||||
sqlite3 $DATABASE < $SCHEMA_FILE || panic
|
||||
chown $CURRENT_USER $DATABASE || panic
|
||||
sed -i '0,/\$DATABASE/{s/\$DATABASE/'${DATABASE//\//\\/}'/}' $NEW_SERVER_FILE || panic
|
||||
|
||||
}
|
||||
|
||||
function configure_ctf(){
|
||||
|
||||
echo "$0: ${GREEN}configuring CTF...${NC}"
|
||||
|
||||
sed -i "0,/\$CONFIGURATION/{s/\$CONFIGURATION/$CONFIGURATION/}" $NEW_SERVER_FILE || panic
|
||||
|
||||
}
|
||||
|
||||
function create_new_server(){
|
||||
|
||||
cp $SERVER_FILE $NEW_SERVER_FILE
|
||||
chown $CURRENT_USER $NEW_SERVER_FILE
|
||||
chmod 744 $NEW_SERVER_FILE
|
||||
}
|
||||
|
||||
function configure_firewall(){
|
||||
|
||||
# Allow incoming connections...
|
||||
echo "$0: ${GREEN} Configuring firewall for HTTPS connections...${NC}"
|
||||
ufw allow https
|
||||
}
|
||||
|
||||
function main()
|
||||
{
|
||||
|
||||
install_dependencies
|
||||
|
||||
create_new_server
|
||||
|
||||
create_certificate
|
||||
|
||||
create_database
|
||||
|
||||
configure_ctf
|
||||
|
||||
configure_firewall
|
||||
|
||||
echo "$0: ${GREEN} CTF server successfully setup!${NC}"
|
||||
echo "$0: ${GREEN} You should now be able to run the server with the command: ${NC}"
|
||||
echo '`sudo python server.py`'
|
||||
|
||||
exit 0
|
||||
|
||||
}
|
||||
|
||||
# Print a fatal error message and exit
|
||||
# Usage:
|
||||
# some_command parameter || panic
|
||||
#
|
||||
# This will print the panic message and exit if `some_command` fails.
|
||||
function panic
|
||||
{
|
||||
echo "$0: ${RED}fatal error${NC}"
|
||||
exit -1
|
||||
}
|
||||
|
||||
|
||||
# Make sure the user is root (e.g. running as sudo)
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo "$0: ${RED}you must be root to configure this box.${NC}"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Parse script options
|
||||
while getopts d:c:h opt; do
|
||||
|
||||
case $opt in
|
||||
d)
|
||||
echo "$0: ${GREEN}using database file ${OPTARG}${NC}"
|
||||
DATABASE=$OPTARG
|
||||
;;
|
||||
c)
|
||||
echo "$0: ${GREEN}using configuration file ${OPTARG}${NC}"
|
||||
CONFIGURATION=$OPTARG
|
||||
;;
|
||||
h)
|
||||
display_help
|
||||
exit 0
|
||||
;;
|
||||
\?)
|
||||
exit -1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# Make sure we entered a database name
|
||||
if [ "$DATABASE" == "" ]; then
|
||||
echo "$0: ${RED}you must specify a database file!${NC}"
|
||||
display_help
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Make sure we entered a configuration file
|
||||
if [ "$CONFIGURATION" == "" ]; then
|
||||
echo "$0: ${RED}you must specify a configuration file!${NC}"
|
||||
display_help
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# This makes it so every function has a "pre-declaration" of all the functions
|
||||
main "$@"
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 356 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |