discord.py bot focused on providing CTF tools for collaboration in Discord servers (ctftime.org commands, team setup + ctfd integration, utilites, etc)! If you have a feature request, make it a GitHub issue or use the >request "x" command.
A
verification requirements)
Please let me know if there's any issues with the link! This is one of multiple alternate instances because the original is over the 100 server limit Discord imposes for non-verified bots (How to Use
If you ever forget a command, use >help
!
After inviting to your server, it is recommended that you first configure the categories you want active and archived CTF channels to go into.
- When you create a ctf, it will by default go into the "CTF" category (it will create one if it is not present), and when you archive a ctf it will go into the ARCHIVE category.
- You can configure this with
>config ctf_category "Category for CTFs"
and>config archive_category "Category for Archived CTFs"
CTF Commands
The following commands are the ones you will most likely want to pay attention to, although if you do not expect to use this bot to manage CTFs you can skip this category and go down to CTFTime commands.
>ctf create "ctf name"
This is the command you'll use when you want to begin a new CTF. This command will make a text channel with your supplied name under the designated CTF category. Must have permissions to manage channels
NOTE: the following ctf specific commands will only be accepted under the channel created for that ctf. This is to avoid clashes with multiple ctfs going on in the same server.
-
>ctf join/leave
Using this command will either give or remove the role of a created ctf to/from you. -
>ctf challenge add/working/solved/remove "challenge"
Allows users to add or remove challenges to a list, and then set the status of that challenge. Use quotations -
>ctf challenge list
This is the list command that was previously mentioned, it displays the added challenges, who's working on what, and if a challenge is solved (and by who).
NOTE: There is shorthand! challenge -> chal/chall, add -> a, working -> w, solved -> s, remove -> r
-
>ctf challenge pull "http(s)://ctfd.url"
Pull challenges and their solved states from a CTFd hosted CTF, and add them to your challenges list. Requires the username and password to be set with>ctf setcreds "username" "password"
-
>ctf setcreds "ctfd username" "password"
Pin the message of ctf credentials, can be fetched by the bot later in order to use>ctf challenge pull
. Credentials are never stored outside of Discord. -
>ctf creds
Gets the credentials from the pinned message.
IMPORTANT: credentials are never stored outside of the pinned message on Discord. They are needed to pull challenge data and solve state from the CTFd platform.
-
>ctf archive
Move the CTF channel into the Archive category. Must have permissions to manage channels -
>ctf delete
Delete the CTF info from the database, and delete the role. Must have permissions to manage channels
CTFtime Commands
-
>ctftime countdown/timeleft
Countdown will return when a selected CTF starts, and timeleft will return when any currently running CTFs end in the form of days hours minutes and seconds.
-
>ctftime upcoming <number>
Uses the api mentioned to return an embed up to 5 upcoming CTFs. If no number is provided the default is 3. -
>ctftime current
Displays any currently running CTFs in the same embed as previously mentioned. -
>ctftime top <year>
Shows the ctftime leaderboards from a certain year (dates back to 2011).
Utility Commands
-
>help
Returns the help page -
>amicool
Are you cool? -
>magicb filetype
Returns the mime and magicbytes of your supplied filetype. Useful for stegonography challenges where a filetype is corrupt. -
>rot "a message"
Returns all 25 possible rotations for a message. -
>b64 encode/decode "message"
Encode or decode in base64 (at the time of writing this, if there are any unprintable characters this command will not work, this goes for all encoding/decoding commands). -
>b32 encode/decode "message"
Encode or decode in base32 -
>binary encode/decode "message"
Encode or decode in binary. -
>hex encode/decode "message"
Encode or decode in hex. -
>url encode/decode "message"
Encode or decode with url parse. This could be used for generating XSS payloads. -
>reverse "message"
Reverse a message. -
>counteach "message"
Count the occurrences of each character in the supplied message. -
>characters "message"
Count the amount of characters in your message. -
>wordcount a test
Counts the amount of words in your message (don't use quotations). -
>cointoss
Get a 50/50 cointoss to make all your life's decisions. -
>request/report "a feature"/"a bug"
Dm's the creator (nullpxl#3928) with your feature/bug request/report.
Writeups Command
>writeups <search query>
Searches for CTF writeups based on the provided string. Search includes, CTF Event, challenge name, writeups content, etc. Double quotes can be used around all or part of a query to find an exact match and a minus sign can be used to exclude results.
Have a feature request? Make a GitHub issue or use the >request command.
Setup - General Overview
- This may be necessary in the future because of Disord's recent verification requirements for bots in over 100 servers (which this bot is already over). This rule, which will disallow users to invite bots that have not been verified by the owner (which requires photoid) will be enforced starting october 7th.
Create a discord bot on discord's developer portal -> get the bot token -> clone this repo ->
Create mongodb account -> create project -> create cluster -> create db user ->
add your ip to db whitelist access -> connect to cluster and select python as driver ->
get connection string and follow mongodb's steps with your password -> use the below template for creating dbs and collections under the file config_vars.py -> build with docker (`docker build`). You may have to set pymongo==3.10.1 or similar in requirements.txt -> invite the bot to your server (go to the bot settings page on discord developer portal)
# config_vars.py
from pymongo import MongoClient
discord_token = ""
mongodb_connection = ""
client = MongoClient(mongodb_connection)
ctfdb = client['ctftime'] # Create ctftime database
ctfs = ctfdb['ctfs'] # Create ctfs collection
teamdb = client['ctfteams'] # Create ctf teams database
serverdb = client['serverinfo'] # configuration db