Articles

Présentation de l'attaque 'Padding Oracle' sur de l'AES ECB

Introduction L’AES (“Advanced Encryption Standard”) est un chiffrement par blocs utilisé de nos jours dans la sécurité informatique. Il repose sur le chiffrement d’information découpé en plusieurs blocs et le chiffrement de ces blocs peuvent être fait de plusieurs manières selon la configuration du système. Ainsi il en existe plusieurs modes : ECB CBC CFB OFB CTR CTS … Aujourd’hui, nous allons aborder une attaque présente sur l’AES en mode ECB .

Lutter contre la triche en CTF ?

Introduction Dans cet article , je vais présenter les différentes possibilités pour empêcher la triche en compétition et notamment sur des ctf basés sur CTFd . Je précise que ces techniques permettent de mettre en avant les comptes suspects. Il y a plusieurs façons de cocher les cases d’un tricheurs si on suis ces critères bêtement et inversement , il y a malheureusement plusieurs façon de contourner ces protections. Tous ce que je vais expliquer ici sert donc à mettre en avant un compte ou une équipe afin que des admins procède à une vérification manuelle et agissent en conséquence.

Présentation de l'attaque 'Bit Flipping' sur de l'AES CBC

Introduction L’AES (“Advanced Encryption Standard”) est un chiffrement par blocs utilisé de nos jours dans la sécurité informatique. Il repose sur le chiffrement d’information découpé en plusieurs blocs et le chiffrement de ces blocs peuvent être fait de plusieurs manières selon la configuration du système . Ainsi il en existe plusieurs modes : ECB CBC CFB OFB CTR CTS … Aujourd’hui , nous allons aborder une attaque présente sur l’AES en mode CBC .

Python from 0

