IcePorge-MWDB-Stack
MWDB-core with Karton Orchestration for Malware Sample Management
Part of the IcePorge Malware Analysis Stack.
Screenshots
MWDB Web Interface

MWDB provides a modern web interface for managing malware samples, viewing analysis results, and exploring relationships between samples.
MWDB + Karton Betriebshandbuch
Version: 1.0.0 Stand: 2026-01-21 System: MWDB-core mit Karton-Orchestrierung und Multi-Source Feeder
1. Systemübersicht
1.1 Architektur
Mermaid-Diagramm (klicken zum Ausklappen)
```mermaid flowchart TB subgraph FEEDS["MALWARE FEED SOURCES"] URLhaus["URLhaus"] ThreatFox["ThreatFox"] HybridA["Hybrid Analysis"] end subgraph PARALLEL["Parallele Pipeline"] MB["MalwareBazaar"] RWL["ransomware.live"] CapeFeed["cape-feed"] MB --> CapeFeed RWL --> CapeFeed end Feeder["mwdb-feederPoll → Dedupe → Download"] FEEDS --> Feeder subgraph STACK["MWDB + Karton Stack"] subgraph MWDB["MWDB-core"] Repo["Malware Repository"] WebUI["Web UI :8443"] PG["PostgreSQL"] MinIO["MinIO S3"] end subgraph KARTON["Karton Orchestration"] System["karton-system"] Redis["Redis Queue"] System <--> Redis end subgraph MODULES["Karton Module"] Classifier["classifier"] Archive["archive-extractor"] Reporter["mwdb-reporter"] CapeSubmit["cape-submitter"] Dashboard["dashboard :8444"] end MWDB --> KARTON KARTON --> MODULES end Feeder --> MWDB CapeSubmit --> CAPE["CAPEv2
Dynamic Analysis"] CapeFeed --> CAPE CAPE --> MISP["MISP"] style FEEDS fill:#667eea,color:#fff style PARALLEL fill:#a8edea,color:#333 style MWDB fill:#f093fb,color:#fff style KARTON fill:#4facfe,color:#fff style CAPE fill:#ff0844,color:#fff ```
ASCII-Diagramm (Legacy)
``` ┌─────────────────────────────────────────────────────────────────────┐ │ MALWARE FEED SOURCES │ │ URLhaus ─────┬───── ThreatFox ─────┬───── (weitere) │ │ └─────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ mwdb-feeder │ Poll → Dedupe → Download │ │ └────────┬────────┘ │ │ ▼ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ MWDB + Karton Stack │ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ │ │ MWDB-core │ │ │ │ │ │ • Malware Repository • Web UI: /mwdb/ │ │ │ │ │ │ • PostgreSQL Backend • REST API │ │ │ │ │ │ • MinIO S3 Storage • Karton Integration │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ ┌────────────┴────────────┐ │ │ │ │ ▼ ▼ │ │ │ │ ┌────────────────────┐ ┌────────────────────┐ │ │ │ │ │ karton-system │ │ Redis │ │ │ │ │ │ (Dispatcher) │◄──►│ (Task Queue) │ │ │ │ │ └────────────────────┘ └────────────────────┘ │ │ │ │ │ │ │ │ │ ┌─────────┼─────────┬─────────────┬─────────────┐ │ │ │ │ ▼ ▼ ▼ ▼ ▼ │ │ │ │ ┌──────┐ ┌───────┐ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ │ │ │ │class-│ │archive│ │ mwdb- │ │ cape- │ │ dashboard │ │ │ │ │ │ifier │ │extrac.│ │reporter │ │submitter │ │ │ │ │ │ │ └──────┘ └───────┘ └─────────┘ └────┬─────┘ └───────────┘ │ │ │ └───────────────────────────────────────┼───────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────┐ │ │ │ CAPEv2 │ │ │ │ Dynamic Analysis │ │ │ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ Parallel bestehend (unverändert): MalwareBazaar ──► cape-feed ──► CAPE ──► MISP ```1.2 Komponenten
| Komponente | Funktion | Image/Pfad |
|---|---|---|
| mwdb | Malware Repository Backend | certpl/mwdb:master |
| mwdb-web | Web Frontend | certpl/mwdb-web:master |
| mwdb-postgres | PostgreSQL Datenbank | postgres:17-alpine |
| mwdb-redis | Karton Queue + Cache | redis:7-alpine |
| mwdb-minio | S3-kompatibler Storage | minio/minio:latest |
| karton-system | Task Dispatcher | certpl/karton-system:master |
| karton-classifier | Sample-Klassifizierung | certpl/karton-classifier:v2.1.0 |
| karton-archive-extractor | Archive-Extraktion | certpl/karton-archive-extractor:v1.5.1 |
| karton-mwdb-reporter | Ergebnisse → MWDB | certpl/karton-mwdb-reporter:latest |
| karton-dashboard | Karton Web UI | certpl/karton-dashboard:latest |
| karton-cape-submitter | Samples → CAPE | Custom (lokal gebaut) |
| mwdb-feeder | Multi-Source Aggregator (URLhaus, ThreatFox, Hybrid Analysis) | Custom (lokal gebaut) |
1.3 Verzeichnisstruktur
/opt/mwdb-core/ # MWDB + Karton Stack
├── docker-compose.yml # Stack Definition
├── .env # Secrets und Konfiguration
├── karton.ini # Karton-Framework Config
├── kartons/
│ └── cape_submitter/ # Custom Karton-Modul
│ ├── Dockerfile
│ ├── cape_submitter.py
│ └── requirements.txt
└── config/
/opt/mwdb-feeder/ # Multi-Source Feeder
├── docker-compose.yml
├── Dockerfile
├── .env # Feed API-Keys
├── app/
│ ├── feeder.py
│ └── requirements.txt
└── work/
├── state.db # Verarbeitungsstatus
└── reports/
└── mwdb-feeder.jsonl # Aktivitätslog
/mnt/cape-data/mwdb-storage/ # MinIO Sample Storage
2. Zugang und URLs
2.1 Web Interfaces
| Service | URL | Bemerkung |
|---|---|---|
| MWDB Web | https://<host>:8443/ | Malware Repository |
| Karton Dashboard | https://<host>:8444/ | Task-Übersicht |
| MinIO Console | http://127.0.0.1:9001 | Nur lokal |
Hinweis: /mwdb und /karton Pfade auf Port 443 leiten automatisch auf die dedizierten Ports weiter.
2.2 Zugangsdaten
MWDB Admin:
- User:
admin - Passwort:
QTlqfISkAGZ9vs+bAaSG03/fXM1EL+W8
Alle Credentials: /root/.claude/mwdb-credentials.md
2.3 API Endpoints
# MWDB API Status
curl -s http://127.0.0.1:8081/api/ping
# {"status":"ok"}
# MWDB API mit Authentifizierung
curl -s http://127.0.0.1:8081/api/file \
-H "Authorization: Bearer <API-KEY>"
3. Container-Management
3.1 MWDB + Karton Stack
cd /opt/mwdb-core
# Stack starten
docker compose up -d
# Stack stoppen
docker compose down
# Logs verfolgen
docker compose logs -f
# Einzelnen Container neustarten
docker compose restart mwdb
docker compose restart karton-cape-submitter
# Status prüfen
docker compose ps
# Container-Logs einzeln
docker logs -f mwdb
docker logs -f karton-cape-submitter
3.2 Feeder
cd /opt/mwdb-feeder
# Feeder starten
docker compose up -d
# Feeder stoppen
docker compose down
# Logs verfolgen
docker compose logs -f mwdb-feeder
# Nach Konfigurationsänderung neustarten
docker compose restart
3.3 Alle Container auf einmal
# Status aller MWDB-Container
docker ps --format "table \t" | grep -E "mwdb|karton"
# Alle MWDB-Container stoppen
docker stop $(docker ps -q --filter "name=mwdb") $(docker ps -q --filter "name=karton")
4. Konfiguration
4.1 MWDB Stack (.env)
Pfad: /opt/mwdb-core/.env
# PostgreSQL
POSTGRES_USER=mwdb
POSTGRES_PASSWORD=<generated>
POSTGRES_DB=mwdb
# MinIO
MINIO_ROOT_USER=mwdb-minio
MINIO_ROOT_PASSWORD=<generated>
# MWDB
MWDB_SECRET_KEY=<generated>
MWDB_POSTGRES_URI=postgresql://...
MWDB_REDIS_URI=redis://mwdb-redis:6379/0
MWDB_ENABLE_KARTON=1
MWDB_ADMIN_LOGIN=admin
MWDB_ADMIN_PASSWORD=<generated>
MWDB_STORAGE_PROVIDER=s3
MWDB_S3_STORAGE_ENDPOINT=mwdb-minio:9000
MWDB_S3_STORAGE_BUCKET_NAME=mwdb
# CAPE Connection (für karton-cape-submitter)
CAPE_SUBMIT_URL=https://host.docker.internal/apiv2/tasks/create/file/
CAPE_TLS_VERIFY=false
CAPE_TAGS_DEFAULT=win11,x64
4.2 Karton Config (karton.ini)
Pfad: /opt/mwdb-core/karton.ini
[s3]
access_key = mwdb-minio
secret_key = <minio-secret>
address = http://mwdb-minio:9000
bucket = karton
[redis]
host = mwdb-redis
port = 6379
[mwdb]
api_url = http://mwdb:8080/api
api_key = <mwdb-api-key>
4.3 Feeder Config
Pfad: /opt/mwdb-feeder/.env
# MWDB Connection
MWDB_URL=http://mwdb:8080/api
MWDB_API_KEY=<mwdb-api-key>
# URLhaus (abuse.ch)
URLHAUS_ENABLED=true # Nach API-Key Registrierung aktivieren
URLHAUS_AUTH_KEY=<your-key> # Von https://auth.abuse.ch/
URLHAUS_POLL_SECONDS=300
# ThreatFox (abuse.ch)
THREATFOX_ENABLED=true
THREATFOX_AUTH_KEY=<your-key> # Gleicher Key wie URLhaus
THREATFOX_POLL_SECONDS=300
# Allgemein
MAX_MB_PER_FILE=50
5. Feed-Quellen aktivieren
5.1 abuse.ch API-Key (URLhaus + ThreatFox)
- Registrierung: https://auth.abuse.ch/
- API-Key in
/opt/mwdb-feeder/.enveintragen:URLHAUS_ENABLED=true URLHAUS_AUTH_KEY=<dein-key> THREATFOX_ENABLED=true THREATFOX_AUTH_KEY=<dein-key> - Feeder neustarten:
cd /opt/mwdb-feeder && docker compose restart
5.2 Hybrid Analysis API-Key (Falcon Sandbox)
- Registrierung: https://www.hybrid-analysis.com/signup
- (Noch nicht implementiert - kann später hinzugefügt werden)
6. Datenfluss
6.1 Sample-Pipeline
1. mwdb-feeder pollt URLhaus/ThreatFox
↓
2. Download → Upload zu MWDB
↓
3. MWDB löst Karton-Task aus
↓
4. karton-classifier analysiert Sample-Typ
↓
5. karton-archive-extractor entpackt Archive
↓
6. karton-cape-submitter sendet an CAPE
↓
7. CAPE führt dynamische Analyse durch
↓
8. Ergebnisse in CAPE + MISP
6.2 Karton Task-Types
| Task Type | Producer | Consumer |
|---|---|---|
| sample (new) | MWDB | karton-classifier |
| sample (recognized) | classifier | cape-submitter, mwdb-reporter |
| sample (unrecognized) | classifier | cape-submitter |
| config | extractor | mwdb-reporter |
7. Monitoring und Logs
7.1 Log-Dateien
# MWDB Feeder Activity Log
tail -f /opt/mwdb-feeder/work/reports/mwdb-feeder.jsonl
# Container Logs
docker logs -f mwdb
docker logs -f karton-cape-submitter
docker logs -f mwdb-feeder
7.2 Health Checks
# MWDB API
curl -s http://127.0.0.1:8081/api/ping
# Container Health
docker ps --format ": " | grep -E "mwdb|karton"
# PostgreSQL
docker exec mwdb-postgres pg_isready -U mwdb
# Redis
docker exec mwdb-redis redis-cli ping
# MinIO
curl -s http://127.0.0.1:9000/minio/health/live
7.3 Karton Dashboard
Über https://<host>/karton/ erreichbar:
- Aktive Tasks anzeigen
- Queue-Status prüfen
- Fehlerhafte Tasks identifizieren
8. Troubleshooting
8.1 MWDB startet nicht
# Logs prüfen
docker logs mwdb
# Häufige Ursachen:
# - PostgreSQL nicht ready → warten oder mwdb-postgres prüfen
# - S3 Bucket nicht vorhanden → mwdb-minio-init prüfen
# - Falsche Credentials → .env prüfen
# Manueller Neustart
docker compose restart mwdb
8.2 Karton Tasks stecken fest
# Karton-System Logs
docker logs karton-system
# Redis Queue prüfen
docker exec mwdb-redis redis-cli keys "karton*"
# Karton neustarten
docker compose restart karton-system karton-classifier
8.3 CAPE-Submission fehlgeschlagen
# Logs prüfen
docker logs karton-cape-submitter
# Häufige Ursachen:
# - CAPE nicht erreichbar → host.docker.internal prüfen
# - TLS-Fehler → CAPE_TLS_VERIFY=false setzen
# - Rate Limiting → Backoff abwarten
# CAPE-Erreichbarkeit testen (vom Host)
curl -k https://127.0.0.1/apiv2/tasks/list/
8.4 Feeder lädt keine Samples
# Logs prüfen
docker logs mwdb-feeder
# Häufige Ursachen:
# - API-Keys nicht konfiguriert → .env prüfen
# - Quellen deaktiviert → URLHAUS_ENABLED=true
# - Netzwerk-Probleme → DNS/Firewall prüfen
# State-DB prüfen
sqlite3 /opt/mwdb-feeder/work/state.db "SELECT COUNT(*) FROM processed"
8.5 Container “unhealthy”
Der mwdb Container zeigt oft “unhealthy”, obwohl er funktioniert (curl fehlt im Image). Prüfen mit:
# API direkt testen
curl -s http://127.0.0.1:8081/api/ping
# Wenn {"status":"ok"} → alles in Ordnung
9. Backup und Recovery
9.1 Wichtige Daten
| Daten | Speicherort | Backup-Methode |
|---|---|---|
| PostgreSQL | Docker Volume | pg_dump |
| MinIO Samples | /mnt/cape-data/mwdb-storage/ | rsync/tar |
| Konfiguration | /opt/mwdb-core/.env, karton.ini | Dateikopie |
| Feeder State | /opt/mwdb-feeder/work/state.db | Dateikopie |
9.2 PostgreSQL Backup
# Backup erstellen
docker exec mwdb-postgres pg_dump -U mwdb mwdb > /backup/mwdb-$(date +%Y%m%d).sql
# Restore
docker exec -i mwdb-postgres psql -U mwdb mwdb < /backup/mwdb-YYYYMMDD.sql
9.3 Komplettes Stack-Backup
#!/bin/bash
BACKUP_DIR=/backup/mwdb-$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# Konfiguration
cp /opt/mwdb-core/.env $BACKUP_DIR/
cp /opt/mwdb-core/karton.ini $BACKUP_DIR/
cp /opt/mwdb-feeder/.env $BACKUP_DIR/feeder.env
# PostgreSQL
docker exec mwdb-postgres pg_dump -U mwdb mwdb > $BACKUP_DIR/mwdb.sql
# Feeder State
cp /opt/mwdb-feeder/work/state.db $BACKUP_DIR/
echo "Backup complete: $BACKUP_DIR"
10. Updates
10.1 MWDB/Karton Images aktualisieren
cd /opt/mwdb-core
# Neue Images pullen
docker compose pull
# Stack mit neuen Images starten
docker compose up -d
# Alte Images aufräumen
docker image prune -f
10.2 Custom Module aktualisieren
cd /opt/mwdb-core
# cape-submitter neu bauen
docker compose build karton-cape-submitter
# Neustart
docker compose up -d karton-cape-submitter
10.3 Feeder aktualisieren
cd /opt/mwdb-feeder
# Neu bauen
docker compose build
# Neustart
docker compose up -d
11. Integration mit bestehendem System
11.1 Parallelbetrieb mit cape-feed
MWDB + Karton läuft parallel zum bestehenden cape-feed:
| Pipeline | Quellen | Ziel |
|---|---|---|
| cape-feed | MalwareBazaar | CAPE → MISP |
| mwdb-feeder | URLhaus, ThreatFox | MWDB → Karton → CAPE |
Beide Pipelines nutzen dieselbe CAPE-Instanz.
11.2 nginx Reverse Proxy
MWDB und Karton laufen auf dedizierten Ports (8443 und 8444).
In /etc/nginx/sites-available/cape:
# Redirects auf Port 443
location /mwdb {
return 301 https://$host:8443/;
}
location /karton {
return 301 https://$host:8444/;
}
# =========================================
# MWDB Server (Port 8443)
# =========================================
server {
listen 8443 ssl http2;
server_name _;
ssl_certificate /etc/nginx/ssl/cape.crt;
ssl_certificate_key /etc/nginx/ssl/cape.key;
ssl_protocols TLSv1.2 TLSv1.3;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# =========================================
# Karton Dashboard (Port 8444)
# =========================================
server {
listen 8444 ssl http2;
server_name _;
ssl_certificate /etc/nginx/ssl/cape.crt;
ssl_certificate_key /etc/nginx/ssl/cape.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
11.3 Ports-Übersicht
| Port | Service | Protokoll |
|---|---|---|
| 443 | CAPEv2 | HTTPS |
| 8443 | MWDB | HTTPS |
| 8444 | Karton Dashboard | HTTPS |
12. Anhang
12.1 Nützliche Befehle
# Alle MWDB-bezogenen Container
docker ps -a | grep -E "mwdb|karton"
# Speicherverbrauch
docker system df
du -sh /mnt/cape-data/mwdb-storage/
# Sample in MWDB suchen (API)
curl -s "http://127.0.0.1:8081/api/file/<sha256>" \
-H "Authorization: Bearer <API-KEY>"
# Feeder-Statistik
sqlite3 /opt/mwdb-feeder/work/state.db \
"SELECT source, COUNT(*) FROM processed GROUP BY source"
12.2 Ports
| Port | Service | Zugang |
|---|---|---|
| 8081 | MWDB Web | localhost + nginx |
| 8082 | Karton Dashboard | localhost + nginx |
| 9000 | MinIO S3 API | localhost |
| 9001 | MinIO Console | localhost |
| 5432 | PostgreSQL | Docker internal |
| 6379 | Redis | Docker internal |
12.3 Docker Volumes
# Volumes anzeigen
docker volume ls | grep mwdb
# Volume-Größe
docker system df -v | grep mwdb
12.4 Referenzen
- MWDB Dokumentation: https://mwdb.readthedocs.io/
- Karton Dokumentation: https://karton-core.readthedocs.io/
- abuse.ch API: https://urlhaus-api.abuse.ch/
- CERT-Polska GitHub: https://github.com/CERT-Polska/
Erstellt: 2026-01-21 Maintainer: Automated Pipeline Credentials: /root/.claude/mwdb-credentials.md