« SE5 IdO sécurité des objets 2025/2026 b2 » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
 
(32 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
=<div class="mcwiki-header" style="border-radius: 40px; padding: 15px; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 130%; background: #14164f; vertical-align: top; width: 98%; font-family: 'Poppins', sans-serif;"> Infrastructure Réseau – Infrastructure Réseau </div>=
=<div class="mcwiki-header" style="border-radius: 40px; padding: 15px; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 130%; background: #14164f; vertical-align: top; width: 98%; font-family: 'Poppins', sans-serif;">🌐 TP Infrastructure Réseau 🛜</div>=


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Introduction</span> ==
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Introduction</span> ==
Ligne 9 : Ligne 9 :


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Serveur virtuel (17/09)</span> ==
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Serveur virtuel (17/09)</span> ==
La VM est créée sur **Xen** depuis ''capbreton'' avec une unique interface reliée à **bridgeStudents**, conformément au sujet (routage par **172.26.145.251** côté salles projets).
La VM est créée sur <code>Xen</code> depuis <code>capbreton</code> avec une unique interface reliée à <code>bridgeStudents</code>, conformément au sujet (routage par <code>172.26.145.251</code> côté salles projets).


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Ligne 23 : Ligne 23 :
</syntaxhighlight>
</syntaxhighlight>


; **Pourquoi cette commande ?** 
; Pourquoi cette commande ?
: *`--bridge=bridgeStudents`* impose l’unique attachement réseau demandé ; *`--dist=daedalus`* assure une base Devuan stable (ifupdown classique) ; les ressources (2 Gio RAM/10 Gio disque) suffisent pour DHCP/DNS/NAT.
: <code>--bridge=bridgeStudents</code> impose l’unique attachement réseau demandé ; <code>--dist=daedalus</code> assure une base Devuan stable (<code>ifupdown</code> classique) ; les ressources (2 Gio RAM/10 Gio disque) suffisent pour DHCP/DNS/NAT.


Démarrage et accès console :
Démarrage et accès console :
Ligne 33 : Ligne 33 :


=== Adresse routée (réseau des salles projets) ===
=== Adresse routée (réseau des salles projets) ===
Configuration statique avec passerelle **172.26.145.251**. On choisit une IP libre dans la plage fournie (exemple **172.26.145.100/24**).
Configuration statique avec passerelle <code>172.26.145.251</code>. On choisit une IP libre dans la plage fournie (exemple <code>172.26.145.109/24</code>).


<syntaxhighlight lang="linux-config">
<syntaxhighlight lang="linux-config">
Ligne 42 : Ligne 42 :
auto eth0
auto eth0
iface eth0 inet static
iface eth0 inet static
     address 172.26.145.100/24
     address 172.26.145.109/24
     gateway 172.26.145.251
     gateway 172.26.145.251
     dns-nameservers 1.1.1.1 8.8.8.8
     dns-nameservers 1.1.1.1 8.8.8.8
</syntaxhighlight>
</syntaxhighlight>


; **Pourquoi une IP statique ?** 
; Pourquoi une IP statique ?
: Le sujet exige un adressage maîtrisé côté salles projets et une **route par défaut** vers le routeur NAT de la salle (**.251**). C’est la base pour que la VM accède à Internet et puisse, ensuite, NATer les clients WiFi.
: Le sujet exige un adressage maîtrisé côté salles projets et une route par défaut vers le routeur NAT de la salle. C’est la base pour que la VM accède à Internet et puisse, ensuite, NATer les clients WiFi.


=== Interface privée (VLAN 409) ===
=== Interface privée (VLAN 409) ===
Le réseau privé associé à X=09 est **172.16.9.0/24**. La VM termine ce VLAN avec l’adresse **172.16.9.1/24** (gateway & DNS pour les clients).   
Le réseau privé associé à <code>X=09</code> est <code>172.16.9.0/24</code>. La VM termine ce VLAN avec l’adresse <code>172.16.9.1/24</code> (gateway & DNS pour les clients).   
Dans notre mise en place, l’interface privée est **eth1**.
Dans notre mise en place, l’interface privée est <code>eth1</code>.


<syntaxhighlight lang="linux-config">
<syntaxhighlight lang="linux-config">
Ligne 68 : Ligne 68 :
ping -c3 8.8.8.8
ping -c3 8.8.8.8
</syntaxhighlight>
</syntaxhighlight>
---


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Point d’accès Cisco – SSID WPA2-PSK (29/09)</span> ==
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Point d’accès Cisco – SSID WPA2-PSK (29/09)</span> ==
Connexion **console série** (9600 8N1, sans control flow).   
Connexion '''console série''' (9600 8N1, sans control flow) avec Minicom.   
Après habilitation, création d’un **SSID** attaché au **VLAN 409** et activé sur la radio 2.4 GHz avec chiffrement **AES-CCMP** (WPA2-PSK).
Après habilitation, création d’un SSID attaché au <code>VLAN 409</code>.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Ligne 90 : Ligne 88 :
</syntaxhighlight>
</syntaxhighlight>


; **Pourquoi WPA2/AES ?** 
Nous laissons de cote cette partie car elle n'est pas bloquante pour la suite du TP.
: Le sujet impose **WPA2-PSK**. Le couple *key-management wpa version 2* + *aes-ccm* répond à ce niveau de sécurité. Le VLAN est imposé pour isoler le trafic WiFi.
 
---


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Serveur DHCP (29/09)</span> ==
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Serveur DHCP (29/09)</span> ==
Distribution automatisée d’adresses **172.16.9.100–200** aux clients du VLAN 409, avec **routeur** et **DNS** pointant vers la VM (**172.16.9.1**).
Distribution automatisée d’adresses <code>172.16.9.100–200</code> aux clients du VLAN 409, avec routeur et DNS pointant vers la VM.


Installation :
Installation :
Ligne 117 : Ligne 112 :
}
}
</syntaxhighlight>
</syntaxhighlight>
Interface d’écoute :
<syntaxhighlight lang="linux-config">
# /etc/default/isc-dhcp-server
INTERFACESv4="eth1"
</syntaxhighlight>
; **Pourquoi donner notre DNS en option ?** 
: Pour l’**interception DNS** ultérieure, **tous les clients** doivent interroger **notre** resolveur (172.16.9.1), qui sait à la fois *forwarder* vers Internet et servir **une zone locale de “spoof”**.
---


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Mascarade (NAT) – Accès Internet (29/09)</span> ==
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Mascarade (NAT) – Accès Internet (29/09)</span> ==
Activation du routage IPv4 et **NAT** du réseau **172.16.9.0/24** vers **eth0** (côté salles projets).   
Activation du routage IPv4 et NAT du réseau <code>172.16.9.0/24</code> vers <code>eth0</code>.   
On reproduit le format “affichage TP” (deux règles identiques listées).


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Ligne 144 : Ligne 127 :
</syntaxhighlight>
</syntaxhighlight>


