diff --git a/.astro/content.d.ts b/.astro/content.d.ts index c0082cc..2a98031 100644 --- a/.astro/content.d.ts +++ b/.astro/content.d.ts @@ -162,7 +162,17 @@ declare module 'astro:content' { }; type DataEntryMap = { - + "knowledgebase": Record; + rendered?: RenderedContent; + filePath?: string; +}>; + }; type AnyEntryMap = ContentEntryMap & DataEntryMap; @@ -194,6 +204,6 @@ declare module 'astro:content' { LiveContentConfig['collections'][C]['loader'] >; - export type ContentConfig = typeof import("../src/content.config.mjs"); + export type ContentConfig = typeof import("../src/content/config.js"); export type LiveContentConfig = never; } diff --git a/.astro/data-store.json b/.astro/data-store.json index e70e52a..32e8b01 100644 --- a/.astro/data-store.json +++ b/.astro/data-store.json @@ -1 +1 @@ -[["Map",1,2],"meta::meta",["Map",3,4,5,6],"astro-version","5.11.1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"server\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":true,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\",\"entrypoint\":\"astro/assets/endpoint/node\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false},\"legacy\":{\"collections\":false},\"session\":{\"driver\":\"fs-lite\",\"options\":{\"base\":\"/var/home/user01/Projekte/cc24-hub/node_modules/.astro/sessions\"}}}"] \ No newline at end of file +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.12.0","content-config-digest","87e4412f3e9f505f","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"server\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":true,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\",\"entrypoint\":\"astro/assets/endpoint/node\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"rawEnvValues\":false},\"legacy\":{\"collections\":false},\"session\":{\"driver\":\"fs-lite\",\"options\":{\"base\":\"/var/home/user01/Projekte/cc24-hub/node_modules/.astro/sessions\"}}}","knowledgebase",["Map",11,12,84,85,161,162,240,241,301,302],"regular-expressions-regex",{"id":11,"data":13,"body":35,"filePath":36,"digest":37,"rendered":38,"legacyId":83},{"title":14,"tool_name":15,"description":16,"last_updated":17,"author":18,"difficulty":19,"categories":20,"tags":25,"sections":31,"review_status":34},"Regular Expressions (Regex) – Musterbasierte Textanalyse","Regular Expressions (Regex)","Pattern matching language für Suche, Extraktion und Manipulation von Text in forensischen Analysen.",["Date","2025-07-20T00:00:00.000Z"],"CC24-Team","intermediate",[21,22,23,24],"incident-response","malware-analysis","network-forensics","fraud-investigation",[26,27,28,29,30],"pattern-matching","text-processing","log-analysis","string-manipulation","search-algorithms",{"overview":32,"installation":33,"configuration":33,"usage_examples":32,"best_practices":32,"troubleshooting":33,"advanced_topics":32},true,false,"published","> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\n\n\n# Übersicht\n\n**Regular Expressions (Regex)** sind ein leistungsfähiges Werkzeug zur Erkennung, Extraktion und Transformation von Zeichenfolgen anhand vordefinierter Muster. In der digitalen Forensik sind Regex-Ausdrücke unverzichtbar: Sie helfen beim Auffinden von IP-Adressen, Hash-Werten, Dateipfaden, Malware-Signaturen oder Kreditkartennummern in großen Mengen unstrukturierter Daten wie Logdateien, Netzwerktraces oder Memory Dumps.\n\nRegex ist nicht auf eine bestimmte Plattform oder Software beschränkt – es wird in nahezu allen gängigen Programmiersprachen, Texteditoren und forensischen Tools unterstützt.\n\n## Verwendungsbeispiele\n\n### 1. IP-Adressen extrahieren\n\n```regex\n\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b\n````\n\nVerwendung:\n\n* Finden von IP-Adressen in Firewall-Logs oder Packet Captures.\n* Beispiel-Zeile:\n\n ```\n Connection from 192.168.1.101 to port 443 established\n ```\n\n### 2. E-Mail-Adressen identifizieren\n\n```regex\n[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\n```\n\nVerwendung:\n\n* Erkennung von kompromittierten Accounts in Phishing-E-Mails.\n* Analyse von Useraktivitäten oder Kommunikationsverläufen.\n\n### 3. Hash-Werte erkennen (z. B. SHA-256)\n\n```regex\n\\b[A-Fa-f0-9]{64}\\b\n```\n\nVerwendung:\n\n* Extraktion von Malware-Hashes aus Memory Dumps oder YARA-Logs.\n\n### 4. Zeitstempel in Logdateien extrahieren\n\n```regex\n\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}\n```\n\nVerwendung:\n\n* Zeitsensitive Korrelationsanalysen (z. B. bei Intrusion Detection oder Timeline-Rekonstruktionen).\n\n## Best Practices\n\n* **Regex testen**: Nutze Plattformen wie [regexr.com](https://regexr.com/) oder [regex101.com](https://regex101.com/) zur Validierung.\n* **Performance beachten**: Komplexe Ausdrücke können ineffizient sein und Systeme verlangsamen – verwende Lazy Quantifiers (`*?`, `+?`) bei Bedarf.\n* **Escape-Zeichen korrekt anwenden**: Spezielle Zeichen wie `.` oder `\\` müssen bei Bedarf mit `\\\\` oder `\\.` maskiert werden.\n* **Portabilität prüfen**: Unterschiedliche Regex-Engines (z. B. Python `re`, PCRE, JavaScript) interpretieren manche Syntax leicht unterschiedlich.\n* **Lesbarkeit fördern**: Verwende benannte Gruppen (`(?P\u003Cname>...)`) und Kommentare (`(?x)`), um reguläre Ausdrücke besser wartbar zu machen.\n\n## Weiterführende Themen\n\n### Lookaheads und Lookbehinds\n\nMit **Lookaheads** (`(?=...)`) und **Lookbehinds** (`(?\u003C=...)`) können Bedingungen formuliert werden, ohne dass der Text Teil des Matchs wird.\n\nBeispiel: Alle `.exe`-Dateinamen **ohne** das Wort `safe` davor matchen:\n\n```regex\n(?\u003C!safe\\s)[\\w-]+\\.exe\n```\n\n### Regex in Forensik-Tools\n\n* **YARA**: Unterstützt Regex zur Erstellung von Malware-Signaturen.\n* **Wireshark**: Filtert Payloads anhand von Regex-ähnlicher Syntax.\n* **Splunk & ELK**: Verwenden Regex für Logparsing und Visualisierung.\n* **Volatility Plugins**: Extrahieren Artefakte mit Regex-basierten Scans.\n\n---\n\n> 🔤 **Regex ist ein universelles Werkzeug für Analysten, Ermittler und Entwickler, um versteckte Informationen schnell und flexibel aufzuspüren.**\n>\n> Nutze es überall dort, wo Textdaten eine Rolle spielen.","src/content/knowledgebase/regular-expressions-regex.md","4c6c276e361561cd",{"html":39,"metadata":40},"\u003Cblockquote>\n\u003Cp>\u003Cstrong>⚠️ Hinweis\u003C/strong>: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\u003C/p>\n\u003C/blockquote>\n\u003Ch1 id=\"übersicht\">Übersicht\u003C/h1>\n\u003Cp>\u003Cstrong>Regular Expressions (Regex)\u003C/strong> sind ein leistungsfähiges Werkzeug zur Erkennung, Extraktion und Transformation von Zeichenfolgen anhand vordefinierter Muster. In der digitalen Forensik sind Regex-Ausdrücke unverzichtbar: Sie helfen beim Auffinden von IP-Adressen, Hash-Werten, Dateipfaden, Malware-Signaturen oder Kreditkartennummern in großen Mengen unstrukturierter Daten wie Logdateien, Netzwerktraces oder Memory Dumps.\u003C/p>\n\u003Cp>Regex ist nicht auf eine bestimmte Plattform oder Software beschränkt – es wird in nahezu allen gängigen Programmiersprachen, Texteditoren und forensischen Tools unterstützt.\u003C/p>\n\u003Ch2 id=\"verwendungsbeispiele\">Verwendungsbeispiele\u003C/h2>\n\u003Ch3 id=\"1-ip-adressen-extrahieren\">1. IP-Adressen extrahieren\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"regex\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">\\b(?:\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{1,3}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\.)\u003C/span>\u003Cspan style=\"color:#F97583\">{3}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{1,3}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\b\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Verwendung:\u003C/p>\n\u003Cul>\n\u003Cli>\n\u003Cp>Finden von IP-Adressen in Firewall-Logs oder Packet Captures.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Beispiel-Zeile:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>Connection from 192.168.1.101 to port 443 established\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"2-e-mail-adressen-identifizieren\">2. E-Mail-Adressen identifizieren\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"regex\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">[a-zA-Z0-9._%+-]\u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#DBEDFF\">@\u003C/span>\u003Cspan style=\"color:#79B8FF\">[a-zA-Z0-9.-]\u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\.[a-zA-Z]\u003C/span>\u003Cspan style=\"color:#F97583\">{2,}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Verwendung:\u003C/p>\n\u003Cul>\n\u003Cli>Erkennung von kompromittierten Accounts in Phishing-E-Mails.\u003C/li>\n\u003Cli>Analyse von Useraktivitäten oder Kommunikationsverläufen.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"3-hash-werte-erkennen-zb-sha-256\">3. Hash-Werte erkennen (z. B. SHA-256)\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"regex\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">\\b[A-Fa-f0-9]\u003C/span>\u003Cspan style=\"color:#F97583\">{64}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\b\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Verwendung:\u003C/p>\n\u003Cul>\n\u003Cli>Extraktion von Malware-Hashes aus Memory Dumps oder YARA-Logs.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"4-zeitstempel-in-logdateien-extrahieren\">4. Zeitstempel in Logdateien extrahieren\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"regex\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{4}\u003C/span>\u003Cspan style=\"color:#DBEDFF\">-\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{2}\u003C/span>\u003Cspan style=\"color:#DBEDFF\">-\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{2}\u003C/span>\u003Cspan style=\"color:#79B8FF\">[ T]\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{2}\u003C/span>\u003Cspan style=\"color:#DBEDFF\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{2}\u003C/span>\u003Cspan style=\"color:#DBEDFF\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"color:#F97583\">{2}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Verwendung:\u003C/p>\n\u003Cul>\n\u003Cli>Zeitsensitive Korrelationsanalysen (z. B. bei Intrusion Detection oder Timeline-Rekonstruktionen).\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"best-practices\">Best Practices\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Regex testen\u003C/strong>: Nutze Plattformen wie \u003Ca href=\"https://regexr.com/\">regexr.com\u003C/a> oder \u003Ca href=\"https://regex101.com/\">regex101.com\u003C/a> zur Validierung.\u003C/li>\n\u003Cli>\u003Cstrong>Performance beachten\u003C/strong>: Komplexe Ausdrücke können ineffizient sein und Systeme verlangsamen – verwende Lazy Quantifiers (\u003Ccode>*?\u003C/code>, \u003Ccode>+?\u003C/code>) bei Bedarf.\u003C/li>\n\u003Cli>\u003Cstrong>Escape-Zeichen korrekt anwenden\u003C/strong>: Spezielle Zeichen wie \u003Ccode>.\u003C/code> oder \u003Ccode>\\\u003C/code> müssen bei Bedarf mit \u003Ccode>\\\\\u003C/code> oder \u003Ccode>\\.\u003C/code> maskiert werden.\u003C/li>\n\u003Cli>\u003Cstrong>Portabilität prüfen\u003C/strong>: Unterschiedliche Regex-Engines (z. B. Python \u003Ccode>re\u003C/code>, PCRE, JavaScript) interpretieren manche Syntax leicht unterschiedlich.\u003C/li>\n\u003Cli>\u003Cstrong>Lesbarkeit fördern\u003C/strong>: Verwende benannte Gruppen (\u003Ccode>(?P<name>...)\u003C/code>) und Kommentare (\u003Ccode>(?x)\u003C/code>), um reguläre Ausdrücke besser wartbar zu machen.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"weiterführende-themen\">Weiterführende Themen\u003C/h2>\n\u003Ch3 id=\"lookaheads-und-lookbehinds\">Lookaheads und Lookbehinds\u003C/h3>\n\u003Cp>Mit \u003Cstrong>Lookaheads\u003C/strong> (\u003Ccode>(?=...)\u003C/code>) und \u003Cstrong>Lookbehinds\u003C/strong> (\u003Ccode>(?<=...)\u003C/code>) können Bedingungen formuliert werden, ohne dass der Text Teil des Matchs wird.\u003C/p>\n\u003Cp>Beispiel: Alle \u003Ccode>.exe\u003C/code>-Dateinamen \u003Cstrong>ohne\u003C/strong> das Wort \u003Ccode>safe\u003C/code> davor matchen:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"regex\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">(?<!\u003C/span>\u003Cspan style=\"color:#DBEDFF\">safe\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\s\u003C/span>\u003Cspan style=\"color:#F97583\">)\u003C/span>\u003Cspan style=\"color:#79B8FF\">[\\w-]\u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\.\u003C/span>\u003Cspan style=\"color:#DBEDFF\">exe\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"regex-in-forensik-tools\">Regex in Forensik-Tools\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>YARA\u003C/strong>: Unterstützt Regex zur Erstellung von Malware-Signaturen.\u003C/li>\n\u003Cli>\u003Cstrong>Wireshark\u003C/strong>: Filtert Payloads anhand von Regex-ähnlicher Syntax.\u003C/li>\n\u003Cli>\u003Cstrong>Splunk & ELK\u003C/strong>: Verwenden Regex für Logparsing und Visualisierung.\u003C/li>\n\u003Cli>\u003Cstrong>Volatility Plugins\u003C/strong>: Extrahieren Artefakte mit Regex-basierten Scans.\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Cblockquote>\n\u003Cp>🔤 \u003Cstrong>Regex ist ein universelles Werkzeug für Analysten, Ermittler und Entwickler, um versteckte Informationen schnell und flexibel aufzuspüren.\u003C/strong>\u003C/p>\n\u003Cp>Nutze es überall dort, wo Textdaten eine Rolle spielen.\u003C/p>\n\u003C/blockquote>",{"headings":41,"localImagePaths":75,"remoteImagePaths":76,"frontmatter":77,"imagePaths":82},[42,46,50,54,57,60,63,66,69,72],{"depth":43,"slug":44,"text":45},1,"übersicht","Übersicht",{"depth":47,"slug":48,"text":49},2,"verwendungsbeispiele","Verwendungsbeispiele",{"depth":51,"slug":52,"text":53},3,"1-ip-adressen-extrahieren","1. IP-Adressen extrahieren",{"depth":51,"slug":55,"text":56},"2-e-mail-adressen-identifizieren","2. E-Mail-Adressen identifizieren",{"depth":51,"slug":58,"text":59},"3-hash-werte-erkennen-zb-sha-256","3. Hash-Werte erkennen (z. B. SHA-256)",{"depth":51,"slug":61,"text":62},"4-zeitstempel-in-logdateien-extrahieren","4. Zeitstempel in Logdateien extrahieren",{"depth":47,"slug":64,"text":65},"best-practices","Best Practices",{"depth":47,"slug":67,"text":68},"weiterführende-themen","Weiterführende Themen",{"depth":51,"slug":70,"text":71},"lookaheads-und-lookbehinds","Lookaheads und Lookbehinds",{"depth":51,"slug":73,"text":74},"regex-in-forensik-tools","Regex in Forensik-Tools",[],[],{"title":14,"tool_name":15,"description":16,"last_updated":78,"author":18,"difficulty":19,"categories":79,"tags":80,"sections":81,"review_status":34},["Date","2025-07-20T00:00:00.000Z"],[21,22,23,24],[26,27,28,29,30],{"overview":32,"installation":33,"configuration":33,"usage_examples":32,"best_practices":32,"troubleshooting":33,"advanced_topics":32},[],"regular-expressions-regex.md","misp",{"id":84,"data":86,"body":102,"filePath":103,"digest":104,"rendered":105,"legacyId":160},{"title":87,"tool_name":88,"description":89,"last_updated":90,"author":18,"difficulty":19,"categories":91,"tags":94,"sections":101,"review_status":34},"MISP - Plattform für Threat Intelligence Sharing","MISP","Das Rückgrat des modernen Threat-Intelligence-Sharings mit über 40.000 aktiven Instanzen weltweit.",["Date","2025-07-20T00:00:00.000Z"],[21,92,22,23,93],"law-enforcement","cloud-forensics",[95,96,97,98,99,100],"web-based","threat-intelligence","api","correlation","ioc-sharing","automation",{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":33},"> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\n\n\n# Übersicht\n\n**MISP (Malware Information Sharing Platform & Threat Sharing)** ist eine freie Open-Source-Plattform zur strukturierten Erfassung, Speicherung, Analyse und gemeinsamen Nutzung von Cyber-Bedrohungsdaten. Mit über 40.000 Instanzen weltweit ist MISP der De-facto-Standard für den Austausch von Indicators of Compromise (IoCs) und Threat Intelligence zwischen CERTs, SOCs, Strafverfolgungsbehörden und anderen sicherheitsrelevanten Organisationen.\n\nDie föderierte Architektur ermöglicht einen kontrollierten, dezentralen Austausch von Informationen über vertrauenswürdige Partner hinweg. Durch Taxonomien, Tags und integrierte APIs ist eine automatische Anreicherung, Korrelation und Verarbeitung von Informationen in SIEMs, Firewalls oder Endpoint-Lösungen möglich.\n\n## Installation\n\n### Voraussetzungen\n\n- **Server-Betriebssystem:** Linux (empfohlen: Debian/Ubuntu)\n- **Abhängigkeiten:** MariaDB/MySQL, PHP, Apache/Nginx, Redis\n- **Ressourcen:** Mindestens 4 GB RAM, SSD empfohlen\n\n### Installationsschritte\n\n```bash\n# Beispiel für Debian/Ubuntu:\nsudo apt update && sudo apt install -y curl gnupg git python3 python3-pip redis-server mariadb-server apache2 php libapache2-mod-php\n\n# MISP klonen\ngit clone https://github.com/MISP/MISP.git /var/www/MISP\n\n# Setup-Skript nutzen\ncd /var/www/MISP && bash INSTALL/INSTALL.debian.sh\n````\n\nWeitere Details: [Offizielle Installationsanleitung](https://misp.github.io/MISP/INSTALL.debian/)\n\n## Konfiguration\n\n### Webserver\n\n* HTTPS aktivieren (Let's Encrypt oder Reverse Proxy)\n* PHP-Konfiguration anpassen (`upload_max_filesize`, `memory_limit`, `post_max_size`)\n\n### Benutzerrollen\n\n* Administrator, Org-Admin, Analyst etc.\n* Zugriffsbeschränkungen nach Organisation/Feed definierbar\n\n### Feeds und Galaxies\n\n* Aktivierung von Feeds (z. B. CIRCL, Abuse.ch, OpenCTI)\n* Nutzung von Galaxies zur Klassifizierung (APT-Gruppen, Malware-Familien)\n\n## Verwendungsbeispiele\n\n### Beispiel 1: Import von IoCs aus externem Feed\n\n1. Feed aktivieren unter **Administration → List Feeds**\n2. Feed synchronisieren\n3. Ereignisse durchsuchen, analysieren, ggf. mit eigenen Daten korrelieren\n\n### Beispiel 2: Automatisierte Anbindung an SIEM\n\n* REST-API-Token erstellen\n* API-Calls zur Abfrage neuer Events (z. B. mit Python, Logstash oder MISP Workbench)\n* Integration in Security-Systeme über JSON/STIX export\n\n## Best Practices\n\n* Regelmäßige Backups der Datenbank\n* Taxonomien konsistent verwenden\n* Nutzung der Sighting-Funktion zur Validierung von IoCs\n* Vertrauensstufen (TLP, PAP) korrekt setzen\n* Nicht nur konsumieren – auch teilen!\n\n## Troubleshooting\n\n### Problem: MISP-Feeds laden nicht\n\n**Lösung:**\n\n* Internetverbindung prüfen\n* Cronjobs aktiv?\n* Logs prüfen: `/var/www/MISP/app/tmp/logs/error.log`\n\n### Problem: API gibt 403 zurück\n\n**Lösung:**\n\n* Ist der API-Key korrekt und aktiv?\n* Rechte des Benutzers überprüfen\n* IP-Filter im MISP-Backend beachten\n\n### Problem: Hohe Datenbanklast\n\n**Lösung:**\n\n* Indizes optimieren\n* Redis aktivieren\n* Alte Events regelmäßig archivieren oder löschen\n\n## Weiterführende Themen\n\n* STIX2-Import/Export\n* Erweiterungen mit MISP Modules (z. B. für Virustotal, YARA)\n* Föderierte Netzwerke und Community-Portale\n* Integration mit OpenCTI oder TheHive\n\n---\n\n**Links:**\n\n* 🌐 [Offizielle Projektseite](https://misp-project.org/)\n* 📦 [CC24-MISP-Instanz](https://misp.cc24.dev)\n* 📊 [Status-Monitoring](https://status.mikoshi.de/api/badge/34/status)\n\nLizenz: **AGPL-3.0**","src/content/knowledgebase/misp.md","cb6bcbd4e290161a",{"html":106,"metadata":107},"\u003Cblockquote>\n\u003Cp>\u003Cstrong>⚠️ Hinweis\u003C/strong>: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\u003C/p>\n\u003C/blockquote>\n\u003Ch1 id=\"übersicht\">Übersicht\u003C/h1>\n\u003Cp>\u003Cstrong>MISP (Malware Information Sharing Platform & Threat Sharing)\u003C/strong> ist eine freie Open-Source-Plattform zur strukturierten Erfassung, Speicherung, Analyse und gemeinsamen Nutzung von Cyber-Bedrohungsdaten. Mit über 40.000 Instanzen weltweit ist MISP der De-facto-Standard für den Austausch von Indicators of Compromise (IoCs) und Threat Intelligence zwischen CERTs, SOCs, Strafverfolgungsbehörden und anderen sicherheitsrelevanten Organisationen.\u003C/p>\n\u003Cp>Die föderierte Architektur ermöglicht einen kontrollierten, dezentralen Austausch von Informationen über vertrauenswürdige Partner hinweg. Durch Taxonomien, Tags und integrierte APIs ist eine automatische Anreicherung, Korrelation und Verarbeitung von Informationen in SIEMs, Firewalls oder Endpoint-Lösungen möglich.\u003C/p>\n\u003Ch2 id=\"installation\">Installation\u003C/h2>\n\u003Ch3 id=\"voraussetzungen\">Voraussetzungen\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Server-Betriebssystem:\u003C/strong> Linux (empfohlen: Debian/Ubuntu)\u003C/li>\n\u003Cli>\u003Cstrong>Abhängigkeiten:\u003C/strong> MariaDB/MySQL, PHP, Apache/Nginx, Redis\u003C/li>\n\u003Cli>\u003Cstrong>Ressourcen:\u003C/strong> Mindestens 4 GB RAM, SSD empfohlen\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"installationsschritte\">Installationsschritte\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Beispiel für Debian/Ubuntu:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> update\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> && \u003C/span>\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> install\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -y\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> curl\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> gnupg\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> git\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> python3\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> python3-pip\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> redis-server\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> mariadb-server\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apache2\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> libapache2-mod-php\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># MISP klonen\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">git\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> clone\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://github.com/MISP/MISP.git\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/www/MISP\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Setup-Skript nutzen\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">cd\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/www/MISP\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> && \u003C/span>\u003Cspan style=\"color:#B392F0\">bash\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> INSTALL/INSTALL.debian.sh\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Weitere Details: \u003Ca href=\"https://misp.github.io/MISP/INSTALL.debian/\">Offizielle Installationsanleitung\u003C/a>\u003C/p>\n\u003Ch2 id=\"konfiguration\">Konfiguration\u003C/h2>\n\u003Ch3 id=\"webserver\">Webserver\u003C/h3>\n\u003Cul>\n\u003Cli>HTTPS aktivieren (Let’s Encrypt oder Reverse Proxy)\u003C/li>\n\u003Cli>PHP-Konfiguration anpassen (\u003Ccode>upload_max_filesize\u003C/code>, \u003Ccode>memory_limit\u003C/code>, \u003Ccode>post_max_size\u003C/code>)\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"benutzerrollen\">Benutzerrollen\u003C/h3>\n\u003Cul>\n\u003Cli>Administrator, Org-Admin, Analyst etc.\u003C/li>\n\u003Cli>Zugriffsbeschränkungen nach Organisation/Feed definierbar\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"feeds-und-galaxies\">Feeds und Galaxies\u003C/h3>\n\u003Cul>\n\u003Cli>Aktivierung von Feeds (z. B. CIRCL, Abuse.ch, OpenCTI)\u003C/li>\n\u003Cli>Nutzung von Galaxies zur Klassifizierung (APT-Gruppen, Malware-Familien)\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"verwendungsbeispiele\">Verwendungsbeispiele\u003C/h2>\n\u003Ch3 id=\"beispiel-1-import-von-iocs-aus-externem-feed\">Beispiel 1: Import von IoCs aus externem Feed\u003C/h3>\n\u003Col>\n\u003Cli>Feed aktivieren unter \u003Cstrong>Administration → List Feeds\u003C/strong>\u003C/li>\n\u003Cli>Feed synchronisieren\u003C/li>\n\u003Cli>Ereignisse durchsuchen, analysieren, ggf. mit eigenen Daten korrelieren\u003C/li>\n\u003C/ol>\n\u003Ch3 id=\"beispiel-2-automatisierte-anbindung-an-siem\">Beispiel 2: Automatisierte Anbindung an SIEM\u003C/h3>\n\u003Cul>\n\u003Cli>REST-API-Token erstellen\u003C/li>\n\u003Cli>API-Calls zur Abfrage neuer Events (z. B. mit Python, Logstash oder MISP Workbench)\u003C/li>\n\u003Cli>Integration in Security-Systeme über JSON/STIX export\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"best-practices\">Best Practices\u003C/h2>\n\u003Cul>\n\u003Cli>Regelmäßige Backups der Datenbank\u003C/li>\n\u003Cli>Taxonomien konsistent verwenden\u003C/li>\n\u003Cli>Nutzung der Sighting-Funktion zur Validierung von IoCs\u003C/li>\n\u003Cli>Vertrauensstufen (TLP, PAP) korrekt setzen\u003C/li>\n\u003Cli>Nicht nur konsumieren – auch teilen!\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C/h2>\n\u003Ch3 id=\"problem-misp-feeds-laden-nicht\">Problem: MISP-Feeds laden nicht\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Internetverbindung prüfen\u003C/li>\n\u003Cli>Cronjobs aktiv?\u003C/li>\n\u003Cli>Logs prüfen: \u003Ccode>/var/www/MISP/app/tmp/logs/error.log\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"problem-api-gibt-403-zurück\">Problem: API gibt 403 zurück\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Ist der API-Key korrekt und aktiv?\u003C/li>\n\u003Cli>Rechte des Benutzers überprüfen\u003C/li>\n\u003Cli>IP-Filter im MISP-Backend beachten\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"problem-hohe-datenbanklast\">Problem: Hohe Datenbanklast\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Indizes optimieren\u003C/li>\n\u003Cli>Redis aktivieren\u003C/li>\n\u003Cli>Alte Events regelmäßig archivieren oder löschen\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"weiterführende-themen\">Weiterführende Themen\u003C/h2>\n\u003Cul>\n\u003Cli>STIX2-Import/Export\u003C/li>\n\u003Cli>Erweiterungen mit MISP Modules (z. B. für Virustotal, YARA)\u003C/li>\n\u003Cli>Föderierte Netzwerke und Community-Portale\u003C/li>\n\u003Cli>Integration mit OpenCTI oder TheHive\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Cp>\u003Cstrong>Links:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>🌐 \u003Ca href=\"https://misp-project.org/\">Offizielle Projektseite\u003C/a>\u003C/li>\n\u003Cli>📦 \u003Ca href=\"https://misp.cc24.dev\">CC24-MISP-Instanz\u003C/a>\u003C/li>\n\u003Cli>📊 \u003Ca href=\"https://status.mikoshi.de/api/badge/34/status\">Status-Monitoring\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Cp>Lizenz: \u003Cstrong>AGPL-3.0\u003C/strong>\u003C/p>",{"headings":108,"localImagePaths":152,"remoteImagePaths":153,"frontmatter":154,"imagePaths":159},[109,110,113,116,119,122,125,128,131,132,135,138,139,142,145,148,151],{"depth":43,"slug":44,"text":45},{"depth":47,"slug":111,"text":112},"installation","Installation",{"depth":51,"slug":114,"text":115},"voraussetzungen","Voraussetzungen",{"depth":51,"slug":117,"text":118},"installationsschritte","Installationsschritte",{"depth":47,"slug":120,"text":121},"konfiguration","Konfiguration",{"depth":51,"slug":123,"text":124},"webserver","Webserver",{"depth":51,"slug":126,"text":127},"benutzerrollen","Benutzerrollen",{"depth":51,"slug":129,"text":130},"feeds-und-galaxies","Feeds und Galaxies",{"depth":47,"slug":48,"text":49},{"depth":51,"slug":133,"text":134},"beispiel-1-import-von-iocs-aus-externem-feed","Beispiel 1: Import von IoCs aus externem Feed",{"depth":51,"slug":136,"text":137},"beispiel-2-automatisierte-anbindung-an-siem","Beispiel 2: Automatisierte Anbindung an SIEM",{"depth":47,"slug":64,"text":65},{"depth":47,"slug":140,"text":141},"troubleshooting","Troubleshooting",{"depth":51,"slug":143,"text":144},"problem-misp-feeds-laden-nicht","Problem: MISP-Feeds laden nicht",{"depth":51,"slug":146,"text":147},"problem-api-gibt-403-zurück","Problem: API gibt 403 zurück",{"depth":51,"slug":149,"text":150},"problem-hohe-datenbanklast","Problem: Hohe Datenbanklast",{"depth":47,"slug":67,"text":68},[],[],{"title":87,"tool_name":88,"description":89,"last_updated":155,"author":18,"difficulty":19,"categories":156,"tags":157,"sections":158,"review_status":34},["Date","2025-07-20T00:00:00.000Z"],[21,92,22,23,93],[95,96,97,98,99,100],{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":33},[],"misp.md","kali-linux",{"id":161,"data":163,"body":178,"filePath":179,"digest":180,"rendered":181,"legacyId":239},{"title":164,"tool_name":165,"description":166,"last_updated":167,"author":18,"difficulty":19,"categories":168,"tags":171,"sections":177,"review_status":34},"Kali Linux - Die Hacker-Distribution für Forensik & Penetration Testing","Kali Linux","Leitfaden zur Installation, Nutzung und Best Practices für Kali Linux – die All-in-One-Plattform für Security-Profis.",["Date","2025-07-20T00:00:00.000Z"],[21,169,170],"forensics","penetration-testing",[172,173,170,174,175,176],"live-boot","tool-collection","forensics-suite","virtualization","arm-support",{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":32},"> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\n\n\n# Übersicht\n\nKali Linux ist eine auf Debian basierende Linux-Distribution, die speziell für Penetration Testing, digitale Forensik, Reverse Engineering und Incident Response entwickelt wurde. Mit über 600 vorinstallierten Tools ist sie ein unverzichtbares Werkzeug für Security-Experten, Ermittler und forensische Analysten. Die Live-Boot-Funktion erlaubt es, Systeme ohne Spuren zu hinterlassen zu analysieren – ideal für forensische Untersuchungen.\n\n## Installation\n\n### Option 1: Live-System (USB/DVD)\n\n1. ISO-Image von [kali.org](https://www.kali.org/get-kali/) herunterladen.\n2. Mit **Rufus** oder **balenaEtcher** auf einen USB-Stick schreiben.\n3. Vom USB-Stick booten (ggf. Boot-Reihenfolge im BIOS anpassen).\n4. Kali kann direkt ohne Installation im Live-Modus verwendet werden.\n\n### Option 2: Installation auf Festplatte\n\n1. ISO-Image booten und **Graphical Install** wählen.\n2. Schritt-für-Schritt durch den Installationsassistenten navigieren:\n - Sprache, Zeitzone und Tastaturlayout auswählen\n - Partitionierung konfigurieren (automatisch oder manuell)\n - Benutzerkonten erstellen\n3. Nach Installation Neustart durchführen.\n\n### Option 3: Virtuelle Maschine (VM)\n\n- Offizielle VM-Images für VirtualBox und VMware von der [Kali-Website](https://www.kali.org/get-kali/#kali-virtual-machines)\n- Importieren, ggf. Netzwerkbrücke und Shared Folders aktivieren\n\n## Konfiguration\n\n### Netzwerkeinstellungen\n\n- Konfiguration über `nmtui` oder `/etc/network/interfaces`\n- VPN und Proxy-Integration über GUI oder Terminal\n\n### Updates & Paketquellen\n\n```bash\nsudo apt update && sudo apt full-upgrade\n````\n\n> Hinweis: `kali-rolling` ist die Standard-Distribution für kontinuierliche Updates.\n\n### Sprache & Lokalisierung\n\n```bash\nsudo dpkg-reconfigure locales\nsudo dpkg-reconfigure keyboard-configuration\n```\n\n## Verwendungsbeispiele\n\n### 1. Netzwerkscan mit Nmap\n\n```bash\nnmap -sS -T4 -A 192.168.1.0/24\n```\n\n### 2. Passwort-Cracking mit John the Ripper\n\n```bash\njohn --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt\n```\n\n### 3. Forensik mit Autopsy\n\n```bash\nautopsy &\n```\n\n### 4. Android-Analyse mit MobSF (in Docker)\n\n```bash\ndocker pull opensecurity/mobile-security-framework-mobsf\ndocker run -it -p 8000:8000 mobsf\n```\n\n## Best Practices\n\n* Nutze immer **aktuelle Snapshots** oder VM-Clones vor gefährlichen Tests\n* Verwende separate Netzwerke (z. B. Host-only oder NAT) für Tests\n* Deaktiviere automatisches WLAN bei forensischen Analysen\n* Prüfe und aktualisiere regelmäßig Toolsets (`apt`, `git`, `pip`)\n* Halte deine ISO-Images versioniert für forensische Reproduzierbarkeit\n\n## Troubleshooting\n\n### Problem: Keine Internetverbindung nach Installation\n\n**Lösung:** Netzwerkadapter prüfen, ggf. mit `ifconfig` oder `ip a` überprüfen, DHCP aktivieren.\n\n### Problem: Tools fehlen nach Update\n\n**Lösung:** Tool-Gruppen wie `kali-linux-default` manuell nachinstallieren:\n\n```bash\nsudo apt install kali-linux-default\n```\n\n### Problem: „Permission Denied“ bei Tools\n\n**Lösung:** Root-Rechte nutzen oder mit `sudo` ausführen.\n\n## Weiterführende Themen\n\n* **Kustomisierung von Kali ISOs** mit `live-build`\n* **NetHunter**: Kali für mobile Geräte (Android)\n* **Kali Purple**: Defensive Security Suite\n* Integration mit **Cloud-Infrastrukturen** via WSL oder Azure\n\n---\n\n**Links & Ressourcen:**\n\n* Offizielle Website: [https://kali.org](https://kali.org/)\n* Dokumentation: [https://docs.kali.org/](https://docs.kali.org/)\n* GitLab Repo: [https://gitlab.com/kalilinux](https://gitlab.com/kalilinux)\n* Discord-Community: [https://discord.com/invite/kali-linux](https://discord.com/invite/kali-linux)","src/content/knowledgebase/kali-linux.md","2efd0b1e4a1c7292",{"html":182,"metadata":183},"\u003Cblockquote>\n\u003Cp>\u003Cstrong>⚠️ Hinweis\u003C/strong>: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\u003C/p>\n\u003C/blockquote>\n\u003Ch1 id=\"übersicht\">Übersicht\u003C/h1>\n\u003Cp>Kali Linux ist eine auf Debian basierende Linux-Distribution, die speziell für Penetration Testing, digitale Forensik, Reverse Engineering und Incident Response entwickelt wurde. Mit über 600 vorinstallierten Tools ist sie ein unverzichtbares Werkzeug für Security-Experten, Ermittler und forensische Analysten. Die Live-Boot-Funktion erlaubt es, Systeme ohne Spuren zu hinterlassen zu analysieren – ideal für forensische Untersuchungen.\u003C/p>\n\u003Ch2 id=\"installation\">Installation\u003C/h2>\n\u003Ch3 id=\"option-1-live-system-usbdvd\">Option 1: Live-System (USB/DVD)\u003C/h3>\n\u003Col>\n\u003Cli>ISO-Image von \u003Ca href=\"https://www.kali.org/get-kali/\">kali.org\u003C/a> herunterladen.\u003C/li>\n\u003Cli>Mit \u003Cstrong>Rufus\u003C/strong> oder \u003Cstrong>balenaEtcher\u003C/strong> auf einen USB-Stick schreiben.\u003C/li>\n\u003Cli>Vom USB-Stick booten (ggf. Boot-Reihenfolge im BIOS anpassen).\u003C/li>\n\u003Cli>Kali kann direkt ohne Installation im Live-Modus verwendet werden.\u003C/li>\n\u003C/ol>\n\u003Ch3 id=\"option-2-installation-auf-festplatte\">Option 2: Installation auf Festplatte\u003C/h3>\n\u003Col>\n\u003Cli>ISO-Image booten und \u003Cstrong>Graphical Install\u003C/strong> wählen.\u003C/li>\n\u003Cli>Schritt-für-Schritt durch den Installationsassistenten navigieren:\n\u003Cul>\n\u003Cli>Sprache, Zeitzone und Tastaturlayout auswählen\u003C/li>\n\u003Cli>Partitionierung konfigurieren (automatisch oder manuell)\u003C/li>\n\u003Cli>Benutzerkonten erstellen\u003C/li>\n\u003C/ul>\n\u003C/li>\n\u003Cli>Nach Installation Neustart durchführen.\u003C/li>\n\u003C/ol>\n\u003Ch3 id=\"option-3-virtuelle-maschine-vm\">Option 3: Virtuelle Maschine (VM)\u003C/h3>\n\u003Cul>\n\u003Cli>Offizielle VM-Images für VirtualBox und VMware von der \u003Ca href=\"https://www.kali.org/get-kali/#kali-virtual-machines\">Kali-Website\u003C/a>\u003C/li>\n\u003Cli>Importieren, ggf. Netzwerkbrücke und Shared Folders aktivieren\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"konfiguration\">Konfiguration\u003C/h2>\n\u003Ch3 id=\"netzwerkeinstellungen\">Netzwerkeinstellungen\u003C/h3>\n\u003Cul>\n\u003Cli>Konfiguration über \u003Ccode>nmtui\u003C/code> oder \u003Ccode>/etc/network/interfaces\u003C/code>\u003C/li>\n\u003Cli>VPN und Proxy-Integration über GUI oder Terminal\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"updates--paketquellen\">Updates & Paketquellen\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> update\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> && \u003C/span>\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> full-upgrade\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cblockquote>\n\u003Cp>Hinweis: \u003Ccode>kali-rolling\u003C/code> ist die Standard-Distribution für kontinuierliche Updates.\u003C/p>\n\u003C/blockquote>\n\u003Ch3 id=\"sprache--lokalisierung\">Sprache & Lokalisierung\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> dpkg-reconfigure\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> locales\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> dpkg-reconfigure\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> keyboard-configuration\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch2 id=\"verwendungsbeispiele\">Verwendungsbeispiele\u003C/h2>\n\u003Ch3 id=\"1-netzwerkscan-mit-nmap\">1. Netzwerkscan mit Nmap\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">nmap\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -sS\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -T4\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -A\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 192.168.1.0/24\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"2-passwort-cracking-mit-john-the-ripper\">2. Passwort-Cracking mit John the Ripper\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">john\u003C/span>\u003Cspan style=\"color:#79B8FF\"> --wordlist=/usr/share/wordlists/rockyou.txt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> hashes.txt\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"3-forensik-mit-autopsy\">3. Forensik mit Autopsy\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">autopsy\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> &\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"4-android-analyse-mit-mobsf-in-docker\">4. Android-Analyse mit MobSF (in Docker)\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">docker\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> pull\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> opensecurity/mobile-security-framework-mobsf\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">docker\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> run\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -it\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -p\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 8000:8000\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> mobsf\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch2 id=\"best-practices\">Best Practices\u003C/h2>\n\u003Cul>\n\u003Cli>Nutze immer \u003Cstrong>aktuelle Snapshots\u003C/strong> oder VM-Clones vor gefährlichen Tests\u003C/li>\n\u003Cli>Verwende separate Netzwerke (z. B. Host-only oder NAT) für Tests\u003C/li>\n\u003Cli>Deaktiviere automatisches WLAN bei forensischen Analysen\u003C/li>\n\u003Cli>Prüfe und aktualisiere regelmäßig Toolsets (\u003Ccode>apt\u003C/code>, \u003Ccode>git\u003C/code>, \u003Ccode>pip\u003C/code>)\u003C/li>\n\u003Cli>Halte deine ISO-Images versioniert für forensische Reproduzierbarkeit\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C/h2>\n\u003Ch3 id=\"problem-keine-internetverbindung-nach-installation\">Problem: Keine Internetverbindung nach Installation\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong> Netzwerkadapter prüfen, ggf. mit \u003Ccode>ifconfig\u003C/code> oder \u003Ccode>ip a\u003C/code> überprüfen, DHCP aktivieren.\u003C/p>\n\u003Ch3 id=\"problem-tools-fehlen-nach-update\">Problem: Tools fehlen nach Update\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong> Tool-Gruppen wie \u003Ccode>kali-linux-default\u003C/code> manuell nachinstallieren:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> install\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> kali-linux-default\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"problem-permission-denied-bei-tools\">Problem: „Permission Denied“ bei Tools\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong> Root-Rechte nutzen oder mit \u003Ccode>sudo\u003C/code> ausführen.\u003C/p>\n\u003Ch2 id=\"weiterführende-themen\">Weiterführende Themen\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Kustomisierung von Kali ISOs\u003C/strong> mit \u003Ccode>live-build\u003C/code>\u003C/li>\n\u003Cli>\u003Cstrong>NetHunter\u003C/strong>: Kali für mobile Geräte (Android)\u003C/li>\n\u003Cli>\u003Cstrong>Kali Purple\u003C/strong>: Defensive Security Suite\u003C/li>\n\u003Cli>Integration mit \u003Cstrong>Cloud-Infrastrukturen\u003C/strong> via WSL oder Azure\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Cp>\u003Cstrong>Links & Ressourcen:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Offizielle Website: \u003Ca href=\"https://kali.org/\">https://kali.org\u003C/a>\u003C/li>\n\u003Cli>Dokumentation: \u003Ca href=\"https://docs.kali.org/\">https://docs.kali.org/\u003C/a>\u003C/li>\n\u003Cli>GitLab Repo: \u003Ca href=\"https://gitlab.com/kalilinux\">https://gitlab.com/kalilinux\u003C/a>\u003C/li>\n\u003Cli>Discord-Community: \u003Ca href=\"https://discord.com/invite/kali-linux\">https://discord.com/invite/kali-linux\u003C/a>\u003C/li>\n\u003C/ul>",{"headings":184,"localImagePaths":231,"remoteImagePaths":232,"frontmatter":233,"imagePaths":238},[185,186,187,190,193,196,197,200,203,206,207,210,213,216,219,220,221,224,227,230],{"depth":43,"slug":44,"text":45},{"depth":47,"slug":111,"text":112},{"depth":51,"slug":188,"text":189},"option-1-live-system-usbdvd","Option 1: Live-System (USB/DVD)",{"depth":51,"slug":191,"text":192},"option-2-installation-auf-festplatte","Option 2: Installation auf Festplatte",{"depth":51,"slug":194,"text":195},"option-3-virtuelle-maschine-vm","Option 3: Virtuelle Maschine (VM)",{"depth":47,"slug":120,"text":121},{"depth":51,"slug":198,"text":199},"netzwerkeinstellungen","Netzwerkeinstellungen",{"depth":51,"slug":201,"text":202},"updates--paketquellen","Updates & Paketquellen",{"depth":51,"slug":204,"text":205},"sprache--lokalisierung","Sprache & Lokalisierung",{"depth":47,"slug":48,"text":49},{"depth":51,"slug":208,"text":209},"1-netzwerkscan-mit-nmap","1. Netzwerkscan mit Nmap",{"depth":51,"slug":211,"text":212},"2-passwort-cracking-mit-john-the-ripper","2. Passwort-Cracking mit John the Ripper",{"depth":51,"slug":214,"text":215},"3-forensik-mit-autopsy","3. Forensik mit Autopsy",{"depth":51,"slug":217,"text":218},"4-android-analyse-mit-mobsf-in-docker","4. Android-Analyse mit MobSF (in Docker)",{"depth":47,"slug":64,"text":65},{"depth":47,"slug":140,"text":141},{"depth":51,"slug":222,"text":223},"problem-keine-internetverbindung-nach-installation","Problem: Keine Internetverbindung nach Installation",{"depth":51,"slug":225,"text":226},"problem-tools-fehlen-nach-update","Problem: Tools fehlen nach Update",{"depth":51,"slug":228,"text":229},"problem-permission-denied-bei-tools","Problem: „Permission Denied“ bei Tools",{"depth":47,"slug":67,"text":68},[],[],{"title":164,"tool_name":165,"description":166,"last_updated":234,"author":18,"difficulty":19,"categories":235,"tags":236,"sections":237,"review_status":34},["Date","2025-07-20T00:00:00.000Z"],[21,169,170],[172,173,170,174,175,176],{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":32},[],"kali-linux.md","nextcloud",{"id":240,"data":242,"body":256,"filePath":257,"digest":258,"rendered":259,"legacyId":300},{"title":243,"tool_name":244,"description":245,"last_updated":246,"author":18,"difficulty":247,"categories":248,"tags":250,"sections":255,"review_status":34},"Nextcloud - Sichere Kollaborationsplattform","Nextcloud","Detaillierte Anleitung und Best Practices für Nextcloud in forensischen Einsatzszenarien",["Date","2025-07-20T00:00:00.000Z"],"novice",[249],"collaboration-general",[95,251,252,97,253,254],"collaboration","file-sharing","encryption","document-management",{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":33},"> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\n\n\n# Übersicht\n\nNextcloud ist eine Open-Source-Cloud-Suite, die speziell für die sichere Zusammenarbeit entwickelt wurde. Sie eignet sich ideal für forensische Teams, da sie eine DSGVO-konforme Umgebung mit verschlüsselter Dateiablage, Office-Integration und Videokonferenzen bereitstellt. Zusätzlich bietet Nextcloud einen integrierten SSO-Provider, der das Identitätsmanagement für andere forensische Tools stark vereinfacht.\n\nSkalierbar von kleinen Raspberry-Pi-Installationen bis hin zu hochverfügbaren Multi-Node-Setups.\n\n- **Website:** [nextcloud.com](https://nextcloud.com/)\n- **Demo/Projektinstanz:** [cloud.cc24.dev](https://cloud.cc24.dev)\n- **Statusseite:** [Mikoshi Status](https://status.mikoshi.de/api/badge/11/status)\n- **Lizenz:** AGPL-3.0\n\n---\n\n## Installation\n\n### Voraussetzungen\n\n- Linux-Server oder Raspberry Pi\n- PHP 8.1 oder höher\n- MariaDB/PostgreSQL\n- Webserver (Apache/Nginx)\n- SSL-Zertifikat (empfohlen: Let's Encrypt)\n\n### Installationsschritte (Ubuntu Beispiel)\n\n```bash\nsudo apt update && sudo apt upgrade\nsudo apt install apache2 mariadb-server libapache2-mod-php php php-mysql \\\n php-gd php-xml php-mbstring php-curl php-zip php-intl php-bcmath unzip\n\nwget https://download.nextcloud.com/server/releases/latest.zip\nunzip latest.zip -d /var/www/\nchown -R www-data:www-data /var/www/nextcloud\n````\n\nDanach den Web-Installer im Browser aufrufen (`https://\u003Cyour-domain>/nextcloud`) und Setup abschließen.\n\n## Konfiguration\n\n* **Trusted Domains** in `config.php` definieren\n* SSO mit OpenID Connect aktivieren\n* Dateiverschlüsselung aktivieren (`Settings → Security`)\n* Benutzer und Gruppen über LDAP oder SAML integrieren\n\n## Verwendungsbeispiele\n\n### Gemeinsame Fallbearbeitung\n\n1. Ermittlungsordner als geteiltes Gruppenverzeichnis anlegen\n2. Versionierung und Kommentare zu forensischen Berichten aktivieren\n3. Vorschau für Office-Dateien, PDFs und Bilder direkt im Browser nutzen\n\n### Videokonferenzen mit \"Nextcloud Talk\"\n\n* Sichere Kommunikation zwischen Ermittlern und Sachverständigen\n* Ende-zu-Ende-verschlüsselt\n* Bildschirmfreigabe möglich\n\n### Automatischer Dateiimport per API\n\n* REST-Schnittstelle nutzen, um z. B. automatisch Logdateien oder Exportdaten hochzuladen\n* Ideal für Anbindung an SIEM, DLP oder Analyse-Pipelines\n\n## Best Practices\n\n* Zwei-Faktor-Authentifizierung aktivieren\n* Tägliche Backups der Datenbank und Datenstruktur\n* Nutzung von OnlyOffice oder Collabora für revisionssichere Dokumentenbearbeitung\n* Zugriff regelmäßig überprüfen, insbesondere bei externen Partnern\n\n## Troubleshooting\n\n### Problem: Langsame Performance\n\n**Lösung:** APCu aktivieren und Caching optimieren (`config.php → 'memcache.local'`).\n\n### Problem: Dateien erscheinen nicht im Sync\n\n**Lösung:** Cronjob für `files:scan` konfigurieren oder manuell ausführen:\n\n```bash\nsudo -u www-data php /var/www/nextcloud/occ files:scan --all\n```\n\n### Problem: Fehlermeldung \"Trusted domain not set\"\n\n**Lösung:** In `config/config.php` Eintrag `trusted_domains` korrekt konfigurieren:\n\n```php\n'trusted_domains' =>\n array (\n 0 => 'yourdomain.tld',\n 1 => 'cloud.cc24.dev',\n ),\n```\n\n## Weiterführende Themen\n\n* **Integration mit Forensik-Plattformen** (über WebDAV, API oder SSO)\n* **Custom Apps entwickeln** für spezielle Ermittlungs-Workflows\n* **Auditing aktivieren**: Nutzung und Änderungen nachvollziehen mit Protokollierungsfunktionen","src/content/knowledgebase/nextcloud.md","d2d5ca8769e0cd0b",{"html":260,"metadata":261},"\u003Cblockquote>\n\u003Cp>\u003Cstrong>⚠️ Hinweis\u003C/strong>: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\u003C/p>\n\u003C/blockquote>\n\u003Ch1 id=\"übersicht\">Übersicht\u003C/h1>\n\u003Cp>Nextcloud ist eine Open-Source-Cloud-Suite, die speziell für die sichere Zusammenarbeit entwickelt wurde. Sie eignet sich ideal für forensische Teams, da sie eine DSGVO-konforme Umgebung mit verschlüsselter Dateiablage, Office-Integration und Videokonferenzen bereitstellt. Zusätzlich bietet Nextcloud einen integrierten SSO-Provider, der das Identitätsmanagement für andere forensische Tools stark vereinfacht.\u003C/p>\n\u003Cp>Skalierbar von kleinen Raspberry-Pi-Installationen bis hin zu hochverfügbaren Multi-Node-Setups.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Website:\u003C/strong> \u003Ca href=\"https://nextcloud.com/\">nextcloud.com\u003C/a>\u003C/li>\n\u003Cli>\u003Cstrong>Demo/Projektinstanz:\u003C/strong> \u003Ca href=\"https://cloud.cc24.dev\">cloud.cc24.dev\u003C/a>\u003C/li>\n\u003Cli>\u003Cstrong>Statusseite:\u003C/strong> \u003Ca href=\"https://status.mikoshi.de/api/badge/11/status\">Mikoshi Status\u003C/a>\u003C/li>\n\u003Cli>\u003Cstrong>Lizenz:\u003C/strong> AGPL-3.0\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2 id=\"installation\">Installation\u003C/h2>\n\u003Ch3 id=\"voraussetzungen\">Voraussetzungen\u003C/h3>\n\u003Cul>\n\u003Cli>Linux-Server oder Raspberry Pi\u003C/li>\n\u003Cli>PHP 8.1 oder höher\u003C/li>\n\u003Cli>MariaDB/PostgreSQL\u003C/li>\n\u003Cli>Webserver (Apache/Nginx)\u003C/li>\n\u003Cli>SSL-Zertifikat (empfohlen: Let’s Encrypt)\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"installationsschritte-ubuntu-beispiel\">Installationsschritte (Ubuntu Beispiel)\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> update\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> && \u003C/span>\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> upgrade\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apt\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> install\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> apache2\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> mariadb-server\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> libapache2-mod-php\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-mysql\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\"> php-gd\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-xml\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-mbstring\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-curl\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-zip\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-intl\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php-bcmath\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> unzip\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">wget\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://download.nextcloud.com/server/releases/latest.zip\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">unzip\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> latest.zip\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -d\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/www/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">chown\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -R\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> www-data:www-data\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/www/nextcloud\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Danach den Web-Installer im Browser aufrufen (\u003Ccode>https://<your-domain>/nextcloud\u003C/code>) und Setup abschließen.\u003C/p>\n\u003Ch2 id=\"konfiguration\">Konfiguration\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Trusted Domains\u003C/strong> in \u003Ccode>config.php\u003C/code> definieren\u003C/li>\n\u003Cli>SSO mit OpenID Connect aktivieren\u003C/li>\n\u003Cli>Dateiverschlüsselung aktivieren (\u003Ccode>Settings → Security\u003C/code>)\u003C/li>\n\u003Cli>Benutzer und Gruppen über LDAP oder SAML integrieren\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"verwendungsbeispiele\">Verwendungsbeispiele\u003C/h2>\n\u003Ch3 id=\"gemeinsame-fallbearbeitung\">Gemeinsame Fallbearbeitung\u003C/h3>\n\u003Col>\n\u003Cli>Ermittlungsordner als geteiltes Gruppenverzeichnis anlegen\u003C/li>\n\u003Cli>Versionierung und Kommentare zu forensischen Berichten aktivieren\u003C/li>\n\u003Cli>Vorschau für Office-Dateien, PDFs und Bilder direkt im Browser nutzen\u003C/li>\n\u003C/ol>\n\u003Ch3 id=\"videokonferenzen-mit-nextcloud-talk\">Videokonferenzen mit “Nextcloud Talk”\u003C/h3>\n\u003Cul>\n\u003Cli>Sichere Kommunikation zwischen Ermittlern und Sachverständigen\u003C/li>\n\u003Cli>Ende-zu-Ende-verschlüsselt\u003C/li>\n\u003Cli>Bildschirmfreigabe möglich\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"automatischer-dateiimport-per-api\">Automatischer Dateiimport per API\u003C/h3>\n\u003Cul>\n\u003Cli>REST-Schnittstelle nutzen, um z. B. automatisch Logdateien oder Exportdaten hochzuladen\u003C/li>\n\u003Cli>Ideal für Anbindung an SIEM, DLP oder Analyse-Pipelines\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"best-practices\">Best Practices\u003C/h2>\n\u003Cul>\n\u003Cli>Zwei-Faktor-Authentifizierung aktivieren\u003C/li>\n\u003Cli>Tägliche Backups der Datenbank und Datenstruktur\u003C/li>\n\u003Cli>Nutzung von OnlyOffice oder Collabora für revisionssichere Dokumentenbearbeitung\u003C/li>\n\u003Cli>Zugriff regelmäßig überprüfen, insbesondere bei externen Partnern\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C/h2>\n\u003Ch3 id=\"problem-langsame-performance\">Problem: Langsame Performance\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong> APCu aktivieren und Caching optimieren (\u003Ccode>config.php → 'memcache.local'\u003C/code>).\u003C/p>\n\u003Ch3 id=\"problem-dateien-erscheinen-nicht-im-sync\">Problem: Dateien erscheinen nicht im Sync\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong> Cronjob für \u003Ccode>files:scan\u003C/code> konfigurieren oder manuell ausführen:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -u\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> www-data\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> php\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/www/nextcloud/occ\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> files:scan\u003C/span>\u003Cspan style=\"color:#79B8FF\"> --all\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"problem-fehlermeldung-trusted-domain-not-set\">Problem: Fehlermeldung “Trusted domain not set”\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong> In \u003Ccode>config/config.php\u003C/code> Eintrag \u003Ccode>trusted_domains\u003C/code> korrekt konfigurieren:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"php\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">'trusted_domains'\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\"> array\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'yourdomain.tld'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\"> 1\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'cloud.cc24.dev'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\"> ),\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch2 id=\"weiterführende-themen\">Weiterführende Themen\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Integration mit Forensik-Plattformen\u003C/strong> (über WebDAV, API oder SSO)\u003C/li>\n\u003Cli>\u003Cstrong>Custom Apps entwickeln\u003C/strong> für spezielle Ermittlungs-Workflows\u003C/li>\n\u003Cli>\u003Cstrong>Auditing aktivieren\u003C/strong>: Nutzung und Änderungen nachvollziehen mit Protokollierungsfunktionen\u003C/li>\n\u003C/ul>",{"headings":262,"localImagePaths":292,"remoteImagePaths":293,"frontmatter":294,"imagePaths":299},[263,264,265,266,269,270,271,274,277,280,281,282,285,288,291],{"depth":43,"slug":44,"text":45},{"depth":47,"slug":111,"text":112},{"depth":51,"slug":114,"text":115},{"depth":51,"slug":267,"text":268},"installationsschritte-ubuntu-beispiel","Installationsschritte (Ubuntu Beispiel)",{"depth":47,"slug":120,"text":121},{"depth":47,"slug":48,"text":49},{"depth":51,"slug":272,"text":273},"gemeinsame-fallbearbeitung","Gemeinsame Fallbearbeitung",{"depth":51,"slug":275,"text":276},"videokonferenzen-mit-nextcloud-talk","Videokonferenzen mit “Nextcloud Talk”",{"depth":51,"slug":278,"text":279},"automatischer-dateiimport-per-api","Automatischer Dateiimport per API",{"depth":47,"slug":64,"text":65},{"depth":47,"slug":140,"text":141},{"depth":51,"slug":283,"text":284},"problem-langsame-performance","Problem: Langsame Performance",{"depth":51,"slug":286,"text":287},"problem-dateien-erscheinen-nicht-im-sync","Problem: Dateien erscheinen nicht im Sync",{"depth":51,"slug":289,"text":290},"problem-fehlermeldung-trusted-domain-not-set","Problem: Fehlermeldung “Trusted domain not set”",{"depth":47,"slug":67,"text":68},[],[],{"title":243,"tool_name":244,"description":245,"last_updated":295,"author":18,"difficulty":247,"categories":296,"tags":297,"sections":298,"review_status":34},["Date","2025-07-20T00:00:00.000Z"],[249],[95,251,252,97,253,254],{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":33},[],"nextcloud.md","velociraptor",{"id":301,"data":303,"body":317,"filePath":318,"digest":319,"rendered":320,"legacyId":370},{"title":304,"tool_name":305,"description":306,"last_updated":307,"author":18,"difficulty":308,"categories":309,"tags":310,"sections":316,"review_status":34},"Velociraptor – Skalierbare Endpoint-Forensik mit VQL","Velociraptor","Detaillierte Anleitung und Best Practices für Velociraptor – Remote-Forensik der nächsten Generation",["Date","2025-07-20T00:00:00.000Z"],"advanced",[21,22,23],[95,311,312,313,314,315],"endpoint-monitoring","artifact-extraction","scripting","live-forensics","hunting",{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":32},"> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\n\n\n# Übersicht\n\nVelociraptor ist ein Open-Source-Tool zur Endpoint-Forensik mit Fokus auf Skalierbarkeit, Präzision und Geschwindigkeit. Es ermöglicht die zielgerichtete Erfassung und Analyse digitaler Artefakte über eine eigene Query Language – VQL (Velociraptor Query Language). Die Architektur erlaubt remote Zugriff auf tausende Endpoints gleichzeitig, ohne dass vollständige Disk-Images erforderlich sind.\n\n## Hauptmerkmale\n\n- 🌐 Web-basierte Benutzeroberfläche\n- 💡 VQL – mächtige, SQL-ähnliche Abfragesprache\n- 🚀 Hochskalierbare Hunt-Funktionalität\n- 🔍 Artefaktbasierte Sammlung (ohne Full-Image)\n- 🖥️ Plattformunterstützung für Windows, macOS, Linux\n- 📦 Apache 2.0 Lizenz – Open Source\n\nWeitere Infos: [velociraptor.app](https://www.velociraptor.app/) \nProjektspiegel: [raptor.cc24.dev](https://raptor.cc24.dev) \nStatus: ![Status](https://status.mikoshi.de/api/badge/33/status)\n\n---\n\n## Installation\n\n### Voraussetzungen\n\n- Python ≥ 3.9\n- Adminrechte auf dem System\n- Firewall-Freigaben für Webport (Standard: 8000)\n\n### Installation unter Linux/macOS\n\n```bash\nwget https://github.com/Velocidex/velociraptor/releases/latest/download/velociraptor\nchmod +x velociraptor\nsudo mv velociraptor /usr/local/bin/\n````\n\n### Installation unter Windows\n\n1. Download der `.exe` von der [Release-Seite](https://github.com/Velocidex/velociraptor/releases)\n2. Ausführung in PowerShell mit Adminrechten:\n\n ```powershell\n .\\velociraptor.exe config generate > server.config.yaml\n ```\n\n---\n\n## Konfiguration\n\n### Server Setup\n\n1. Generiere die Konfigurationsdatei:\n\n ```bash\n velociraptor config generate > server.config.yaml\n ```\n2. Starte den Server:\n\n ```bash\n velociraptor --config server.config.yaml frontend\n ```\n3. Zugriff über Browser via `https://\u003Chostname>:8000`\n\n### Client Deployment\n\n* MSI/EXE für Windows, oder `deb/rpm` für Linux\n* Unterstützt automatische Registrierung am Server\n* Deployment über GPO, Puppet, Ansible etc. möglich\n\n---\n\n## Verwendungsbeispiele\n\n### 1. Live-Memory-Artefakte sammeln\n\n```vql\nSELECT * FROM Artifact.MemoryInfo()\n```\n\n### 2. Hunt starten auf verdächtige Prozesse\n\n```vql\nSELECT * FROM pslist()\nWHERE Name =~ \"mimikatz|cobaltstrike\"\n```\n\n### 3. Dateiinhalt extrahieren\n\n```vql\nSELECT * FROM glob(globs=\"C:\\\\Users\\\\*\\\\AppData\\\\*.dat\")\n```\n\n---\n\n## Best Practices\n\n* Erstelle eigene Artefakte für unternehmensspezifische Bedrohungsmodelle\n* Verwende \"Notebook\"-Funktion für strukturierte Analysen\n* Nutze \"Labels\", um Endpoints zu organisieren (z. B. `location:Berlin`)\n* Kombiniere Velociraptor mit SIEM/EDR-Systemen über REST API\n\n---\n\n## Troubleshooting\n\n### Problem: Keine Verbindung vom Client zum Server\n\n**Lösung:**\n\n* Ports freigegeben? (Default: 8000/tcp)\n* TLS-Zertifikate korrekt generiert?\n* `server.config.yaml` auf korrekte `public_ip` prüfen\n\n### Problem: Hunt hängt in Warteschleife\n\n**Lösung:**\n\n* Genügend Worker-Prozesse aktiv?\n* Endpoint online?\n* `log_level` auf `debug` setzen und Log analysieren\n\n---\n\n## Weiterführende Themen\n\n* Eigene Artefakte schreiben mit VQL\n* Integration mit ELK Stack\n* Automatisiertes Incident Response Playbook\n* Velociraptor als IR-as-a-Service einsetzen\n\n---\n\n🧠 **Tipp:** Die Lernkurve bei VQL ist steil – aber mit hohem ROI. Testumgebung aufsetzen und mit Community-Artefakten starten.\n\n📚 Weitere Ressourcen:\n\n* [Offizielle Doku](https://docs.velociraptor.app/)\n* [YouTube Channel](https://www.youtube.com/c/VelociraptorDFIR)\n* [Community auf Discord](https://www.velociraptor.app/community/)","src/content/knowledgebase/velociraptor.md","835bd74f7afd2c35",{"html":321,"metadata":322},"\u003Cblockquote>\n\u003Cp>\u003Cstrong>⚠️ Hinweis\u003C/strong>: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community!\u003C/p>\n\u003C/blockquote>\n\u003Ch1 id=\"übersicht\">Übersicht\u003C/h1>\n\u003Cp>Velociraptor ist ein Open-Source-Tool zur Endpoint-Forensik mit Fokus auf Skalierbarkeit, Präzision und Geschwindigkeit. Es ermöglicht die zielgerichtete Erfassung und Analyse digitaler Artefakte über eine eigene Query Language – VQL (Velociraptor Query Language). Die Architektur erlaubt remote Zugriff auf tausende Endpoints gleichzeitig, ohne dass vollständige Disk-Images erforderlich sind.\u003C/p>\n\u003Ch2 id=\"hauptmerkmale\">Hauptmerkmale\u003C/h2>\n\u003Cul>\n\u003Cli>🌐 Web-basierte Benutzeroberfläche\u003C/li>\n\u003Cli>💡 VQL – mächtige, SQL-ähnliche Abfragesprache\u003C/li>\n\u003Cli>🚀 Hochskalierbare Hunt-Funktionalität\u003C/li>\n\u003Cli>🔍 Artefaktbasierte Sammlung (ohne Full-Image)\u003C/li>\n\u003Cli>🖥️ Plattformunterstützung für Windows, macOS, Linux\u003C/li>\n\u003Cli>📦 Apache 2.0 Lizenz – Open Source\u003C/li>\n\u003C/ul>\n\u003Cp>Weitere Infos: \u003Ca href=\"https://www.velociraptor.app/\">velociraptor.app\u003C/a>\u003Cbr>\nProjektspiegel: \u003Ca href=\"https://raptor.cc24.dev\">raptor.cc24.dev\u003C/a>\u003Cbr>\nStatus: \u003Cimg src=\"https://status.mikoshi.de/api/badge/33/status\" alt=\"Status\">\u003C/p>\n\u003Chr>\n\u003Ch2 id=\"installation\">Installation\u003C/h2>\n\u003Ch3 id=\"voraussetzungen\">Voraussetzungen\u003C/h3>\n\u003Cul>\n\u003Cli>Python ≥ 3.9\u003C/li>\n\u003Cli>Adminrechte auf dem System\u003C/li>\n\u003Cli>Firewall-Freigaben für Webport (Standard: 8000)\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"installation-unter-linuxmacos\">Installation unter Linux/macOS\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">wget\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://github.com/Velocidex/velociraptor/releases/latest/download/velociraptor\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">chmod\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> +x\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> velociraptor\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sudo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> mv\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> velociraptor\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /usr/local/bin/\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"installation-unter-windows\">Installation unter Windows\u003C/h3>\n\u003Col>\n\u003Cli>\n\u003Cp>Download der \u003Ccode>.exe\u003C/code> von der \u003Ca href=\"https://github.com/Velocidex/velociraptor/releases\">Release-Seite\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Ausführung in PowerShell mit Adminrechten:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"powershell\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">.\\\u003C/span>\u003Cspan style=\"color:#79B8FF\">velociraptor.exe\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> config generate \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> server.config.yaml\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003C/li>\n\u003C/ol>\n\u003Chr>\n\u003Ch2 id=\"konfiguration\">Konfiguration\u003C/h2>\n\u003Ch3 id=\"server-setup\">Server Setup\u003C/h3>\n\u003Col>\n\u003Cli>\n\u003Cp>Generiere die Konfigurationsdatei:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">velociraptor\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> config\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> generate\u003C/span>\u003Cspan style=\"color:#F97583\"> >\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> server.config.yaml\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Cp>Starte den Server:\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">velociraptor\u003C/span>\u003Cspan style=\"color:#79B8FF\"> --config\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> server.config.yaml\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> frontend\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003C/li>\n\u003Cli>\n\u003Cp>Zugriff über Browser via \u003Ccode>https://<hostname>:8000\u003C/code>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003Ch3 id=\"client-deployment\">Client Deployment\u003C/h3>\n\u003Cul>\n\u003Cli>MSI/EXE für Windows, oder \u003Ccode>deb/rpm\u003C/code> für Linux\u003C/li>\n\u003Cli>Unterstützt automatische Registrierung am Server\u003C/li>\n\u003Cli>Deployment über GPO, Puppet, Ansible etc. möglich\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2 id=\"verwendungsbeispiele\">Verwendungsbeispiele\u003C/h2>\n\u003Ch3 id=\"1-live-memory-artefakte-sammeln\">1. Live-Memory-Artefakte sammeln\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>SELECT * FROM Artifact.MemoryInfo()\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"2-hunt-starten-auf-verdächtige-prozesse\">2. Hunt starten auf verdächtige Prozesse\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>SELECT * FROM pslist()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>WHERE Name =~ \"mimikatz|cobaltstrike\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"3-dateiinhalt-extrahieren\">3. Dateiinhalt extrahieren\u003C/h3>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>SELECT * FROM glob(globs=\"C:\\\\Users\\\\*\\\\AppData\\\\*.dat\")\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Chr>\n\u003Ch2 id=\"best-practices\">Best Practices\u003C/h2>\n\u003Cul>\n\u003Cli>Erstelle eigene Artefakte für unternehmensspezifische Bedrohungsmodelle\u003C/li>\n\u003Cli>Verwende “Notebook”-Funktion für strukturierte Analysen\u003C/li>\n\u003Cli>Nutze “Labels”, um Endpoints zu organisieren (z. B. \u003Ccode>location:Berlin\u003C/code>)\u003C/li>\n\u003Cli>Kombiniere Velociraptor mit SIEM/EDR-Systemen über REST API\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2 id=\"troubleshooting\">Troubleshooting\u003C/h2>\n\u003Ch3 id=\"problem-keine-verbindung-vom-client-zum-server\">Problem: Keine Verbindung vom Client zum Server\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Ports freigegeben? (Default: 8000/tcp)\u003C/li>\n\u003Cli>TLS-Zertifikate korrekt generiert?\u003C/li>\n\u003Cli>\u003Ccode>server.config.yaml\u003C/code> auf korrekte \u003Ccode>public_ip\u003C/code> prüfen\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"problem-hunt-hängt-in-warteschleife\">Problem: Hunt hängt in Warteschleife\u003C/h3>\n\u003Cp>\u003Cstrong>Lösung:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Genügend Worker-Prozesse aktiv?\u003C/li>\n\u003Cli>Endpoint online?\u003C/li>\n\u003Cli>\u003Ccode>log_level\u003C/code> auf \u003Ccode>debug\u003C/code> setzen und Log analysieren\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2 id=\"weiterführende-themen\">Weiterführende Themen\u003C/h2>\n\u003Cul>\n\u003Cli>Eigene Artefakte schreiben mit VQL\u003C/li>\n\u003Cli>Integration mit ELK Stack\u003C/li>\n\u003Cli>Automatisiertes Incident Response Playbook\u003C/li>\n\u003Cli>Velociraptor als IR-as-a-Service einsetzen\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Cp>🧠 \u003Cstrong>Tipp:\u003C/strong> Die Lernkurve bei VQL ist steil – aber mit hohem ROI. Testumgebung aufsetzen und mit Community-Artefakten starten.\u003C/p>\n\u003Cp>📚 Weitere Ressourcen:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://docs.velociraptor.app/\">Offizielle Doku\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.youtube.com/c/VelociraptorDFIR\">YouTube Channel\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.velociraptor.app/community/\">Community auf Discord\u003C/a>\u003C/li>\n\u003C/ul>",{"headings":323,"localImagePaths":362,"remoteImagePaths":363,"frontmatter":364,"imagePaths":369},[324,325,328,329,330,333,336,337,340,343,344,347,350,353,354,355,358,361],{"depth":43,"slug":44,"text":45},{"depth":47,"slug":326,"text":327},"hauptmerkmale","Hauptmerkmale",{"depth":47,"slug":111,"text":112},{"depth":51,"slug":114,"text":115},{"depth":51,"slug":331,"text":332},"installation-unter-linuxmacos","Installation unter Linux/macOS",{"depth":51,"slug":334,"text":335},"installation-unter-windows","Installation unter Windows",{"depth":47,"slug":120,"text":121},{"depth":51,"slug":338,"text":339},"server-setup","Server Setup",{"depth":51,"slug":341,"text":342},"client-deployment","Client Deployment",{"depth":47,"slug":48,"text":49},{"depth":51,"slug":345,"text":346},"1-live-memory-artefakte-sammeln","1. Live-Memory-Artefakte sammeln",{"depth":51,"slug":348,"text":349},"2-hunt-starten-auf-verdächtige-prozesse","2. Hunt starten auf verdächtige Prozesse",{"depth":51,"slug":351,"text":352},"3-dateiinhalt-extrahieren","3. Dateiinhalt extrahieren",{"depth":47,"slug":64,"text":65},{"depth":47,"slug":140,"text":141},{"depth":51,"slug":356,"text":357},"problem-keine-verbindung-vom-client-zum-server","Problem: Keine Verbindung vom Client zum Server",{"depth":51,"slug":359,"text":360},"problem-hunt-hängt-in-warteschleife","Problem: Hunt hängt in Warteschleife",{"depth":47,"slug":67,"text":68},[],[],{"title":304,"tool_name":305,"description":306,"last_updated":365,"author":18,"difficulty":308,"categories":366,"tags":367,"sections":368,"review_status":34},["Date","2025-07-20T00:00:00.000Z"],[21,22,23],[95,311,312,313,314,315],{"overview":32,"installation":32,"configuration":32,"usage_examples":32,"best_practices":32,"troubleshooting":32,"advanced_topics":32},[],"velociraptor.md"] \ No newline at end of file diff --git a/.astro/types.d.ts b/.astro/types.d.ts index f964fe0..03d7cc4 100644 --- a/.astro/types.d.ts +++ b/.astro/types.d.ts @@ -1 +1,2 @@ /// +/// \ No newline at end of file diff --git a/README.md b/README.md index 8c59a41..04f95c1 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,17 @@ Ein kuratiertes Verzeichnis für digitale Forensik- und Incident-Response-Tools ## 🎯 Projektübersicht -CC24-Hub bietet eine strukturierte Übersicht über bewährte DFIR-Tools und -Methoden mit intelligenten Empfehlungsfunktionen. Das Projekt orientiert sich am NIST-Framework (SP 800-86) und kategorisiert nach forensischen Domänen und Untersuchungsphasen. +CC24-Hub bietet eine strukturierte Übersicht über bewährte DFIR-Tools, -Methoden und -Konzepte mit intelligenten Empfehlungsfunktionen. Das Projekt orientiert sich am NIST-Framework (SP 800-86) und kategorisiert nach forensischen Domänen und Untersuchungsphasen. ### Hauptfunktionen - **KI-gestützte Empfehlungen**: Workflow- und Tool-Vorschläge basierend auf forensischen Szenarien -- **Tools & Methoden**: Software-Tools UND forensische Verfahren/Prozeduren +- **Drei Kategorien**: Software-Tools, forensische Methoden UND Grundlagenkonzepte - **Matrix-Ansicht**: Visualisierung nach Domänen × Prozess-Phasen - **Erweiterte Filter**: Suche nach Name, Tags, Domäne, Phase, Lizenz - **CC24-Server Integration**: Direkte SSO-Links zu gehosteten Instanzen - **Knowledgebase**: Erweiterte Dokumentation mit praktischen Erkenntnissen +- **Konzept-Verlinkung**: Automatische Verknüpfung zwischen Tools und Grundlagenkonzepten - **Status-Monitoring**: Live-Überwachung verfügbarer Services - **Responsive Design**: Dark/Light Mode, Mobile-optimiert @@ -22,7 +23,7 @@ CC24-Hub bietet eine strukturierte Übersicht über bewährte DFIR-Tools und -Me - **Framework**: [Astro](https://astro.build/) mit Server-Side Rendering - **Backend**: Node.js mit API-Routen für KI und Authentifizierung - **Styling**: Vanilla CSS mit CSS Custom Properties -- **Datenformat**: YAML für Tool-/Methoden-Definitionen +- **Datenformat**: YAML für Tool-/Methoden-/Konzept-Definitionen - **KI-Integration**: Mistral AI über OpenAI-kompatible API - **Authentifizierung**: OIDC (OpenID Connect) mit JWT-Sessions - **Node.js**: >=18.0.0 @@ -248,16 +249,16 @@ Nextcloud OIDC Einstellungen (sollte auch mit anderen OIDC-Anwendungen klappen): - **Redirect URI**: `https://your-domain.com/auth/callback` - **Logout URI**: `https://your-domain.com` -## 🔧 Tool-/Methoden-Datenformat +## 🔧 Datenformat & Kategorien -Einträge werden in `src/data/tools.yaml` definiert: +Die CC24-Hub verwaltet drei Kategorien von Einträgen in `src/data/tools.yaml`: -### Software-Tool Beispiel +### 1. Software-Tools ```yaml tools: - name: "Autopsy" - icon: "📱" + icon: "📦" type: "software" description: "Die führende Open-Source-Alternative zu kommerziellen Forensik-Suiten" domains: ["incident-response", "law-enforcement"] @@ -266,18 +267,19 @@ tools: skillLevel: "intermediate" accessType: "download" url: "https://www.autopsy.com/" - projectUrl: "https://autopsy.cc24.dev" # CC24-Server URL + projectUrl: "https://autopsy.cc24.dev" # CC24-Server URL (optional) license: "Apache 2.0" knowledgebase: true # Hat erweiterte Dokumentation + related_concepts: ["Hash Functions & Digital Signatures", "SQL Query Fundamentals"] # Verknüpfung zu Konzepten tags: ["gui", "filesystem", "timeline-analysis"] - statusUrl: "https://status.example.com/badge/1/status" + statusUrl: "https://status.example.com/badge/1/status" # Status-Badge URL (optional) ``` -### Forensische Methode Beispiel +### 2. Forensische Methoden ```yaml - name: "Live Memory Acquisition Procedure" - icon: "🧠" + icon: "📋" type: "method" description: "Standardisiertes Verfahren zur forensisch korrekten Akquisition des Arbeitsspeichers" domains: ["incident-response", "law-enforcement"] @@ -289,9 +291,30 @@ tools: projectUrl: null license: null knowledgebase: false + related_concepts: null # Können optional Konzepte verknüpfen tags: ["memory-acquisition", "volatile-evidence", "procedure"] ``` +### 3. Grundlagenkonzepte (NEU) + +```yaml + - name: "Regular Expressions (Regex)" + icon: "🔤" + type: "concept" + description: "Pattern matching language for searching, extracting, and manipulating text" + domains: ["incident-response", "malware-analysis"] + phases: ["examination", "analysis"] + platforms: [] # Konzepte haben keine Plattformen + skillLevel: "intermediate" + accessType: null + url: "https://regexr.com/" + projectUrl: null + license: null + knowledgebase: true # Erweiterte Erklärung in Knowledgebase + related_concepts: null # Konzepte verweisen nicht auf andere Konzepte + tags: ["pattern-matching", "text-processing", "log-analysis"] +``` + ### Verfügbare Kategorien **Domänen:** @@ -314,6 +337,135 @@ tools: - `collaboration-general` - Übergreifend & Kollaboration - `specific-os` - Betriebssysteme +## 📚 Knowledgebase-System + +### Erweiterte Dokumentation erstellen + +Die Knowledgebase bietet detaillierte Artikel für Tools, Methoden und Konzepte. So erstellen Sie neue Einträge: + +#### 1. Knowledgebase-Flag setzen + +Setzen Sie in `src/data/tools.yaml` das Flag: +```yaml +knowledgebase: true +``` + +#### 2. Artikel-Datei erstellen + +Erstellen Sie eine Markdown-Datei in `src/content/knowledgebase/`: + +**Dateiname-Schema:** `[tool-name-slug].md` + +**Beispiel:** `src/content/knowledgebase/autopsy.md` + +```markdown +--- +title: "Autopsy - Umfassende Forensik-Suite" +tool_name: "Autopsy" +description: "Detaillierte Anleitung und Best Practices für Autopsy" +last_updated: 2024-01-15 +author: "CC24-Team" +difficulty: "intermediate" +categories: ["filesystem-analysis", "timeline-analysis"] +tags: ["gui", "windows", "linux", "open-source"] +sections: + overview: true + installation: true + configuration: true + usage_examples: true + best_practices: true + troubleshooting: true + advanced_topics: false +review_status: "published" +--- + +# Übersicht + +Autopsy ist eine grafische Benutzeroberfläche für The Sleuth Kit (TSK) und bietet... + +## Installation + +### Windows +1. Download der neuesten Version von [autopsy.com](https://www.autopsy.com/) +2. Ausführung des Installers mit Administratorrechten +3. ... + +## Konfiguration + +### Grundeinstellungen +- Arbeitsverzeichnis festlegen +- Hash-Algorithmen auswählen +- ... + +## Verwendungsbeispiele + +### Fall 1: Gelöschte Dateien wiederherstellen +1. Neuen Fall erstellen +2. Image hinzufügen +3. ... + +## Best Practices + +- Immer Hash-Verifikation durchführen +- Regelmäßige Backups der Case-Datenbank +- ... + +## Troubleshooting + +### Problem: Autopsy startet nicht +**Lösung:** Java-Version überprüfen... + +### Problem: Langsame Performance +**Lösung:** RAM-Zuteilung erhöhen... + +## Weiterführende Themen + +- Integration mit externen Tools +- Custom Modules entwickeln +- ... +``` + +#### 3. Schema-Validierung + +Das System validiert automatisch folgende Felder: + +**Pflichtfelder:** +- `title`: Anzeigename des Artikels +- `tool_name`: Exakter Name aus tools.yaml +- `description`: Kurze Beschreibung +- `last_updated`: Datum der letzten Aktualisierung +- `difficulty`: `novice|beginner|intermediate|advanced|expert` + +**Optionale Felder:** +- `author`: Standard "CC24-Team" +- `categories`: Array von Kategorien +- `tags`: Array von Tags +- `sections`: Welche Abschnitte enthalten sind +- `review_status`: `draft|review|published` (Standard: `published`) + +#### 4. Automatische Verlinkung + +- Artikel sind automatisch über `/knowledgebase/[tool-slug]` erreichbar +- Links werden automatisch in Tool-Details angezeigt +- Suchfunktion indiziert Artikel-Inhalte + +### Konzept-Verlinkung + +Tools können mit Grundlagenkonzepten verknüpft werden: + +```yaml +# Tool-Definition +- name: "Autopsy" + related_concepts: ["Hash Functions & Digital Signatures", "SQL Query Fundamentals"] + +# Konzept-Definition +- name: "Hash Functions & Digital Signatures" + type: "concept" + description: "Cryptographic principles for data integrity verification" +``` + +Die KI-Empfehlungen nutzen diese Verlinkungen für Hintergrundwissen-Empfehlungen. + ## 🤖 KI-Integration ### Workflow-Empfehlungen @@ -322,6 +474,9 @@ Beschreibung forensischer Szenarien für maßgeschneiderte Workflows mit phasenb ### Tool-spezifische Empfehlungen Konkrete Tool-Vorschläge für spezifische Probleme mit detaillierten Begründungen, Implementierungsansätzen und Vor-/Nachteilen. +### Konzept-Integration +Die KI berücksichtigt automatisch verknüpfte Grundlagenkonzepte und empfiehlt relevantes Hintergrundwissen. + **API-Endpunkt:** `/api/ai/query` - **Rate Limiting**: 10 Anfragen pro Minute pro Benutzer - **Modi**: `workflow` (Szenario-basiert) oder `tool` (Problem-spezifisch) @@ -338,31 +493,42 @@ OIDC-Integration mit JWT-Sessions: - `src/utils/auth.ts` - Kern-Authentifizierungslogik - `src/pages/api/auth/` - Auth-API-Endpunkte -## 📚 Weitere Funktionen +## 📁 Datei-Referenz -### Knowledgebase -Erweiterte Dokumentation für Tools mit `knowledgebase: true` in `/knowledgebase`. Bietet praktische Erkenntnisse, Konfigurationshinweise und Lektionen aus der Praxis. +### Wichtige Konfigurationsdateien +- `src/data/tools.yaml` - Hauptdatenbank für Tools, Methoden und Konzepte +- `src/content/config.ts` - Schema für Knowledgebase-Artikel +- `src/utils/dataService.js` - Datenverarbeitungslogik +- `src/styles/global.css` - Zentrale Stylesheet-Definitionen -### Status-Monitoring -Live-Überwachung gehosteter Services in `/status` mit automatischen Status-Badges und direkten Zugriffs-Links. - -### Tool-Editor -Standalone WYSIWYG-Editor unter `/dfir_yaml_editor.html` für die Verwaltung der `tools.yaml` mit Bulk-Operationen und Validierung. +### Content-Verzeichnisse +- `src/content/knowledgebase/` - Knowledgebase-Artikel (Markdown) +- `src/components/` - Wiederverwendbare UI-Komponenten +- `src/pages/api/` - Backend-API-Endpunkte ## 🤝 Beitragen -### Tool/Methode hinzufügen +### Tool/Methode/Konzept hinzufügen **Option 1: Direkte YAML-Bearbeitung** 1. Fork des Repositories erstellen 2. `src/data/tools.yaml` bearbeiten -3. Pull Request mit Beschreibung erstellen +3. Bei Bedarf Knowledgebase-Artikel erstellen +4. Pull Request mit Beschreibung erstellen **Option 2: Web-Editor verwenden** 1. YAML-Editor öffnen (`/dfir_yaml_editor.html`) -2. Tool/Methode hinzufügen +2. Eintrag hinzufügen (Tool/Methode/Konzept) 3. YAML exportieren und in Pull Request einreichen +### Knowledgebase-Artikel erweitern + +1. Tool in `tools.yaml` identifizieren +2. `knowledgebase: true` setzen +3. Artikel in `src/content/knowledgebase/[slug].md` erstellen +4. Schema-Validierung beachten +5. Pull Request einreichen + ### Korrekturen & Verbesserungen - Bug Reports und Feature Requests über Issues melden @@ -381,6 +547,11 @@ Standalone WYSIWYG-Editor unter `/dfir_yaml_editor.html` für die Verwaltung der - Redirect-URIs im OIDC-Provider registriert? - `AUTH_SECRET` mindestens 32 Zeichen? +**Knowledgebase-Artikel werden nicht angezeigt:** +- `knowledgebase: true` in tools.yaml gesetzt? +- Markdown-Datei existiert in `src/content/knowledgebase/`? +- Schema-Validierung erfolgreich? + **Logs prüfen:** ```bash # Anwendungs-Logs @@ -388,4 +559,4 @@ sudo journalctl -u cc24-hub -f # Development-Modus npm run dev -``` \ No newline at end of file +``` diff --git a/astro.config.mjs b/astro.config.mjs index 907fdea..69e2603 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,20 +1,16 @@ -// astro.config.mjs - SSR configuration for authentication import { defineConfig } from 'astro/config'; import node from '@astrojs/node'; export default defineConfig({ - // Server-side rendering for authentication and API routes output: 'server', adapter: node({ mode: 'standalone' }), - // Build configuration build: { assets: '_astro' }, - // Development server server: { port: 4321, host: true diff --git a/dfir_yaml_editor.html b/dfir_yaml_editor.html index fe92f47..9c33db9 100644 --- a/dfir_yaml_editor.html +++ b/dfir_yaml_editor.html @@ -102,15 +102,20 @@ padding: 12px 24px; border-radius: 8px; cursor: pointer; - font-size: 14px; font-weight: 500; - transition: all 0.3s ease; margin: 5px; + transition: all 0.3s ease; + text-decoration: none; + display: inline-block; } .btn:hover { transform: translateY(-2px); - box-shadow: 0 8px 15px rgba(52, 152, 219, 0.3); + box-shadow: 0 4px 12px rgba(52, 152, 219, 0.3); + } + + .btn-secondary { + background: linear-gradient(135deg, #95a5a6, #7f8c8d); } .btn-danger { @@ -125,9 +130,33 @@ background: linear-gradient(135deg, #f39c12, #e67e22); } + .stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 20px; + margin-bottom: 30px; + } + + .stat-card { + background: linear-gradient(135deg, #3498db, #2980b9); + color: white; + padding: 20px; + border-radius: 10px; + text-align: center; + } + + .stat-card h3 { + font-size: 2em; + margin-bottom: 5px; + } + + .stat-card p { + opacity: 0.9; + } + .tools-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin-top: 20px; } @@ -137,317 +166,67 @@ border: 1px solid #e9ecef; border-radius: 10px; padding: 20px; - box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: all 0.3s ease; + border-left: 4px solid #3498db; } .tool-card:hover { - transform: translateY(-5px); - box-shadow: 0 8px 15px rgba(0,0,0,0.15); - } - - .tool-card.method { - border-left: 4px solid #9b59b6; - background: linear-gradient(135deg, #f8f9fa 0%, #f4f1ff 100%); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0,0,0,0.1); } .tool-card.software { - border-left: 4px solid #3498db; + border-left-color: #3498db; + } + + .tool-card.method { + border-left-color: #9b59b6; + } + + .tool-card.concept { + border-left-color: #e67e22; } .tool-card h3 { color: #2c3e50; margin-bottom: 10px; - font-size: 1.3em; display: flex; align-items: center; - gap: 8px; - } - - .tool-icon { - font-size: 1.4em; + gap: 10px; } .tool-card p { - color: #7f8c8d; + color: #666; margin-bottom: 15px; - font-size: 0.9em; - line-height: 1.4; + line-height: 1.5; } - .tag { - display: inline-block; - background: #ecf0f1; - color: #34495e; - padding: 4px 8px; - border-radius: 15px; - font-size: 0.8em; - margin: 2px; - } - - .tag.method-tag { - background: #e8e4ff; - color: #9b59b6; - font-weight: bold; - } - - .tag.domain-agnostic { - background: #e8f5e8; - color: #27ae60; - font-weight: bold; - } - - .skill-badge { - display: inline-block; - padding: 4px 12px; - border-radius: 20px; - font-size: 0.8em; - font-weight: bold; - margin: 5px 0; - } - - .skill-novice { background: #d5f4e6; color: #158bc2; } - .skill-beginner { background: #d5f4e6; color: #27ae60; } - .skill-intermediate { background: #ffeaa7; color: #e17055; } - .skill-advanced { background: #fab1a0; color: #d63031; } - .skill-expert { background: #2c3e50; color: #ffffff; } - - .form-section { - background: #f8f9fa; - padding: 25px; - border-radius: 10px; - margin-bottom: 20px; - } - - .form-group { - margin-bottom: 20px; - } - - .form-group label { - display: block; - margin-bottom: 8px; - font-weight: 600; - color: #2c3e50; - } - - .form-group input, - .form-group textarea, - .form-group select { - width: 100%; - padding: 12px; - border: 2px solid #e9ecef; - border-radius: 8px; - font-size: 14px; - transition: border-color 0.3s ease; - } - - .form-group input:focus, - .form-group textarea:focus, - .form-group select:focus { - outline: none; - border-color: #3498db; - box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1); - } - - .checkbox-group { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + .tool-actions { + display: flex; gap: 10px; - margin-top: 10px; + margin-top: 15px; } - .checkbox-item { - display: flex; - align-items: center; - gap: 8px; - } - - .search-bar { - width: 100%; - padding: 15px; - border: 2px solid #e9ecef; - border-radius: 10px; - font-size: 16px; - margin-bottom: 20px; - } - - .bulk-operations { - background: #fff3cd; - border: 1px solid #ffeaa7; - border-radius: 10px; - padding: 20px; - margin-bottom: 20px; - } - - .stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 20px; - margin-bottom: 30px; - } - - .stat-card { - background: white; - padding: 20px; - border-radius: 10px; - text-align: center; - box-shadow: 0 4px 6px rgba(0,0,0,0.1); - } - - .stat-number { - font-size: 2em; - font-weight: bold; - color: #3498db; - } - - .stat-label { - color: #7f8c8d; - margin-top: 5px; - } - - .hidden { - display: none !important; - } - - .tag-input-container { - display: flex; - flex-wrap: wrap; - gap: 5px; - margin-bottom: 10px; - padding: 10px; - border: 2px solid #e9ecef; - border-radius: 8px; - min-height: 50px; - align-items: center; - } - - .tag-input { - border: none; - outline: none; - padding: 5px; + .tool-actions button { flex: 1; - min-width: 100px; + padding: 8px 12px; + font-size: 0.9em; } - .removable-tag { - background: #3498db; - color: white; + .skill-level { + display: inline-block; padding: 4px 8px; border-radius: 15px; font-size: 0.8em; - display: flex; - align-items: center; - gap: 5px; - } - - .remove-tag { - cursor: pointer; - background: rgba(255,255,255,0.3); - border-radius: 50%; - width: 16px; - height: 16px; - display: flex; - align-items: center; - justify-content: center; - font-size: 12px; - } - - .export-section { - background: #e8f5e8; - border: 1px solid #c3e6c3; - border-radius: 10px; - padding: 20px; - margin-top: 20px; - } - - .tag-stat { - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px 12px; - margin: 5px 0; - background: #f8f9fa; - border-radius: 8px; - border-left: 4px solid #3498db; - } - - .tag-stat:hover { - background: #e9ecef; - cursor: pointer; - } - - .tag-name { - font-weight: 500; - color: #2c3e50; - } - - .tag-count { - background: #3498db; + font-weight: bold; color: white; - padding: 4px 8px; - border-radius: 12px; - font-size: 0.85em; - font-weight: bold; } - .skill-bar { - display: flex; - align-items: center; - margin: 10px 0; - gap: 15px; - } - - .skill-label { - width: 100px; - font-weight: 500; - text-transform: capitalize; - } - - .skill-progress { - flex: 1; - height: 20px; - background: #e9ecef; - border-radius: 10px; - overflow: hidden; - position: relative; - } - - .skill-fill { - height: 100%; - border-radius: 10px; - transition: width 0.3s ease; - } - - .skill-fill.novice { background: linear-gradient(90deg, #77b7d3, #2e92cc); } - .skill-fill.beginner { background: linear-gradient(90deg, #27ae60, #2ecc71); } - .skill-fill.intermediate { background: linear-gradient(90deg, #f39c12, #e67e22); } - .skill-fill.advanced { background: linear-gradient(90deg, #e74c3c, #c0392b); } - .skill-fill.expert { background: linear-gradient(90deg, #2c3e50, #34495e); } - - .skill-count { - min-width: 30px; - text-align: right; - font-weight: bold; - color: #2c3e50; - } - - .error-message { - background: #f8d7da; - color: #721c24; - padding: 12px; - border-radius: 8px; - margin: 10px 0; - border: 1px solid #f5c6cb; - } - - .success-message { - background: #d4edda; - color: #155724; - padding: 12px; - border-radius: 8px; - margin: 10px 0; - border: 1px solid #c3e6cb; - } + .skill-novice { background: #77b7d3; } + .skill-beginner { background: #27ae60; } + .skill-intermediate { background: #f39c12; } + .skill-advanced { background: #e74c3c; } + .skill-expert { background: #2c3e50; } .type-badge { display: inline-block; @@ -469,6 +248,91 @@ color: white; } + .type-concept { + background: #e67e22; + color: white; + } + + .form-group { + margin-bottom: 20px; + } + + .form-group label { + display: block; + margin-bottom: 5px; + font-weight: 500; + color: #2c3e50; + } + + .form-group input, + .form-group select, + .form-group textarea { + width: 100%; + padding: 10px; + border: 1px solid #ddd; + border-radius: 5px; + font-size: 14px; + } + + .form-group textarea { + resize: vertical; + min-height: 100px; + } + + .checkbox-group { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 10px; + margin-top: 10px; + } + + .checkbox-item { + display: flex; + align-items: center; + gap: 8px; + } + + .tags-input { + display: flex; + flex-wrap: wrap; + gap: 5px; + min-height: 40px; + padding: 5px; + border: 1px solid #ddd; + border-radius: 5px; + background: white; + } + + .tag { + background: #e9ecef; + padding: 4px 8px; + border-radius: 15px; + font-size: 0.85em; + display: flex; + align-items: center; + gap: 5px; + } + + .tag.domain-agnostic { + background: #d1ecf1; + color: #0c5460; + } + + .tag.related-concept { + background: #fff3cd; + color: #856404; + } + + .tag-remove { + cursor: pointer; + font-weight: bold; + color: #666; + } + + .tag-remove:hover { + color: #e74c3c; + } + .conditional-fields { transition: opacity 0.3s ease; } @@ -478,11 +342,105 @@ pointer-events: none; } - .icon-input { - font-size: 1.5em; - text-align: center; + .hidden { + display: none !important; + } + + .message { + padding: 15px; + border-radius: 8px; + margin: 10px 0; + } + + .message.success { + background: #d4edda; + color: #155724; + border: 1px solid #c3e6cb; + } + + .message.error { + background: #f8d7da; + color: #721c24; + border: 1px solid #f5c6cb; + } + + .bulk-actions { + background: #f8f9fa; + padding: 20px; + border-radius: 10px; + margin-bottom: 20px; + } + + .bulk-actions h3 { + margin-bottom: 15px; + color: #2c3e50; + } + + .selection-info { + margin-bottom: 15px; padding: 10px; - width: 80px; + background: #e9ecef; + border-radius: 5px; + font-weight: 500; + } + + .filter-section { + background: #f8f9fa; + padding: 15px; + border-radius: 8px; + margin-bottom: 20px; + } + + .filter-row { + display: flex; + gap: 15px; + align-items: center; + flex-wrap: wrap; + } + + .filter-row select { + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; + } + + .knowledge-generator { + background: #fff3cd; + border: 1px solid #ffeaa7; + border-radius: 8px; + padding: 20px; + margin-top: 20px; + } + + .knowledge-generator h3 { + color: #856404; + margin-bottom: 15px; + } + + .markdown-preview { + background: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 4px; + padding: 15px; + font-family: 'Courier New', monospace; + font-size: 0.9em; + white-space: pre-wrap; + max-height: 400px; + overflow-y: auto; + } + + @media (max-width: 768px) { + .tabs { + flex-direction: column; + } + + .stats-grid { + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + } + + .tools-grid { + grid-template-columns: 1fr; + } } @@ -490,14 +448,15 @@

