server/frontend/static/public.html

336 lines
16 KiB
HTML
Raw Normal View History

2016-01-25 02:09:22 +00:00
<!DOCTYPE html>
<html ng-app="FICApp">
<head>
<meta charset="utf-8">
2016-10-13 17:11:34 +00:00
<title>Challenge Forensic</title>
2017-12-14 03:08:43 +00:00
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
2016-01-25 02:09:22 +00:00
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<base href="/">
2017-12-14 03:08:43 +00:00
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
2017-12-17 16:12:51 +00:00
<link href="/css/glyphicon.css" type="text/css" rel="stylesheet" media="screen">
2017-12-14 03:08:43 +00:00
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
2016-01-25 02:09:22 +00:00
<script src="/js/angular.min.js"></script>
</head>
2017-12-17 19:44:23 +00:00
<body class="bg-light bg-public" style="overflow: hidden;" class="container-fluid" ng-controller="DataController">
2017-12-14 03:08:43 +00:00
<div class="row" style="margin:10px 0">
<div class="col-8">
2017-03-31 17:47:48 +00:00
<noscript>
<div class="alert alert-danger">
<strong>Veuillez activer le JavaScript.</strong> Ce site requiert un navigateur interprêtant le JavaScript pour fonctionner. Veuillez l'activer ou en télécharger un supportant cette technologie.
2017-01-15 22:56:28 +00:00
</div>
2017-03-31 17:47:48 +00:00
</noscript>
2016-01-25 02:09:22 +00:00
2017-12-17 15:07:04 +00:00
<div ng-repeat="(k,s) in scene" class="repeatedd-item" style="margin-bottom: 15px;">
2016-01-25 02:09:22 +00:00
2017-12-17 19:44:23 +00:00
<div class="card" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'teams'">
<div class="card-body text-light">
2017-12-17 19:44:23 +00:00
<h1 ng-if="!s.params.notitle">Bienvenue au challenge forensic&nbsp;!</h1>
2017-12-14 03:08:43 +00:00
<p class="lead text-justify">
Avant de vous installer, venez récupérer votre clef USB auprès
de notre équipe. Elle contient le certificat qui vous permettra
de vous authentifier auprès de notre serveur.
</p>
<p class="lead text-justify">
Une fois connecté au réseau, contactez notre serveur sur&nbsp;:
<span style="display: block; font-size: 200%" class="text-center">
<a style="font-family: mono" href="https://fic.srs.epita.fr/"><span class="text-info">https://fic.srs.epita.fr/</span></a>
</span>
</p>
</div>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-17 19:44:23 +00:00
<div class="card border-{{s.params.color}}" ng-if="s.type == 'countdown' && !s.params.hide">
<div class="card-header bg-{{s.params.color}} text-light" ng-if="s.params.title">
2017-12-17 19:44:23 +00:00
<h3 style="margin:0"><strong ng-bind="s.params.title"></strong></h3>
</div>
<div ng-controller="CountdownController" ng-init="s.params.end?init(s.params.end):initT(startAt)">
<div class="card-body text-center" style="font-size: 450%;" ng-if="duration > 0">{{ duration / 60 | time }} <span class="point">:</span> {{ duration % 60 | time }}</div>
<div class="card-body text-center" style="font-size: 450%;" ng-if="!duration || duration <= 0">{{ s.params.lead }}</div>
2016-01-25 02:09:22 +00:00
</div>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-14 03:08:43 +00:00
<div class="card" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'public'">
<div class="card-body text-light">
2017-12-17 19:44:23 +00:00
<h1 ng-if="!s.params.notitle">Bienvenue au challenge forensic&nbsp;!</h1>
2017-12-14 03:08:43 +00:00
<p class="lead text-justify">
Durant ce challenge, les équipes doivent <strong>remonter des scénarii
d'attaques</strong> auxquels nos systèmes d'information <strong>font face
2017-12-14 03:08:43 +00:00
chaque jour</strong> : fuite de données, compromission d'un poste de
travail, exploitation de vulnérabilités d'un site web, ...
</p>
<p class="lead text-justify">
Pour valider un challenge, chaque participant va télécharger :
soit des <strong>journaux d'évènements</strong>, des extraits de trafic réseau
ou même des <strong>copies</strong> figées <strong>de la mémoire vive</strong> de machines
malveillantes, pour <strong>essayer de comprendre</strong> comment l'attaquant a
<strong>contourné la sécurité</strong> de la machine et quelles actions hostiles
ont été effectuées.
</p>
</div>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-14 03:08:43 +00:00
<div class="card" ng-if="s.type == 'message' && !s.params.hide">
<div class="card-body text-light">
2017-12-17 19:44:23 +00:00
<h1 ng-if="s.params.title"><strong ng-bind="s.params.title"></strong></h1>
<p ng-if="s.params.lead" class="lead text-justify" ng-bind="s.params.lead"></p>
2017-12-14 03:08:43 +00:00
<p ng-bind-html="s.params.html" ng-if="s.params.html"></p>
2017-12-17 19:44:23 +00:00
<p ng-if="s.params.text" ng-bind="s.params.text"></p>
2017-12-14 03:08:43 +00:00
</div>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-17 19:44:23 +00:00
<div class="card border-{{ s.params.color }}" ng-if="s.type == 'panel' && !s.params.hide">
<div class="card-header bg-{{ s.params.color }} text-white" ng-if="s.params.title">
<h3 style="margin:0" ng-bind="s.params.title"></h3>
</div>
<div class="card-body text-light" ng-if="s.params.text || s.params.lead">
2017-12-17 19:44:23 +00:00
<h4 ng-if="s.params.lead" class="card-title text-justify" ng-bind="s.params.lead"></h4>
<p class="card-text" ng-bind="s.params.text"></p>
2016-01-25 02:09:22 +00:00
</div>
<div class="card-body text-light" ng-if="s.params.html" ng-bind-html="s.params.html"></div>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-14 03:08:43 +00:00
<div class="card" ng-if="s.type == 'exercice' && !s.params.hide">
<div class="card-body text-light">
2017-12-14 03:08:43 +00:00
<p class="lead">
<strong>Challenge <em>{{ themes[my.exercices[s.params.exercice].theme_id].exercices[s.params.exercice].title }}</em> du thème {{ themes[my.exercices[s.params.exercice].theme_id].name }}</strong>
<small class="authors" ng-if="themes[my.exercices[s.params.exercice].theme_id].authors">par {{ themes[my.exercices[s.params.exercice].theme_id].authors }}</small>
</p>
<p ng-bind-html="my.exercices[s.params.exercice].statement"></p>
2018-01-23 02:54:20 +00:00
<ul class="list-inline text-secondary">
2017-12-14 03:08:43 +00:00
<li>Rapporte <ng-pluralize count="themes[my.exercices[s.params.exercice].theme_id].exercices[s.params.exercice].gain" when="{'0': 'aucun point', 'one': '{} point', 'other': '{} points'}"></ng-pluralize></li>
2018-01-23 02:54:20 +00:00
<li ng-if="my.exercices[s.params.exercice].files"><ng-pluralize count="my.exercices[s.params.exercice].files.length" when="{'0': 'Aucun fichier disponible', 'one': '{} fichier disponible', 'other': '{} fichiers disponibles'}"></ng-pluralize></li>
2017-12-14 03:08:43 +00:00
<li ng-if="my.exercices[s.params.exercice].hints.length"><ng-pluralize count="my.exercices[s.params.exercice].hints.length" when="{'0': 'Aucun indice disponible', 'one': '{} indice disponible', 'other': '{} indices disponibles'}"></ng-pluralize></li>
<li>Tenté par <ng-pluralize count="themes[my.exercices[s.params.exercice].theme_id].exercices[s.params.exercice].tried" when="{'0': 'aucune équipe', 'one': '{} équipe', 'other': '{} équipes'}"></ng-pluralize></li>
2018-01-23 02:54:20 +00:00
<li ng-if="my.exercices[s.params.exercice].tries"><ng-pluralize count="my.exercices[s.params.exercice].tries" when="{'0': 'Aucune tentative', 'one': '{} tentative', 'other': '{} tentatives'}"></ng-pluralize></li>
2017-12-14 03:08:43 +00:00
<li>Résolu par <ng-pluralize count="themes[my.exercices[s.params.exercice].theme_id].exercices[s.params.exercice].solved" when="{'0': 'aucune équipe', 'one': '{} équipe', 'other': '{} équipes'}"></ng-pluralize></li>
</ul>
</div>
2017-03-31 17:47:48 +00:00
</div>
2017-12-17 19:44:23 +00:00
<div ng-if="s.type == 'table' && !s.params.hide">
<table class="table table-striped table-sm">
2016-01-25 02:09:22 +00:00
<thead>
2017-12-17 19:44:23 +00:00
<tr class="text-light">
2017-03-31 17:47:48 +00:00
<th class="frotated"></th>
2017-12-17 19:44:23 +00:00
<th class="rotated" ng-repeat="(tid,th) in themes" ng-if="s.params.themes.indexOf(tid-0) !== -1"><div class="bg-dark"><span>{{ th.name }}</span></div></th>
2016-01-25 02:09:22 +00:00
</tr>
</thead>
2017-12-17 19:44:23 +00:00
<tbody class="table-bordered bg-secondary text-dark" ng-if="s.params.kind == 'levels'">
<tr ng-repeat="lvl in s.params.levels">
2018-01-26 11:01:05 +00:00
<th class="text-center"><nobr>Challenge {{ lvl }}</nobr></th>
2017-03-31 17:47:48 +00:00
<td ng-repeat="(tid,th) in themes" class="text-center" ng-if="s.params.themes.indexOf(tid-0) !== -1">
<span ng-repeat="exercice in th.exercices" ng-if="$index == lvl-1 && (exercice.tried || lvl == 1)" ng-class="{'text-primary': exercice.solved == 0, 'text-success': exercice.solved >= 1, 'text-bold': exercice.solved >= 1, 'text-warning': exercice.solved == 0 && exercice.tried}">
<span ng-if="exercice.solved">{{ exercice.solved }}</span>
<span ng-if="!exercice.solved">{{ exercice.tried }}</span>
</span>
</td>
2016-01-25 02:09:22 +00:00
</tr>
</tbody>
2017-12-17 19:44:23 +00:00
<tbody class="table-bordered bg-secondary text-dark" ng-if="s.params.kind == 'teams'">
2017-03-31 17:47:48 +00:00
<tr ng-repeat="team in rank | orderBy: 'rank' | limitTo: s.params.limit: s.params.begin" ng-if="s.params.teams.indexOf(team.id-0) !== -1" ng-controller="TeamController">
<th class="text-center">{{ team.rank }}<sup ng-if="team.rank == 1">er</sup><sup ng-if="team.rank > 1">e</sup><br><span style="text-overflow: ellipsis; display: inline-block; width: 82px;overflow: hidden;">{{ team.name }}</span></th>
<td ng-repeat="(tid,th) in themes" class="text-center" ng-if="mystats && s.params.themes.indexOf(tid-0) !== -1">
<span ng-class="{'text-success': mystats.themes[tid].solved}">{{ mystats.themes[tid].solved }}/{{ mystats.themes[tid].total }}</span>
<span ng-class="{'text-warning': mystats.themes[tid].solved < mystats.themes[tid].tried}">({{ mystats.themes[tid].tries }})</span>
</td>
</tr>
</tbody>
<tfoot ng-if="s.params.total" ng-init="team={id:0}">
<tr ng-controller="TeamController">
2017-12-17 19:44:23 +00:00
<td class="text-right text-dark">
2017-03-31 17:47:48 +00:00
<span ng-if="s.params.kind == 'levels'">Résolus</span>
<span ng-if="s.params.kind == 'teams'">Total résolus</span><br>
Tentatives
</td>
2017-12-17 19:44:23 +00:00
<td class="table-bordered bg-dark" ng-repeat="(tid,th) in themes" class="text-center" ng-if="mystats && s.params.themes.indexOf(tid-0) !== -1">
2017-03-31 17:47:48 +00:00
<strong>{{ mystats.themes[tid].solved }}</strong><br>
{{ mystats.themes[tid].tries }}
</td>
</tr>
</tfoot>
2016-01-25 02:09:22 +00:00
</table>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-14 03:08:43 +00:00
<div class="card" ng-if="s.type == 'rank' && !s.params.hide">
2017-12-17 15:07:04 +00:00
<table class="table table-bordered table-striped table-sm">
2017-12-17 19:44:23 +00:00
<thead class="thead-dark">
2016-01-25 02:09:22 +00:00
<tr>
<th class="text-right">Place</th>
<th>Équipe</th>
<th>Score</th>
</tr>
</thead>
2017-03-31 17:47:48 +00:00
<tbody ng-if="s.params.which == 'general'">
<tr ng-repeat="r in rank | orderBy: 'rank' | limitTo: s.params.limit: s.params.begin">
<th class="text-right">{{ r.rank }}<sup ng-if="r.rank == 1">er</sup><sup ng-if="r.rank > 1">e</sup></th>
2016-01-25 02:09:22 +00:00
<td>{{ r.name }}</td>
<td>{{ r.score }}</td>
</tr>
</tbody>
</table>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
<div class="card" ng-if="s.type == 'themes' && !s.params.hide">
<div class="card-header bg-{{ s.params.color }} text-white" ng-if="s.params.title">
<h3 style="margin:0" ng-bind="s.params.title" class="text-dark" ng-if="s.params.color == 'light'"></h3>
<h3 style="margin:0" ng-bind="s.params.title" ng-if="s.params.color != 'light'"></h3>
</div>
<div class="card-body bg-primary" autocarousel>
<div class="carousel slide" id="carouselThemes" data-interval="30000" style="height: 270px">
<ol class="carousel-indicators">
<li data-target="#carouselThemes" data-slide-to="{{k}}" ng-repeat="(k, theme) in themes" ng-class="{active: $first}"></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item" ng-repeat="theme in themes" ng-class="{active: $first}">
<div class="carousel-caption">
<h3 class="text-left" style="margin: 10px" ng-bind="theme.name"></h3>
<p class="text-justify text-bold" style="padding: 5px 16px; font-size: 111%" ng-bind="theme.intro"></p>
</div>
</div>
</div>
</div>
</div>
</div>
2016-01-25 02:09:22 +00:00
</div>
2017-03-31 17:47:48 +00:00
</div>
2016-01-25 02:09:22 +00:00
2017-12-14 03:08:43 +00:00
<div class="col-4">
2016-01-25 02:09:22 +00:00
2017-03-31 17:47:48 +00:00
<div ng-controller="EventsController">
<div ng-repeat="e in events | limitTo: 7" class="repeated-item">
2016-01-25 02:09:22 +00:00
<div class="alert" ng-class="e.kind">
<div class="heading">{{ e.since | since }}</div>
<span ng-bind-html="e.txt"></span>
</div>
</div>
2017-12-17 15:07:04 +00:00
<div style="box-shadow: 0px -5px 5px 5px #e9ecef; position: fixed; bottom: calc(14vh - 1px); right: 0; width: 33vw;" class="navbar bg-light" ng-controller="TimeController">
2017-11-10 19:23:08 +00:00
<div class="text-center" ng-if="time.hours === 0 || time.hours" style="margin-top: -5px;">
2017-03-31 17:47:48 +00:00
<div id="clock" ng-class="{expired: time.expired, end: time.end}" style="font-size: 50px" ng-cloak>
<span id="hours">{{ time.hours | time }}</span>
<span class="point">:</span>
<span id="min">{{ time.minutes | time }}</span>
<span class="point">:</span>
<span id="sec">{{ time.seconds | time }}</span>
</div>
<div style="font-size: 18px; margin-top: -15px; text-shadow: 0 0 6px #446688;">
<span ng-if="!time.end && time.duration != time.remaining">Temps restant du challenge forensic</span>
<span ng-if="!time.end && time.duration == time.remaining">Le challenge forensic va bientôt commencer&nbsp;!</span>
<span ng-if="time.end">Le challenge forensic est terminé&nbsp;!</span>
</div>
</div>
<div id="clock" class="col-sm-6" ng-if="!(time.hours === 0 || time.hours)">
{{ time.start | date:"shortDate" }}
</div>
</div>
2017-12-14 03:08:43 +00:00
<div style="position: fixed; bottom: 0; right: 0; width: 33vw; height: 14vh" class="bg-primary">
<div class="carousel slide" id="carousel-logos" data-ride="carousel" data-interval="10500">
2017-03-31 17:47:48 +00:00
<div class="carousel-inner">
2017-12-17 19:44:23 +00:00
<div class="carousel-item">
2017-03-31 17:47:48 +00:00
<div class="carousel-caption">
2017-12-14 03:08:43 +00:00
<a href="http://www.epita.fr/"><img src="/img/epita.png" alt="Epita" style="max-height:14vh"></a>
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="height:14vh">
2017-03-31 17:47:48 +00:00
</div>
</div>
<div class="carousel-item active">
2017-12-14 03:08:43 +00:00
<div class="carousel-caption">
2017-12-17 19:44:23 +00:00
<h2 style="margin: 17px">Bienvenue au challenge forensic&nbsp;!</h2>
2017-03-31 17:47:48 +00:00
</div>
</div>
2017-12-14 03:08:43 +00:00
<div class="carousel-item">
2017-03-31 17:47:48 +00:00
<div class="carousel-caption">
2017-12-14 03:08:43 +00:00
<p class="text-justify text-bold" style="padding: 5px 16px; font-size: 111%">
2017-03-31 17:47:48 +00:00
Ce challenge met en scène des scénarii d'attaques auxquels
nos systèmes d'information font face chaque jour.
2017-03-31 17:47:48 +00:00
</p>
</div>
</div>
2017-12-14 03:08:43 +00:00
<div class="carousel-item">
2017-03-31 17:47:48 +00:00
<div class="carousel-caption">
<p class="text-justify text-bold" style="padding: 20px 16px; font-size: 111%">
Les 42 équipes doivent, en 4 heures, retracer les attaques à la
recherche des données exfiltrées.
</p>
</div>
</div>
2017-12-14 03:08:43 +00:00
<div class="carousel-item">
<div class="carousel-caption row" style="padding: 10px">
<div class="col-4">
<a href="https://srs.epita.fr/"><img src="/img/srs.png" alt="Laboratoire SRS" style="height:12vh"></a>
2017-03-31 17:47:48 +00:00
</div>
2017-12-14 03:08:43 +00:00
<p class="col-8 text-bold" style="font-size: 111%">
2017-03-31 17:47:48 +00:00
Les challenges ont été réalisés par les étudiants de la
2017-12-14 03:08:43 +00:00
spécialisation SRS de l'Épita.
2017-03-31 17:47:48 +00:00
</p>
</div>
</div>
2017-12-14 03:08:43 +00:00
<div class="carousel-item">
2017-03-31 17:47:48 +00:00
<div class="carousel-caption row" style="padding: 12px">
2017-12-14 03:08:43 +00:00
<div class="col-4">
2017-03-31 17:47:48 +00:00
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="max-width:100%; max-height: 11vh">
</div>
2017-12-14 03:08:43 +00:00
<p class="col-8 text-bold" style="padding: 10px 10px 10px 0; font-size: 111%">
2018-01-26 10:57:43 +00:00
Avec le parrainage de la Réserve de Cyberdéfense
2017-03-31 17:47:48 +00:00
</p>
</div>
</div>
<div class="carousel-item">
2017-12-17 19:44:23 +00:00
<div class="carousel-caption">
<table class="table table-sm table-striped">
2017-03-31 17:47:48 +00:00
<tbody>
<tr>
<td>11&nbsp;h</td>
<td>Accueil des équipes</td>
</tr>
<tr>
<td>11&nbsp;h&nbsp;30</td>
<td>Début du challenge</td>
</tr>
<tr>
<td>15&nbsp;h&nbsp;30</td>
<td>Fin du challenge</td>
</tr>
<tr>
<td>16&nbsp;h&nbsp;00</td>
<td>Remise des prix</td>
</tr>
</tbody>
</table>
</div>
</div>
2017-12-14 03:08:43 +00:00
<div class="carousel-item">
2017-03-31 17:47:48 +00:00
<div class="carousel-caption row" style="padding: 12px">
2017-12-14 03:08:43 +00:00
<p class="text-bold" style="padding: 5px;">
Retrouvez les solutions des challenges dès demain sur :
2017-03-31 17:47:48 +00:00
<span style="display: block; font-size: 150%" class="text-center">
<a style="font-family: mono" href="https://fic.srs.epita.fr/"><span class="text-info">https://fic.srs.epita.fr/</span></a>
</span>
</p>
</div>
</div>
</div>
</div>
</div>
2016-01-25 02:09:22 +00:00
</div>
</div>
</div>
<script src="/js/jquery.min.js"></script>
2017-12-14 03:08:43 +00:00
<script src="/js/popper.min.js"></script>
2016-01-25 02:09:22 +00:00
<script src="/js/bootstrap.min.js"></script>
<script src="/js/angular-animate.min.js"></script>
<script src="/js/angular-route.min.js"></script>
<script src="/js/angular-sanitize.min.js"></script>
2016-10-13 17:34:53 +00:00
<script src="/js/i18n/angular-locale_fr-fr.js"></script>
2016-01-25 02:09:22 +00:00
<script src="/js/public.js"></script>
<script src="/js/common.js"></script>
2016-01-25 02:09:22 +00:00
</body>
</html>