rephrasing, prepare for methods implementation

This commit is contained in:
overcuriousity 2025-07-19 17:53:17 +02:00
parent ba3a5461b4
commit 1d048e816c
12 changed files with 60 additions and 60 deletions

View File

@ -14,7 +14,7 @@ CC24-Hub ist eine statische Website, die eine strukturierte Übersicht über bew
- **Tool-Katalog**: Umfassende Sammlung von Open-Source und kommerziellen Forensik-Tools
- **Matrix-Ansicht**: Visualisierung der Tools nach Domänen und Prozess-Phasen
- **Erweiterte Filterung**: Suche nach Name, Beschreibung, Tags, Domäne und Phase
- **Self-Hosted Integration**: Direkte Links zu gehosteten Tool-Instanzen
- **CC24-Server Integration**: Direkte Links zu gehosteten Tool-Instanzen
- **Status-Monitoring**: Live-Überwachung der verfügbaren Services
- **Responsive Design**: Optimiert für Desktop und Mobile
- **Dark/Light Mode**: Automatische Theme-Erkennung mit manueller Überschreibung

View File

@ -472,7 +472,7 @@
</div>
<div class="stat-card">
<div class="stat-number" id="selfHostedCount">0</div>
<div class="stat-label">Self-Hosted</div>
<div class="stat-label">CC24-Server</div>
</div>
<div class="stat-card">
<div class="stat-number" id="knowledgebaseCount">0</div>
@ -550,7 +550,7 @@
<select id="accessType">
<option value="">Select Type</option>
<option value="download">Download</option>
<option value="self-hosted">Self-Hosted</option>
<option value="server-based">CC24-Server</option>
<option value="commercial">Commercial</option>
<option value="OS">Operating System</option>
</select>
@ -812,7 +812,7 @@
document.getElementById('totalPhases').textContent = yamlData.phases ? yamlData.phases.length : 0;
document.getElementById('totalDomainAgnostic').textContent = yamlData['domain-agnostic-software'] ? yamlData['domain-agnostic-software'].length : 0;
const selfHosted = tools.filter(tool => tool.accessType === 'self-hosted').length;
const selfHosted = tools.filter(tool => tool.accessType === 'server-based').length;
document.getElementById('selfHostedCount').textContent = selfHosted;
const knowledgebaseTools = tools.filter(tool => tool.knowledgebase === true).length;

View File

