Compare commits

...

10 commits

13 changed files with 2723 additions and 15 deletions

View file

@ -1,4 +1,4 @@
Notes de cours et TD machines
Notes de cours et TD machine
-----------------------------
Dépôt git pour la construction d'un site statique avec

View file

@ -15,7 +15,7 @@ enableRobotsTXT = true
[Params]
toc = true
post_navigation = true
postSections = ["reseau", "progsys", "installations", "bdd"]
postSections = ["reseau", "progsys", "installations", "bdd", "securite"]
[Params.sidebar]
home = "right" # Configure layout for home page

View file

@ -2,7 +2,7 @@
title: TDM1 OpenLDAP - notes d'installation
date: 2018-09-13
lastmod: 2018-09-27
categories: ["Installations", "TD machines"]
categories: ["Installations", "TD machine"]
tags: ['OpenLDAP', 'Apache Directory Studio', 'PAM']
---

View file

@ -0,0 +1,117 @@
---
title: "Installation d'un serveur DHCP et DNS"
date: 2018-11-15
categories: ["Installations", "TD machine"]
---
Avant toutes choses, j'ai modifié mon réseau virtuel pour ne plus avoir de DHCP.
J'ai ensuite commencé l'installation d'une nouvelle machine virtuelle. Comme je
n'ai plus de DHCP sur le réseau, j'ai mis une adresse IPv4 manuelle :
```
ip : 192.168.122.254/24
passerelle : 192.168.122.1
```
## Installation d'un serveur DHCP
Le serveur DHCP le plus utilisé est `isc-dhcp-server` il suffit de l'installer
avec la commande :
```shell
# apt install isc-dhcp-server
```
Il existe aussi une version avec le support de LDAP en tant que backend, mais
nous verrons celà plus tard.
### Configuration
La configuration du serveur se fait dans le fichier `/etc/dhcp/dhcpd.conf`. Elle
est succinte et rapide à mettre en place
```
# option definitions common to all supported networks...
option domain-name "u-bordeaux.com";
option domain-name-servers 192.168.122.1;
default-lease-time 3600;
max-lease-time 7200;
ddns-update-style none;
# Our subnet definition
subnet 192.168.122.0 netmask 255.255.255.0 {
range 192.168.122.100 192.168.122.120;
option routers 192.168.122.1;
}
# The only dhcp server in our network
authoritative;
```
## DNS
Le paquet à instller est `bind9` avec la commande
```shell
# apt install bind9
```
Le fichier de configurion est situé dans le répertoire `/etc/bind/named.conf`
### Configuration
J'ai choisis de séparer les fihiers de zone et de les mettres dans une dossier
`zone` dans le dossier de configuration de bind.
Le fichier `named.conf`
```
// Include options
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.default-zones";
zone "u-bordeaux.fr" {
type master;
file "/etc/bind/zones/db.u-bordeaux.fr.zone";
allow-update { key rndc-key; };
};
zone "122.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/inv.db.u-bordeaux.fr.zone";
allow-update { key rndc.key; };
};
```
Et les fichiers de zones, en premier la zone "normale puis la zone inverse
```
$TTL 3600
@ IN SOA u-bordeaux.fr. root.u-borderaux.fr. (
2007010401 ; Serial
3600 ; Refresh [1h]
600 ; Retry [10m]
86400 ; Expire [1d]
600 ) ; Negative Cache TTL [1h]
;
@ IN NS ns
ns IN A 192.168.122.254
```
```
$TTL 604800
@ IN SOA u-bordeaux.com admin.u-bordeaux.fr (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost. ; delete this line
254 IN PTR ns.u-bordeaux.fr
```
## Interfacer DHCP et DNS
Il s'agit maintenant de permettre la mise jour du serveur DNS avec

View file

