Title: ZZ2 F5 - Securité logicielle - sécurité des applications web
Date: 2019-11-20 10:55
Category: <i class='fa fa-graduation-cap' aria-hidden='true'></i> &Eacute;tudiants
Tags: cours

[TOC]

## Contexte

* [Souveraineté](slides/privacy/sovereignty.html)
* [Mots de passes](slides/privacy/passwords.html)
* [HTTP](slides/1337/http.html)
* [HTTPS](slides/privacy/tls.html#/0/52)
* [JS](slides/1337/js.html)
* [tracking](slides/privacy/tracking.html)

## Pentesting

* [Collecter](slides/1337/gathering.html)
* [Détecter](slides/1337/detecting.html)
    * [Heartbleed](slides/1337/heartbleed.html)

## Mécanisme

* [Authentification](slides/1337/authentication.html)

## Vulnérabilités communes

* [Command execution](slides/1337/cmdi.html)
    * [Shellshock](slides/1337/shellshock.html)
* [Upload](slides/1337/upload.html)
* [LFI_RFI](slides/1337/fi.html)
* [XSS](slides/1337/xss.html)
* [CSRF](slides/1337/csrf.html)
* [SQLi](slides/1337/sqli.html)
    * [Drupalgeddon](slides/1337/drupalgeddon.html)

## Se protéger

* [Top10](slides/1337/top10.html)
* [anticiper](slides/1337/anticiper.html)

<div class="panel panel-success">
  <div class="panel-heading">
    <h3 class="panel-title">FYI</h3>
  </div>
  <div class="panel-body">
    <ul>
      <li>Tous les slides sont fait avec <a href="https://github.com/hakimel/reveal.js">reveal.js</a>
        <ul>
          <li>ils sont exportables en pdf en ajoutant <code>?print-pdf#</code> à l'url (à coller juste après le <code>.html</code>) et en passant par l'impression dans un fichier du navigateur chrome ou (mieux) <a href="https://www.chromium.org/">chromium</a>
            <ul>
              <li>plus de détails sur l'<a href="https://github.com/hakimel/reveal.js/#pdf-export">export PDF de reveal</a></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

## Recréer l'environnement de cours dans VirtualBox

* testé avec [VirtualBox 5.2.18](https://download.virtualbox.org/virtualbox/5.2.18/virtualbox-5.2_5.2.18-124319~Ubuntu~bionic_amd64.deb) sous [Ubuntu Bionic](http://releases.ubuntu.com/bionic/)
  * et les [extensions pack associés](https://download.virtualbox.org/virtualbox/5.2.18/Oracle_VM_VirtualBox_Extension_Pack-5.2.18.vbox-extpack)

```
VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.2.18.vbox-extpack
```

sous windows vous devrez peut être utiliser le path entier de vboxmanage

```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
```

### Créer un réseau NAT

```bash
vboxmanage  natnetwork add --netname natwebsec --network "172.16.76.0/24" --enable --dhcp off
```

### Télécharger les images OVA

voir [https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/](https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/)

```bash
wget https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/files/?p=/debian.ova&dl=1
wget https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/files/?p=/proxy.ova&dl=1
wget https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/files/?p=/kali.ova&dl=1
wget https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/files/?p=/thenetwork.ova&dl=1
wget https://drive.mesocentre.uca.fr/d/69e5535b0b88425396d7/files/?p=/ubuntu-server-18.04.ova&dl=1
```
<div class="panel panel-warning">
  <div class="panel-heading">
    <h3 class="panel-title">FYI</h3>
  </div>
  <div class="panel-body">
    il y a environ 7 Go d'images, n'hésitez pas à vous les faire passer via des clés USB
  </div>
</div>

### Importer les images OVA

```bash
vboxmanage import debian.ova
vboxmanage import proxy.ova
vboxmanage import kali.ova
vboxmanage import thenetwork.ova
vboxmanage ubuntu-server-18.04.ova
```

### Configurer le réseau pour chaque vm

```bash
vboxmanage modifyvm debian --nic1 natnetwork --nat-network1 natwebsec
vboxmanage modifyvm proxy --nic1 natnetwork --nat-network1 natwebsec
vboxmanage modifyvm kali --nic1 natnetwork --nat-network1 natwebsec
vboxmanage modifyvm thenetwork --nic1 natnetwork --nat-network1 natwebsec
vboxmanage modifyvm ubuntu-server-18.04 --nic1 natnetwork --nat-network1 natwebsec
```

![réseau vm](images/etudiants/vm-network.png)

### (optionnel) Mettre en place le port-forwarding sur debian

```bash
vboxmanage natnetwork modify --netname natwebsec --port-forward-4 "ssh:tcp:[127.0.0.1]:1722:[172.16.76.142]:22"
vboxmanage natnetwork modify --netname natwebsec --port-forward-4 "ssh:tcp:[127.0.0.1]:1723:[172.16.76.143]:22"
vboxmanage natnetwork modify --netname natwebsec --port-forward-4 "ssh:tcp:[127.0.0.1]:1724:[172.16.76.144]:22"
vboxmanage natnetwork modify --netname natwebsec --port-forward-4 "ssh:tcp:[127.0.0.1]:1725:[172.16.76.145]:22"
vboxmanage natnetwork modify --netname natwebsec --port-forward-4 "ssh:tcp:[127.0.0.1]:1726:[172.16.76.146]:22"
```

### (optionnel) Se connecter en ssh

```bash
ssh -p 1722 mazenovi@127.0.0.1 #thenetwork
ssh -p 1723 mazenovi@127.0.0.1 #proxy
ssh -p 1724 mazenovi@127.0.0.1 #debian
ssh -p 1725 mazenovi@127.0.0.1 #kali
ssh -p 1726 mazenovi@127.0.0.1 #ubuntu server 18.04
```

## (fix) En cas de réseau injoignable sur proxy et thenetwork

si

```bash
ping 172.16.76.145 # ping sur kali
```

renvoie

```bash
connect: Network is unreachable
```

vérifier le numéro de votre interface réseau

```bash
student@proxy:~$ ifconfig -a

eth2      Link encap:Ethernet  HWaddr 08:00:27:ae:b5:20
          inet adr:172.16.76.143  Bcast:172.16.76.255  Masque:255.255.255.0
          adr inet6: fe80::a00:27ff:feae:b520/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Packets reçus:24 erreurs:0 :0 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000
          Octets reçus:4789 (4.7 KB) Octets transmis:4679 (4.6 KB)

lo        Link encap:Boucle locale
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          Packets reçus:54 erreurs:0 :0 overruns:0 frame:0
          TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0
          Octets reçus:4076 (4.0 KB) Octets transmis:4076 (4.0 KB)
```

par exemple ce numéro peut être eth2 (comme ci dessus) au lieu de eth0

il faut alors modifier le fichier /etc/network/interfaces en fonction

```bash
student@proxy:~$ sudo vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth2
iface eth2 inet static
        address 172.16.76.143
        netmask 255.255.255.0
        gateway 172.16.76.1
```

puis activer l'interface réseau

```bash
student@proxy:~$ sudo ifup eth2
```

réessayer

```bash
ping 172.16.76.145 # ping sur kali
```

Ce bug est dû à la numérotation fantaisiste d'Ubuntu des interfaces réseau ...


## liste des vms / noms de domaine

```
# SecLab
172.16.76.143 proxy secured heart.bleed fo.ol #proxied version of dum.my

172.16.76.144 good.one go.od targ.et
172.16.76.144 mutillid.ae
172.16.76.144 dvwa.com dv.wa
172.16.76.144 d.oc
172.16.76.144 dum.my
172.16.76.144 drup.al hackable-drupal.com drupal
172.16.76.144 wordpre.ss bl.og wp wordpress
172.16.76.144 spip sp.ip
172.16.76.145 bad.guy hack.er 1337.net

172.16.76.142 thenetwork

172.16.76.1   us.er
```

## Evaluation

* Examen écrit en fin de session

* Une présentation d'une des 7 failles suivantes par trinôme

    * [lundi 22/09/2020] Authentification inefficiente ou ressource mal protégée 
        * un objet qui devrait être protégée est accessible sans authentification
        * on peut obtenir une session 
    * [lundi 29/09/2020] Command execution
        * il s'agit d'injecter des commandes systèmes (on empiète pas sur le SQLi)
    * [lundi 6/10/2020] Upload
        * comment exécuter du code arbitraire à partir d'un formulaire d'upload de fichier
    * [lundi 13/10/2020] LFI / RFI
        * injection de paramètre http permettant d'inclure un fichier localement / distant
    * [lundi 20/10/2020] XSS
        * faire exécuter du code javascript arbitraire stocké (stored) ou passé en paramètres dan la requête (reflected)
    * [lundi 03/11/2020] CSRF
        * exécution d'un commande avec privilège à l'insu de l'utilisateur
    * [lundi 17/11/2020] SQLi
        * injection de commandes SQL (les blind sont à traiter)

* Vous pouvez vous organiser avec ce [framacalc](https://lite.framacalc.org/HgFrqMT1eZ)

* Chaque présentation durera 15 minutes et devra présenter 

    * la vulnérabilité
    * l'exploitation de la vulnérabilité
        * l'exploitation d'une vulnérabilité existante dans https://www.cvedetails.com/ est un plus :D
    * un ensemble de solutions permettant de se protéger

* Vous éviterez au maximum de vous aider du support de cours et des exemples qui s'y trouvent (notamment [DVWA](http://www.dvwa.co.uk/)). Si je raconte la même chose que les étudiants qui présentent c'est pas marrant ...



<!-- 
### Projet

#### jwt

Vous implémenterez un exemple de protection d'API REST via [JWT](https://jwt.io/) dans l'un des langages au choix

* php
* nodejs
* python

Vous implémenterez 2 services et un client

* un service de génération et de validation de JWT
* un service accessible via REST avec un JWT valide
* un client capable d'obtenir un JWT et de l'utiliser pour accéder légitimement à l'API REST

Dans un premier temps vous implémenterez des JWT avec mot de passe (chiffrement symétrique)
Dans un second temps vous implémenterez des JWT avec des paires de clés publiques / privées (chiffrement asymétrique)

**N.B.** "l'api rest" peut se résumer à une url /protected qui renvoie un json en méthode GET. L'implémentation d'une API REST ne fait pas parti du sujet!

Dans votre rapport vous analyserez

* les avantages et les inconvénients, notamment au niveau de la sécurité, de chacune des deux approches
* les conséquences des choix d'implémentation sur
    * la validation d'un JWT
    * l'enrolement des clients
    * la gestion d'une compromission côté serveur

#### Rendu

Un repo Gitlab sur [https://gitlab.isima.fr](https://gitlab.isima.fr), par binôme, ayant la forme suivante

* symetric
    * ...
    * README.md
* asymetric
    * ...
    * README.md
* README.md

* symetric/README.md et asymetric/README.md contiennent respectivement la marche à suivre pour pouvoir déployer l'implémentation avec des JWT avec mot de passe et avec des clés publiques / privées

* le fichier README.md contient votre rapport

* vous mettrez l'utilisateur gitlab Vincent Mazenod comme membre en tant que maintainer
* vous m'enverrez l'url du repo dans un message mail chiffré avec GPG
* le tout avant le 22 mars 23h59

#### Critères de notation

* Qualité de l'implémentation, notamment sur l'aspect sécurité (si je passe au travers des sécurités mises en place c'est 0)
* Qualité de la documentation de déploiement (si je n'arrive pas à installer le projet en local sur ma machine c'est 0)
* Qualité de l'analyse (le rapport n'est pas forcément long il s'agit de présenter tous les scénarios d'utilisation et d'attaque en expliquant les avantages et inconvénients de chacune des deux implémentations)

## Mini projet en binôme

* [Enoncé](https://drive.mesocentre.uca.fr/f/d9e76a8e45934a069890/?dl=1)

* [Enoncé](https://drive.mesocentre.uca.fr/f/54bdd1a80c184bbcb63e/?dl=1)

* Rendu le 25/03/2019 à 23h59 dernier délais

    * à [vincent.mazenod@uca.fr](mailto:vincent.mazenod@uca.fr)

      * ```[TP websec]``` dans le sujet du mail ... sinon je vous perds ;)

    * Tous les fichiers nommés en NOMETUDIANT1_NOMETUDIANT2_nomfichier.ext

 -->

## Evaluation du cours

Vous avez aimé ou vous avez détesté ce cours ... [donnez moi votre avis et aidez moi à l'améliorer (en tout anonymat)](https://docs.google.com/forms/d/1zTH-8YIaW6yGxmIasFjQEnMstCnOaWjnZEuM9VHnRlk/prefill)


## See also

* [faire son propre seclab](https://blog.mazenod.fr/faire-son-propre-seclab.html)