Files
HacktivityLabSheets/index.md
Z. Cliffe Schreuders 7bd1b6a94f Update lab sheets and enhance highlighting functionality
- Modified permalink structure in the configuration to include category in lab URLs.
- Added author and license metadata to lab sheets for better attribution and clarity.
- Introduced a comprehensive highlighting guide for AI assistants to standardize lab sheet formatting.
- Enhanced JavaScript functionality to support multiple highlight types and improved table of contents generation.
- Updated styles for various highlight types to improve visual distinction in lab content.
- Added a new logo for branding consistency across the site.
2025-09-23 12:50:22 +01:00

7.3 KiB

layout, title
layout title
default Hacktivity Lab Sheets

Hacktivity Lab Sheets

Welcome to the Hacktivity SecGen lab sheets repository. This site contains hands-on cybersecurity lab exercises designed for educational purposes.

Available Labs

{% if site.labs.size > 0 %}

{% assign labs_by_category = site.labs | group_by: 'category' %} {% for category in labs_by_category %} {% if category.name != blank %}

{{ category.name | replace: '_', ' ' | capitalize }}

{% else %}

General Labs

{% endif %}
<div class="category-labs">
  {% for lab in category.items %}
  <div class="lab-item">
    <h3><a href="{{ lab.url | relative_url }}">{{ lab.title }}</a></h3>
    <p class="lab-description">{{ lab.description | default: lab.excerpt }}</p>
    <div class="lab-meta">
      {% if lab.author %}
        <div class="author">
          <strong>Author:</strong> {{ lab.author }}
        </div>
      {% endif %}
      {% if lab.license %}
        <div class="license">
          <strong>License:</strong> {{ lab.license }}
        </div>
      {% endif %}
      {% if lab.cybok %}
        <div class="cybok">
          <strong>CyBOK Knowledge Areas:</strong>
          {% for cybok_item in lab.cybok %}
            <span class="cybok-ka">{{ cybok_item.ka }}: {{ cybok_item.topic }}</span>
          {% endfor %}
        </div>
      {% endif %}
      {% if lab.tags %}
        <div class="tags">
          {% for tag in lab.tags %}
            <span class="tag">{{ tag }}</span>
          {% endfor %}
        </div>
      {% endif %}
    </div>
  </div>
  {% endfor %}
</div>

{% endfor %}

{% else %}

No labs are currently available. Labs will be added as they are developed.

Check back soon for new cybersecurity lab exercises!

{% endif %}

About

These lab sheets are designed to work with SecGen (Security Scenario Generator) and provide practical, hands-on experience with various cybersecurity concepts and techniques.

How to Use

  1. Browse the available labs above
  2. Click on a lab title to view the detailed instructions
  3. Follow the setup and execution steps provided in each lab
  4. Complete the challenges and questions included in each exercise

Contributing

If you'd like to contribute new labs or improvements to existing ones, please see the repository's contribution guidelines.

<script> // Theme toggle functionality document.addEventListener('DOMContentLoaded', function() { const themeToggle = document.getElementById('theme-toggle'); const themeIcon = document.getElementById('theme-icon'); const body = document.body; // Check for saved theme preference or default to dark mode const currentTheme = localStorage.getItem('theme') || 'dark'; body.setAttribute('data-theme', currentTheme); updateThemeIcon(currentTheme); themeToggle.addEventListener('click', function() { const currentTheme = body.getAttribute('data-theme'); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; body.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); updateThemeIcon(newTheme); }); function updateThemeIcon(theme) { if (theme === 'dark') { themeIcon.className = 'fas fa-sun'; } else { themeIcon.className = 'fas fa-moon'; } } }); // Process ==highlight== syntax document.addEventListener('DOMContentLoaded', function() { const contentBody = document.querySelector('.lab-list'); if (contentBody) { // Replace specific highlight types first contentBody.innerHTML = contentBody.innerHTML.replace(/==action:\s*([^=]+)==/gi, ' $1'); contentBody.innerHTML = contentBody.innerHTML.replace(/==tip:\s*([^=]+)==/gi, '💡 $1'); contentBody.innerHTML = contentBody.innerHTML.replace(/==hint:\s*([^=]+)==/gi, '💭 $1'); contentBody.innerHTML = contentBody.innerHTML.replace(/==note:\s*([^=]+)==/gi, '$1'); contentBody.innerHTML = contentBody.innerHTML.replace(/==warning:\s*([^=]+)==/gi, '⚠️ $1'); contentBody.innerHTML = contentBody.innerHTML.replace(/==VM:\s*([^=]+)==/gi, '🖥️ $1'); // Replace generic ==text== with text contentBody.innerHTML = contentBody.innerHTML.replace(/==([^=]+)==/g, '$1'); // Replace > TIP: patterns with tip-item divs contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Tip:<\/em>\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/p>\s*<\/blockquote>/gi, '

$1
' ); // Handle > *Tip: ANYTHINGHERE* (entire content in italics) contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Tip:\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/em>\s*<\/p>\s*<\/blockquote>/gi, '

$1
' ); // Also handle > TIP: without italics contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Tip:\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/p>\s*<\/blockquote>/gi, '

$1
' ); // Handle block-level action, warning, note, hint patterns contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Action:\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/p>\s*<\/blockquote>/gi, '

$1
' ); contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Warning:\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/p>\s*<\/blockquote>/gi, '

$1
' ); contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Note:\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/p>\s*<\/blockquote>/gi, '

Note: $1
' ); contentBody.innerHTML = contentBody.innerHTML.replace( /
\s*

\s*Hint:\s*([^<]+(?:<[^>]+>[^<]*<\/[^>]+>[^<]*)*)<\/p>\s*<\/blockquote>/gi, '

Hint: $1
' ); } }); </script>