; **Pourquoi la mascarade ?** 
; Pourquoi la mascarade ?  
: Les clients WiFi utilisent des **adresses privées**. Le NAT traduit leurs paquets pour qu’ils sortent avec l’IP de la VM côté salles projets (via la passerelle **172.26.145.251**).   
: Les clients WiFi utilisent des adresses privées. Le NAT traduit leurs paquets pour qu’ils sortent avec l’IP de la VM côté salles projets.   
: Sans NAT, pas d’Internet pour le VLAN 409.
: Sans NAT, pas d’Internet pour le VLAN 409.


Ligne 154 : Ligne 137 :
</syntaxhighlight>
</syntaxhighlight>


---
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Interception de flux (04/10)</span> ==
 
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Interception de flux (30/09)</span> ==


=== <span style="color:#6369e6;font-weight: bold;">Redirection par DNS (zone locale)</span> ===
=== <span style="color:#6369e6;font-weight: bold;">Redirection par DNS (zone locale)</span> ===
On implémente une **zone primaire** sur la VM pour **rediriger `picoctf.org` et tous ses sous-domaines** vers la VM (**172.16.9.1**).   
On implémente une '''zone primaire''' sur la VM pour rediriger <code>picoctf.org</code> et tous ses sous-domaines vers la VM.   
Service **BIND** sous Devuan : *nom de service systemd = `named`*.
Service '''BIND''' sous Devuan : nom de service systemd = <code>named</code>.