🔧 DFIR Tools YAML Editor

-

Comprehensive editor for Digital Forensics and Incident Response tools database

+

Comprehensive editor for Digital Forensics and Incident Response tools, methods, and concepts

📊 Overview
-
🛠️ Tools
+
🛠️ Tools & Concepts
✏️ Editor
📋 Bulk Edit
+
📚 Knowledge Generator
💾 Export
@@ -505,283 +464,264 @@

📁 Load YAML File

- - - + +

Select a YAML file to load existing tools data

-
- -
+
+

🔍 Filter Tools & Concepts

+
+ + + + + +
+
+
+ +
-
-

Add New Tool

-
-
-
-
- - -
-
- - -
-
- - -
-
+

✏️ Add/Edit Tool, Method, or Concept

+ + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
- - -
- -
-
- - -
-
- - -
-
- - -
-
-
- - + +
+
+ +
-
- - +
+ +
-
- - +
+ + +
+
+ + +
+
+ +
- -
-
- - -
-
-
- - -
-
-
- -
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- -
- -
-
- -
- -
-
+
+ +
+
+
+ + +
+
+ +
- -
- -
+ +
-
- - - +
+ +
- -
+ +
+ + +
+ +
+
+ + +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ Reference concept names for providing background knowledge +
+ +
+ + + +
+
-
-

