Mar 162014
 

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

 Publié par à 23 h 57 min
Fév 142014
 

CISCO secret 4 vulnérabilité

La vulnérabilité est confirmée officiellement dans le bulletin cisco id: 33464 du 18 mars 2013.

Certaines versions de Cisco IOS XE and Cisco IOS Software Release 15 intègrent un nouvel algorithme de hashage appelé secret 4. Les spécifications devaient être les suivantes :

algorithme de hashage : sha 256
un salt de 80 bits
1000 itérations

Tout naturellement il était destiné à remplacer le secret 5 qui lui est basé sur md5crypt.

Mais malheureusement, à cause d’un problème de mise en œuvre, le secret 4 s’est étrangement transformé
en un simple sha256 (pas de sel , pas d’itération). Sont impactés tous les CISCO IOS and IOS XE supportant le secret 4.

Du coup , CISCO préconise de ne pas utiliser le hash secret 4 , mais d’ utiliser le hash secret 5.

Mais là on rencontre une difficulté. En effet, lorsque l’on déclare un utilisateur sur un équipement CISCO, on saisit la commande suivante:
username secret

Mais cette commande ne permet pas de choisir entre le secret 4 et le secret 5.
Le secret 4 est choisi automatiquement.

2 méthodes de contournement:

1/
Pour déclarer un hash secret 5, il faut le générer avec une application tierce (exemple avec openssl)
et l’importer en le copiant dans la config du routeur

Commande openssl :

openssl passwd -1 -salt

Exemple :

salt = 12345678
Mot de passe : hashcat

openssl passwd -1 -salt 12345678 hashcat

Nous obtenons le hash md5crypt : $1$12345678$oBguOQT6/v2L/9ZuzX4Cq0

Commande pour déclarer un utilisateur avec un hash secret 5 sur un équipement CISCO

username secret 5 $1$12345678$oBguOQT6/v2L/9ZuzX4Cq0

2/
Générer un hash secret 5 sur un IOS ne supportant pas encore le secret 4 et ensuite copier-coller.

Pour finir, j’ aimerais bien que l’on m’explique comment une société comme CISCO a pu faire une telle erreur d’intégration ?
N’ hésiter pas à me laisser un commentaire.

 Publié par à 12 h 26 min