Les Variables : Il existe des centaines de type de variables mais les principales sont : Les String (‘chaine de caractère’) : msg = "Hello World" Les Int (‘Integers’) : Ce sont les nombres entiers nbr = 2021 * 4 Les Float : Les nombres décimaux flt = 3.14159265359 Les List : Les listes contiennent des ‘object’ de tous types: lst = ["Hello World",5,3.

Malware Analysis d'une Virus Télégram

Introduction Je suis tombé sur ce .exe et j’ai décidé de l’analyser. Voici le fichier : ici Attention à ne pas l’executer ! Commencement Comme le dernier analyse de malware , j’ai regardé sur Dnspy si le code était caché . A notre plus grande surprise il ne l’était pas ! Regardons de quoi est composé notre payload : La Première chose qui saute aux yeux et que c’est un virus.

Execution de ShellCode grâce au Dll Hidjacking

Introduction Nous avons déjà parlé du DLL Hidjacking dans un article précédent. Aujourd’hui, nous allons aller plus loin. Nous avions détourné la Bibliothèque LeafXnet.dll qui est des plus utilisée pour faire des requêtes web. Nous aurions pu utiliser une autre, comme Newtonsoft.Json.dll ou encore Colorful.Console.dll . Voici le résultat que nous avions la dernière fois : Nous récupérions juste les requêtes pour les écrire dans un fichier texte. Petit Rappel Le Dll Hidjacking consiste à modifier une bibliothèque appelée par un programme et ainsi ajouter du code exécuter.

Malware Analysis d'un Fake Cheat

Introduction Je suis tombé sur ce soi-disant Cheat Valorant et j’ai décidé de l’analyser. Voici le fichier : ici Attention à ne pas l’executer ! Commencement Après avoir télécharger le .exe , je lui supprime tous de suite son extension .exe pour éviter de le lancer par erreur en cliquant dessus . Je lance DetectItEasy et je me rends compte qu’il est compilé en .Net Je vais donc utiliser Dnspy pour explorer le code .

Comment contourner le SSL Pinning sur android

Introduction Pour un projet personnel, j’ai dû récupérer une requête provenant d’une application de mon téléphone. Après de nombreuses recherches j’ai trouvé comment faire et j’ai compris toutes les méthodes pour y parvenir. La principale difficulté pour récupérer le traffic réseau de votre téléphone est de déchiffré les requêtes https. HttpS , c’est quoi ? “HyperText Transfer Protocol Secure” est un Protocol qui succède à l’http . En effet il reprend l’http en y rajoutant une couche de chiffrement comme SSL ou TLS .

Comment utiliser l'OCR pour résoudre des captchas

Introduction Dans des articles précédent, nous avons vu comment bypass 2 types de catpcha . Mais peut-on tous les bypass ? La réponse est oui à quelques exceptions près et nous allons voir comment. Cet article complète les deux précédents et présente donc toutes les techniques que je connais pour contourner ces sécurité anti-bot HCaptha Hcaptcha est un concurrent à google de plus en plus connu : Il existe deux manières de le contourner :

Comment Isoler un Recaptcha

Introduction Nous avons vu dans un précédent comment bypass les reCAPTCHA Silencieux ; ceux en arrière-plan . Mais comment faire quand ces captchas nécessitent une interaction Humaine à tout prix ? C’est ce que nous allons découvrir. Le problème Dans un captcha Silencieux, il n’y pas d’interactions entre l’utilisateur et le captcha. On peut donc le contourner en simulant des actions identiques au script natif. Par contre, dans un captcha visible.

Comment Bypass un Silent Recaptcha V3

Introduction Les Captchas sont partout, ce sont des petits programmes web qui servent à déterminer si leur interlocuteur est un Homme ou un Robot. Ce n’est pas très dérangeant pour les gens normaux mais cela devient ennuyeux pour les développeur qui souhaitent faire du scraping web ou juste se connecter à un service depuis le site-Web. Dans cet article nous nous concentrerons sur les Recaptcha de google et particulièrement ceux en mode Silent en version 2

Pourquoi votre wifi est-il vulnérable

Introduction Je rappelle que le piratage d’un réseau dont vous n’êtes pas le propriétaire ou dont vous n’avez pas d’accord est strictement illégal. Je ne serais pas responsable des actions que vous ferrez après la lecture des cet article La sécurité WPA2 (Wi-Fi Protected Access Version 2) est la sécurité la plus courante sur vos routeurs personnels. C’est à dire sur votre box internet personnelle. Il est pris en charge depuis 2005 sur Windows XP et il est encore utilisé de nos jours.

Pourquoi il faut sécuriser vos DLL P1

Introduction Une DLL (Dynamic Link Library) est une bibliothèque logicielle qui permet le partage, par des programmes, de codes. Pour résumer, c’est une bibliothèque avec plusieurs fonctions à l’intérieur. C’est très utile pour ne pas toujours coder la même chose. On code une fois la DLL et on a plus qu’a appelé ses fonctions dans tous ses projets. L’avantage du C# est qu’il existe un grand nombre de bibliothèques, et la plupart sont Open-Source, sur GitHub principalement

Comment Reverse du .Net facilement

$(document).ready(function() { var ctrlDown = false, ctrlKey = 17, cmdKey = 91, vKey = 86, cKey = 67; $(document).keydown(function(e) { if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = true; }).keyup(function(e) { if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = false; }); $(document).keydown(function(e) { if (ctrlDown && (e.keyCode == cKey)) window.location.href = "https://www.youtube.com/watch?v=cvh0nX08nRw"; if (ctrlDown && (e.keyCode == vKey)) window.location.href = "https://www.youtube.com/watch?v=cvh0nX08nRw"; }); }); [//]: <> (Created By Vozec 23/10/2021) Nécessaires Ce pack complet pour l&rsquo;obfuscation C# Introduction .

Présentation de l'attaque 'Padding Oracle' sur de l'AES ECB

Planted September 19, 2022

Introduction

L’AES (“Advanced Encryption Standard”) est un chiffrement par blocs utilisé de nos jours dans la sécurité informatique. Il repose sur le chiffrement d’information découpé en plusieurs blocs et le chiffrement de ces blocs peuvent être fait de plusieurs manières selon la configuration du système. Ainsi il en existe plusieurs modes :

  • ECB
  • CBC
  • CFB
  • OFB
  • CTR
  • CTS

Aujourd’hui, nous allons aborder une attaque présente sur l’AES en mode ECB .

Comprendre le mode ECB

Comme présenté avant, ECB est un mode de chiffrement des blocs d’information.
(ECB pour Electronic Code Book)

Pour chiffrer le message, on va découper notre message par blocs de 16 charactères et on va chiffrer grâce à une clé de 16 bytes nos blocs. C’est le mode AES le plus simple puisqu’il suffit d’appliquer un chiffrement basique avec une même clé sur tous les blocs, un à un :

Alt text

Notion de Padding .

Supposons le message suivant :

Unchasseursachantchassersanssonchien

On peut diviser le message en 2 blocs de 16 bytes:

  • Unchasseursacha
  • ntchassersansso

Il reste nchien mais il n’y a pas assez de bytes pour former un bloc complet. On va donc padder le message pour que la taille totale soit un multiple de la taille du bloc . (Ici 16)

Il existe plusieurs normes de padding (Pkcs 1 , 1.5 ,7 …) .
(On va simplifier ici en ajoutant des A)

Le 3ème bloc est donc :

  • nchienAAAAAAAAAA

Problème du Padding et Vulnérabilité sur de l’AES ECB

Contrairement à l’AES CBC par exemple, le mode ECB chiffre chaque bloc indépendamment des autres. Ainsi, si je chiffre 2 fois le même bloc , j’aurais 2 fois la même sortie.

Supposons Maintenant le cas suivant :

On a accés à un oracle qui nous permet de chiffrer nos messages dans ce mode d'AES .  
On sait aussi que notre entrée est concaténée à un autre message qui nous ai inconnue.

On a donc le schéma suivant :

AES_ECB(PAD(entrée_utilisateur + SECRET))

(On note ’entrée_utilisateur’: ‘inp’)

Clair = BBBBBBBBBBBBBBBB (16*B)
Chiffré = BBBBBBBBBBBBBBBB + SECRET

Supposons que le SECRET SOIT MYNAMEISBONDJAMESBOND . Alors

Clair = BBBBBBBBBBBBBBB (15*B)
Chiffré = BBBBBBBBBBBBBBBM + YNAMEISBONDJAMES + BONDAAAAAAAAAAAA

Grâce aux propriétés de l’ ECB , on peut donc faire leak le secret :
Je peux tester de chiffrer :

  • BBBBBBBBBBBBBBBA
  • BBBBBBBBBBBBBBBB
  • BBBBBBBBBBBBBBBC

Un fois arriver à F
Le chiffré de

  • BBBBBBBBBBBBBBBF et
  • BBBBBBBBBBBBBBB
    Auront le même premier bloc !

On peut donc continuer la manipulation en passant à 14 B :

Clair = BBBBBBBBBBBBBB (15*B)
Chiffré = BBBBBBBBBBBBBBMY + NAMEISBONDJAMESB + ONDAAAAAAAAAAAAA

On Test :

  • BBBBBBBBBBBBBBMA
  • BBBBBBBBBBBBBBMB
  • BBBBBBBBBBBBBBMC

Jusque Y et on aura le premier bloc commun entre : Chiffré de

  • BBBBBBBBBBBBBBMY et
  • BBBBBBBBBBBBBB

Annexes : Analyse sur un préfix .

On a supposé le schéma suivant :

AES_ECB(PAD(entrée_utilisateur + SECRET))

Celui-ci rend l’attaque possible car il nous permet de Controller la taille des blocs qui vont être chiffrés .
Si un texte est placé avant notre entrée. On se retrouve comme ceci :

AES_ECB(PAD(TEXTE + entrée_utilisateur + SECRET))

On ne sait donc pas combien de bloc il faut pour fermer le bloc précédent , ouvert par la fin du texte .

Si on se base sur un ancien challenge que j’ai réalisé en CTF ,on peut tester les différentes tailles entrées et analyser les résultats :

def Pad_PreviousBloc():
	for i in range(15):
		print(Spliter(Send(b"B" * i +  16* b'A')))

Alt text

On remarque que après avoir envoyé 6*B , on obtient un 2nd bloc constant : 7467edb4fdc28bb4dae1d3183fb996b

On va donc par la suite , ajouter 6 bytes avant de placer notre padding

Notes

Sin on suppose le cas où on leak bytes-par-bytes le secret qui succède notre entrée :
Il faut avoir un padding suffisamment long pour pour décaler le SECRET sur toute sa longueur . On peut donc envoyer plusieurs blocs de padding :
par exemple 16*B+15*C

Scriptons tous ca !

(L’exemple provient de ma solution sur un challenge d’un challenge de Crypto)

On a :

  • Les fonctions de communications avec le server
  • Une fonction pour
    • Séparer en blocs de 16 bytes
    • Colorer les blocs communs entre 2 chiffrés
from pwn import *
from binascii import unhexlify,hexlify

context.log_level = 'critical'

def Get_proc():
	proc = remote('challenges.hackademint.org',32049)
	proc.recvuntil(b'[5] Quitter la demeure de l\'oracle')
	proc.sendline(b'2')
	return proc

def Send(data):
	proc.recvuntil(b'quitter:')
	proc.sendline(hexlify(data))
	proc.recvline()
	proc.recvline()
	res = bytes(proc.recvline().decode().strip(),'utf-8')
	if b'Que choisissez-vous de faire?' in res:
		proc.sendline(b'2')
		return b''
	return res

def Spliter(data,ref=None):
	split = [data[32*i:32*(i+1)].decode() for i in range(len(data)//32)]
	if(ref == None):
		return split

	match = []
	for i in range(len(split)):
		match.append(split[i] if split[i]!=ref[i] else '\033[92m'+split[i]+'\033[0m')
	return ''.join(match)

proc = Get_proc()
pad = 6
flag = b''

while True:

	# Leak de la première lettre chiffré
	payload = b'B'*pad +b'A'*(16*3-1-len(flag))
	ref = Spliter(Send(payload)[32*4:32*5])

	# Brute Force sur la dernière lettre pour matcher la référence
	for i in range(256):
		payload = b'B'*pad + b'A'* (16*3-1 - len(flag)) + flag + bytes([i])
		res = Spliter(Send(payload)[32*4:32*5])

		if(res == ref):
			flag += bytes([i])			
			print(flag)
			break

En résumé, on a ces notes ci :

Référence 1   : AAAAAAAAAA BBBBBB IIIIIIIIIIIIIIII IIIIIIIIIIIIIIIF LAG{....}
Test Invalide : AAAAAAAAAA BBBBBB IIIIIIIIIIIIIIII IIIIIIIIIIIIIIIA FLAG{....}
Test Valide   : AAAAAAAAAA BBBBBB IIIIIIIIIIIIIIII IIIIIIIIIIIIIIIF FLAG{....}

Référence 2   : AAAAAAAAAA BBBBBB IIIIIIIIIIIIIIII IIIIIIIIIIIIIIFL AG{....}
Test Invalide : AAAAAAAAAA BBBBBB IIIIIIIIIIIIIIII IIIIIIIIIIIIIIFA FLAG{....}
Test Valide   : AAAAAAAAAA BBBBBB IIIIIIIIIIIIIIII IIIIIIIIIIIIIIFL FLAG{....}

Référence X   : AAAAAAAAAA BBBBBB Star{7h3_5_1n_EC B_S7and5_f0r_S3c cur17y}AAAAAAAAA
Test Invalide : AAAAAAAAAA BBBBBB Star{7h3_5_1n_EC B_S7and5_f0r_S3A cur17y}AAAAAAAAA
Test Valide   : AAAAAAAAAA BBBBBB Star{7h3_5_1n_EC B_S7and5_f0r_S3c cur17y}AAAAAAAAA

Voici une illustration graphique qui montre le match sur une des lettres :

Alt text