🔄 Bulk Operations

-

Select multiple tools to perform bulk operations

- -
+
+

📋 Bulk Operations

+
+ No tools selected +
+
- - - - 0 selected -
- -
- - - - + + - - -
- -
- - - - - -
- -
- - - - -
- -
- - - + +
+
+ +
+
-
+ +
+
+

📚 Knowledgebase Entry Generator

+

Generate markdown templates for tools with extended knowledgebase documentation.

+ +
+ + +
+ + +
-
-

💾 Export Options

-

Download your edited YAML file

- -
- - - -
+

💾 Export & Preview

+ + - - -
@@ -791,6 +731,40 @@ let currentEditingIndex = -1; let selectedTools = new Set(); + // Initialize the application + function init() { + yamlData = { + tools: [], + domains: [ + { id: 'network', name: 'Network Forensics' }, + { id: 'memory', name: 'Memory Forensics' }, + { id: 'disk', name: 'Disk Forensics' }, + { id: 'mobile', name: 'Mobile Forensics' }, + { id: 'cloud', name: 'Cloud Forensics' }, + { id: 'malware', name: 'Malware Analysis' } + ], + phases: [ + { id: 'identification', name: 'Identification' }, + { id: 'preservation', name: 'Preservation' }, + { id: 'collection', name: 'Collection' }, + { id: 'examination', name: 'Examination' }, + { id: 'analysis', name: 'Analysis' }, + { id: 'reporting', name: 'Reporting' } + ], + 'domain-agnostic-software': [ + { id: 'collaboration', name: 'Collaboration & Communication' }, + { id: 'documentation', name: 'Documentation & Reporting' }, + { id: 'virtualization', name: 'Virtualization & Sandboxing' }, + { id: 'automation', name: 'Automation & Scripting' } + ] + }; + + populateFormOptions(); + updateStats(); + renderToolsGrid(); + updateKnowledgeToolSelect(); + } + function showTab(tabName) { // Hide all tab contents document.querySelectorAll('.tab-content').forEach(content => { @@ -808,289 +782,381 @@ // Add active class to clicked tab event.target.classList.add('active'); - // Refresh content based on tab + // Refresh content for specific tabs if (tabName === 'tools') { renderToolsGrid(); } else if (tabName === 'bulk') { renderBulkGrid(); + } else if (tabName === 'knowledge') { + updateKnowledgeToolSelect(); } } - function handleTypeChange() { - const type = document.getElementById('toolType').value; + function populateFormOptions() { + // Populate domains + const domainsContainer = document.getElementById('domainsCheckbox'); + domainsContainer.innerHTML = ''; + yamlData.domains.forEach(domain => { + const div = document.createElement('div'); + div.className = 'checkbox-item'; + div.innerHTML = ` + + + `; + domainsContainer.appendChild(div); + }); + + // Populate phases + const phasesContainer = document.getElementById('phasesCheckbox'); + phasesContainer.innerHTML = ''; + yamlData.phases.forEach(phase => { + const div = document.createElement('div'); + div.className = 'checkbox-item'; + div.innerHTML = ` + + + `; + phasesContainer.appendChild(div); + }); + + // Populate domain-agnostic software + const domainAgnosticContainer = document.getElementById('domainAgnosticCheckbox'); + domainAgnosticContainer.innerHTML = ''; + yamlData['domain-agnostic-software'].forEach(category => { + const div = document.createElement('div'); + div.className = 'checkbox-item'; + div.innerHTML = ` + + + `; + domainAgnosticContainer.appendChild(div); + }); + } + + function toggleConditionalFields() { + const toolType = document.getElementById('toolType').value; + const softwareMethodFields = document.getElementById('softwareMethodFields'); const softwareFields = document.getElementById('softwareFields'); - - if (type === 'method') { + + if (toolType === 'concept') { + // Concepts don't have platforms, domain-agnostic categories, or software-specific fields + softwareMethodFields.classList.add('disabled'); + softwareFields.classList.add('disabled'); + } else if (toolType === 'method') { + // Methods have platforms and domain-agnostic categories but not software-specific fields + softwareMethodFields.classList.remove('disabled'); softwareFields.classList.add('disabled'); - // Clear software-specific fields for methods - document.getElementById('projectUrl').value = ''; - document.getElementById('license').value = ''; - document.getElementById('accessType').value = ''; - document.getElementById('statusUrl').value = ''; - document.getElementById('knowledgebase').checked = false; - // Clear platform checkboxes - document.querySelectorAll('#platformsCheckbox input').forEach(cb => cb.checked = false); } else { + // Software has all fields + softwareMethodFields.classList.remove('disabled'); softwareFields.classList.remove('disabled'); } } - function showMessage(message, type = 'success') { - const messageArea = document.getElementById('messageArea'); - const className = type === 'error' ? 'error-message' : 'success-message'; - messageArea.innerHTML = `
${message}
`; - setTimeout(() => { - messageArea.innerHTML = ''; - }, 5000); - } - function loadFile() { - const fileInput = document.getElementById('fileInput'); - const file = fileInput.files[0]; - - if (!file) { - showMessage('Please select a file', 'error'); - return; - } + const file = document.getElementById('fileInput').files[0]; + if (!file) return; const reader = new FileReader(); reader.onload = function(e) { try { yamlData = jsyaml.load(e.target.result); - console.log('Loaded YAML data:', yamlData); - updateUI(); - showMessage('File loaded successfully!'); + showMessage('YAML file loaded successfully!', 'success'); + populateFormOptions(); + updateStats(); + renderToolsGrid(); + updateKnowledgeToolSelect(); } catch (error) { - showMessage('Error parsing YAML: ' + error.message, 'error'); + showMessage('Error loading YAML file: ' + error.message, 'error'); } }; reader.readAsText(file); } - function loadSampleData() { - try { - const sampleData = { - tools: [ - { - name: "Autopsy", - icon: "📱", - type: "software", - description: "The leading open-source digital forensics platform.", - domains: ["incident-response", "law-enforcement"], - phases: ["examination", "analysis"], - platforms: ["Windows", "Linux"], - skillLevel: "intermediate", - accessType: "download", - url: "https://www.autopsy.com/", - projectUrl: "", - license: "Apache 2.0", - knowledgebase: false, - tags: ["gui", "filesystem", "timeline-analysis", "carving"] - }, - { - name: "Live Memory Acquisition Procedure", - icon: "🧠", - type: "method", - description: "Standardized procedure for forensically sound memory acquisition.", - domains: ["incident-response", "law-enforcement"], - phases: ["data-collection"], - platforms: [], - skillLevel: "advanced", - accessType: null, - url: "https://www.nist.gov/publications/guide-integrating-forensic-techniques-incident-response", - projectUrl: null, - license: null, - knowledgebase: false, - tags: ["memory-acquisition", "volatile-evidence", "procedure"] - } - ], - domains: [ - { id: "incident-response", name: "Incident Response & Breach Investigation" }, - { id: "law-enforcement", name: "Law Enforcement & Criminal Investigation" }, - { id: "malware-analysis", name: "Malware Analysis & Reverse Engineering" } - ], - phases: [ - { id: "data-collection", name: "Data Collection", description: "Imaging, Acquisition, Remote Collection Tools" }, - { id: "examination", name: "Examination", description: "Parsing, Extraction, Initial Analysis Tools" }, - { id: "analysis", name: "Analysis", description: "Deep Analysis, Correlation, Visualization Tools" }, - { id: "reporting", name: "Reporting", description: "Documentation, Visualization, Presentation Tools" } - ], - "domain-agnostic-software": [ - { id: "collaboration-general", name: "Collaboration & General", description: "Cross-cutting tools and collaboration platforms" }, - { id: "specific-os", name: "Operating Systems", description: "Operating Systems which focus on forensics" } - ] - }; - yamlData = sampleData; - updateUI(); - showMessage('Sample data loaded successfully!'); - } catch (error) { - showMessage('Error loading sample data: ' + error.message, 'error'); - } - } - - function updateUI() { - if (!yamlData) return; - - // Show stats section - document.getElementById('statsSection').classList.remove('hidden'); - - // Update statistics - updateStats(); + function showMessage(message, type = 'success') { + const messageDiv = document.createElement('div'); + messageDiv.className = `message ${type}`; + messageDiv.textContent = message; + document.body.appendChild(messageDiv); - // Update checkboxes - updateDomainCheckboxes(); - updatePhaseCheckboxes(); - updateDomainAgnosticCheckboxes(); - - // Render tools grid - renderToolsGrid(); + setTimeout(() => { + document.body.removeChild(messageDiv); + }, 3000); } function updateStats() { if (!yamlData || !yamlData.tools) return; - const tools = yamlData.tools; - document.getElementById('totalTools').textContent = tools.length; - - const softwareCount = tools.filter(tool => tool.type === 'software').length; - const methodCount = tools.filter(tool => tool.type === 'method').length; - document.getElementById('softwareCount').textContent = softwareCount; - document.getElementById('methodCount').textContent = methodCount; - - document.getElementById('totalDomains').textContent = yamlData.domains ? yamlData.domains.length : 0; - 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 === 'server-based').length; - document.getElementById('selfHostedCount').textContent = selfHosted; + const stats = { + total: yamlData.tools.length, + software: yamlData.tools.filter(t => t.type === 'software' || !t.type).length, + methods: yamlData.tools.filter(t => t.type === 'method').length, + concepts: yamlData.tools.filter(t => t.type === 'concept').length, + withKnowledgebase: yamlData.tools.filter(t => t.knowledgebase).length + }; - const knowledgebaseTools = tools.filter(tool => tool.knowledgebase === true).length; - document.getElementById('knowledgebaseCount').textContent = knowledgebaseTools; - - // Update analytics - updateTagAnalytics(); - updateSkillDistribution(); - } - - function updateTagAnalytics() { - const tagCounts = {}; - - if (yamlData && yamlData.tools) { - yamlData.tools.forEach(tool => { - if (tool.tags && Array.isArray(tool.tags)) { - tool.tags.forEach(tag => { - tagCounts[tag] = (tagCounts[tag] || 0) + 1; - }); - } - }); - } - - const container = document.getElementById('tagAnalytics'); - - if (Object.keys(tagCounts).length === 0) { - container.innerHTML = '

No tags found

'; - return; - } - - const sortedTags = Object.entries(tagCounts).sort((a, b) => b[1] - a[1]); - - container.innerHTML = sortedTags.map(([tag, count]) => ` -
- ${tag} - ${count} + const statsContainer = document.getElementById('stats'); + statsContainer.innerHTML = ` +
+

${stats.total}

+

Total Items

- `).join(''); +
+

