blob: a9a971026a1f29c9d5f1e166ea4c34a7cb57690d [file]
<!DOCTYPE html>
<html>
<head>
<title>{{ page_title }} | Caldera</title>
<link rel="shortcut icon" type="image/png" href="/gui/img/favicon.png"/>
<link rel="stylesheet" href="/gui/css/shared.css">
<link rel="stylesheet" href="/gui/css/core.css">
<link rel="stylesheet" href="/gui/css/modal.css">
<link rel="stylesheet" href="/gui/css/basic.css">
<link rel="stylesheet" href="/gui/css/timeline.css">
<link rel="stylesheet" href="/gui/css/multi-select.css" media="screen">
<link rel="stylesheet" href="/gui/css/lib/custom-bulma.css">
<link rel="stylesheet" href="/gui/css/lib/bulma-tooltip.min.css">
<link href="/gui/css/lib/fa-all.min.css" rel="stylesheet">
<style>
:root {
--primary-color: {{ primary_color }};
--primary-color-hover: {{ primary_color_hover }};
--primary-color-translucent: {{ primary_color_translucent }};
}
</style>
</head>
<body>
<main id="home" class="main" x-data="alpineCore()" x-init="initPage()">
<div class="navigation">
<a href="#home" class="scroll-top button is-rounded is-primary" x-show="scrollTop > 0">
<span class="icon"><i class="fas fa-chevron-up"></i></span>
</a>
<div class="nav-logo">
<img src="/gui/img/caldera-logo.png" alt="Caldera logo" @click="window.open('https://caldera.mitre.org?ref=caldera', '_blank')"/>
</div>
<div class="is-flex is-justify-content-center">
<span class="tag is-primary is-small is-rounded mb-2 p-4 user-badge"><em class="fas fa-user pr-3"></em>{{ user_name }}</span>
</div>
<template x-if="errors.length > 0">
<div class="is-flex is-justify-content-center">
<a id="startup-errors-warning" class="has-text-info">
<em class="fas fa-comment-alt pr-1"></em>
<span title="Click for to view startup errors" class="has-text-info" x-text="`${errors.length} startup message${errors.length > 1 ? 's' : ''}`" @click="showErrors = true"></span>
</a>
</div>
</template>
<aside id="nav-menu" class="menu">
<p class="menu-label nav-header"><em class="fas fa-flag pr-2"></em>Campaigns</p>
<ul class="menu-list">
<li><a href="#home" class="nav-item" x-on:click="addTab('agents', '/campaign/agents')">agents</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('abilities', '/campaign/abilities')">abilities</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('adversaries', '/campaign/adversaries')">{{ team_name }}</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('operations', '/campaign/operations')">operations</a></li>
</ul>
<p class="menu-label nav-header"><em class="fas fa-puzzle-piece pr-2"></em>Plugins</p>
<ul class="menu-list">
{% for plugin in plugins | sort(attribute='name') %}
<li>
<a href="#home" x-on:click="addTab('{{ plugin.name }}', '{{ plugin.address }}')" class="nav-item">
{{ plugin.name }}
<template x-if="`{{plugin.name | e}}` === 'fieldmanual'">
<sup><em class="fas fa-external-link-alt pl-1 is-size-7"></em></sup>
</template>
</a>
</li>
{% endfor %}
</ul>
<p class="menu-label nav-header"><em class="fas fa-cog pr-2"></em></em>Configuration</p>
<ul class="menu-list">
<li><a href="#home" class="nav-item" x-on:click="addTab('fact sources', '/advanced/sources')">fact sources</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('objectives', '/advanced/objectives')">objectives</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('planners', '/advanced/planners')">planners</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('contacts', '/advanced/contacts')">contacts</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('obfuscators', '/advanced/obfuscators')">obfuscators</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('configuration', '/advanced/configurations')">configuration</a></li>
<li><a href="#home" class="nav-item" x-on:click="addTab('exfilled files', '/advanced/exfills')">exfilled files</a></li>
<li><a href="./api/docs" target="_blank">
api docs
<sup><em class="fas fa-external-link-alt pl-1 is-size-7"></em></sup></a>
</li>
</ul>
<br>
<ul class="menu-list has-text-centered">
<li>
<a href="/logout">
<span class="icon"><em class="fas fa-sign-out-alt"></em></span>
<span>Log out</span>
</a>
</li>
</ul>
</aside>
</div>
<div class="main-content">
<div class="tabs nav is-boxed">
<ul>
<template x-for="(tab, index) in openTabs" :key="index">
<li x-bind:class="{ 'is-active' : activeTabIndex === index }">
<a x-on:click="activeTabIndex = index">
<span x-text="tab.name"></span>
<span class="icon is-small tab-delete" x-on:click.stop="deleteTab(index, tab.contentID)"><em class="fas fa-sm fa-times"></em></span>
</a>
</li>
</template>
</ul>
</div>
<div id="active-tab-display" class="container content"></div>
<div id="no-open-tabs" x-show="openTabs.length === 0">
<p>
Select a tab on the left to get started
</p>
<p>
<a href="docs/Getting-started.html" target="blank">Getting Started Guide</a>
</p>
</div>
</div>
<div x-bind:class="{ 'is-active': showErrors }" class="modal">
<div class="modal-background" @click="showErrors = false"></div>
<div class="modal-card">
<div>
<header class="modal-card-head">
<h2>Startup Messages</h2>
</header>
<section class="modal-card-body">
<div class="modal-form">
<template x-if="!errors || errors.length < 1">
<div class="is-flex is-justify-content-center">
<em>No startup messages.</em>
</div>
</template>
<template x-for="error of errors" :key="error.msg">
<article class="media">
<div class="media-content">
<div class="content">
<p>
<span class="is-flex">
<strong x-text="error.name" class="mr-2"></strong>
<span class="tag" x-show="error.optional">Optional</span>
</span>
<span x-text="error.msg"></span>
</p>
</div>
</div>
</article>
</template>
</div>
</section>
</div>
<footer class="modal-card-foot">
<button class="button is-primary is-small is-fullwidth" @click="showErrors = false">Close</button>
</footer>
</div>
</div>
<div x-bind:class="{ 'is-active': isFirstVisit }" class="modal">
<div class="modal-background" @click="isFirstVisit = false"></div>
<div class="modal-card">
<div>
<header class="modal-card-head">
<h2>Welcome to Caldera!</h2>
</header>
<section class="modal-card-body">
<div class="block">
<label class="label">📚 Learn</label>
<div class="is-flex is-justify-content-space-between">
<p>
Never used Caldera before? The User Certificate in the training plugin will walk you through all
the capabilities of the platform in hands-on, capture-the-flag style exercises.
</p>
<button class="button is-small is-primary" @click="addTab('training', '/plugin/training/gui'); isFirstVisit = false">Start Training</button>
</div>
</div>
<div class="block">
<label class="label">📖 Documentation</label>
<div class="is-flex is-justify-content-space-between">
<p>
Get familiar with all of Caldera's capabilities, terminology, and plugins.
</p>
<a class="button is-small is-primary" target="_blank" href="/docs/index.html">Read the Docs</a>
</div>
</div>
<div class="block">
<label class="label">📬 Get in touch</label>
<div class="buttons">
<a class="button is-small is-primary" target="_blank" rel="noopener" href="https://join.slack.com/t/mitre-caldera/shared_invite/zt-rvngjjpw-OQHAqpUT87DcyClTosF8dQ">
<span class="icon"><em class="fab fa-slack"></em></span>
<span>Join our Slack</span>
</a>
<a class="button is-small" href="mailto:caldera@mitre.org">
<span class="icon"><em class="far fa-envelope"></em></span>
<span>Email us</span>
</a>
</div>
</div>
</section>
</div>
<footer class="modal-card-foot">
<button class="button fancy-button is-small is-fullwidth" @click="isFirstVisit = false">🚀 Get started</button>
</footer>
</div>
</div>
</main>
<script>
let startupErrors = JSON.parse('{{ errors | tojson }}');
</script>
<script src="/gui/jquery/jquery.js"></script>
<script src="/gui/jquery/jquery.multi-select.js"></script>
<script src="/gui/js/shared.js"></script>
<script src="/gui/js/core.js"></script>
<script defer src="/gui/js/lib/alpine.min.js"></script>
<script src="/gui/js/lib/bulma-toast.min.js"></script>
<script src="/gui/js/lib/confetti.browser.min.js"></script>
</body>
</html>