Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

The iCTF Framework 3.0

This is the framework that Shellphish uses to host the iCTF.

The iCTF Framework is described in a paper presented at the Usenix 3GSE workshop in 2014.

We released this in the hope that it allows educators and trainers to host their own A/D CTFs. This framework is free for commercial use, but the support that we can provide is limited.

We are planning to release more technical documentation regarding each components in the future; as for now you can find instruction on how to create a game here.

If you have questions, please send an email to ctf-admin@lists.cs.ucsb.edu.

DISCLAIMER: This framework is still a work in progress and this release have to be considered a BETA version. New pull requests and new issues are welcome :)

TODOs and known issues

  • The codebase needs to be cleaned from old pieces of unused code.
  • Finish to port every component to python 3.
  • Finish to document the various components.
  • Extend the framework to support multiple cloud providers other than AWS.
  • The CTF cannot be run for more than 12 hours because the credentials we use to login to the docker registry will expire after such time and we currently don't have a way to renew them when the game is running.

Database

This is the central database that tracks the state of the game. It runs on the Database VM and exposes a RESTful API.
Note that this database should not be directly accessed by the teams, which instead should go through the team services component.

Gamebot

The Gamebot is the component responsible for advancing the competition. The competition is divided into ticks. At the beginning of each tick, the gamebot decides which scripts need to be executed by the scriptbot (e.g., scripts to set flags, retrieve flags, or test services) and writes the schedule in the central database. Then, it extracts from the database the data about the previous tick (e.g., flag submitted and the status of service checks) and computes the points to be assigned to each team. The new scores are stored in the database, so that they can be displayed by the dashboard component.

Scriptbot

The scriptbot is responsible for the execution of the scripts scheduled by the gamebot. The scriptbot extracts the scripts scheduled for execution from the central database, and then runs them. For example, the scripts retrieve flags that have been set in the previous tick, or check if the services are up and functional.

Router

The router component is responsible for routing the traffic between the teams in the competition. The component implements an OpenVPN service. Each team is given a VM that acts as the router for the team. The traffic among teams needs to be anonymized to prevent teams from distinguishing scriptbot-generate traffic from team traffic.

Creating a CTF competition

For more information visit our wiki page about running a class CTF

About

The iCTF Framework, presented by Shellphish!

Topics

Resources

Stars

330 stars

Watchers

44 watching

Forks

Releases

Packages

Used by

Contributors

Languages