${stats.software}

+

Software Tools

+
+
+

${stats.methods}

+

Methods

+
+
+

${stats.concepts}

+

Concepts

+
+
+

${stats.withKnowledgebase}

+

With Knowledgebase

+
+ `; } - function updateSkillDistribution() { - const skillCounts = { novice: 0, beginner: 0, intermediate: 0, advanced: 0, expert: 0 }; + function getCheckedValues(selector) { + return Array.from(document.querySelectorAll(selector + ':checked')).map(cb => cb.value); + } + + function getTags() { + return Array.from(document.querySelectorAll('#tagsInput .tag')).map(tag => + tag.textContent.replace('×', '').trim() + ).filter(tag => tag); + } + + function getRelatedConcepts() { + return Array.from(document.querySelectorAll('#relatedConceptsInput .tag')).map(tag => + tag.textContent.replace('×', '').trim() + ).filter(concept => concept); + } + + function focusTagInput() { + document.getElementById('tagInputField').focus(); + } + + function focusRelatedConceptInput() { + document.getElementById('relatedConceptInputField').focus(); + } + + function handleTagInput(event) { + if (event.key === 'Enter' || event.key === ',') { + event.preventDefault(); + const input = event.target; + const value = input.value.trim(); + if (value) { + addTag('tagsInput', value); + input.value = ''; + } + } + } + + function handleRelatedConceptInput(event) { + if (event.key === 'Enter' || event.key === ',') { + event.preventDefault(); + const input = event.target; + const value = input.value.trim(); + if (value) { + addTag('relatedConceptsInput', value, 'related-concept'); + input.value = ''; + } + } + } + + function addTag(containerId, value, extraClass = '') { + const container = document.getElementById(containerId); + const input = container.querySelector('input'); - if (yamlData && yamlData.tools) { - yamlData.tools.forEach(tool => { - const skill = tool.skillLevel || 'intermediate'; - if (skillCounts.hasOwnProperty(skill)) { - skillCounts[skill]++; + const tag = document.createElement('span'); + tag.className = `tag ${extraClass}`; + tag.innerHTML = `${value} ×`; + + container.insertBefore(tag, input); + } + + function saveTool() { + try { + if (!yamlData) { + yamlData = { tools: [], domains: [], phases: [], 'domain-agnostic-software': [] }; + } + if (!yamlData.tools) { + yamlData.tools = []; + } + + const toolType = document.getElementById('toolType').value; + const tool = { + name: document.getElementById('toolName').value, + type: toolType, + description: document.getElementById('description').value, + skillLevel: document.getElementById('skillLevel').value, + url: document.getElementById('url').value, + tags: getTags() + }; + + // Add icon if provided + const icon = document.getElementById('toolIcon').value.trim(); + if (icon) { + tool.icon = icon; + } + + // Add domains and phases for all types + tool.domains = getCheckedValues('#domainsCheckbox input:checked'); + tool.phases = getCheckedValues('#phasesCheckbox input:checked'); + + // Add related concepts + const relatedConcepts = getRelatedConcepts(); + if (relatedConcepts.length > 0) { + tool.related_concepts = relatedConcepts; + } + + // Type-specific fields + if (toolType === 'software') { + tool.platforms = getCheckedValues('#platformsCheckbox input:checked'); + tool.accessType = document.getElementById('accessType').value; + tool.projectUrl = document.getElementById('projectUrl').value; + tool.license = document.getElementById('license').value; + tool.knowledgebase = document.getElementById('knowledgebase').checked; + + const statusUrl = document.getElementById('statusUrl').value; + if (statusUrl) { + tool.statusUrl = statusUrl; + } + + // Add domain-agnostic software if selected + const domainAgnostic = getCheckedValues('#domainAgnosticCheckbox input:checked'); + if (domainAgnostic.length > 0) { + tool['domain-agnostic-software'] = domainAgnostic; + } + } else if (toolType === 'method') { + tool.platforms = getCheckedValues('#platformsCheckbox input:checked'); + + // Add domain-agnostic software if selected + const domainAgnostic = getCheckedValues('#domainAgnosticCheckbox input:checked'); + if (domainAgnostic.length > 0) { + tool['domain-agnostic-software'] = domainAgnostic; + } + + // Methods don't have software-specific fields + tool.accessType = null; + tool.projectUrl = null; + tool.license = null; + tool.knowledgebase = false; + } else if (toolType === 'concept') { + // Concepts don't have platforms or software-specific fields (but can have knowledgebase) + tool.platforms = []; + tool.accessType = null; + tool.projectUrl = null; + tool.license = null; + tool.knowledgebase = document.getElementById('knowledgebase').checked; + } + + // Clean up empty arrays and null values + Object.keys(tool).forEach(key => { + if (Array.isArray(tool[key]) && tool[key].length === 0) { + delete tool[key]; + } else if (tool[key] === '' || tool[key] === null || tool[key] === false) { + if (key === 'knowledgebase' && (toolType === 'software' || toolType === 'concept')) { + // Keep knowledgebase boolean for software and concepts + } else { + delete tool[key]; + } } }); - } - const total = Object.values(skillCounts).reduce((sum, count) => sum + count, 0); - const container = document.getElementById('skillDistribution'); - - if (total === 0) { - container.innerHTML = '

No skill data available

'; - return; - } + if (currentEditingIndex >= 0) { + yamlData.tools[currentEditingIndex] = tool; + showMessage('Tool updated successfully!'); + currentEditingIndex = -1; + } else { + yamlData.tools.push(tool); + showMessage('Tool added successfully!'); + } - container.innerHTML = Object.entries(skillCounts).map(([skill, count]) => { - const percentage = total > 0 ? (count / total) * 100 : 0; - return ` -
-
${skill}
-
-
-
-
${count}
-
- `; - }).join(''); - } - - function searchForTag(tag) { - showTab('tools'); - document.querySelector('[onclick="showTab(\'tools\')"]').classList.add('active'); - document.getElementById('searchBar').value = tag; - filterTools(); - } - - function updateDomainCheckboxes() { - const container = document.getElementById('domainsCheckbox'); - container.innerHTML = ''; - - if (yamlData.domains) { - yamlData.domains.forEach(domain => { - const div = document.createElement('div'); - div.className = 'checkbox-item'; - div.innerHTML = ` - - - `; - container.appendChild(div); - }); + clearForm(); + updateStats(); + renderToolsGrid(); + updateKnowledgeToolSelect(); + } catch (error) { + showMessage('Error saving tool: ' + error.message, 'error'); } } - function updatePhaseCheckboxes() { - const container = document.getElementById('phasesCheckbox'); - container.innerHTML = ''; - - if (yamlData.phases) { - yamlData.phases.forEach(phase => { - const div = document.createElement('div'); - div.className = 'checkbox-item'; - div.innerHTML = ` - - - `; - container.appendChild(div); - }); - } + function clearForm() { + document.getElementById('toolForm').reset(); + document.getElementById('tagsInput').innerHTML = ''; + document.getElementById('relatedConceptsInput').innerHTML = ''; + currentEditingIndex = -1; + toggleConditionalFields(); } - function updateDomainAgnosticCheckboxes() { - const container = document.getElementById('domainAgnosticCheckbox'); - container.innerHTML = ''; - - if (yamlData['domain-agnostic-software']) { - yamlData['domain-agnostic-software'].forEach(category => { - const div = document.createElement('div'); - div.className = 'checkbox-item'; - div.innerHTML = ` - - - `; - container.appendChild(div); - }); + function cancelEdit() { + clearForm(); + showMessage('Edit cancelled'); + } + + function editTool(index) { + const tool = yamlData.tools[index]; + currentEditingIndex = index; + + // Populate form fields + document.getElementById('toolType').value = tool.type || 'software'; + document.getElementById('toolName').value = tool.name || ''; + document.getElementById('toolIcon').value = tool.icon || ''; + document.getElementById('description').value = tool.description || ''; + document.getElementById('skillLevel').value = tool.skillLevel || 'intermediate'; + document.getElementById('url').value = tool.url || ''; + + // Software-specific fields + if (tool.type === 'software' || !tool.type) { + document.getElementById('accessType').value = tool.accessType || ''; + document.getElementById('projectUrl').value = tool.projectUrl || ''; + document.getElementById('license').value = tool.license || ''; + document.getElementById('statusUrl').value = tool.statusUrl || ''; + } + + // Knowledgebase field for software and concepts + if (tool.type === 'software' || tool.type === 'concept' || !tool.type) { + document.getElementById('knowledgebase').checked = tool.knowledgebase || false; + } + + // Set checkboxes + setCheckboxValues('#domainsCheckbox input', tool.domains || []); + setCheckboxValues('#phasesCheckbox input', tool.phases || []); + setCheckboxValues('#platformsCheckbox input', tool.platforms || []); + setCheckboxValues('#domainAgnosticCheckbox input', tool['domain-agnostic-software'] || []); + + // Set tags + const tagsContainer = document.getElementById('tagsInput'); + tagsContainer.innerHTML = ''; + (tool.tags || []).forEach(tag => addTag('tagsInput', tag)); + + // Set related concepts + const conceptsContainer = document.getElementById('relatedConceptsInput'); + conceptsContainer.innerHTML = ''; + (tool.related_concepts || []).forEach(concept => addTag('relatedConceptsInput', concept, 'related-concept')); + + toggleConditionalFields(); + showTab('editor'); + } + + function setCheckboxValues(selector, values) { + document.querySelectorAll(selector).forEach(cb => { + cb.checked = values.includes(cb.value); + }); + } + + function deleteTool(index) { + if (confirm('Are you sure you want to delete this tool?')) { + yamlData.tools.splice(index, 1); + showMessage('Tool deleted successfully!'); + updateStats(); + renderToolsGrid(); + updateKnowledgeToolSelect(); } } @@ -1100,26 +1166,27 @@ if (!yamlData || !yamlData.tools) return; - yamlData.tools.forEach((tool, index) => { - const card = createToolCard(tool, index); + let filteredTools = yamlData.tools; + + // Apply filters + const typeFilter = document.getElementById('typeFilter')?.value; + const skillFilter = document.getElementById('skillFilter')?.value; + + if (typeFilter) { + filteredTools = filteredTools.filter(tool => (tool.type || 'software') === typeFilter); + } + + if (skillFilter) { + filteredTools = filteredTools.filter(tool => tool.skillLevel === skillFilter); + } + + filteredTools.forEach((tool, index) => { + const originalIndex = yamlData.tools.indexOf(tool); + const card = createToolCard(tool, originalIndex); container.appendChild(card); }); } - function renderBulkGrid() { - const container = document.getElementById('bulkToolsGrid'); - container.innerHTML = ''; - - if (!yamlData || !yamlData.tools) return; - - yamlData.tools.forEach((tool, index) => { - const card = createBulkToolCard(tool, index); - container.appendChild(card); - }); - - updateSelectionCount(); - } - function createToolCard(tool, index) { const card = document.createElement('div'); card.className = `tool-card ${tool.type || 'software'}`; @@ -1135,304 +1202,92 @@ return `🔧 ${categoryName}`; }).join(''); + // Add related concepts indicators + const relatedConceptTags = (tool.related_concepts || []).map(concept => { + return `🧠 ${concept}`; + }).join(''); + card.innerHTML = `

