Files
HacktivityLabSheets/index.md
Z. Cliffe Schreuders 31155f9aeb Enhance author display logic and improve command formatting guidelines across lab sheets
- Updated author display in lab metadata to handle multiple authors correctly.
- Added detailed command formatting instructions in the example highlighting guide, emphasizing the use of markdown code blocks and escaping pipe characters.
- Improved consistency in lab instructions by standardizing headings and formatting for clarity.
- Introduced a new lab on software vulnerabilities, exploits, and remote access payloads, providing a comprehensive overview of the topic.
2025-09-25 12:34:07 +01:00

7.7 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>{% if lab.author.first %}Authors:{% else %}Author:{% endif %}</strong> 
          {% if lab.author.first %}
            {% assign author_count = lab.author.size %}
            {% for author in lab.author %}
              {% if forloop.last and author_count > 1 %}and {% endif %}{{ author }}{% unless forloop.last %}, {% endunless %}
            {% endfor %}
          {% else %}
            {{ lab.author }}
          {% endif %}
        </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>