Extrait configuration ASA
ASA Version 8.4(2)
!
hostname ciscoasa
enable password 8Ry2YjIyt7RRXU24 encrypted
passwd 2KFQnbNIdI.2KYOU encrypted
Le mot de passe par défaut pour accéder à l’ ASA est « cisco ».
- le hash est 2KFQnbNIdI.2KYOU
Le mot de passe pour passer en mode enable est vide , le hash est : 8Ry2YjIyt7RRXU24.
On retrouve très souvent ces hashs dans les configurations. Cela signifie que l’ administrateur n’a tout simplement pas changé les mots de passe par défaut . . .
Algorithme de calcul du hash
Ajout de padding ‘\0’ au mot de passe en clair pour obtenir une taille de 16 octets
Calcul du hash md5
Conversion en base 64 du hash md5 (façon freebsd – _crypt_to64)
Padding et hash md5
Avant de calculer le hash md5 du mot de passe , il faut compléter le mot de passe avec la valeur
de remplissage « \0 » (Null) pour obtenir une longueur de 16 octets
exemple pour le mdp : cisco
Dans un éditeur hexadécimal saisissez la ligne suivante
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 63 69 73 63 6F 00 00 00 00 00 00 00 00 00 00 00 cisco...........
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
11 valeurs ‘\00’ sont ajoutées
Sauvegarder :
Calculer le md5 , on obtient : 841571baf39951012905107416a981c7
Conversion Base 64 – _crypt_to64
Table de conversion base64.
1 2 3 4 5 6
0123456789012345678901234567890123456789012345678901234567890123
ITOA64 = ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Découpage du hash en groupe de 4 octets :
841571ba f3995101 29051074 16a981c7
Le premier octet de poids fort de chaque groupe n’ est pas utilisé.
1er groupe :
7 1 1 5 8 4
0111 0001 0001 0101 1000 0100
^ ^ ^ ^
011100 010001 010110 000100 (on créé 4 groupes de 6 bits)
28d 17d 22d 04d (d : décimal)
"Q" "F" "K" "2" (utilisation de la table de conversion base 64)
Le résultat se lit de la droite vers la gauche. On obtient 2KFQ
2ème groupe :
5 1 9 9 f 3
0101 0001 1001 1001 1111 0011
^ ^ ^ ^
010100 011001 100111 110011 (on crée 4 groupes de 6 bits)
20d 25d 39d 51d (d : décimal)
"I" "N" "b" "n" (utilisation de la table de conversion base 64)
Le résultat se lit de la droite vers la gauche. On obtient nbNI
3éme groupe
1 0 0 5 2 9
0001 0000 0000 0101 0010 1001
^ ^ ^ ^
000100 000000 010100 101001 (on crée 4 groupes de 6 bits)
04d 00d 20d 41d (d : décimal)
"2" "." "I" "d" (utilisation de la table de conversion base 64)
Le résultat se lit de la droite vers la gauche. On obtient dI.2
4ieme groupe
8 1 a 9 1 6
1000 0001 1010 1001 0001 0110
^ ^ ^ ^
100000 011010 100100 010110 (on crée 4 groupes de 6 bits)
32d 26d 36d 22d (d : décimale)
"U" "O" "Y" "K" (utilisation de la table de conversion base 64)
Le résultat se lit de la droite vers la gauche. On obtient KYOU
Concaténons les 4 chaines obtenues
2KFQ || nbNI || dI.2 || KYOU = 2KFQnbNIdI.2KYOU
Programme python
Pour sélectionner tout le code, double-cliquez dans la fenêtre.
# -*- coding: cp1252 -*-
# 1 2 3 4 5 6
# 0123456789012345678901234567890123456789012345678901234567890123
ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
import hashlib
import struct
def to64 (v, n):
ret = ''
while (n - 1 >= 0):
n = n - 1
ret = ret + ITOA64[v & 0x3f]
v = v >> 6
return ret
def md5_asa(pw):
# padding du mot de passe
data = ['\x00'] * 16
pos=0
for car in pw:
data.insert(pos,car)
pos=pos+1
# transforme la liste en buffer
password = struct.pack('c'*len(data), *data)
# hash du mot de passe
# cisco : 841571baf39951012905107416a981c7
# (vide) : 4ae71336e44bf9bf79d2752e234818a5
hash=hashlib.md5()
hash.update(password[0:16])
print "hash md5 : " + hash.hexdigest()
hashdigest = hash.digest()
output=''
output=output + to64((int(ord(hashdigest[2]))) << 16 | (int(ord(hashdigest[1]))) << 8 | (int(ord(hashdigest[0]))),4)
output=output + to64((int(ord(hashdigest[6]))) << 16 | (int(ord(hashdigest[5]))) << 8 | (int(ord(hashdigest[4]))),4)
output=output + to64((int(ord(hashdigest[10]))) << 16 | (int(ord(hashdigest[9]))) << 8 | (int(ord(hashdigest[8]))),4)
output=output + to64((int(ord(hashdigest[14]))) << 16 | (int(ord(hashdigest[13]))) << 8 | (int(ord(hashdigest[12]))),4)
return output
if __name__ == "__main__":
# mot de passe : cisco - hash : 2KFQnbNIdI.2KYOU
password="cisco"
# arg01: password
print "password : " + password + " - hash asa : " + md5_asa(password)
# mot de passe : cisco - hash : 8Ry2YjIyt7RRXU24
password=""
print "password : (vide) " + "- hash asa : " + md5_asa(password)
Cain a implémenté l’algorithme,on peut l’utiliser pour réaliser un brute force
www.oxid.it
Référence : http://www.securiteam.com/securitynews/5FP0P0A7FM.html