- ${tool.icon ? `${tool.icon}` : ''} - ${tool.name} + ${tool.icon ? tool.icon + ' ' : ''}${tool.name} ${typeIndicator}

-
-
${tool.skillLevel || 'intermediate'}
+

${tool.description}

+
+ ${tool.skillLevel || 'intermediate'} +
+
+ ${tags} + ${domainAgnosticTags} + ${relatedConceptTags} ${knowledgebaseIndicator}
-

${tool.description}

-
${tags}${domainAgnosticTags}
-
- - +
+ +
`; return card; } + function getDomainAgnosticName(id) { + const category = yamlData['domain-agnostic-software'].find(cat => cat.id === id); + return category ? category.name : id; + } + + function applyFilters() { + renderToolsGrid(); + } + + function clearFilters() { + document.getElementById('typeFilter').value = ''; + document.getElementById('skillFilter').value = ''; + renderToolsGrid(); + } + + // Bulk operations + function renderBulkGrid() { + const container = document.getElementById('bulkToolsGrid'); + container.innerHTML = ''; + + if (!yamlData || !yamlData.tools) return; + + yamlData.tools.forEach((tool, index) => { + const card = createBulkToolCard(tool, index); + container.appendChild(card); + }); + + updateSelectionCount(); + } + function createBulkToolCard(tool, index) { const card = document.createElement('div'); card.className = `tool-card ${tool.type || 'software'}`; - const skillClass = `skill-${tool.skillLevel || 'intermediate'}`; const isSelected = selectedTools.has(index); - const knowledgebaseIndicator = tool.knowledgebase ? '📚 KB' : ''; - const typeIndicator = `${tool.type || 'software'}`; + card.style.opacity = isSelected ? '1' : '0.7'; + card.style.border = isSelected ? '2px solid #3498db' : '1px solid #e9ecef'; + + const typeIndicator = `${tool.type || 'software'}`; card.innerHTML = `
- -