Déclaration :
Déclaration :
Ligne 173 : Ligne 154 :
Zone :
Zone :
<syntaxhighlight lang="dns">
<syntaxhighlight lang="dns">
$TTL  86400
$TTL  200
@  IN SOA ns.picoctf.org. admin.picoctf.org. (
@  IN SOA ns.picoctf.org. admin.picoctf.org. (
     2025100402 ; Serial
     2025100403 ; Serial
     3600      ; Refresh
     3600      ; Refresh
     1800      ; Retry
     1800      ; Retry
     604800    ; Expire
     604800    ; Expire
     86400 )    ; Minimum
     86400 )    ; Minimum
;
 
@      IN NS  ns.picoctf.org.
        IN NS  ns.picoctf.org.
ns      IN A  172.16.9.1
ns      IN A  172.16.9.1
@      IN A  172.16.9.1
@      IN A  172.16.9.1
www    IN A  172.16.9.1
www    IN CNAME ns
*      IN A  172.16.9.1
</syntaxhighlight>
</syntaxhighlight>


Ligne 210 : Ligne 190 :
dig @127.0.0.1 www.picoctf.org +short
dig @127.0.0.1 www.picoctf.org +short
dig @127.0.0.1 test.picoctf.org +short  # wildcard
dig @127.0.0.1 test.picoctf.org +short  # wildcard
</syntaxhighlight>
</syntaxhighlight>[[Fichier:Screenshot from 2025-10-04 08-33-01.png|centré|sans_cadre|600x600px]]


; **Pourquoi une zone locale plutôt qu’un simple /etc/hosts ?** 
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Redirection réseau</span> ==
: La zone locale intercepte **tous les clients** du VLAN via DHCP (option DNS=172.16.9.1) et gère le **wildcard**. C’est reproductible, scalable et cohérent avec l’architecture du TP.
Mise en place d’une REDIRECT pour capter le HTTP et le diriger vers un service local.
 
---
 
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Redirection réseau (PREROUTING 80→8080)</span> ==
Mise en place d’une **REDIRECT** pour capter le HTTP et le diriger vers un service local (ex. proxy/captor sur **8080**). 
On conserve les deux règles **MASQUERADE** du « style TP ».


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Ligne 235 : Ligne 209 :
</syntaxhighlight>
</syntaxhighlight>


; **Pourquoi intercepter en PREROUTING ?**  
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Serveur Apache sécurisé (08/10)</span> ==
: Le hook **PREROUTING** permet de **réécrire la destination** avant routage local. On peut ainsi “aspirer” le trafic HTTP vers un service interne (ex. `python3 -m http.server 8080`) sans changer la conf des clients.
 
Dans cette partie, l’objectif est de mettre en place un serveur web sécurisé en HTTPS avec un certificat signé par une autorité locale.  
J'utilise ici le domaine d’exemple <code>picoctf.org</code>, déjà intercepté par notre DNS.
 
=== <span style="color:#6369e6;font-weight: bold;">1. Création d’un certificat auto-signé</span> ===
Avant toute chose, je génère un certificat auto-signé permettant à Apache de servir du HTTPS localement.
 
<syntaxhighlight lang="bash">
openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout /etc/ssl/apache/apache-selfsigned.key \
  -out /etc/ssl/apache/apache-selfsigned.crt \
  -subj "/C=FR/ST=Nord/L=Lille/O=Polytech/CN=picoctf.org"
</syntaxhighlight>
 
=== <span style="color:#6369e6;font-weight: bold;">2. Configuration d’Apache2</span> ===
Je crée un nouveau fichier de configuration HTTPS dans <code>/etc/apache2/sites-available/secure-site.conf</code>.
 