@ -18,10 +18,10 @@ const domainAgnosticSoftware = data['domain-agnostic-software'] || [];
<path d="M9 11H5a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2h-4"/>
<path d="M9 11V7a3 3 0 0 1 6 0v4"/>
</svg>
KI-gestützte Tool-Empfehlungen
KI-gestützte Workflow-Empfehlungen
</h2>
<p id="ai-description" class="text-muted" style="max-width: 700px; margin: 0 auto; line-height: 1.6;">
Beschreiben Sie Ihr forensisches Szenario und erhalten Sie maßgeschneiderte Tool-Empfehlungen
Beschreiben Sie Ihr forensisches Szenario und erhalten Sie maßgeschneiderte Workflow-Empfehlungen
basierend auf bewährten DFIR-Workflows und der verfügbaren Software-Datenbank.
</p>
</div>
@ -45,7 +45,7 @@ const domainAgnosticSoftware = data['domain-agnostic-software'] || [];
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="margin-right: 0.5rem; vertical-align: middle;">
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/>
</svg>
Spezifisches Tool
Spezifische Software oder Methode
</span>
</div>
@ -145,15 +145,15 @@ document.addEventListener('DOMContentLoaded', () => {
const modeConfig = {
workflow: {
placeholder: "Beschreiben Sie Ihr forensisches Szenario... z.B. 'Verdacht auf Ransomware-Angriff auf Windows-Domänencontroller mit verschlüsselten Dateien und verdächtigen Netzwerkverbindungen'",
description: "Beschreiben Sie Ihr forensisches Szenario und erhalten Sie maßgeschneiderte Tool-Empfehlungen basierend auf bewährten DFIR-Workflows und der verfügbaren Software-Datenbank.",
description: "Beschreiben Sie Ihr forensisches Szenario und erhalten Sie maßgeschneiderte Empfehlungen basierend auf bewährten DFIR-Workflows und der verfügbaren Software-Datenbank.",
submitText: "Empfehlungen generieren",
loadingText: "Analysiere Szenario und generiere Empfehlungen..."
},
tool: {
placeholder: "Beschreiben Sie Ihr spezifisches Problem oder Ihre Anforderung... z.B. 'Ich benötige ein Tool zur Analyse von Android-Backups mit WhatsApp-Nachrichten und GPS-Daten'",
description: "Beschreiben Sie Ihr spezifisches Problem oder Ihre Anforderung und erhalten Sie 1-3 gezielt passende Tool-Empfehlungen mit detaillierten Erklärungen zur optimalen Anwendung.",
submitText: "Tool-Empfehlungen finden",
loadingText: "Analysiere Anforderungen und suche passende Tools..."
placeholder: "Beschreiben Sie Ihr spezifisches Problem oder Ihre Anforderung... z.B. 'Ich benötige eine Anwendung zur Analyse von Android-Backups mit WhatsApp-Nachrichten und GPS-Daten'",
description: "Beschreiben Sie Ihr spezifisches Problem oder Ihre Anforderung und erhalten Sie 1-3 gezielt passende Empfehlungen mit detaillierten Erklärungen zur optimalen Anwendung.",
submitText: "Empfehlungen finden",
loadingText: "Analysiere Anforderungen und suche passende Methode..."
}
};
@ -261,7 +261,7 @@ document.addEventListener('DOMContentLoaded', () => {
// Disable submit button
aiSubmitBtn.disabled = true;
submitBtnText.textContent = currentMode === 'workflow' ? 'Generiere Empfehlungen...' : 'Suche passende Tools...';
submitBtnText.textContent = currentMode === 'workflow' ? 'Generiere Empfehlungen...' : 'Suche passende Methode...';
try {
const response = await fetch('/api/ai/query', {
@ -474,7 +474,7 @@ document.addEventListener('DOMContentLoaded', () => {
<div class="tool-rec-metadata">
<div style="display: flex; flex-wrap: wrap; gap: 0.25rem; margin-bottom: 0.5rem;">
${hasValidProjectUrl ? '<span class="badge badge-primary">Self-Hosted</span>' : ''}
${hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
${tool.license !== 'Proprietary' ? '<span class="badge badge-success">Open Source</span>' : ''}
<span class="badge" style="background-color: var(--color-bg-tertiary); color: var(--color-text);">${tool.skillLevel}</span>
</div>
@ -631,7 +631,7 @@ document.addEventListener('DOMContentLoaded', () => {
<span class="badge" style="background-color: ${suitabilityColors[toolRec.suitability_score]}; color: white; font-size: 0.8125rem;">
${getSuitabilityText(toolRec.suitability_score)}
</span>
${hasValidProjectUrl ? '<span class="badge badge-primary">Self-Hosted</span>' : ''}
${hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
${fullTool.license !== 'Proprietary' ? '<span class="badge badge-success">Open Source</span>' : ''}
${fullTool.knowledgebase === true ? '<span class="badge badge-error">📖</span>' : ''}
</div>
@ -658,7 +658,7 @@ document.addEventListener('DOMContentLoaded', () => {
<path d="M9 11H5a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2h-4"/>
<path d="M9 11V7a3 3 0 0 1 6 0v4"/>
</svg>
Warum dieses Tool?
Warum diese Methode?
</h4>
${formatWorkflowSuggestion(toolRec.detailed_explanation)}
${toolRec.implementation_approach ? `

View File

@ -37,7 +37,7 @@ const cardClass = hasValidProjectUrl ? 'card card-hosted tool-card' : (tool.lice
<div class="tool-card-header">
<h3>{tool.name}</h3>
<div class="tool-card-badges">
{hasValidProjectUrl && <span class="badge badge-primary">Self-Hosted</span>}
{hasValidProjectUrl && <span class="badge badge-primary">CC24-Server</span>}
{tool.license !== 'Proprietary' && <span class="badge badge-success">OSS</span>}
{hasKnowledgebase && <span class="badge badge-error">📖</span>}
</div>

View File

@ -337,7 +337,7 @@ const sortedTags = Object.entries(tagFrequency)
return true;
});
// Sort filtered results: self-hosted first, proprietary last
// Sort filtered results: server-based first, proprietary last
filtered.sort((a, b) => {
const aHosted = isToolHosted(a);
const bHosted = isToolHosted(b);

View File

@ -67,7 +67,7 @@ domains.forEach((domain: any) => {
<div class="tool-compact-header">
<h4 style="margin: 0; font-size: 0.875rem; font-weight: 600;">{tool.name}</h4>
<div style="display: flex; gap: 0.25rem;">
{hasValidProjectUrl && <span class="badge badge--mini badge-primary">Self-Hosted</span>}
{hasValidProjectUrl && <span class="badge badge--mini badge-primary">CC24-Server</span>}
{tool.license !== 'Proprietary' && <span class="badge badge--mini badge-success">OSS</span>}
{tool.knowledgebase === true && <span class="badge badge--mini badge-error">Infos 📖</span>}
</div>
@ -90,7 +90,7 @@ domains.forEach((domain: any) => {
<!-- DFIR Tools Matrix -->
<div id="dfir-matrix-section">
<h2 style="margin-bottom: 1rem; color: var(--color-text);">DFIR Tools Matrix</h2>
<h2 style="margin-bottom: 1rem; color: var(--color-text);">MATRIX</h2>
<table class="matrix-table">
<thead>
<tr>
@ -255,7 +255,7 @@ domains.forEach((domain: any) => {
badgesContainer.innerHTML = '';
if (hasValidProjectUrl) {
badgesContainer.innerHTML += '<span class="badge badge-primary">Self-Hosted</span>';
badgesContainer.innerHTML += '<span class="badge badge-primary">CC24-Server</span>';
}
if (tool.license !== 'Proprietary') {
badgesContainer.innerHTML += '<span class="badge badge-success">Open Source</span>';

View File

@ -89,7 +89,7 @@ tools:
domain-agnostic-software:
- collaboration-general
skillLevel: intermediate
accessType: self-hosted
accessType: server-based
url: https://github.com/TheHive-Project/TheHive
projectUrl: ''
license: Community Edition (Free) / Commercial
@ -122,7 +122,7 @@ tools:
platforms:
- Web
skillLevel: intermediate
accessType: self-hosted
accessType: server-based
url: https://misp-project.org/
projectUrl: https://misp.cc24.dev
license: AGPL-3.0
@ -154,7 +154,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: intermediate
accessType: self-hosted
accessType: server-based
url: https://timesketch.org/
projectUrl: ''
license: Apache 2.0
@ -286,7 +286,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: advanced
accessType: self-hosted
accessType: server-based
url: https://github.com/cert-ee/cuckoo3
projectUrl: ''
license: GPL-3.0
@ -382,7 +382,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: beginner
accessType: self-hosted
accessType: server-based
url: https://gchq.github.io/CyberChef/
projectUrl: ''
license: Apache 2.0
@ -420,7 +420,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: advanced
accessType: self-hosted
accessType: server-based
url: https://www.velociraptor.app/
projectUrl: https://raptor.cc24.dev
license: Apache 2.0
@ -456,7 +456,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: advanced
accessType: self-hosted
accessType: server-based
url: https://github.com/google/grr
projectUrl: ''
license: Apache 2.0
@ -489,7 +489,7 @@ tools:
- Linux
domain-agnostic-software: null
skillLevel: expert
accessType: self-hosted
accessType: server-based
url: https://arkime.com/
projectUrl: ''
license: Apache 2.0
@ -621,7 +621,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: intermediate
accessType: self-hosted
accessType: server-based
url: https://neo4j.com/
projectUrl: https://graph.cc24.dev
license: GPL-3.0 / Commercial
@ -689,7 +689,7 @@ tools:
domain-agnostic-software:
- collaboration-general
skillLevel: novice
accessType: self-hosted
accessType: server-based
url: https://nextcloud.com/
projectUrl: https://cloud.cc24.dev
license: AGPL-3.0
@ -719,7 +719,7 @@ tools:
domain-agnostic-software:
- collaboration-general
skillLevel: beginner
accessType: self-hosted
accessType: server-based
url: https://gitea.io/
projectUrl: https://git.cc24.dev
license: MIT
@ -859,7 +859,7 @@ tools:
- Web
domain-agnostic-software: null
skillLevel: intermediate
accessType: self-hosted
accessType: server-based
url: https://graphsense.org/
projectUrl: ''
license: MIT

View File

@ -177,9 +177,9 @@ import BaseLayout from '../layouts/BaseLayout.astro';
<div style="display: grid; gap: 1.25rem;">
<div style="background-color: var(--color-bg-secondary); padding: 1.25rem; border-radius: 0.5rem;">
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">🔍 Tool-Vorschläge</h4>
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">🔍 Vorschläge</h4>
<p style="margin: 0;">
Ich suche stets nach Ergänzungen für die Liste. Falls euch interessante Tools einfallen
Ich suche stets nach Ergänzungen für die Liste. Falls euch interessante Tools oder Methoden einfallen
schreibt mir gerne auf Signal!
</p>
</div>
@ -219,8 +219,8 @@ import BaseLayout from '../layouts/BaseLayout.astro';
<!-- Footer Note -->
<div style="text-align: center; padding: 2rem; background-color: var(--color-bg-secondary); border-radius: 0.75rem; border: 1px solid var(--color-border);">
<p style="margin: 0; color: var(--color-text-secondary); font-size: 0.875rem;">
<strong>Akademisches Projekt</strong> | Seminargruppe CC24-w1 |
Alle Tools und Dienste dienen ausschließlich Bildungs- und Forschungszwecken
<strong>Inoffizielles Studienprojekt</strong> | Seminargruppe CC24-w1 |
Alle dargestellte Software, Dienste und Methoden dienen Bildungs- und Forschungszwecken sowie der Weiterentwicklung der IT-forensischen Methodik.
</p>
</div>
</section>

View File

@ -119,12 +119,12 @@ function createWorkflowSystemPrompt(toolsData: any): string {
// Build dynamic phase descriptions for tool selection
const phaseDescriptions = regularPhases.map((phase: any) =>
`- ${phase.name}: ${phase.description || 'Tools for this phase'}`
`- ${phase.name}: ${phase.description || 'Tools/Methods for this phase'}`
).join('\n');
// Add domain-agnostic software descriptions
const domainAgnosticDescriptions = domainAgnosticSoftware.map((section: any) =>
`- ${section.name}: ${section.description || 'Cross-cutting tools and platforms'}`
`- ${section.name}: ${section.description || 'Cross-cutting software and platforms'}`
).join('\n');
// Create valid phase values for JSON schema
@ -133,9 +133,9 @@ function createWorkflowSystemPrompt(toolsData: any): string {
...domainAgnosticSoftware.map((s: any) => s.id)
].join('|');
return `Du bist ein DFIR (Digital Forensics and Incident Response) Experte, der Ermittlern bei der Toolauswahl hilft.
return `Du bist ein DFIR (Digital Forensics and Incident Response) Experte, der Ermittlern bei der Auswahl von Software und Methoden hilft.
VERFÜGBARE TOOLS DATABASE:
VERFÜGBARE DATENBASIS:
${JSON.stringify(toolsList, null, 2)}
UNTERSUCHUNGSPHASEN (NIST Framework):
@ -145,18 +145,18 @@ FORENSISCHE DOMÄNEN:
${domainsDescription}
WICHTIGE REGELN:
1. Pro Phase 1-3 Tools empfehlen (immer mindestens 1 wenn verfügbar)
2. Tools können in MEHREREN Phasen empfohlen werden wenn sinnvoll - versuche ein Tool für jede Phase zu empfehlen, selbst wenn die Priorität "low" ist.
3. Für Reporting-Phase: Visualisierungs- und Dokumentationstools einschließen
1. Pro Phase 1-3 Tools/Methoden empfehlen (immer mindestens 1 wenn verfügbar)
2. Tools/Methoden können in MEHREREN Phasen empfohlen werden wenn sinnvoll - versuche ein Tool/Methode für jede Phase zu empfehlen, selbst wenn die Priorität "low" ist.
3. Für Reporting-Phase: Visualisierungs- und Dokumentationssoftware einschließen
4. Gib stets dem spezieller für den Fall geeigneten Werkzeug den Vorzug.
5. Deutsche Antworten für deutsche Anfragen, English for English queries
6. Bewerbe NIEMALS Proprietäre Software fälschlicherweise als Open-Source-Tools, erkenne aber an, falls diese besser geeignet sein könnte.
7. Bevorzuge alles, was nicht proprietär ist (license != "Proprietary"), aber erkenne an wenn ein proprietäres Tool besser geeignet ist.
6. Bewerbe NIEMALS Proprietäre Software fälschlicherweise als Open-Source-Software, erkenne aber an, falls diese besser geeignet sein könnte.
7. Bevorzuge alles, was nicht proprietär ist (license != "Proprietary"), aber erkenne an, wenn proprietäre Software besser geeignet ist.
TOOL-AUSWAHL NACH PHASE:
SOFTWARE/METHODEN-AUSWAHL NACH PHASE:
${phaseDescriptions}
DOMAIN-AGNOSTIC SOFTWARE:
DOMÄNENAGNOSTISCHE SOFTWARE/METHODEN:
${domainAgnosticDescriptions}
ANTWORT-FORMAT (strict JSON):
@ -167,7 +167,7 @@ ANTWORT-FORMAT (strict JSON):
"name": "EXAKTER Name aus der Database",
"priority": "high|medium|low",
"phase": "${validPhases}",
"justification": "Warum dieses Tool für diese Phase und Szenario geeignet ist"
"justification": "Warum diese Methode für diese Phase und Szenario geeignet ist"
}
],
"workflow_suggestion": "Vorgeschlagener Untersuchungsablauf",
@ -192,9 +192,9 @@ function createToolSystemPrompt(toolsData: any): string {
projectUrl: tool.projectUrl
}));
return `Du bist ein DFIR (Digital Forensics and Incident Response) Experte, der bei der Auswahl spezifischer Tools für konkrete Probleme hilft.
return `Du bist ein DFIR (Digital Forensics and Incident Response) Experte, der bei der Auswahl spezifischer Software/Methoden für konkrete Probleme hilft.
VERFÜGBARE TOOLS DATABASE:
VERFÜGBARE DATENBASIS:
${JSON.stringify(toolsList, null, 2)}
WICHTIGE REGELN:
@ -216,11 +216,11 @@ ANTWORT-FORMAT (strict JSON):
"name": "EXAKTER Name aus der Database",
"rank": 1,
"suitability_score": "high|medium|low",
"detailed_explanation": "Detaillierte Erklärung, warum dieses Tool das Problem löst",
"detailed_explanation": "Detaillierte Erklärung, warum dieses Tool/diese Methode das Problem löst",
"implementation_approach": "Konkrete Schritte/Ansatz zur Anwendung für dieses spezifische Problem",
"pros": ["Spezifische Vorteile für diesen Anwendungsfall", "Weitere Vorteile"],
"cons": ["Potentielle Nachteile oder Limitationen", "Weitere Einschränkungen"],
"alternatives": "Alternative Ansätze oder ergänzende Tools, falls relevant"
"alternatives": "Alternative Ansätze oder ergänzende Tools/Methoden, falls relevant"
}
],
"additional_considerations": "Wichtige Überlegungen, Voraussetzungen oder Warnungen"

View File

@ -23,7 +23,7 @@ const tools = data.tools;
</p>
<p class="text-muted" style="font-size: 1.125rem; margin-bottom: 1.5rem; line-height: 1.7;">
Unser kuratiertes Verzeichnis bietet euch eine strukturierte Übersicht über bewährte DFIR-Tools,
Unser kuratiertes Verzeichnis bietet euch eine strukturierte Übersicht über bewährte Methoden und Tools,
kategorisiert nach forensischen Domänen und Untersuchungsphasen nach Kent, Chevalier, Grance & Dang.
</p>
@ -41,7 +41,7 @@ const tools = data.tools;
<path d="M12 16v-4"></path>
<path d="M12 8h.01"></path>
</svg>
SSO & Zugang erfahren
Infos zu SSO & Zugang
</a>
<!-- AI Query Button -->
@ -59,7 +59,7 @@ const tools = data.tools;
<polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline>
<line x1="12" y1="22.08" x2="12" y2="12"></line>
</svg>
Tools entdecken
Entdecken
</a>
</div>
</div>
@ -354,7 +354,7 @@ function createToolCard(tool) {
<div class="tool-card-header">
<h3>${tool.name}</h3>
<div class="tool-card-badges">
${hasValidProjectUrl ? '<span class="badge badge-primary">Self-Hosted</span>' : ''}
${hasValidProjectUrl ? '<span class="badge badge-primary">CC24-Server</span>' : ''}
${tool.license !== 'Proprietary' ? '<span class="badge badge-success">OSS</span>' : ''}
${hasKnowledgebase ? '<span class="badge badge-error">📖</span>' : ''}
</div>

View File

@ -56,7 +56,7 @@ knowledgebaseTools.sort((a: any, b: any) => a.name.localeCompare(b.name));
</svg>
<h3 style="color: var(--color-text-secondary); margin-bottom: 0.5rem;">Noch keine Knowledgebase-Einträge</h3>
<p class="text-muted">
Knowledgebase-Einträge werden automatisch angezeigt, sobald Tools das Attribut "knowledgebase: true" haben.
Knowledgebase-Einträge werden automatisch angezeigt, sobald Datenbankeinträge das Attribut "knowledgebase: true" haben. Wenn hier noch nichts drinsteht, habe ich noch nichts dazu geschrieben.
</p>
</div>
) : (
@ -76,7 +76,7 @@ knowledgebaseTools.sort((a: any, b: any) => a.name.localeCompare(b.name));
tool.projectUrl.trim() !== "";
return (
<>
{hasValidProjectUrl && <span class="badge badge-primary">Self-Hosted</span>}
{hasValidProjectUrl && <span class="badge badge-primary">CC24-Server</span>}
{tool.license !== 'Proprietary' && <span class="badge badge-success">Open Source</span>}
<span class="badge badge-error">Infos 📖</span>
</>

View File

@ -3,7 +3,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
import { getToolsData } from '../utils/dataService.js';
// Load tools data to get self-hosted services
// Load tools data to get server-based services
const data = await getToolsData();
// Filter for hosted services based on projectUrl presence