- ${tool.icon ? `${tool.icon}` : ''} - ${tool.name} + +

+ ${tool.icon ? tool.icon + ' ' : ''}${tool.name} + ${typeIndicator}

- ${typeIndicator} - ${knowledgebaseIndicator}
-
${tool.skillLevel || 'intermediate'}

${tool.description}

+
+ ${tool.skillLevel || 'intermediate'} +
`; - if (isSelected) { - card.style.border = '2px solid #3498db'; - card.style.backgroundColor = '#f8f9ff'; - } - return card; } - function getDomainAgnosticName(id) { - if (!yamlData['domain-agnostic-software']) return id; - const category = yamlData['domain-agnostic-software'].find(cat => cat.id === id); - return category ? category.name : id; - } - - function filterTools() { - const searchTerm = document.getElementById('searchBar').value.toLowerCase(); - const cards = document.querySelectorAll('#toolsGrid .tool-card'); - - if (!yamlData || !yamlData.tools) return; - - cards.forEach((card, index) => { - const tool = yamlData.tools[index]; - - const searchableText = [ - tool.name || '', - tool.description || '', - tool.type || '', - ...(tool.tags || []), - ...(tool.domains || []), - ...(tool.phases || []), - ...(tool.platforms || []), - ...(tool['domain-agnostic-software'] || []), - tool.skillLevel || '', - tool.license || '', - tool.accessType || '', - tool.knowledgebase ? 'knowledgebase' : '' - ].join(' ').toLowerCase(); - - if (searchableText.includes(searchTerm)) { - card.style.display = ''; - } else { - card.style.display = 'none'; - } - }); - } - - function editTool(index) { - currentEditingIndex = index; - const tool = yamlData.tools[index]; - - showTab('editor'); - document.querySelector('[onclick="showTab(\'editor\')"]').classList.add('active'); - - document.getElementById('editorTitle').textContent = `Edit Tool: ${tool.name}`; - document.getElementById('deleteBtn').style.display = 'inline-block'; - - // Populate form fields - document.getElementById('toolName').value = tool.name || ''; - document.getElementById('toolType').value = tool.type || 'software'; - document.getElementById('toolIcon').value = tool.icon || ''; - document.getElementById('description').value = tool.description || ''; - document.getElementById('skillLevel').value = tool.skillLevel || ''; - document.getElementById('url').value = tool.url || ''; - document.getElementById('projectUrl').value = tool.projectUrl || ''; - document.getElementById('license').value = tool.license || ''; - document.getElementById('accessType').value = tool.accessType || ''; - document.getElementById('statusUrl').value = tool.statusUrl || ''; - document.getElementById('knowledgebase').checked = tool.knowledgebase || false; - - // Handle conditional fields - handleTypeChange(); - - // Set checkboxes - setCheckboxValues('#platformsCheckbox input', tool.platforms || []); - setCheckboxValues('#domainsCheckbox input', tool.domains || []); - setCheckboxValues('#phasesCheckbox input', tool.phases || []); - setCheckboxValues('#domainAgnosticCheckbox input', tool['domain-agnostic-software'] || []); - - populateTags(tool.tags || []); - } - - function setCheckboxValues(selector, values) { - document.querySelectorAll(selector).forEach(checkbox => { - checkbox.checked = values.includes(checkbox.value); - }); - } - - function populateTags(tags) { - const container = document.getElementById('tagContainer'); - container.querySelectorAll('.removable-tag').forEach(tag => tag.remove()); - - tags.forEach(tag => { - addTag(tag); - }); - } - - function addTagOnEnter(event) { - if (event.key === 'Enter') { - event.preventDefault(); - const input = event.target; - const tag = input.value.trim(); - if (tag) { - addTag(tag); - input.value = ''; - } - } - } - - function addTag(tagText) { - const container = document.getElementById('tagContainer'); - const input = container.querySelector('.tag-input'); - - const tagElement = document.createElement('span'); - tagElement.className = 'removable-tag'; - tagElement.innerHTML = ` - ${tagText} - × - `; - - container.insertBefore(tagElement, input); - } - - function removeTag(element) { - element.parentElement.remove(); - } - - function saveTool() { - try { - if (!yamlData) { - yamlData = { tools: [], domains: [], phases: [], 'domain-agnostic-software': [] }; - } - if (!yamlData.tools) { - yamlData.tools = []; - } - - const toolType = document.getElementById('toolType').value; - const tool = { - name: document.getElementById('toolName').value, - type: toolType, - description: document.getElementById('description').value, - domains: getCheckedValues('#domainsCheckbox input:checked'), - phases: getCheckedValues('#phasesCheckbox input:checked'), - skillLevel: document.getElementById('skillLevel').value, - url: document.getElementById('url').value, - tags: getTags() - }; - - // Add icon if provided - const icon = document.getElementById('toolIcon').value.trim(); - if (icon) { - tool.icon = icon; - } - - // Add software-specific fields - if (toolType === 'software') { - tool.platforms = getCheckedValues('#platformsCheckbox input:checked'); - tool.accessType = document.getElementById('accessType').value; - tool.projectUrl = document.getElementById('projectUrl').value; - tool.license = document.getElementById('license').value; - tool.knowledgebase = document.getElementById('knowledgebase').checked; - - const statusUrl = document.getElementById('statusUrl').value; - if (statusUrl) { - tool.statusUrl = statusUrl; - } - } else { - // For methods, set appropriate defaults - tool.platforms = []; - tool.accessType = null; - tool.projectUrl = null; - tool.license = null; - tool.knowledgebase = false; - } - - // Add domain-agnostic software if selected - const domainAgnostic = getCheckedValues('#domainAgnosticCheckbox input:checked'); - if (domainAgnostic.length > 0) { - tool['domain-agnostic-software'] = domainAgnostic; - } else { - tool['domain-agnostic-software'] = null; - } - - // Clean up empty arrays and null values - Object.keys(tool).forEach(key => { - if (Array.isArray(tool[key]) && tool[key].length === 0) { - if (key === 'platforms' && toolType === 'method') { - tool[key] = []; // Keep empty array for methods - } else { - delete tool[key]; - } - } else if (tool[key] === '' || tool[key] === null) { - if ((key === 'accessType' || key === 'projectUrl' || key === 'license') && toolType === 'method') { - tool[key] = null; // Keep null for methods - } else { - delete tool[key]; - } - } - }); - - if (currentEditingIndex >= 0) { - yamlData.tools[currentEditingIndex] = tool; - showMessage('Tool updated successfully!'); - } else { - yamlData.tools.push(tool); - showMessage('Tool added successfully!'); - } - - clearForm(); - updateStats(); - renderToolsGrid(); - } catch (error) { - showMessage('Error saving tool: ' + error.message, 'error'); - } - } - - function getCheckedValues(selector) { - return Array.from(document.querySelectorAll(selector)).map(checkbox => checkbox.value); - } - - function getTags() { - const tags = []; - document.querySelectorAll('#tagContainer .removable-tag').forEach(tagElement => { - const text = tagElement.textContent.replace('×', '').trim(); - if (text) tags.push(text); - }); - return tags; - } - - function clearForm() { - document.getElementById('toolForm').reset(); - document.getElementById('tagContainer').querySelectorAll('.removable-tag').forEach(tag => tag.remove()); - document.getElementById('editorTitle').textContent = 'Add New Tool'; - document.getElementById('deleteBtn').style.display = 'none'; - document.getElementById('softwareFields').classList.remove('disabled'); - currentEditingIndex = -1; - } - - function confirmDelete(index) { - if (confirm(`Are you sure you want to delete "${yamlData.tools[index].name}"?`)) { - deleteTool(index); - } - } - - function deleteTool(index = currentEditingIndex) { - if (index >= 0 && yamlData && yamlData.tools) { - yamlData.tools.splice(index, 1); - clearForm(); - updateStats(); - renderToolsGrid(); - showMessage('Tool deleted successfully!'); - } - } - - // Bulk operations function toggleToolSelection(index) { if (selectedTools.has(index)) { selectedTools.delete(index); @@ -1444,23 +1299,10 @@ } function selectAllTools() { - if (yamlData && yamlData.tools) { - yamlData.tools.forEach((_, index) => selectedTools.add(index)); - updateSelectionCount(); - renderBulkGrid(); - } - } - - function selectByType(type) { - if (yamlData && yamlData.tools) { - yamlData.tools.forEach((tool, index) => { - if (tool.type === type) { - selectedTools.add(index); - } - }); - updateSelectionCount(); - renderBulkGrid(); - } + selectedTools.clear(); + yamlData.tools.forEach((_, index) => selectedTools.add(index)); + updateSelectionCount(); + renderBulkGrid(); } function clearSelection() { @@ -1470,107 +1312,21 @@ } function updateSelectionCount() { - document.getElementById('selectionCount').textContent = `${selectedTools.size} selected`; + const count = selectedTools.size; + document.getElementById('selectionInfo').textContent = + count === 0 ? 'No tools selected' : `${count} tool(s) selected`; } - function showIconSuggestions() { - const suggestions = `DFIR Tool Icons by Operational Mode: - -📦 Downloaded/Installed 🌐 Web Application ☁️ Cloud Service -🖥️ Operating System ⌨️ Command Line 📡 Server/Self-hosted -🔧 Hardware Tool 💰 Commercial ⚙️ Built-in/System -📱 Mobile Application 🔗 API/Library 📋 Method/Procedure - -🖲️ Remote Access 💻 Desktop GUI 🛠️ Utility/Helper -🏢 Enterprise Platform 🔓 Open Source 🎯 Specialized Tool -📊 Analysis Platform 🗄️ Database/Storage 🔄 Processing Engine - -Most common combinations: -📦 + 🔓 = Open Source Desktop Software -🌐 + ☁️ = Cloud Web Application -🖥️ + 🔓 = Forensic Live OS -⌨️ + 🔧 = Command Line Utility -📋 + 🎯 = Specialized Method - -Click any emoji to copy it, then paste into the icon field.`; - - alert(suggestions); - } - - function bulkUpdateIcons() { + function bulkSetType() { if (selectedTools.size === 0) { showMessage('No tools selected', 'error'); return; } - // Show operational mode-focused icon suggestions - const suggestedIcons = ` -DFIR Tool Icons by Operational Mode: - -📦 Downloaded/Installed 🌐 Web Application ☁️ Cloud Service -🖥️ Operating System ⌨️ Command Line 📡 Server/Self-hosted -🔧 Hardware Tool 💰 Commercial ⚙️ Built-in/System -📱 Mobile Application 🔗 API/Library 📋 Method/Procedure - -🖲️ Remote Access 💻 Desktop GUI 🛠️ Utility/Helper -🏢 Enterprise Platform 🔓 Open Source 🎯 Specialized Tool -📊 Analysis Platform 🗄️ Database/Storage 🔄 Processing Engine - -Quick suggestions by access type: -• Downloaded Software: 📦 -• Web Applications: 🌐 -• Cloud Services: ☁️ -• Operating Systems: 🖥️ -• Command Line: ⌨️ -• Hardware: 🔧 -• Methods/Procedures: 📋`; - - const icon = prompt(`Enter emoji icon (single character) or leave empty to remove:\n\n${suggestedIcons}`); - - if (icon !== null) { // Allow empty string to remove icons - const trimmedIcon = icon.trim(); - if (trimmedIcon.length > 2) { - showMessage('Icon should be a single emoji character', 'error'); - return; - } - + const newType = prompt('Enter new type (software/method/concept):'); + if (newType && ['software', 'method', 'concept'].includes(newType)) { selectedTools.forEach(index => { - if (trimmedIcon === '') { - delete yamlData.tools[index].icon; // Remove icon field entirely - } else { - yamlData.tools[index].icon = trimmedIcon; - } - }); - - const action = trimmedIcon === '' ? 'removed icons from' : 'updated icons for'; - showMessage(`Successfully ${action} ${selectedTools.size} tools`); - renderBulkGrid(); - renderToolsGrid(); // Update tools view if visible - } - } - - function bulkUpdateType() { - if (selectedTools.size === 0) { - showMessage('No tools selected', 'error'); - return; - } - - const type = prompt('Enter type (software/method):'); - if (type && ['software', 'method'].includes(type)) { - selectedTools.forEach(index => { - yamlData.tools[index].type = type; - - // Handle method-specific cleanup - if (type === 'method') { - yamlData.tools[index].platforms = []; - yamlData.tools[index].accessType = null; - yamlData.tools[index].projectUrl = null; - yamlData.tools[index].license = null; - yamlData.tools[index].knowledgebase = false; - if (yamlData.tools[index].statusUrl) { - delete yamlData.tools[index].statusUrl; - } - } + yamlData.tools[index].type = newType; }); showMessage(`Updated type for ${selectedTools.size} tools`); updateStats(); @@ -1578,52 +1334,19 @@ Quick suggestions by access type: } } - function bulkUpdateSkillLevel() { + function bulkUpdateTags() { if (selectedTools.size === 0) { showMessage('No tools selected', 'error'); return; } - const skillLevel = prompt('Enter skill level (novice/beginner/intermediate/advanced/expert):'); - if (skillLevel && ['novice','beginner', 'intermediate', 'advanced', 'expert'].includes(skillLevel)) { + const tags = prompt('Enter tags (comma-separated):'); + if (tags) { + const tagList = tags.split(',').map(t => t.trim()).filter(t => t); selectedTools.forEach(index => { - yamlData.tools[index].skillLevel = skillLevel; + yamlData.tools[index].tags = tagList; }); - showMessage(`Updated skill level for ${selectedTools.size} tools`); - renderBulkGrid(); - } - } - - function bulkUpdateDomains() { - if (selectedTools.size === 0) { - showMessage('No tools selected', 'error'); - return; - } - - const domains = prompt('Enter domains (comma-separated):'); - if (domains) { - const domainList = domains.split(',').map(d => d.trim()).filter(d => d); - selectedTools.forEach(index => { - yamlData.tools[index].domains = domainList; - }); - showMessage(`Updated domains for ${selectedTools.size} tools`); - renderBulkGrid(); - } - } - - function bulkUpdatePhases() { - if (selectedTools.size === 0) { - showMessage('No tools selected', 'error'); - return; - } - - const phases = prompt('Enter phases (comma-separated):'); - if (phases) { - const phaseList = phases.split(',').map(p => p.trim()).filter(p => p); - selectedTools.forEach(index => { - yamlData.tools[index].phases = phaseList; - }); - showMessage(`Updated phases for ${selectedTools.size} tools`); + showMessage(`Updated tags for ${selectedTools.size} tools`); renderBulkGrid(); } } @@ -1645,122 +1368,190 @@ Quick suggestions by access type: } } - function bulkUpdateTags() { - if (selectedTools.size === 0) { - showMessage('No tools selected', 'error'); - return; - } - - const tags = prompt('Enter tags (comma-separated):'); - if (tags) { - const tagList = tags.split(',').map(t => t.trim()).filter(t => t); - selectedTools.forEach(index => { - yamlData.tools[index].tags = tagList; - }); - showMessage(`Updated tags for ${selectedTools.size} tools`); - updateStats(); - renderBulkGrid(); - } - } - - function bulkSetKnowledgebase(value) { - if (selectedTools.size === 0) { - showMessage('No tools selected', 'error'); - return; - } - - // Only apply to software tools - const softwareTools = Array.from(selectedTools).filter(index => - yamlData.tools[index].type === 'software' - ); - - if (softwareTools.length === 0) { - showMessage('No software tools selected (knowledgebase only applies to software)', 'error'); - return; - } - - const action = value ? 'set as knowledgebase' : 'remove knowledgebase flag from'; - if (!confirm(`Are you sure you want to ${action} ${softwareTools.length} selected software tools?`)) { - return; - } - - softwareTools.forEach(index => { - if (yamlData.tools[index]) { - yamlData.tools[index].knowledgebase = value; - } - }); - - const actionCompleted = value ? 'marked as knowledgebase' : 'removed knowledgebase flag from'; - showMessage(`Successfully ${actionCompleted} ${softwareTools.length} software tools`); - - updateStats(); - renderBulkGrid(); - } - - function bulkClearField(fieldName) { - if (selectedTools.size === 0) { - showMessage('No tools selected', 'error'); - return; - } - - const fieldDisplayName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1).replace('-', ' '); - if (!confirm(`Are you sure you want to clear ${fieldDisplayName} for ${selectedTools.size} selected tools?`)) { - return; - } - - selectedTools.forEach(index => { - if (yamlData.tools[index]) { - const tool = yamlData.tools[index]; - const arrayFields = ['tags', 'domains', 'phases', 'platforms', 'domain-agnostic-software']; - - if (arrayFields.includes(fieldName)) { - if (fieldName === 'platforms' && tool.type === 'method') { - tool[fieldName] = []; // Keep empty array for methods - } else { - tool[fieldName] = []; - } - } else if (fieldName === 'icon') { - delete tool.icon; // Remove icon field entirely - } else { - if ((fieldName === 'projectUrl' || fieldName === 'accessType' || fieldName === 'license') && tool.type === 'method') { - tool[fieldName] = null; // Keep null for methods - } else { - tool[fieldName] = ''; - } - } - } - }); - - showMessage(`Cleared ${fieldDisplayName} for ${selectedTools.size} tools`); - - if (fieldName === 'tags') { - updateStats(); - } - - renderBulkGrid(); - if (fieldName === 'icon') { - renderToolsGrid(); // Update tools view to reflect icon changes - } - } - function bulkDelete() { if (selectedTools.size === 0) { showMessage('No tools selected', 'error'); return; } - if (confirm(`Are you sure you want to delete ${selectedTools.size} tools?`)) { - const indices = Array.from(selectedTools).sort((a, b) => b - a); - indices.forEach(index => { + if (confirm(`Are you sure you want to delete ${selectedTools.size} selected tools?`)) { + const indicesToDelete = Array.from(selectedTools).sort((a, b) => b - a); + indicesToDelete.forEach(index => { yamlData.tools.splice(index, 1); }); selectedTools.clear(); + showMessage(`Deleted ${indicesToDelete.length} tools successfully!`); updateStats(); renderBulkGrid(); - showMessage('Tools deleted successfully!'); + updateKnowledgeToolSelect(); } } + // Knowledge Generator + function updateKnowledgeToolSelect() { + const select = document.getElementById('knowledgeToolSelect'); + select.innerHTML = ''; + + if (!yamlData || !yamlData.tools) return; + + yamlData.tools + .filter(tool => tool.knowledgebase || tool.type === 'concept') + .forEach((tool, index) => { + const originalIndex = yamlData.tools.indexOf(tool); + const option = document.createElement('option'); + option.value = originalIndex; + option.textContent = `${tool.icon ? tool.icon + ' ' : ''}${tool.name} (${tool.type || 'software'})`; + select.appendChild(option); + }); + } + + function generateKnowledgeTemplate() { + const select = document.getElementById('knowledgeToolSelect'); + const index = parseInt(select.value); + + if (isNaN(index)) { + document.getElementById('knowledgePreview').classList.add('hidden'); + return; + } + + const tool = yamlData.tools[index]; + const template = createMarkdownTemplate(tool); + + document.getElementById('markdownContent').textContent = template; + document.getElementById('knowledgePreview').classList.remove('hidden'); + } + + function createMarkdownTemplate(tool) { + const isConceptType = tool.type === 'concept'; + const title = isConceptType ? 'Concept' : 'Tool'; + + return `# ${tool.icon ? tool.icon + ' ' : ''}${tool.name} + +## Overview + +${tool.description} + +**Type**: ${tool.type || 'software'} +**Skill Level**: ${tool.skillLevel || 'intermediate'} +**Official URL**: [${tool.name}](${tool.url}) + +${tool.license ? `**License**: ${tool.license}` : ''} +${tool.platforms && tool.platforms.length > 0 ? `**Platforms**: ${tool.platforms.join(', ')}` : ''} + +## ${isConceptType ? 'Key Concepts' : 'Key Features'} + +- Feature/concept 1 +- Feature/concept 2 +- Feature/concept 3 + +## ${isConceptType ? 'Applications' : 'Installation & Setup'} + +${isConceptType ? +`This concept applies to: +- Use case 1 +- Use case 2 +- Use case 3` : +`### Prerequisites +- Requirement 1 +- Requirement 2 + +### Installation Steps +1. Step 1 +2. Step 2 +3. Step 3`} + +## ${isConceptType ? 'Related Tools' : 'Basic Usage'} + +${isConceptType ? +`Tools that implement or relate to this concept: +${tool.related_concepts ? tool.related_concepts.map(c => `- ${c}`).join('\n') : '- Related tool 1\n- Related tool 2'}` : +`### Common Commands/Operations +\`\`\`bash +# Example command 1 +command --option value + +# Example command 2 +command2 --help +\`\`\` + +### Workflow Examples +1. Basic workflow step +2. Advanced workflow step`} + +## Advanced Topics + +${isConceptType ? +`### Implementation Variations +- Variation 1 +- Variation 2 + +### Best Practices +- Practice 1 +- Practice 2` : +`### Advanced Configuration +- Advanced setting 1 +- Advanced setting 2 + +### Integration with Other Tools +- Integration 1 +- Integration 2`} + +## Troubleshooting + +### Common Issues + +**Issue 1**: Description +- Solution: Solution description + +**Issue 2**: Description +- Solution: Solution description + +## Resources + +- [Official Documentation](${tool.url}) +${tool.projectUrl ? `- [Project Repository](${tool.projectUrl})` : ''} +- Additional resource 1 +- Additional resource 2 + +## Tags + +${tool.tags ? tool.tags.map(tag => `\`${tag}\``).join(' ') : '`tag1` `tag2` `tag3`'} + +${tool.domains && tool.domains.length > 0 ? `## Forensics Domains + +${tool.domains.map(domain => `- ${domain}`).join('\n')}` : ''} + +${tool.phases && tool.phases.length > 0 ? `## Investigation Phases + +${tool.phases.map(phase => `- ${phase}`).join('\n')}` : ''} + +--- + +*Last updated: ${new Date().toISOString().split('T')[0]}* +`; + } + + function downloadMarkdown() { + const content = document.getElementById('markdownContent').textContent; + const select = document.getElementById('knowledgeToolSelect'); + const index = parseInt(select.value); + const tool = yamlData.tools[index]; + + const blob = new Blob([content], { type: 'text/markdown' }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = `${tool.name.toLowerCase().replace(/[^a-z0-9]/g, '-')}.md`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + + showMessage('Markdown template downloaded successfully!'); + } + + // Validation and Export function validateYAML() { if (!yamlData) { showMessage('No data to validate', 'error'); @@ -1781,32 +1572,44 @@ Quick suggestions by access type: if (!tool.description) validationResults.push(`❌ Tool ${index + 1}: Missing description`); if (!tool.skillLevel) validationResults.push(`❌ Tool ${index + 1}: Missing skillLevel`); if (!tool.type) validationResults.push(`❌ Tool ${index + 1}: Missing type`); - if (tool.type && !['software', 'method'].includes(tool.type)) { - validationResults.push(`❌ Tool ${index + 1}: Invalid type (must be 'software' or 'method')`); + if (tool.type && !['software', 'method', 'concept'].includes(tool.type)) { + validationResults.push(`❌ Tool ${index + 1}: Invalid type (must be 'software', 'method', or 'concept')`); } - // Software-specific validation + // Type-specific validation if (tool.type === 'software') { if (!tool.platforms || tool.platforms.length === 0) { - validationResults.push(`❌ Tool ${index + 1}: Software must have platforms`); + validationResults.push(`⚠️ Tool ${index + 1}: Software should have platforms`); } - if (!tool.license) validationResults.push(`❌ Tool ${index + 1}: Software should have license`); + if (!tool.license) validationResults.push(`⚠️ Tool ${index + 1}: Software should have license`); } - // Method-specific validation - if (tool.type === 'method') { + if (tool.type === 'concept') { if (tool.platforms && tool.platforms.length > 0) { - validationResults.push(`⚠️ Tool ${index + 1}: Methods should not have platforms`); + validationResults.push(`⚠️ Tool ${index + 1}: Concepts should not have platforms`); } + if (tool.license) { + validationResults.push(`⚠️ Tool ${index + 1}: Concepts should not have license`); + } + } + + // Validate related_concepts references + if (tool.related_concepts) { + const conceptNames = yamlData.tools.filter(t => t.type === 'concept').map(t => t.name); + tool.related_concepts.forEach(conceptName => { + if (!conceptNames.includes(conceptName)) { + validationResults.push(`⚠️ Tool ${index + 1}: References unknown concept '${conceptName}'`); + } + }); } }); } const container = document.getElementById('validationContent'); if (validationResults.length === 0) { - container.innerHTML = '
✅ YAML structure is valid!
'; + container.innerHTML = '
✅ YAML structure is valid!
'; } else { - container.innerHTML = '
' + validationResults.join('
') + '
'; + container.innerHTML = '
' + validationResults.join('
') + '
'; } document.getElementById('validationResults').classList.remove('hidden'); @@ -1843,6 +1646,9 @@ Quick suggestions by access type: showMessage('YAML file exported successfully!'); } + + // Initialize the application + init(); \ No newline at end of file diff --git a/package.json b/package.json index 107b52e..45468ef 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/node": "^9.3.0", - "astro": "^5.3.0", + "astro": "^5.12.0", "cookie": "^0.6.0", "dotenv": "^16.4.5", "jose": "^5.2.0", diff --git a/src/components/AIQueryInterface.astro b/src/components/AIQueryInterface.astro index fdab0f2..34600f6 100644 --- a/src/components/AIQueryInterface.astro +++ b/src/components/AIQueryInterface.astro @@ -383,7 +383,45 @@ document.addEventListener('DOMContentLoaded', () => { return `