<syntaxhighlight lang="apache">
<VirtualHost *:443>
    ServerName picoctf
    DocumentRoot /var/www/html
 
    SSLEngine on
    SSLCertificateFile /etc/apache2/sites-available/apache.crt
    SSLCertificateKeyFile /etc/apache2/sites-available/apache.key
 
    # Logs SSL
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined
</VirtualHost>
 
# HTTP vers HTTPS
<VirtualHost *:80>
    ServerName picoctf.org
    Redirect permanent / https://picoctf.org/
</VirtualHost>
</syntaxhighlight>
 
Cette configuration active le service sur le port '''443''' et redirige automatiquement les connexions HTTP vers HTTPS.


---
=== <span style="color:#6369e6;font-weight: bold;">3. Création d’une autorité de certification locale</span> ===
Afin de simuler un certificat signé par une autorité de confiance, je crée une CA interne appelée "Certif".


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Tests & État au 04/10</span> ==
<syntaxhighlight lang="bash">
* **DHCP** : un client WiFi obtient **172.16.9.100–200**, **GW=DNS=172.16.9.1**. 
openssl req -x509 -new -nodes \
* **NAT** : les compteurs `iptables -t nat -L -n -v` montent dès qu’un client sort vers Internet.
  -keyout ca.key -sha256 -days 365 \
* **DNS** : `dig picoctf.org`, `www` et `test` renvoient **172.16.9.1** ; le reste du monde est résolu via les *forwarders*.   
  -out ca.crt -subj "/CN=Certif"
* **REDIRECT** : `curl http://picoctf.org` atteint le service local **:8080** si un listener est en place.
</syntaxhighlight>
 
=== <span style="color:#6369e6;font-weight: bold;">4. Signature du certificat Apache avec l’autorité locale</span> ===
Je commence par créer une demande de signature (CSR) pour le serveur Apache :
 
<syntaxhighlight lang="bash">
openssl req -new -newkey rsa:2048 -nodes \
  -keyout apache.key -out apache.csr \
  -subj "/CN=picoctf.org"
</syntaxhighlight>
 
Puis je signe cette requête avec notre autorité <code>Certif</code> :
 
<syntaxhighlight lang="bash">
openssl x509 -req -in apache.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out apache.crt -days 365 -sha256
</syntaxhighlight>
 
Je remplace ensuite dans la configuration Apache les fichiers de certificat auto-signés par ceux nouvellement générés :
<br>- <code>/etc/apache2/sites-available/apache.crt</code>  
<br>- <code>/etc/apache2/sites-available/apache.key</code>
 
Redémarrage du service :
<syntaxhighlight lang="bash">
a2enmod ssl
a2ensite secure-site.conf
systemctl reload apache2
</syntaxhighlight>


---
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Machine virtuelle Android</span> ==
Lorsque je tente d’accéder à <code>https://picoctf.org</code> depuis un appareil Android récent, le certificat de l’autorité “Certif” n’est pas reconnu.[[Fichier:Screenshot from 2025-10-10 15-30-32.png|centré|sans_cadre|954x954px]]Pour contourner cela, il est possible d’installer une ancienne machine Android (par exemple sous '''Android 4.x'''), où l’ajout manuel d’une autorité de certification est encore possible.


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Problèmes rencontrés & solutions</span> ==
Sur cette Android, après quelques ajustements réseau, il est possible d’importer le certificat racine Certif et ainsi naviguer vers le faux site <code>picoctf.org</code>.
* **Console Cisco muette** : causée par le *flow control*. Solution : **désactiver** hardware & software flow control dans *minicom* (9600 **8N1**, `/dev/ttyS0` ou `/dev/ttyUSB0`). 
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Appareil Android physique (08/10)</span> ==
* **Erreur AP “cipher not configured”** : corriger en posant **`authentication ... version 2`** côté SSID et **`encryption mode ciphers aes-ccm`** côté radio. 
Enfin, le même test a été reproduit sur la tablette Android 4.4 de mon camarade, une version qui permet encore l’ajout d’autorités de certification manuellement.
* **SERVFAIL sur Bind** : chemin de zone incorrect ou SOA incomplet. Solution : corriger `file "/etc/bind/db.picoctf.org";`, ajouter les **points finaux** dans le SOA/NS, **incrémenter le serial**, `rndc reload`. 
* **Compteurs iptables à 0** : normal tant qu’aucun client ne génère de trafic. Vérifier le bail DHCP, puis tester `ping 8.8.8.8` depuis un client.


