312 lines
14 KiB
HTML
312 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html ng-app="FICApp">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Challenge Forensic</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
|
|
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
|
|
|
|
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
|
<!--[if lt IE 9]>
|
|
<script src="/assets/js/html5shiv.js"></script>
|
|
<script src="/assets/js/respond.min.js"></script>
|
|
<![endif]-->
|
|
|
|
<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="/">
|
|
<script src="/js/angular.min.js"></script>
|
|
</head>
|
|
<body style="overflow: hidden;" class="container-fluid" ng-controller="DataController">
|
|
<div class="row" style="margin-top: 10px">
|
|
<div class="col-xs-8">
|
|
<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.
|
|
</div>
|
|
</noscript>
|
|
|
|
<div ng-repeat="(k,s) in scene" class="repeatedd-item">
|
|
|
|
<div class="well" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'init'">
|
|
<h1>Bienvenue au challenge forensic !</h1>
|
|
<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 :
|
|
<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>
|
|
|
|
<div class="panel panel-success" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'countdown'">
|
|
<div class="panel-heading">
|
|
<h3 class="panel-title"><strong>Le challenge forensic 2017 est sur le point de commencer !</strong></h3>
|
|
</div>
|
|
<div class="panel-body text-center" style="font-size: 450%;" ng-if="startIn">{{ startIn }}</div>
|
|
<div class="panel-body text-center" style="font-size: 450%;" ng-if="!startIn">Go, go, go !</div>
|
|
</div>
|
|
|
|
<div class="well" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'public'">
|
|
<h1>Bienvenue au challenge forensic !</h1>
|
|
<p class="lead text-justify">
|
|
Durant ce challenge, les équipes doivent remonter des scénarii
|
|
d'attaques auxquels nos systèmes d'information font faces
|
|
chaque jour : 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 journaux d'évènements, des extraits de trafic réseau
|
|
ou même des copies figées de la mémoire vive de machines
|
|
malveillantes, pour essayer de comprendre comment l'attaquant a
|
|
contourné la sécurité de la machine et quelles actions hostiles
|
|
ont été effectuées.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="well" ng-if="s.type == 'message' && !s.params.hide">
|
|
<h1 ng-if="s.params.title"><strong>{{ s.params.title }}</strong></h1>
|
|
<p ng-if="s.params.lead" class="lead text-justify">{{ s.params.lead }}</p>
|
|
<p ng-bind-html="s.params.html" ng-if="s.params.html"></p>
|
|
<p ng-if="s.params.text">{{ s.params.text }}</p>
|
|
</div>
|
|
|
|
<div class="panel {{ s.params.kind }}" ng-if="s.type == 'panel' && !s.params.hide">
|
|
<div class="panel-heading" ng-if="s.params.title">
|
|
<h3 class="panel-title">{{ s.params.title }}</h3>
|
|
</div>
|
|
<div class="panel-body" ng-if="s.params.text">{{ s.params.text }}</div>
|
|
<div class="panel-body" ng-if="s.params.html" ng-bind-html="s.params.html"></div>
|
|
</div>
|
|
|
|
<div class="well" ng-if="s.type == 'exercice' && !s.params.hide">
|
|
<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>
|
|
<ul class="list-inline">
|
|
<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>
|
|
<li><ng-pluralize count="my.exercices[s.params.exercice].files.length" when="{'0': 'Aucun fichier disponible', 'one': '{} fichier disponible', 'other': '{} fichiers disponibles'}"></ng-pluralize></li>
|
|
<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>
|
|
<li><ng-pluralize count="my.exercices[s.params.exercice].solved_number" when="{'0': 'aucun tentative', 'one': '{} tentative', 'other': '{} tentatives'}"></ng-pluralize></li>
|
|
<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>
|
|
|
|
<div class="panel" ng-if="s.type == 'table' && !s.params.hide">
|
|
<table class="table table-bordered table-striped table-condensed">
|
|
<thead>
|
|
<tr>
|
|
<th class="frotated"></th>
|
|
<th class="rotated" ng-repeat="(tid,th) in themes" ng-if="s.params.themes.indexOf(tid-0) !== -1"><div><span>{{ th.name }}</span></div></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody ng-if="s.params.kind == 'levels'">
|
|
<tr ng-repeat="lvl in [1,2,3,4,5]">
|
|
<th class="text-center"><nobr>Niveau {{ lvl }}</nobr></th>
|
|
<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>
|
|
</tr>
|
|
</tbody>
|
|
<tbody ng-if="s.params.kind == 'teams'">
|
|
<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">
|
|
<td class="text-right">
|
|
<span ng-if="s.params.kind == 'levels'">Résolus</span>
|
|
<span ng-if="s.params.kind == 'teams'">Total résolus</span><br>
|
|
Tentatives
|
|
</td>
|
|
<td ng-repeat="(tid,th) in themes" class="text-center" ng-if="mystats && s.params.themes.indexOf(tid-0) !== -1">
|
|
<strong>{{ mystats.themes[tid].solved }}</strong><br>
|
|
{{ mystats.themes[tid].tries }}
|
|
</td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="panel" ng-if="s.type == 'rank' && !s.params.hide">
|
|
<table class="table table-bordered table-striped table-condensed">
|
|
<thead>
|
|
<tr>
|
|
<th class="text-right">Place</th>
|
|
<th>Équipe</th>
|
|
<th>Score</th>
|
|
</tr>
|
|
</thead>
|
|
<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>
|
|
<td>{{ r.name }}</td>
|
|
<td>{{ r.score }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-xs-4">
|
|
|
|
<div ng-controller="EventsController">
|
|
<div ng-repeat="e in events | limitTo: 7" class="repeated-item">
|
|
<div class="alert" ng-class="e.kind">
|
|
<div class="heading">{{ e.since | since }}</div>
|
|
<span ng-bind-html="e.txt"></span>
|
|
</div>
|
|
</div>
|
|
|
|
<div style="box-shadow: 0px -5px 5px 5px #272b30; position: fixed; bottom: calc(14vh - 1px); right: 0; width: 33vw;" class="navbar navbar-inverse">
|
|
<div class="text-center" ng-if="time.hours === 0 || time.hours" style="margin-top: -5px;" ng-controller="TimeController">
|
|
<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 !</span>
|
|
<span ng-if="time.end">Le challenge forensic est terminé !</span>
|
|
</div>
|
|
</div>
|
|
<div id="clock" class="col-sm-6" ng-if="!(time.hours === 0 || time.hours)">
|
|
{{ time.start | date:"shortDate" }}
|
|
</div>
|
|
</div>
|
|
|
|
<div style="position: fixed; bottom: 0; right: 0; width: 33vw; height: 14vh" class="navbar navbar-inverse">
|
|
<div class="carousel slide" id="carousel-logos" data-ride="carousel">
|
|
<div class="carousel-inner">
|
|
<div class="item active">
|
|
<div class="carousel-caption">
|
|
<a href="http://www.epita.fr/"><img src="/img/epita.png" alt="Epita" style="width:30%"></a>
|
|
<a href="https://srs.epita.fr/"><img src="/img/srs.png" alt="Laboratoire SRS" style="width:30%"></a>
|
|
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="width:30%">
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="carousel-caption" style="padding: 0 10px">
|
|
<h2>Bienvenue au challenge forensic !</h2>
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="carousel-caption">
|
|
<p class="text-justify text-bold" style="padding: 20px 16px; font-size: 111%">
|
|
Ce challenge met en scène des scénarii d'attaques auxquels
|
|
nos systèmes d'information font faces chaque jour.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<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>
|
|
<div class="item">
|
|
<div class="carousel-caption row" style="padding: 12px">
|
|
<div class="col-xs-4">
|
|
<a href="https://www.epita.fr/"><img src="/img/epita.png" alt="Épita" style="height: 10vh"></a>
|
|
</div>
|
|
<p class="col-xs-8 text-bold" style="font-size: 111%">
|
|
Les challenges ont été réalisés par les étudiants de la
|
|
spécialisation SRS de l'Épita
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="carousel-caption row" style="padding: 12px">
|
|
<div class="col-xs-4">
|
|
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="max-width:100%; max-height: 11vh">
|
|
</div>
|
|
<p class="col-xs-8 text-bold" style="padding: 10px 10px 10px 0; font-size: 111%">
|
|
Avec le parrainage du réseau de la Réserve Citoyenne Cyberdéfense
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="carousel-caption" style="padding: 3px 25px; width: 32vw;">
|
|
<table class="table table-bordered table-condensed table-striped">
|
|
<tbody>
|
|
<tr>
|
|
<td>11 h</td>
|
|
<td>Accueil des équipes</td>
|
|
</tr>
|
|
<tr>
|
|
<td>11 h 30</td>
|
|
<td>Début du challenge</td>
|
|
</tr>
|
|
<tr>
|
|
<td>15 h 30</td>
|
|
<td>Fin du challenge</td>
|
|
</tr>
|
|
<tr>
|
|
<td>16 h 00</td>
|
|
<td>Remise des prix</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="carousel-caption row" style="padding: 12px">
|
|
<p class="text-bold" style="padding: 5px; font-size: 105%">
|
|
Retrouvez la correction des challenges dès demain sur :
|
|
<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>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script src="/js/jquery.min.js"></script>
|
|
<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>
|
|
<script src="/js/i18n/angular-locale_fr-fr.js"></script>
|
|
<script src="/js/public.js"></script>
|
|
<script src="/js/common.js"></script>
|
|
<script>
|
|
$(".carousel").carousel({
|
|
interval: 21000
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|