${text}

`; } - // Display results for workflow mode (existing functionality) + // NEW: Function to render background knowledge concepts + function renderBackgroundKnowledge(backgroundKnowledge) { + if (!backgroundKnowledge || backgroundKnowledge.length === 0) { + return ''; + } + + const conceptLinks = backgroundKnowledge.map(concept => ` +
+
+ + Hintergrundwissen +
+

+ ${concept.relevance} +

+
+ `).join(''); + + return ` +
+

+ + + + + Empfohlenes Hintergrundwissen +

+ ${conceptLinks} +
+ `; + } + + // Display results for workflow mode (ENHANCED with concepts) function displayWorkflowResults(recommendation, originalQuery) { // Group tools by phase const toolsByPhase = {}; @@ -434,6 +472,8 @@ document.addEventListener('DOMContentLoaded', () => {
` : ''} + ${renderBackgroundKnowledge(recommendation.background_knowledge)} + ${phaseOrder.map((phase, index) => { const phaseTools = toolsByPhase[phase]; if (phaseTools.length === 0) return ''; @@ -540,7 +580,7 @@ document.addEventListener('DOMContentLoaded', () => { aiResults.appendChild(tempDiv); } - // Display results for tool-specific mode (new functionality) + // Display results for tool-specific mode (ENHANCED with concepts) function displayToolResults(recommendation, originalQuery) { function getSuitabilityText(score) { const suitabilityTexts = { @@ -597,6 +637,8 @@ document.addEventListener('DOMContentLoaded', () => {
` : ''} + ${renderBackgroundKnowledge(recommendation.background_knowledge)} +
${recommendation.recommended_tools?.map((toolRec, index) => { const fullTool = tools.find(t => t.name === toolRec.name); diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..ed15432 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,29 @@ +import { defineCollection, z } from 'astro:content'; + +const knowledgebaseCollection = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + tool_name: z.string(), + description: z.string(), + last_updated: z.date(), + author: z.string().default('CC24-Team'), + difficulty: z.enum(['novice', 'beginner', 'intermediate', 'advanced', 'expert']), + categories: z.array(z.string()).default([]), + tags: z.array(z.string()).default([]), + sections: z.object({ + overview: z.boolean().default(true), + installation: z.boolean().default(false), + configuration: z.boolean().default(false), + usage_examples: z.boolean().default(true), + best_practices: z.boolean().default(true), + troubleshooting: z.boolean().default(false), + advanced_topics: z.boolean().default(false), + }).default({}), + review_status: z.enum(['draft', 'review', 'published']).default('published'), + }) +}); + +export const collections = { + knowledgebase: knowledgebaseCollection, +}; \ No newline at end of file diff --git a/src/content/knowledgebase/kali-linux.md b/src/content/knowledgebase/kali-linux.md new file mode 100644 index 0000000..2d427b7 --- /dev/null +++ b/src/content/knowledgebase/kali-linux.md @@ -0,0 +1,141 @@ +--- +title: "Kali Linux - Die Hacker-Distribution für Forensik & Penetration Testing" +tool_name: "Kali Linux" +description: "Leitfaden zur Installation, Nutzung und Best Practices für Kali Linux – die All-in-One-Plattform für Security-Profis." +last_updated: 2025-07-20 +author: "CC24-Team" +difficulty: "intermediate" +categories: ["incident-response", "forensics", "penetration-testing"] +tags: ["live-boot", "tool-collection", "penetration-testing", "forensics-suite", "virtualization", "arm-support"] +sections: + overview: true + installation: true + configuration: true + usage_examples: true + best_practices: true + troubleshooting: true + advanced_topics: true +review_status: "published" +--- + +> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community! + + +# Übersicht + +Kali Linux ist eine auf Debian basierende Linux-Distribution, die speziell für Penetration Testing, digitale Forensik, Reverse Engineering und Incident Response entwickelt wurde. Mit über 600 vorinstallierten Tools ist sie ein unverzichtbares Werkzeug für Security-Experten, Ermittler und forensische Analysten. Die Live-Boot-Funktion erlaubt es, Systeme ohne Spuren zu hinterlassen zu analysieren – ideal für forensische Untersuchungen. + +## Installation + +### Option 1: Live-System (USB/DVD) + +1. ISO-Image von [kali.org](https://www.kali.org/get-kali/) herunterladen. +2. Mit **Rufus** oder **balenaEtcher** auf einen USB-Stick schreiben. +3. Vom USB-Stick booten (ggf. Boot-Reihenfolge im BIOS anpassen). +4. Kali kann direkt ohne Installation im Live-Modus verwendet werden. + +### Option 2: Installation auf Festplatte + +1. ISO-Image booten und **Graphical Install** wählen. +2. Schritt-für-Schritt durch den Installationsassistenten navigieren: + - Sprache, Zeitzone und Tastaturlayout auswählen + - Partitionierung konfigurieren (automatisch oder manuell) + - Benutzerkonten erstellen +3. Nach Installation Neustart durchführen. + +### Option 3: Virtuelle Maschine (VM) + +- Offizielle VM-Images für VirtualBox und VMware von der [Kali-Website](https://www.kali.org/get-kali/#kali-virtual-machines) +- Importieren, ggf. Netzwerkbrücke und Shared Folders aktivieren + +## Konfiguration + +### Netzwerkeinstellungen + +- Konfiguration über `nmtui` oder `/etc/network/interfaces` +- VPN und Proxy-Integration über GUI oder Terminal + +### Updates & Paketquellen + +```bash +sudo apt update && sudo apt full-upgrade +```` + +> Hinweis: `kali-rolling` ist die Standard-Distribution für kontinuierliche Updates. + +### Sprache & Lokalisierung + +```bash +sudo dpkg-reconfigure locales +sudo dpkg-reconfigure keyboard-configuration +``` + +## Verwendungsbeispiele + +### 1. Netzwerkscan mit Nmap + +```bash +nmap -sS -T4 -A 192.168.1.0/24 +``` + +### 2. Passwort-Cracking mit John the Ripper + +```bash +john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt +``` + +### 3. Forensik mit Autopsy + +```bash +autopsy & +``` + +### 4. Android-Analyse mit MobSF (in Docker) + +```bash +docker pull opensecurity/mobile-security-framework-mobsf +docker run -it -p 8000:8000 mobsf +``` + +## Best Practices + +* Nutze immer **aktuelle Snapshots** oder VM-Clones vor gefährlichen Tests +* Verwende separate Netzwerke (z. B. Host-only oder NAT) für Tests +* Deaktiviere automatisches WLAN bei forensischen Analysen +* Prüfe und aktualisiere regelmäßig Toolsets (`apt`, `git`, `pip`) +* Halte deine ISO-Images versioniert für forensische Reproduzierbarkeit + +## Troubleshooting + +### Problem: Keine Internetverbindung nach Installation + +**Lösung:** Netzwerkadapter prüfen, ggf. mit `ifconfig` oder `ip a` überprüfen, DHCP aktivieren. + +### Problem: Tools fehlen nach Update + +**Lösung:** Tool-Gruppen wie `kali-linux-default` manuell nachinstallieren: + +```bash +sudo apt install kali-linux-default +``` + +### Problem: „Permission Denied“ bei Tools + +**Lösung:** Root-Rechte nutzen oder mit `sudo` ausführen. + +## Weiterführende Themen + +* **Kustomisierung von Kali ISOs** mit `live-build` +* **NetHunter**: Kali für mobile Geräte (Android) +* **Kali Purple**: Defensive Security Suite +* Integration mit **Cloud-Infrastrukturen** via WSL oder Azure + +--- + +**Links & Ressourcen:** + +* Offizielle Website: [https://kali.org](https://kali.org/) +* Dokumentation: [https://docs.kali.org/](https://docs.kali.org/) +* GitLab Repo: [https://gitlab.com/kalilinux](https://gitlab.com/kalilinux) +* Discord-Community: [https://discord.com/invite/kali-linux](https://discord.com/invite/kali-linux) + diff --git a/src/content/knowledgebase/misp.md b/src/content/knowledgebase/misp.md new file mode 100644 index 0000000..058b9ba --- /dev/null +++ b/src/content/knowledgebase/misp.md @@ -0,0 +1,133 @@ +--- +title: "MISP - Plattform für Threat Intelligence Sharing" +tool_name: "MISP" +description: "Das Rückgrat des modernen Threat-Intelligence-Sharings mit über 40.000 aktiven Instanzen weltweit." +last_updated: 2025-07-20 +author: "CC24-Team" +difficulty: "intermediate" +categories: ["incident-response", "law-enforcement", "malware-analysis", "network-forensics", "cloud-forensics"] +tags: ["web-based", "threat-intelligence", "api", "correlation", "ioc-sharing", "automation"] +sections: + overview: true + installation: true + configuration: true + usage_examples: true + best_practices: true + troubleshooting: true + advanced_topics: false +review_status: "published" +--- + +> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community! + + +# Übersicht + +**MISP (Malware Information Sharing Platform & Threat Sharing)** ist eine freie Open-Source-Plattform zur strukturierten Erfassung, Speicherung, Analyse und gemeinsamen Nutzung von Cyber-Bedrohungsdaten. Mit über 40.000 Instanzen weltweit ist MISP der De-facto-Standard für den Austausch von Indicators of Compromise (IoCs) und Threat Intelligence zwischen CERTs, SOCs, Strafverfolgungsbehörden und anderen sicherheitsrelevanten Organisationen. + +Die föderierte Architektur ermöglicht einen kontrollierten, dezentralen Austausch von Informationen über vertrauenswürdige Partner hinweg. Durch Taxonomien, Tags und integrierte APIs ist eine automatische Anreicherung, Korrelation und Verarbeitung von Informationen in SIEMs, Firewalls oder Endpoint-Lösungen möglich. + +## Installation + +### Voraussetzungen + +- **Server-Betriebssystem:** Linux (empfohlen: Debian/Ubuntu) +- **Abhängigkeiten:** MariaDB/MySQL, PHP, Apache/Nginx, Redis +- **Ressourcen:** Mindestens 4 GB RAM, SSD empfohlen + +### Installationsschritte + +```bash +# Beispiel für Debian/Ubuntu: +sudo apt update && sudo apt install -y curl gnupg git python3 python3-pip redis-server mariadb-server apache2 php libapache2-mod-php + +# MISP klonen +git clone https://github.com/MISP/MISP.git /var/www/MISP + +# Setup-Skript nutzen +cd /var/www/MISP && bash INSTALL/INSTALL.debian.sh +```` + +Weitere Details: [Offizielle Installationsanleitung](https://misp.github.io/MISP/INSTALL.debian/) + +## Konfiguration + +### Webserver + +* HTTPS aktivieren (Let's Encrypt oder Reverse Proxy) +* PHP-Konfiguration anpassen (`upload_max_filesize`, `memory_limit`, `post_max_size`) + +### Benutzerrollen + +* Administrator, Org-Admin, Analyst etc. +* Zugriffsbeschränkungen nach Organisation/Feed definierbar + +### Feeds und Galaxies + +* Aktivierung von Feeds (z. B. CIRCL, Abuse.ch, OpenCTI) +* Nutzung von Galaxies zur Klassifizierung (APT-Gruppen, Malware-Familien) + +## Verwendungsbeispiele + +### Beispiel 1: Import von IoCs aus externem Feed + +1. Feed aktivieren unter **Administration → List Feeds** +2. Feed synchronisieren +3. Ereignisse durchsuchen, analysieren, ggf. mit eigenen Daten korrelieren + +### Beispiel 2: Automatisierte Anbindung an SIEM + +* REST-API-Token erstellen +* API-Calls zur Abfrage neuer Events (z. B. mit Python, Logstash oder MISP Workbench) +* Integration in Security-Systeme über JSON/STIX export + +## Best Practices + +* Regelmäßige Backups der Datenbank +* Taxonomien konsistent verwenden +* Nutzung der Sighting-Funktion zur Validierung von IoCs +* Vertrauensstufen (TLP, PAP) korrekt setzen +* Nicht nur konsumieren – auch teilen! + +## Troubleshooting + +### Problem: MISP-Feeds laden nicht + +**Lösung:** + +* Internetverbindung prüfen +* Cronjobs aktiv? +* Logs prüfen: `/var/www/MISP/app/tmp/logs/error.log` + +### Problem: API gibt 403 zurück + +**Lösung:** + +* Ist der API-Key korrekt und aktiv? +* Rechte des Benutzers überprüfen +* IP-Filter im MISP-Backend beachten + +### Problem: Hohe Datenbanklast + +**Lösung:** + +* Indizes optimieren +* Redis aktivieren +* Alte Events regelmäßig archivieren oder löschen + +## Weiterführende Themen + +* STIX2-Import/Export +* Erweiterungen mit MISP Modules (z. B. für Virustotal, YARA) +* Föderierte Netzwerke und Community-Portale +* Integration mit OpenCTI oder TheHive + +--- + +**Links:** + +* 🌐 [Offizielle Projektseite](https://misp-project.org/) +* 📦 [CC24-MISP-Instanz](https://misp.cc24.dev) +* 📊 [Status-Monitoring](https://status.mikoshi.de/api/badge/34/status) + +Lizenz: **AGPL-3.0** diff --git a/src/content/knowledgebase/nextcloud.md b/src/content/knowledgebase/nextcloud.md new file mode 100644 index 0000000..fe45472 --- /dev/null +++ b/src/content/knowledgebase/nextcloud.md @@ -0,0 +1,124 @@ +--- +title: "Nextcloud - Sichere Kollaborationsplattform" +tool_name: "Nextcloud" +description: "Detaillierte Anleitung und Best Practices für Nextcloud in forensischen Einsatzszenarien" +last_updated: 2025-07-20 +author: "CC24-Team" +difficulty: "novice" +categories: ["collaboration-general"] +tags: ["web-based", "collaboration", "file-sharing", "api", "encryption", "document-management"] +sections: + overview: true + installation: true + configuration: true + usage_examples: true + best_practices: true + troubleshooting: true + advanced_topics: false +review_status: "published" +--- + +> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community! + + +# Übersicht + +Nextcloud ist eine Open-Source-Cloud-Suite, die speziell für die sichere Zusammenarbeit entwickelt wurde. Sie eignet sich ideal für forensische Teams, da sie eine DSGVO-konforme Umgebung mit verschlüsselter Dateiablage, Office-Integration und Videokonferenzen bereitstellt. Zusätzlich bietet Nextcloud einen integrierten SSO-Provider, der das Identitätsmanagement für andere forensische Tools stark vereinfacht. + +Skalierbar von kleinen Raspberry-Pi-Installationen bis hin zu hochverfügbaren Multi-Node-Setups. + +- **Website:** [nextcloud.com](https://nextcloud.com/) +- **Demo/Projektinstanz:** [cloud.cc24.dev](https://cloud.cc24.dev) +- **Statusseite:** [Mikoshi Status](https://status.mikoshi.de/api/badge/11/status) +- **Lizenz:** AGPL-3.0 + +--- + +## Installation + +### Voraussetzungen + +- Linux-Server oder Raspberry Pi +- PHP 8.1 oder höher +- MariaDB/PostgreSQL +- Webserver (Apache/Nginx) +- SSL-Zertifikat (empfohlen: Let's Encrypt) + +### Installationsschritte (Ubuntu Beispiel) + +```bash +sudo apt update && sudo apt upgrade +sudo apt install apache2 mariadb-server libapache2-mod-php php php-mysql \ + php-gd php-xml php-mbstring php-curl php-zip php-intl php-bcmath unzip + +wget https://download.nextcloud.com/server/releases/latest.zip +unzip latest.zip -d /var/www/ +chown -R www-data:www-data /var/www/nextcloud +```` + +Danach den Web-Installer im Browser aufrufen (`https:///nextcloud`) und Setup abschließen. + +## Konfiguration + +* **Trusted Domains** in `config.php` definieren +* SSO mit OpenID Connect aktivieren +* Dateiverschlüsselung aktivieren (`Settings → Security`) +* Benutzer und Gruppen über LDAP oder SAML integrieren + +## Verwendungsbeispiele + +### Gemeinsame Fallbearbeitung + +1. Ermittlungsordner als geteiltes Gruppenverzeichnis anlegen +2. Versionierung und Kommentare zu forensischen Berichten aktivieren +3. Vorschau für Office-Dateien, PDFs und Bilder direkt im Browser nutzen + +### Videokonferenzen mit "Nextcloud Talk" + +* Sichere Kommunikation zwischen Ermittlern und Sachverständigen +* Ende-zu-Ende-verschlüsselt +* Bildschirmfreigabe möglich + +### Automatischer Dateiimport per API + +* REST-Schnittstelle nutzen, um z. B. automatisch Logdateien oder Exportdaten hochzuladen +* Ideal für Anbindung an SIEM, DLP oder Analyse-Pipelines + +## Best Practices + +* Zwei-Faktor-Authentifizierung aktivieren +* Tägliche Backups der Datenbank und Datenstruktur +* Nutzung von OnlyOffice oder Collabora für revisionssichere Dokumentenbearbeitung +* Zugriff regelmäßig überprüfen, insbesondere bei externen Partnern + +## Troubleshooting + +### Problem: Langsame Performance + +**Lösung:** APCu aktivieren und Caching optimieren (`config.php → 'memcache.local'`). + +### Problem: Dateien erscheinen nicht im Sync + +**Lösung:** Cronjob für `files:scan` konfigurieren oder manuell ausführen: + +```bash +sudo -u www-data php /var/www/nextcloud/occ files:scan --all +``` + +### Problem: Fehlermeldung "Trusted domain not set" + +**Lösung:** In `config/config.php` Eintrag `trusted_domains` korrekt konfigurieren: + +```php +'trusted_domains' => + array ( + 0 => 'yourdomain.tld', + 1 => 'cloud.cc24.dev', + ), +``` + +## Weiterführende Themen + +* **Integration mit Forensik-Plattformen** (über WebDAV, API oder SSO) +* **Custom Apps entwickeln** für spezielle Ermittlungs-Workflows +* **Auditing aktivieren**: Nutzung und Änderungen nachvollziehen mit Protokollierungsfunktionen diff --git a/src/content/knowledgebase/regular-expressions-regex.md b/src/content/knowledgebase/regular-expressions-regex.md new file mode 100644 index 0000000..60da171 --- /dev/null +++ b/src/content/knowledgebase/regular-expressions-regex.md @@ -0,0 +1,110 @@ +--- +title: "Regular Expressions (Regex) – Musterbasierte Textanalyse" +tool_name: "Regular Expressions (Regex)" +description: "Pattern matching language für Suche, Extraktion und Manipulation von Text in forensischen Analysen." +last_updated: 2025-07-20 +author: "CC24-Team" +difficulty: "intermediate" +categories: ["incident-response", "malware-analysis", "network-forensics", "fraud-investigation"] +tags: ["pattern-matching", "text-processing", "log-analysis", "string-manipulation", "search-algorithms"] +sections: + overview: true + installation: false + configuration: false + usage_examples: true + best_practices: true + troubleshooting: false + advanced_topics: true +review_status: "published" +--- + +> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community! + + +# Übersicht + +**Regular Expressions (Regex)** sind ein leistungsfähiges Werkzeug zur Erkennung, Extraktion und Transformation von Zeichenfolgen anhand vordefinierter Muster. In der digitalen Forensik sind Regex-Ausdrücke unverzichtbar: Sie helfen beim Auffinden von IP-Adressen, Hash-Werten, Dateipfaden, Malware-Signaturen oder Kreditkartennummern in großen Mengen unstrukturierter Daten wie Logdateien, Netzwerktraces oder Memory Dumps. + +Regex ist nicht auf eine bestimmte Plattform oder Software beschränkt – es wird in nahezu allen gängigen Programmiersprachen, Texteditoren und forensischen Tools unterstützt. + +## Verwendungsbeispiele + +### 1. IP-Adressen extrahieren + +```regex +\b(?:\d{1,3}\.){3}\d{1,3}\b +```` + +Verwendung: + +* Finden von IP-Adressen in Firewall-Logs oder Packet Captures. +* Beispiel-Zeile: + + ``` + Connection from 192.168.1.101 to port 443 established + ``` + +### 2. E-Mail-Adressen identifizieren + +```regex +[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} +``` + +Verwendung: + +* Erkennung von kompromittierten Accounts in Phishing-E-Mails. +* Analyse von Useraktivitäten oder Kommunikationsverläufen. + +### 3. Hash-Werte erkennen (z. B. SHA-256) + +```regex +\b[A-Fa-f0-9]{64}\b +``` + +Verwendung: + +* Extraktion von Malware-Hashes aus Memory Dumps oder YARA-Logs. + +### 4. Zeitstempel in Logdateien extrahieren + +```regex +\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2} +``` + +Verwendung: + +* Zeitsensitive Korrelationsanalysen (z. B. bei Intrusion Detection oder Timeline-Rekonstruktionen). + +## Best Practices + +* **Regex testen**: Nutze Plattformen wie [regexr.com](https://regexr.com/) oder [regex101.com](https://regex101.com/) zur Validierung. +* **Performance beachten**: Komplexe Ausdrücke können ineffizient sein und Systeme verlangsamen – verwende Lazy Quantifiers (`*?`, `+?`) bei Bedarf. +* **Escape-Zeichen korrekt anwenden**: Spezielle Zeichen wie `.` oder `\` müssen bei Bedarf mit `\\` oder `\.` maskiert werden. +* **Portabilität prüfen**: Unterschiedliche Regex-Engines (z. B. Python `re`, PCRE, JavaScript) interpretieren manche Syntax leicht unterschiedlich. +* **Lesbarkeit fördern**: Verwende benannte Gruppen (`(?P...)`) und Kommentare (`(?x)`), um reguläre Ausdrücke besser wartbar zu machen. + +## Weiterführende Themen + +### Lookaheads und Lookbehinds + +Mit **Lookaheads** (`(?=...)`) und **Lookbehinds** (`(?<=...)`) können Bedingungen formuliert werden, ohne dass der Text Teil des Matchs wird. + +Beispiel: Alle `.exe`-Dateinamen **ohne** das Wort `safe` davor matchen: + +```regex +(? 🔤 **Regex ist ein universelles Werkzeug für Analysten, Ermittler und Entwickler, um versteckte Informationen schnell und flexibel aufzuspüren.** +> +> Nutze es überall dort, wo Textdaten eine Rolle spielen. + diff --git a/src/content/knowledgebase/velociraptor.md b/src/content/knowledgebase/velociraptor.md new file mode 100644 index 0000000..a67bc1e --- /dev/null +++ b/src/content/knowledgebase/velociraptor.md @@ -0,0 +1,161 @@ +--- +title: "Velociraptor – Skalierbare Endpoint-Forensik mit VQL" +tool_name: "Velociraptor" +description: "Detaillierte Anleitung und Best Practices für Velociraptor – Remote-Forensik der nächsten Generation" +last_updated: 2025-07-20 +author: "CC24-Team" +difficulty: "advanced" +categories: ["incident-response", "malware-analysis", "network-forensics"] +tags: ["web-based", "endpoint-monitoring", "artifact-extraction", "scripting", "live-forensics", "hunting"] +sections: + overview: true + installation: true + configuration: true + usage_examples: true + best_practices: true + troubleshooting: true + advanced_topics: true +review_status: "published" +--- + +> **⚠️ Hinweis**: Dies ist ein vorläufiger, KI-generierter Knowledgebase-Eintrag. Wir freuen uns über Verbesserungen und Ergänzungen durch die Community! + + +# Übersicht + +Velociraptor ist ein Open-Source-Tool zur Endpoint-Forensik mit Fokus auf Skalierbarkeit, Präzision und Geschwindigkeit. Es ermöglicht die zielgerichtete Erfassung und Analyse digitaler Artefakte über eine eigene Query Language – VQL (Velociraptor Query Language). Die Architektur erlaubt remote Zugriff auf tausende Endpoints gleichzeitig, ohne dass vollständige Disk-Images erforderlich sind. + +## Hauptmerkmale + +- 🌐 Web-basierte Benutzeroberfläche +- 💡 VQL – mächtige, SQL-ähnliche Abfragesprache +- 🚀 Hochskalierbare Hunt-Funktionalität +- 🔍 Artefaktbasierte Sammlung (ohne Full-Image) +- 🖥️ Plattformunterstützung für Windows, macOS, Linux +- 📦 Apache 2.0 Lizenz – Open Source + +Weitere Infos: [velociraptor.app](https://www.velociraptor.app/) +Projektspiegel: [raptor.cc24.dev](https://raptor.cc24.dev) +Status: ![Status](https://status.mikoshi.de/api/badge/33/status) + +--- + +## Installation + +### Voraussetzungen + +- Python ≥ 3.9 +- Adminrechte auf dem System +- Firewall-Freigaben für Webport (Standard: 8000) + +### Installation unter Linux/macOS + +```bash +wget https://github.com/Velocidex/velociraptor/releases/latest/download/velociraptor +chmod +x velociraptor +sudo mv velociraptor /usr/local/bin/ +```` + +### Installation unter Windows + +1. Download der `.exe` von der [Release-Seite](https://github.com/Velocidex/velociraptor/releases) +2. Ausführung in PowerShell mit Adminrechten: + + ```powershell + .\velociraptor.exe config generate > server.config.yaml + ``` + +--- + +## Konfiguration + +### Server Setup + +1. Generiere die Konfigurationsdatei: + + ```bash + velociraptor config generate > server.config.yaml + ``` +2. Starte den Server: + + ```bash + velociraptor --config server.config.yaml frontend + ``` +3. Zugriff über Browser via `https://:8000` + +### Client Deployment + +* MSI/EXE für Windows, oder `deb/rpm` für Linux +* Unterstützt automatische Registrierung am Server +* Deployment über GPO, Puppet, Ansible etc. möglich + +--- + +## Verwendungsbeispiele + +### 1. Live-Memory-Artefakte sammeln + +```vql +SELECT * FROM Artifact.MemoryInfo() +``` + +### 2. Hunt starten auf verdächtige Prozesse + +```vql +SELECT * FROM pslist() +WHERE Name =~ "mimikatz|cobaltstrike" +``` + +### 3. Dateiinhalt extrahieren + +```vql +SELECT * FROM glob(globs="C:\\Users\\*\\AppData\\*.dat") +``` + +--- + +## Best Practices + +* Erstelle eigene Artefakte für unternehmensspezifische Bedrohungsmodelle +* Verwende "Notebook"-Funktion für strukturierte Analysen +* Nutze "Labels", um Endpoints zu organisieren (z. B. `location:Berlin`) +* Kombiniere Velociraptor mit SIEM/EDR-Systemen über REST API + +--- + +## Troubleshooting + +### Problem: Keine Verbindung vom Client zum Server + +**Lösung:** + +* Ports freigegeben? (Default: 8000/tcp) +* TLS-Zertifikate korrekt generiert? +* `server.config.yaml` auf korrekte `public_ip` prüfen + +### Problem: Hunt hängt in Warteschleife + +**Lösung:** + +* Genügend Worker-Prozesse aktiv? +* Endpoint online? +* `log_level` auf `debug` setzen und Log analysieren + +--- + +## Weiterführende Themen + +* Eigene Artefakte schreiben mit VQL +* Integration mit ELK Stack +* Automatisiertes Incident Response Playbook +* Velociraptor als IR-as-a-Service einsetzen + +--- + +🧠 **Tipp:** Die Lernkurve bei VQL ist steil – aber mit hohem ROI. Testumgebung aufsetzen und mit Community-Artefakten starten. + +📚 Weitere Ressourcen: + +* [Offizielle Doku](https://docs.velociraptor.app/) +* [YouTube Channel](https://www.youtube.com/c/VelociraptorDFIR) +* [Community auf Discord](https://www.velociraptor.app/community/) \ No newline at end of file diff --git a/src/data/tools.yaml b/src/data/tools.yaml index 8578501..80c3db3 100644 --- a/src/data/tools.yaml +++ b/src/data/tools.yaml @@ -1,6 +1,5 @@ tools: - name: Autopsy - icon: 📦 type: software description: >- Die führende Open-Source-Alternative zu kommerziellen Forensik-Suiten mit @@ -9,6 +8,16 @@ tools: Plugin-Architektur erlaubt Erweiterungen für spezielle Untersuchungsszenarien. Zwar komplexer als kommerzielle Lösungen, aber dafür vollständig transparent und kostenfrei. + skillLevel: intermediate + url: https://www.autopsy.com/ + tags: + - gui + - filesystem + - timeline-analysis + - carving + - artifact-extraction + - keyword-search + icon: 📦 domains: - incident-response - law-enforcement @@ -18,26 +27,15 @@ tools: phases: - examination - analysis + related_concepts: + - SQL Query Fundamentals + - Hash Functions & Digital Signatures platforms: - Windows - Linux - related_concepts: - - "SQL Query Fundamentals" - - "Hash Functions & Digital Signatures" - domain-agnostic-software: null - skillLevel: intermediate - accessType: download - url: https://www.autopsy.com/ - projectUrl: '' + accessType: Download license: Apache 2.0 knowledgebase: false - tags: - - gui - - filesystem - - timeline-analysis - - carving - - artifact-extraction - - keyword-search - name: Volatility 3 icon: 📦 type: software @@ -62,8 +60,8 @@ tools: - Linux - macOS related_concepts: - - "Hash Functions & Digital Signatures" - - "Regular Expressions (Regex)" + - Hash Functions & Digital Signatures + - Regular Expressions (Regex) domain-agnostic-software: null skillLevel: advanced accessType: download @@ -170,8 +168,8 @@ tools: platforms: - Web related_concepts: - - "Regular Expressions (Regex)" - - "SQL Query Fundamentals" + - Regular Expressions (Regex) + - SQL Query Fundamentals domain-agnostic-software: null skillLevel: intermediate accessType: server-based @@ -608,8 +606,8 @@ tools: - Windows - Linux - macOS - related_concepts: - - "Regular Expressions (Regex)" + related_concepts: + - Regular Expressions (Regex) domain-agnostic-software: null skillLevel: novice accessType: download @@ -682,7 +680,7 @@ tools: - macOS - Web related_concepts: - - "SQL Query Fundamentals" + - SQL Query Fundamentals domain-agnostic-software: null skillLevel: intermediate accessType: server-based @@ -973,7 +971,7 @@ tools: platforms: - Windows related_concepts: - - "Hash Functions & Digital Signatures" + - Hash Functions & Digital Signatures domain-agnostic-software: null skillLevel: beginner accessType: download @@ -1005,7 +1003,7 @@ tools: platforms: - Linux related_concepts: - - "Hash Functions & Digital Signatures" + - Hash Functions & Digital Signatures domain-agnostic-software: null skillLevel: novice accessType: download @@ -1072,7 +1070,7 @@ tools: - Linux - macOS related_concepts: - - "SQL Query Fundamentals" + - SQL Query Fundamentals domain-agnostic-software: null skillLevel: intermediate accessType: download @@ -1240,7 +1238,7 @@ tools: platforms: - Linux related_concepts: - - "Hash Functions & Digital Signatures" + - Hash Functions & Digital Signatures domain-agnostic-software: null skillLevel: intermediate accessType: download @@ -1480,8 +1478,8 @@ tools: - Linux - macOS related_concepts: - - "Regular Expressions (Regex)" - - "Hash Functions & Digital Signatures" + - Regular Expressions (Regex) + - Hash Functions & Digital Signatures accessType: download license: BSD-3-Clause knowledgebase: false @@ -1504,7 +1502,7 @@ tools: - Linux - macOS related_concepts: - - "Regular Expressions (Regex)" + - Regular Expressions (Regex) domain-agnostic-software: null skillLevel: novice accessType: built-in @@ -1977,9 +1975,10 @@ tools: icon: 🔤 type: concept description: >- - Pattern matching language for searching, extracting, and manipulating text. - Essential for log analysis, malware signature creation, and data extraction from - unstructured sources. Forms the backbone of many forensic tools and custom scripts. + Pattern matching language for searching, extracting, and manipulating + text. Essential for log analysis, malware signature creation, and data + extraction from unstructured sources. Forms the backbone of many forensic + tools and custom scripts. domains: - incident-response - malware-analysis @@ -1996,21 +1995,21 @@ tools: url: https://regexr.com/ projectUrl: null license: null - knowledgebase: false + knowledgebase: true tags: - pattern-matching - text-processing - log-analysis - string-manipulation - search-algorithms - - name: SQL Query Fundamentals icon: 🗃️ type: concept description: >- - Structured Query Language for database interrogation and analysis. Critical for - examining application databases, SQLite artifacts from mobile devices, and - browser history databases. Enables complex correlation and filtering of large datasets. + Structured Query Language for database interrogation and analysis. + Critical for examining application databases, SQLite artifacts from + mobile devices, and browser history databases. Enables complex + correlation and filtering of large datasets. domains: - incident-response - mobile-forensics @@ -2034,14 +2033,14 @@ tools: - data-correlation - mobile-artifacts - browser-forensics - - name: Hash Functions & Digital Signatures icon: 🔐 type: concept description: >- - Cryptographic principles for data integrity verification and authentication. - Fundamental for evidence preservation, malware identification, and establishing - chain of custody. Understanding of MD5, SHA, and digital signature validation. + Cryptographic principles for data integrity verification and + authentication. Fundamental for evidence preservation, malware + identification, and establishing chain of custody. Understanding of MD5, + SHA, and digital signature validation. domains: - incident-response - law-enforcement diff --git a/src/env.d.ts b/src/env.d.ts index 44afb34..a056e36 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -9,10 +9,16 @@ declare global { getStoredTheme: () => string; }; toolsData: any[]; - showToolDetails: (toolName: string) => void; - hideToolDetails: () => void; + showToolDetails: (toolName: string, modalType?: string) => void; + hideToolDetails: (modalType?: string) => void; + hideAllToolDetails: () => void; + toggleKbEntry: (entryId: string) => void; + toggleDomainAgnosticSection: (sectionId: string) => void; + restoreAIResults?: () => void; + switchToAIView?: () => void; + clearTagFilters?: () => void; + clearAllFilters?: () => void; } - } // Also declare the modules that might not be recognized diff --git a/src/pages/api/ai/query.ts b/src/pages/api/ai/query.ts index ec811fc..4f13f8b 100644 --- a/src/pages/api/ai/query.ts +++ b/src/pages/api/ai/query.ts @@ -94,6 +94,17 @@ function createWorkflowSystemPrompt(toolsData: any): string { skillLevel: tool.skillLevel, license: tool.license, tags: tool.tags, + related_concepts: tool.related_concepts || [] + })); + + // NEW: Include concepts for background knowledge + const conceptsList = toolsData.concepts.map((concept: any) => ({ + name: concept.name, + description: concept.description, + domains: concept.domains, + phases: concept.phases, + skillLevel: concept.skillLevel, + tags: concept.tags })); // Get regular phases (no more filtering needed) @@ -135,9 +146,12 @@ function createWorkflowSystemPrompt(toolsData: any): string { return `Du bist ein DFIR (Digital Forensics and Incident Response) Experte, der Ermittlern bei der Auswahl von Software und Methoden hilft. -VERFÜGBARE DATENBASIS: +VERFÜGBARE TOOLS/METHODEN: ${JSON.stringify(toolsList, null, 2)} +VERFÜGBARE HINTERGRUNDWISSEN-KONZEPTE: +${JSON.stringify(conceptsList, null, 2)} + UNTERSUCHUNGSPHASEN (NIST Framework): ${phasesDescription} @@ -152,6 +166,8 @@ WICHTIGE REGELN: 5. Deutsche Antworten für deutsche Anfragen, English for English queries 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. +8. WICHTIG: Erwähne relevante Hintergrundwissen-Konzepte wenn Tools verwendet werden, die related_concepts haben +9. Konzepte sind NICHT Tools - empfehle sie nicht als actionable Schritte, sondern als Wissensbasis SOFTWARE/METHODEN-AUSWAHL NACH PHASE: ${phaseDescriptions} @@ -164,13 +180,19 @@ ANTWORT-FORMAT (strict JSON): "scenario_analysis": "Detaillierte Analyse des Szenarios auf Deutsch/English", "recommended_tools": [ { - "name": "EXAKTER Name aus der Database", + "name": "EXAKTER Name aus der Tools-Database", "priority": "high|medium|low", "phase": "${validPhases}", "justification": "Warum diese Methode für diese Phase und Szenario geeignet ist" } ], "workflow_suggestion": "Vorgeschlagener Untersuchungsablauf", + "background_knowledge": [ + { + "concept_name": "EXAKTER Name aus der Konzepte-Database", + "relevance": "Warum dieses Konzept für das Szenario relevant ist, und bei welchen der empfohlenen Methoden/Tools." + } + ], "additional_notes": "Wichtige Überlegungen und Hinweise" } @@ -189,14 +211,28 @@ function createToolSystemPrompt(toolsData: any): string { license: tool.license, tags: tool.tags, url: tool.url, - projectUrl: tool.projectUrl + projectUrl: tool.projectUrl, + related_concepts: tool.related_concepts || [] + })); + + // NEW: Include concepts for background knowledge + const conceptsList = toolsData.concepts.map((concept: any) => ({ + name: concept.name, + description: concept.description, + domains: concept.domains, + phases: concept.phases, + skillLevel: concept.skillLevel, + tags: concept.tags })); 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 DATENBASIS: +VERFÜGBARE TOOLS/METHODEN: ${JSON.stringify(toolsList, null, 2)} +VERFÜGBARE HINTERGRUNDWISSEN-KONZEPTE: +${JSON.stringify(conceptsList, null, 2)} + WICHTIGE REGELN: 1. Analysiere das spezifische Problem/die Anforderung sorgfältig 2. Empfehle 1-3 Tools, sortiert nach Eignung (beste Empfehlung zuerst) @@ -207,13 +243,15 @@ WICHTIGE REGELN: 7. Erwähne sowohl Stärken als auch Schwächen/Limitationen 8. Schlage alternative Ansätze vor, wenn sinnvoll 9. Gib grundsätzliche Hinweise, WIE das Tool konkret eingesetzt wird +10. WICHTIG: Erwähne relevante Hintergrundwissen-Konzepte wenn Tools verwendet werden, die related_concepts haben +11. Konzepte sind NICHT Tools - empfehle sie nicht als actionable Schritte, sondern als Wissensbasis ANTWORT-FORMAT (strict JSON): { "problem_analysis": "Detaillierte Analyse des Problems/der Anforderung", "recommended_tools": [ { - "name": "EXAKTER Name aus der Database", + "name": "EXAKTER Name aus der Tools-Database", "rank": 1, "suitability_score": "high|medium|low", "detailed_explanation": "Detaillierte Erklärung, warum dieses Tool/diese Methode das Problem löst", @@ -223,6 +261,12 @@ ANTWORT-FORMAT (strict JSON): "alternatives": "Alternative Ansätze oder ergänzende Tools/Methoden, falls relevant" } ], + "background_knowledge": [ + { + "concept_name": "EXAKTER Name aus der Konzepte-Database", + "relevance": "Warum dieses Konzept für die empfohlenen Tools/das Problem relevant ist, und für welche der empfohlenen Methoden/Tools." + } + ], "additional_considerations": "Wichtige Überlegungen, Voraussetzungen oder Warnungen" } @@ -353,12 +397,13 @@ export const POST: APIRoute = async ({ request }) => { }); } - // Validate tool names against database based on mode + // Validate tool names and concept names against database const validToolNames = new Set(toolsData.tools.map((t: any) => t.name)); + const validConceptNames = new Set(toolsData.concepts.map((c: any) => c.name)); + let validatedRecommendation; if (mode === 'workflow') { - // Existing validation for workflow mode validatedRecommendation = { ...recommendation, recommended_tools: recommendation.recommended_tools?.filter((tool: any) => { @@ -367,10 +412,16 @@ export const POST: APIRoute = async ({ request }) => { return false; } return true; + }) || [], + background_knowledge: recommendation.background_knowledge?.filter((concept: any) => { + if (!validConceptNames.has(concept.concept_name)) { + console.warn(`AI referenced unknown concept: ${concept.concept_name}`); + return false; + } + return true; }) || [] }; } else { - // New validation for tool mode validatedRecommendation = { ...recommendation, recommended_tools: recommendation.recommended_tools?.filter((tool: any) => { @@ -385,12 +436,19 @@ export const POST: APIRoute = async ({ request }) => { suitability_score: tool.suitability_score || 'medium', // Default suitability pros: Array.isArray(tool.pros) ? tool.pros : [], cons: Array.isArray(tool.cons) ? tool.cons : [] - })) || [] + })) || [], + background_knowledge: recommendation.background_knowledge?.filter((concept: any) => { + if (!validConceptNames.has(concept.concept_name)) { + console.warn(`AI referenced unknown concept: ${concept.concept_name}`); + return false; + } + return true; + }) || [] }; } // Log successful query - console.log(`[AI Query] Mode: ${mode}, User: ${userId}, Query length: ${sanitizedQuery.length}, Tools: ${validatedRecommendation.recommended_tools.length}`); + console.log(`[AI Query] Mode: ${mode}, User: ${userId}, Query length: ${sanitizedQuery.length}, Tools: ${validatedRecommendation.recommended_tools.length}, Concepts: ${validatedRecommendation.background_knowledge?.length || 0}`); return new Response(JSON.stringify({ success: true, diff --git a/src/pages/knowledgebase.astro b/src/pages/knowledgebase.astro index 58cb2b1..9c3f362 100644 --- a/src/pages/knowledgebase.astro +++ b/src/pages/knowledgebase.astro @@ -2,11 +2,10 @@ import BaseLayout from '../layouts/BaseLayout.astro'; import { getToolsData } from '../utils/dataService.js'; - // Load tools data const data = await getToolsData(); -// Filter tools that have knowledgebase entries +// Filter tools that have knowledgebase flag set to true const knowledgebaseTools = data.tools.filter((tool: any) => tool.knowledgebase === true); // Sort alphabetically by name @@ -26,7 +25,7 @@ knowledgebaseTools.sort((a: any, b: any) => a.name.localeCompare(b.name));

- +
a.name.localeCompare(b.name));

Noch keine Knowledgebase-Einträge

- 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. + Knowledgebase-Einträge werden automatisch angezeigt, sobald Datenbankeinträge das Attribut "knowledgebase: true" haben.

) : (
- {knowledgebaseTools.map((tool: any, index: number) => ( -
- -
+ {knowledgebaseTools.map((tool: any, index: number) => { + const hasValidProjectUrl = tool.projectUrl !== undefined && + tool.projectUrl !== null && + tool.projectUrl !== "" && + tool.projectUrl.trim() !== ""; + + const toolSlug = tool.name.toLowerCase() + .replace(/[^a-z0-9\s-]/g, '') // Remove special characters + .replace(/\s+/g, '-') // Replace spaces with hyphens + .replace(/-+/g, '-') // Remove duplicate hyphens + .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens + + return ( +
-

{tool.name}

-
- {(() => { - const hasValidProjectUrl = tool.projectUrl !== undefined && - tool.projectUrl !== null && - tool.projectUrl !== "" && - tool.projectUrl.trim() !== ""; - return ( - <> - {hasValidProjectUrl && CC24-Server} - {tool.license !== 'Proprietary' && Open Source} - Infos 📖 - - ); - })()} +

+ {tool.icon && {tool.icon}} + {tool.name} +

+
+ + {tool.type === 'concept' && Konzept} + {tool.type === 'method' && Methode} + {tool.type === 'software' && Software} + + {hasValidProjectUrl && CC24-Server} + {tool.license !== 'Proprietary' && tool.type !== 'concept' && tool.type !== 'method' && Open Source} + + + + {tool.skillLevel || 'intermediate'} +
-
- - + + + + + + + -
+ Artikel öffnen +
-

+ + +

{tool.description}

-
- -
- ))} +
+ ); + })}
)}
- -