---
En important le fichier `ca.crt` dans les paramètres de sécurité, le site `https://picoctf.org` devient totalement “sécurisé” : le navigateur affiche le cadenas vert , confirmant que la connexion est chiffrée et que le certificat est reconnu par le système.


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Prochaines étapes (HTTP/HTTPS Apache)</span> ==
[[Fichier:Screenshot 2025-10-08-10-04-04.png|droite|sans_cadre|419x419px]]
* Activer **Apache** (vhost **:80**) et vérifier la desserte locale.
[[Fichier:Screenshot 2025-10-08-09-21-51.png|sans_cadre|706x706px]]
* Ajouter **HTTPS** (vhost **:443**) avec **certificat auto-signé** pour `picoctf.org` et `www.picoctf.org`. 
* Configurer la redirection **HTTP → HTTPS**. 
* Supprimer la règle iptables **REDIRECT 80→8080** si Apache écoute sur 80, pour éviter conflit.


''Une fois finalisé, la section complète “Serveur Apache (HTTP & HTTPS)” sera ajoutée à la suite, au même format.''
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Problèmes rencontrés</span> ==
* Console Cisco muette : causée par le '''flow control'''. Solution : désactiver hardware & software flow control dans minicom (9600, 8N1, <code>/dev/ttyUSB0</code>).
* Erreur AP <code>cipher not configured</code> : corriger en posant `authentication ... version 2` côté SSID et <code>encryption mode ciphers aes-ccm</code> côté radio.

Version actuelle datée du 9 octobre 2025 à 18:53

🌐 TP Infrastructure Réseau 🛜

Introduction

Ce wiki documente la mise en place d’une petite infrastructure réseau pédagogique pour le TP 2025/2026.

L’objectif est de déployer un serveur virtuel sur capbreton, d’y terminer un VLAN privé (ici 409 car je suis a la Zabeth 09), puis d’implanter les services exigés : DHCP, DNS (forwarder + zone locale d’interception), NAT/mascarade, et redirection réseau pour l’HTTP.

Des choix techniques sont explicités à chaque étape (pourquoi tel fichier, telle option, tel service), afin d’argumenter les décisions et permettre la reproductibilité.

Serveur virtuel (17/09)

La VM est créée sur Xen depuis capbreton avec une unique interface reliée à bridgeStudents, conformément au sujet (routage par 172.26.145.251 côté salles projets).

xen-create-image \
  --hostname=SE5.kelbachi \
  --dhcp \
  --bridge=bridgeStudents \
  --dir=/usr/local/xen \
  --size=10GB \
  --dist=daedalus \
  --memory=2G \
  --force
Pourquoi cette commande ?
--bridge=bridgeStudents impose l’unique attachement réseau demandé ; --dist=daedalus assure une base Devuan stable (ifupdown classique) ; les ressources (2 Gio RAM/10 Gio disque) suffisent pour DHCP/DNS/NAT.

Démarrage et accès console :

xl create -c /etc/xen/SE5.kelbachi.cfg
# Ctrl+] pour détacher la console sans éteindre

Adresse routée (réseau des salles projets)

Configuration statique avec passerelle 172.26.145.251. On choisit une IP libre dans la plage fournie (exemple 172.26.145.109/24).

# /etc/network/interfaces (extrait)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 172.26.145.109/24
    gateway 172.26.145.251
    dns-nameservers 1.1.1.1 8.8.8.8
