Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary

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

Repository files navigation

Project Kaguya

A CTF for beginners

The name (and the CTF itself) is a homage to the game Hacknet, more specifically the Labyrinths DLC

Dependencies

A virtual machine with the following:

  • docker
  • SystemD (for the service files)
  • ASLR turned OFF (kernel.randomize.va_space=0)
  • GCC and Make
  • A promiscuous network interface

How to Use

Assuming that your VM has all dependencies satisfied, run start_CTF.sh in the VM_files folder.

It may take a few minutes for all of the docker images to start running, and it will take a lot longer if you have not built the images yet.

First thing you need to do is get the IP of your VM. If you name your VM 'Project Kaguya', you can use the provided shell file to get the VM IP.

Then, run netcat on port 4444 of your VM, which will tell you the IP of your flag system.

Telnet to the flag system, with user 'anonymous'

You can cleanup / reset everything by using the 'cleanup.sh' script

A note about networks

By default, the images assume that the internal LAN has the subnet 192.168.2.0/24, and an external LAN of 192.168.1.0/24 This means, that if your external LAN isn't using 192.168.1.0/24, you need to update the 'create_docker_networks.sh' file. Also, if you're using 192.168.2.0/24, be sure to change both docker networks to reflect this change. I don't believe any of the images have their interfaces hardcoded in terms of their subnets, but I'm not sure.

VM Image

I have a virtualbox image prepared that can be imported. All that needs to be configured are the docker networks, but be sure to pull the repository beforehand.

The VM can be found here: https://mega.nz/file/iEYzFC7A#wRD-t1exKVeqOEQ3RwtlcFdzawh22y0jbYWrn8659Ds

The credentials for the VM are: kaguya:by any means necessary