hash cisco asa et pix

 

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


La période de vérification reCAPTCHA a expiré. Veuillez recharger la page.