Pourquoi une IP statique ?
Le sujet exige un adressage maîtrisé côté salles projets et une route par défaut vers le routeur NAT de la salle. C’est la base pour que la VM accède à Internet et puisse, ensuite, NATer les clients WiFi.

Interface privée (VLAN 409)

Le réseau privé associé à X=09 est 172.16.9.0/24. La VM termine ce VLAN avec l’adresse 172.16.9.1/24 (gateway & DNS pour les clients). Dans notre mise en place, l’interface privée est eth1.

# /etc/network/interfaces (complément)
auto eth1
iface eth1 inet static
    address 172.16.9.1/24

Vérifications :

ip a
ip r
ping -c3 172.26.145.251
ping -c3 8.8.8.8

Point d’accès Cisco – SSID WPA2-PSK (29/09)

Connexion console série (9600 8N1, sans control flow) avec Minicom. Après habilitation, création d’un SSID attaché au VLAN 409.

dot11 ssid SE5-SSID09
  vlan 409
  authentication open
  authentication key-management wpa version 2
  wpa-psk ascii Cisco2025
  exit

interface dot11radio 0
  encryption mode ciphers aes-ccm
  ssid SE5-SSID09
  station-role root
  no shutdown

Nous laissons de cote cette partie car elle n'est pas bloquante pour la suite du TP.

Serveur DHCP (29/09)

Distribution automatisée d’adresses 172.16.9.100–200 aux clients du VLAN 409, avec routeur et DNS pointant vers la VM.

Installation :

apt-get update
apt-get install -y isc-dhcp-server

Configuration :

# /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
authoritative;

subnet 172.16.9.0 netmask 255.255.255.0 {
  range 172.16.9.100 172.16.9.200;
  option routers 172.16.9.1;
  option domain-name-servers 172.16.9.1;
}

Mascarade (NAT) – Accès Internet (29/09)

Activation du routage IPv4 et NAT du réseau 172.16.9.0/24 vers eth0.

sysctl -w net.ipv4.ip_forward=1
sed -i 's/^#\?net\.ipv4\.ip_forward.*/net.ipv4.ip_forward=1/' /etc/sysctl.conf

iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE

iptables -t nat -L -n -v
Pourquoi la mascarade ?
Les clients WiFi utilisent des adresses privées. Le NAT traduit leurs paquets pour qu’ils sortent avec l’IP de la VM côté salles projets.
Sans NAT, pas d’Internet pour le VLAN 409.

Persistance :

apt-get install -y iptables-persistent
netfilter-persistent save

Interception de flux (04/10)

Redirection par DNS (zone locale)

On implémente une zone primaire sur la VM pour rediriger picoctf.org et tous ses sous-domaines vers la VM. Service BIND sous Devuan : nom de service systemd = named.

Déclaration :

# /etc/bind/named.conf.local
zone "picoctf.org" {
    type master;
    file "/etc/bind/db.picoctf.org";
};

Zone :

$TTL  200
@  IN SOA ns.picoctf.org. admin.picoctf.org. (
    2025100403 ; Serial
    3600       ; Refresh
    1800       ; Retry
    604800     ; Expire
    86400 )    ; Minimum

        IN NS  ns.picoctf.org.
ns      IN A   172.16.9.1
@       IN A   172.16.9.1
www     IN CNAME ns

Options (écoute VLAN) :

# /etc/bind/named.conf.options (extrait)
options {
  directory "/var/cache/bind";
  recursion yes;
  allow-query { 172.16.9.0/24; 127.0.0.1; };
  forwarders { 1.1.1.1; 8.8.8.8; };
  listen-on { 172.16.9.1; 127.0.0.1; };
  dnssec-validation auto;
};

Service & vérifs :

systemctl enable named
systemctl restart named
named-checkconf
named-checkzone picoctf.org /etc/bind/db.picoctf.org
dig @127.0.0.1 picoctf.org +short
dig @127.0.0.1 www.picoctf.org +short
dig @127.0.0.1 test.picoctf.org +short   # wildcard
Screenshot from 2025-10-04 08-33-01.png