@ -23,13 +23,13 @@ l'exécution de programmes pour l'utilisateur final :
- accès mémoire
- accès réseau
## POSIX et IEE
## POSIX et IEEE
La norme POSIX, standard IEEE, définie les interfaces utilisateurs et
logiciels, la ligne de commande standard et son interface de scripts, les
entrées / sorties de base. les attributs de fichiers (permissions)
La norme SUS *Single Unie Specification* est une norme plus récente et moins
La norme SUS *Single Unix Specification* est une norme plus récente et moins
contraignante. elle est basée sur les travaux de l'IEEE et de l'Open Group.
[SUS][https://fr.wikipedia.org/wiki/Single_UNIX_Specification] et
@ -41,7 +41,7 @@ LSB ou *Linux Standard Base* définie l'agencement général du système GNU / L
: librairies standard, commandes POSIX étendues, hiérarchie du système de
fichiers, les runlevels etc.
[LSB][https://fr.wikipedia.org/wiki/Linux_Standard_Base] sur Wikipedia.
[LSB](https://fr.wikipedia.org/wiki/Linux_Standard_Base) sur Wikipédia.
## Architecture des systèmes "modernes"
@ -51,8 +51,8 @@ Ils sont organisés en couches un peu à la façon du modèle OSI :
2. l'assemblage (assembleur)
3. système (applications système)
4. Application
N. Les applications / machines virtuelles (capables de traverser les couches
pour atteindre le matériel)
5. (couche N) Les applications / machines virtuelles (capables de traverser les
couches pour atteindre le matériel)
Plus la couche est basse, plus la programmation est efficace du point de vue
des performances mais plus difficile est la portabilité (un code assembleurs et

View file

@ -55,7 +55,7 @@ O APPEND | Écriture à la fin du fichier
#### mode
C'est aussi un masquage de bits définissant le node du fichier en vas de
C'est aussi un masquage de bits définissant le mode du fichier en cas de
création :
| mode | octal | utilisation |
@ -69,9 +69,9 @@ création :
| S IWGRP | 00020 | Le groupe a le droit d'écrire |
| S IXGRP | 00010 | Le groupe a le droit d'exécuter |
| S_IRWXO | 00007 | Le propriétaire a le droit de lire, écrire, exécuter |
| S_IROTH | 00004 | Lutilisateur a le droit de lire |
| S IWOTH | 00002 | L'utilisateur a le droit d'écrire |
| S IXOTH | 00001 | L'utilisateur a le droit d'exécuter |
| S_IROTH | 00004 | Les autres ont le droit de lire |
| S IWOTH | 00002 | Les autres onr le droit d'écrire |
| S IXOTH | 00001 | Les autres ont le droit d'exécuter |
#### Exemple en C

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 130 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 91 KiB

View file

@ -0,0 +1,274 @@
---
title: "Les attributs de fichiers"
date: 2018-10-16
categories: ["Programmation système", "cours"]
tags: ["fichier", "i-node"]
---
Les attributs de fichiers représentent toutes les informations dont dispose le
système sur les fichiers et répertoires : propriétaire, groupe permissions,
taille, horodatage etc.
## Système de fichiers
Un système de fichiers (ou système de gestion des fichiers) représente la façon
de stocker les fichiers, leurs informations et les organiser et sur un support
physique de stockage de masse. Parmi les plus courant on peut citer :
- Ext4, système de fichier par défaut sur la plupart des installation
GNU/Linux
- NTFS, système de fichiers par défaut de Microsoft Windows
- YAFFS pour Android
- APFS pour les machines Apple (MacOS, iOS, et Apple TV)
- ZFS pour les Unix
C'est bien entendu une liste non exhaustive, on pourrait citer des système plus
ancien comme FAT, UFS, HFS etc. Ou d'autres spécifique comme CEPH (système de
fichiers pour clusters).
## Anatomie d'un stockage de masse
Dans les premiers secteurs d'un disque dur, on trouve la table de partitions
cartographiant le disque. Il en existe deux type principaux : BPT et MBR Du type
de MBR découlera le nombres de partitions : 4 pour MD-DOS et pas de limites pour
le GPT par exemple.
![Schéma de fonctionnement d'un systeme de fichier](images/schema_hdd.svg)
### Gestion des fichiers dans le cas de la FAT
Le système de fichier FAT de Microsoft utilise le chainage de blocs : la table
d'allocation de fichiers contient l'adresse du premier bloc du fichiers. À la
fin de ce bloc, on obtient l'adresse du suivant. Avec ce système, la lecture
séquentielle est lente.
### Le cas le L'UFS
L'UFS pour *Unix File System* utilise, comme la plupart des systèmes de fichiers
moderne sous les systèmes Unix, utilise les i-nodes. Un numéro unique d'inode
est attribué à chaque fichier. Chaque fichier a un seul inode mais il peut avoir
plusieurs nom
![Schéma de fonctionnement des inodes](images/schema_inodes.svg)
Un inode peut aussi contenir d'autres informations comme le créateurs, les accès
etc.
## Appels Systèmes
La lecture des attributs de fichiers se fait par un appel système `stat()`.
```c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
```
Récupère les informations du fichiers pointé par `*pathname` et rempli la
structure `*statbuf`. En cas de succès renvoie 0 sinon -1 et positionne `errno`.
Il est aussi possible d'utiliser `fstat()`, variante de `stat()` mais utilisant
un descripteur de fichier.
```c
int fstat(int fd, struct stat *statbuf);
```
`lstat()` est utiliser dans le cas de lien symbolique, cet appel est utiliser
afin de récupérer les informations sur le lien lui-même et non le fichier
pointé.
```c
int lstat(const char *pathname, struct stat *statbuf);
```
### La structure stat
Voici les informations contenues dans la structure de type `stat`.
```c
struct stat {
dev_t st_dev; /* Périphérique */
ino_t st_ino; /* numéro d'inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* nombres de lien physiques */
uid_t st_uid ; /* UID du propriétaire */
gui_t st_gid; /* UID du groupe */
dev_t st_rdev; /* type de périphérique */
off_t st_size; /* taille totale en octets */
blksize_t st_blksize; /* taille de bloc pou E/S */
blkcnt_t st_blocks; /* nombres de blocks de 512o alloués */
struct timespec st_atim; /* heure du dernier accès */
struct timespec st_mtim; /* heure de la dernière modification */
struct timespec st_ctim; /* heure du dernier changemet d'état */
}
```
`st_rdev`, `st_blksize`, et `st_blocks` ne sont pas requises par POSIX.1 mais
définies comme extensions dans SUS.
- `st_mode` : Permissions daccès au fichier ainsi que le type de ce dernier
(répertoire, socket, fichier normal, etc.)
- `st_ino` :Numéro de référence du fichier (SUSv4), identifiant unique
daccès au contenu du fichier, plus communément sous UNIX : numéro
di-inœud
- `st_dev` : Numéro du périphérique qui contient le système de fichier auquel
se rapporte le numéro di-inœud
- `st_nlink` : Nombre de liens physiques sur i-inœud (un fichier peut avoir
plusieurs noms). Lappel système `unlink()` décrémente cette valeur
jusqu'à 0 alors le fichier sera réellement supprimé.
- `st_size` : Taille du fichier mesurée en octets (uniquement utile pour les
fichiers normaux)
### tests sur les types de fichiers
Ces extraits de codes permettent de tester les types de fichiers. `statbuf`
étant le retour de `stat()` ou de ses dérivées.
```c
if (S_ISREG(statbuf.st_mode)) {
printf "Regular file";
}
if (S_ISDIR(statbuf.st_mode)) {
printf "Directory file";
}
if (S_ISCHR(statbuf.st_mode)) {
printf "Character special file";
}
if (S_ISBLK(statbuf.st_mode)) {
printf "Block special file";
}
if (S_ISFIFO(statbuf.st_mode)) {
printf "Pipe or Fifo";
}
if (S_ISLNK(statbuf.st_mode)) {
printf "Symbolic link";
}
if (S_ISSOCK(statbuf.st_mode)) {
printf "Socket";
}
```
#### Exemple de code
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int i;
struct stat statbuf;
for (i = 1; i < argc; i++) {
printf("%s: ", argv[i]);
if (lstat(argv[i], &statbuf) < 0) {
perror("Unable to get stats");
continue;
}
if (S_ISREG(statbuf.st_mode)) {
printf("regular\n");
}
else if (S_ISDIR(statbuf.st_mode)) {
printf("directory\n");
}
else if (S_ISCHR(statbuf.st_mode)) {
printf("character special\n");
}
else if (S_ISBLK(statbuf.st_mode)) {
printf("block special\n");
}
else if (S_ISFIFO(statbuf.st_mode)) {
printf("fifo\n");
}
else if (S_ISLNK(statbuf.st_mode)) {
printf("symbolic link\n");
}
else if (S_ISSOCK(statbuf.st_mode)) {
printf("socket\n");
}
else {
printf("*unknown*\n");
}
}
exit(EXIT_SUCCESS);
}
```
##### Exécution
```shell
$ ./stat-file /etc /etc/passwd /dev/null /dev/sda
/etc: directory
/etc/passwd: regular
/dev/null: character special
/dev/sda: block special
```
### Tests sur les permissions de fichiers
Les extraits de codes suivant permettent des tester les permissisons sur les
fichiers et répertoires.
```c
if (statbuf.st_mode & S_IRUSR) { printf "User can read"; }
if (statbuf.st_mode & S_IWUSR) { printf "User can write"; }
if (statbuf.st_mode & S_IXUSR) { printf "User can execute"; }
if (statbuf.st_mode & S_IRGRP) { printf "Group can read"; }
if (statbuf.st_mode & S_IWGRP) { printf "Group can write"; }
if (statbuf.st_mode & S_IXGRP) { printf "Group can execute"; }
if (statbuf.st_mode & S_IROTH) { printf "Others can read"; }
if (statbuf.st_mode & S_IWOTH) { printf "Others can write"; }
if (statbuf.st_mode & S_IXOTH) { printf "Others can execute";}
```
### changer les permissions sur un fichier
```c
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
```
Modifie les permissions du fichier référencé par `*pathname`
```c
in fchmod(int fd, mode_t mode);
```
Modifie les permissions tout comme `chmod()` mais prend un descripteur de
fichier en paramètre.
Dans les deux cas, `mode` est un masquage de bits avec les paramètres suivants :
| mode | octal | utilisation |
|---------|-------|--------------------------------------------------------
| S_IRWXU | 00700 | Le propriétaire a le droit de lire, écrire, exécuter |
| S_IRUSR | 00400 | Lutilisateur a le droit de lire |
| S IWUSR | 00200 | L'utilisateur a le droit d'écrire |
| S IXUSR | 00100 | L'utilisateur a le droit d'exécuter |
| S_IRWXG | 00070 | Le groupe a le droit de lire, écrire, exécuter |
| S_IRGRP | 00040 | Le groupe a le droit de lire |
| S IWGRP | 00020 | Le groupe a le droit d'écrire |
| S IXGRP | 00010 | Le groupe a le droit d'exécuter |
| S_IRWXO | 00007 | Le propriétaire a le droit de lire, écrire, exécuter |
| S_IROTH | 00004 | Les autres ont le droit de lire |
| S IWOTH | 00002 | Les autres onr le droit d'écrire |
| S IXOTH | 00001 | Les autres ont le droit d'exécuter |
| | | S_ISUID, S_ISGID, S_ISVTX, cf. man 2 chmod
En cas de succès, retourne 0, sinon -1 et positionne `errno`
### Modifier l'appartenance d'un fichier
```c
#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
```
Modifie l'appartenance d'un fichier pointé par `*path`. comme pour `stat()`, il
existe un variante avec un descripteur de fichiers : `fchown()` et une pour les
lien symboliques `lchmod()`.
En cas de succès, retourne 0, sinon -1 et positionne `errno`

View file

@ -1,7 +1,7 @@
---
date: "2018-09-03"
categories: ["Réseau", "Cours"]
title: "Réseaux - Introduction"
title: "Réseau - Introduction"
tags: ["OSI", "latence", "débit"]
---

View file

@ -1,7 +1,7 @@
---
title: "Architecture d'Internet"
date: 2018-10-10
categories: ["Réseaux", "cours"]
categories: ["Réseau", "cours"]
tags: ["Internet", "routage", "interconnexion", "FAI"]
---

View file

@ -0,0 +1,238 @@
---
title: "TDM : Authentification et mots de passes"
date: 2019-01-09
categories: ['Sécurité', 'TD machine']
tags : ['hash', 'MD5', 'mot de passe', 'kali']
---
Lors de ce TD nous utiliserons principalement **john the ripper**, un outil de
cassage de mots de passe. C'est un logiciel opensource (licence GPL V.2)
connaissant de base plusieurs algorithmes de hachages (MD4, MD5, SHA256,
Blowfish, NTLM etc). Il est de plus extensible par des plugins.
Il est disponible sur beaucoup de plates-formes (GNU/Linux, *BSD, Windows, BeOS
etc.). Pour l'installer sur Debian ( et ses dérivés comme Ubuntu) :
```
apt install john
```
## Utiliser john
John permet de fonctionner dans 3 modes différents : single, par dictionnaire et
incrémentale
**Single** : dans ce mode, `john` utilise le *hash* du login et éventuellement
des variantes de celui-ci.
**Dictionnaire** : `john` essaye un à un les mos de passes d'une liste établie
**Incrémentale** : aussi appelé *Bruteforce*, dans ce mode, `john` essaye un
ensemble de combinaisons composé d'une suite de caractères donnés.
### Le mode single
C'est le mode le plus rapide du logiciel, pour tester notre fichier de mot de
passe dans ce mode il suffit de faire :
```
john -single -format=raw-MD5 logins.txt
```
Voici la sortie de la commande :
```
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 8 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Press 'q' or Ctrl-C to abort, almost any other key for status
AndyGollum (AndyGollum)
Warning: Only 18 candidates buffered for the current salt, minimum 24
needed for performance.
Almost done: Processing the remaining buffered candidate passwords, if any
Warning: Only 4 candidates buffered for the current salt, minimum 24
needed for performance.
1g 0:00:00:08 DONE (2019-01-09 23:14) 0.1142g/s 718.4p/s 718.4c/s 5031C/s indianaford1900..brucemclane1900
Use the --show --format=Raw-MD5 options to display all of the cracked passwords reliably
Session completed
```
`john` sauvegarde automatiquement **tous** les *hashes* qu'il retrouve dans sa
base de donnée qu'il stocke dans le fichier `~/.john/john.pot`. Il écrit aussi
un fichier journal afin de reprendre les opérations là où il les a arrêtées
(`~/.john/john.log`).
Il est possible de retrouver les mots de passes que `john` a trouvé avec la
commande :
```
john -show -format=raw-MD5 logins.txt
```
Et le résultat :
```
Using default input encoding: UTF-8
Loaded 8 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Remaining 7 password hashes with no different salts
Proceeding with single, rules:Wordlist
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 15 candidates buffered for the current salt, minimum 24
needed for performance.
0g 0:00:00:01 1/3 (2019-01-09 23:40) 0g/s 549.0p/s 549.0c/s 3843C/s Indianaforded..maximuscr0we
Almost done: Processing the remaining buffered candidate passwords, if any
Warning: Only 4 candidates buffered for the current salt, minimum 24
needed for performance.
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
Proceeding with incremental:ASCII
pwnetp (SylvesterBalboa)
avnrflr (bt1)
2g 0:00:51:49 3/3 (2019-01-10 00:32) 0.000643g/s 4060Kp/s 4060Kc/s 23260KC/s aslepred2..aslepruma
```
### La recherche incrémentale
`john` va tester un ensemble de combinaisons, elle est communément appelée
*bruteforce*. Comme pour les précédentes commandes, il est **nécessaire** de
spécifier la fonction de hashage via le paramètre `-format=<hash>` :
```
john -format=raw-MD5 logins.txt
```
Cette commande est bien plus longue que la précédente, les combinaisons à tester
étant très nombreuses. Voici le résultat :
```
Using default input encoding: UTF-8
Loaded 8 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Remaining 7 password hashes with no different salts
Proceeding with single, rules:Wordlist
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 15 candidates buffered for the current salt, minimum 24
needed for performance.
0g 0:00:00:01 1/3 (2019-01-09 23:40) 0g/s 549.0p/s 549.0c/s 3843C/s Indianaforded..maximuscr0we
Almost done: Processing the remaining buffered candidate passwords, if any
Warning: Only 4 candidates buffered for the current salt, minimum 24
needed for performance.
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
Proceeding with incremental:ASCII
pwnetp (SylvesterBalboa)
avnrflr (bt1)
2g 0:00:51:49 3/3 (2019-01-10 00:32) 0.000643g/s 4060Kp/s 4060Kc/s 23260KC/s aslepred2..aslepruma
```
La commande a été interrompue, mais a trouvé deux mots de passe. Il est possible
de la lancer en changeant le format par `raw-SHA256`.
### les dictionnaires
Plus rapide que la technique précédente, celle-ci est basée sur une liste
définie de mots de passe> Voici la commande :
```
john -wordlist=top500movies.txt -format=raw-MD5 logins.txt
```
Et le résultat :
```
Using default input encoding: UTF-8
Loaded 8 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Remaining 5 password hashes with no different salts
Press 'q' or Ctrl-C to abort, almost any other key for status
Le silence des agneaux (MaximusCrowe)
1g 0:00:00:00 DONE (2019-01-10 00:34) 25.00g/s 13500p/s 13500c/s 63600C/s The King of New York..Indiana Jones et le temple maudit
Use the --show --format=Raw-MD5 options to display all of the cracked passwords reliably
Session completed
```
## Utilisation avancée de john
Nous avons vu ici trois utilisations de `john the ripper`, mais grâce à son
fichier de configuration situé dans le répertoire `/etc/john/john.conf`. En plus
des paramètres de bases du logiciel, il est possible de définit des règles plus
fine pour la recherche.
Ces règle sont définie dans des sections commençant par
```
[List.Rules.<name>]
```
`<name>` est la nom donné à notre liste. Suive ensuite un ensemble de règle
étendant les recherche de bases.
### Premier exemple : étendre notre dictionnaire
Il est courant qu'un utilisateur choisisse un mot courant, puis ajoute son année
de naissance puis un caractère spécial à la fin, composant ainsi un mot de passe
correspondant à la politique de sécurité de son organisation.
Nous allons donc étendre notre liste de mots en prenant en compte ceci. Parton
du principe que les personnes de l'organisation on moins de 40 ans, voici la
règle créée :
```
[List.Rules:MaListe]
$1$9$[7-9]$[0-9]$[.,;:@-_!#]
```
Le caractère `$` remplace un caractère et `[]` est là pour définir une plage de
caractères.
Pour l'appliquer modifions notre dernière commande `john` comme ceci :
```
john -format=raw-MD5 -wordlist=top500movies.txt -rules=MaListe logins.txt
```
```
Using default input encoding: UTF-8
Loaded 8 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Remaining 4 password hashes with no different salts
Press 'q' or Ctrl-C to abort, almost any other key for status
Pulp Fiction1989! (IndianaFord)
Use the --show --format=Raw-MD5 options to display all of the cracked passwords reliably
Session completed
```
### Second exemple : modifier la recherche
Prenons le cas d'un utilisateur qui aurait changé les voyelles d'un mot par des
chiffres pour en faire un mot de passe. Il est possible via des règles de tester
ce cas de figure.
```
[List.Rules:Voyelles]
s?v[0-9]
```
- `s` : remplacer
- `?v` : rechercher la classe v : les voyelles
- `[0-9]` : remplacer par la classe d : un chiffre
Nous pouvons maintenant lancer la recherche avec la commande
```
john -format=raw-MD5 -wordlist=top500movies.txt -rules=Voyelles logins.txt
```
Et voilà la sortie :
```
Using default input encoding: UTF-8
Loaded 8 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Remaining 3 password hashes with no different salts
Press 'q' or Ctrl-C to abort, almost any other key for status
Sl1md1g M1ll11n11r1 (KevinSoze)
1g 0:00:00:00 DONE (2019-01-10 01:40) 16.66g/s 90000p/s 90000c/s 192800C/s Th9 Pl9y9r..9nd99n9 J9n9s 9t l9 t9mpl9 m99d9t
Use the --show --format=Raw-MD5 options to display all of the cracked passwords reliably
Session completed
```
## Bibliographie
- [Site officiel](https://www.openwall.com/john/) de John the Ripper
- [Page Wikipedia](https://fr.wikipedia.org/wiki/John_the_Ripper)