Redirection réseau

Mise en place d’une REDIRECT pour capter le HTTP et le diriger vers un service local.

# Table nat propre
iptables -t nat -F

# Interception HTTP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080

# NAT format TP (409)
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE

iptables -t nat -L -n -v

Serveur Apache sécurisé (08/10)

Dans cette partie, l’objectif est de mettre en place un serveur web sécurisé en HTTPS avec un certificat signé par une autorité locale. J'utilise ici le domaine d’exemple picoctf.org, déjà intercepté par notre DNS.

1. Création d’un certificat auto-signé

Avant toute chose, je génère un certificat auto-signé permettant à Apache de servir du HTTPS localement.

openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout /etc/ssl/apache/apache-selfsigned.key \
  -out /etc/ssl/apache/apache-selfsigned.crt \
  -subj "/C=FR/ST=Nord/L=Lille/O=Polytech/CN=picoctf.org"

2. Configuration d’Apache2

Je crée un nouveau fichier de configuration HTTPS dans /etc/apache2/sites-available/secure-site.conf.

<VirtualHost *:443>
    ServerName picoctf
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/apache2/sites-available/apache.crt
    SSLCertificateKeyFile /etc/apache2/sites-available/apache.key

    # Logs SSL
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined
</VirtualHost>

# HTTP vers HTTPS
<VirtualHost *:80>
    ServerName picoctf.org
    Redirect permanent / https://picoctf.org/
</VirtualHost>

Cette configuration active le service sur le port 443 et redirige automatiquement les connexions HTTP vers HTTPS.

3. Création d’une autorité de certification locale

Afin de simuler un certificat signé par une autorité de confiance, je crée une CA interne appelée "Certif".

openssl req -x509 -new -nodes \
  -keyout ca.key -sha256 -days 365 \
  -out ca.crt -subj "/CN=Certif"

4. Signature du certificat Apache avec l’autorité locale

Je commence par créer une demande de signature (CSR) pour le serveur Apache :

openssl req -new -newkey rsa:2048 -nodes \
  -keyout apache.key -out apache.csr \
  -subj "/CN=picoctf.org"

Puis je signe cette requête avec notre autorité Certif :

openssl x509 -req -in apache.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out apache.crt -days 365 -sha256

Je remplace ensuite dans la configuration Apache les fichiers de certificat auto-signés par ceux nouvellement générés :
- /etc/apache2/sites-available/apache.crt
- /etc/apache2/sites-available/apache.key

Redémarrage du service :

a2enmod ssl
a2ensite secure-site.conf
systemctl reload apache2

Machine virtuelle Android

Lorsque je tente d’accéder à https://picoctf.org depuis un appareil Android récent, le certificat de l’autorité “Certif” n’est pas reconnu.

Screenshot from 2025-10-10 15-30-32.png

Pour contourner cela, il est possible d’installer une ancienne machine Android (par exemple sous Android 4.x), où l’ajout manuel d’une autorité de certification est encore possible.

Sur cette Android, après quelques ajustements réseau, il est possible d’importer le certificat racine Certif et ainsi naviguer vers le faux site picoctf.org.

Appareil Android physique (08/10)

Enfin, le même test a été reproduit sur la tablette Android 4.4 de mon camarade, une version qui permet encore l’ajout d’autorités de certification manuellement.

En important le fichier `ca.crt` dans les paramètres de sécurité, le site `https://picoctf.org` devient totalement “sécurisé” : le navigateur affiche le cadenas vert , confirmant que la connexion est chiffrée et que le certificat est reconnu par le système.

Screenshot 2025-10-08-10-04-04.png

Screenshot 2025-10-08-09-21-51.png

Problèmes rencontrés

  • Console Cisco muette : causée par le flow control. Solution : désactiver hardware & software flow control dans minicom (9600, 8N1, /dev/ttyUSB0).
  • Erreur AP cipher not configured : corriger en posant `authentication ... version 2` côté SSID et encryption mode ciphers aes-ccm côté radio.