lundi 6 août 2012

Solution for the ESET BlackHat US Challenge 2012


1.  Introduction

On July 21st 2012 at 7AM (Las Vegas time) ESET published a crack-me for the BlackHat US 2012 edition. Rules were simple: find a valid couple of serial numbers for a given name before July 26th 2012 2PM to maybe win $1000 and a BlackCard (that gives you a free entry for either the next BlackHat US or EU).

Figure 1: GUI of the crack-me

According to challenge's site Eloi Vanderbeken from Oppida was the only person to solve it in time and won the price even if he was not at BlackHat US:
 
Figure 2: Result of the challenge

This post explains how Eloi achieved to break it.

mercredi 28 mars 2012

eZ Publish - Cross Site Scripting in URI « EzJSCORE » module


1.1.  Synopsis

Ce document présente une vulnérabilité découverte dans le produit CMS « eZ Publish ». Cette vulnérabilité est de type « Cross Site Scripting » réfléchi et permet d’exécuter du code dans le navigateur d’un utilisateur lorsque celui-ci est invité à consulter un lien malicieux.

1.2.  Impacts

Cette vulnérabilité permet d’exécuter du code dans le navigateur d’un utilisateur lorsque celui-ci est invité à consulter un lien malicieux forgé par une personne malveillante. Il est possible par exemple de récupérer son identifiant de session, ou de rediriger l’utilisateur piégé vers un site malveillant.

1.3.  Versions affectées

« eZ Publish » comporte le module « ezjscore » depuis la version 4.2.0. Les versions affectées sont donc :



  • eZ Publish Enterprise 4.6, 
  • eZ Publish Enterprise 4.5, 
  • eZ Publish Enterprise 4.4, 
  • eZ Publish Enterprise 4.3, 
  • eZ Publish Enterprise 4.2, 
  • eZ Publish Enterprise 4.1,
  • eZ Publish Community Project 2011.4
  • eZ Publish Community Project 2011.5
  • eZ Publish Community Project 2011.6 
  • eZ Publish Community Project 2011.7 
  • eZ Publish Community Project 2011.8 
  • eZ Publish Community Project 2011.9 
  • eZ Publish Community Project 2011.10
  • eZ Publish Community Project 2011.11
  • eZ Publish Community Project 2011.12
  • eZ Publish Community Project 2012.1
  • eZ Publish Community Project 2012.2
  • Ainsi que les versions 4.0 et 4.1 d’« eZ Publish » où  le module « ezjscore » a été manuellement installés.

    1.4.  Description

    Pour que le site publié sous « eZ Publish » soit vulnérable, il faut que les fichiers de configuration « module.ini » et/ou « site.ini » comportent :

    Figure 1 - site.ini



    Figure 2 - Module.ini
    Si ces  prérequis sont satisfaits à savoir :
    8  Activation du module « ezjscore » ;
    8  Autorisation d’accès à la méthode « ezjscnode » ;
    8  Pas de traitement des caractères spéciaux par le « template » de présentation des erreurs type « mauvaise vue »;

    Il est alors possible d’injecter du code javascript dans l’URL au niveau de l’appel d’une action « Ezjscnode » [HELLO|CALL|RUN]. Dans l’exemple qui suit, nous avons utilisé la méthode « ezjsc ::time », activée par défaut pour exploiter la vulnérabilité.
    http://www.monsite.fr/ezjscore/call<XSS>/ezjsc::time
    où :
    8  <XSS>est le code javascript que l’on veut faire exécuter par le client.
    8  Afin de pouvoir facilement injecter du code javascript, nous allons utiliser la balise simple :
    <IMG SRC=lienonerror= « code javascript » >où les caractères spéciaux seront encodes.

    L’URL suivante permet donc d’afficher le cookie de l’utilisateur :

    Exemple :

    1.5.  Recommandation

    Il est recommandé de nettoyer les caractères spéciaux lors du traitement du type d’action [HELLO|CALL|RUN] par lemodule « ezjscore ».

    1.6.  Crédits

    Cette vulnérabilité a été découverte par Yann MICHARD de la société OPPIDA.
    Cette information fait suite à l'annonce officielle de l'éditeur.

    lundi 26 mars 2012

    CVE-2012-1565 - eZ Publish - Object remote full information disclosure through « EzJSCORE » module


    1.1.  Synopsis

    Ce document présente une vulnérabilité découverte dans le produit CMS « eZ Publish ». Cette vulnérabilité permet avec un simple navigateur d’accéder à l’ensemble des informations concernant un objet « eZ Publish » dont :
    8  Les comptes utilisateurs (nom, prénom, login, email, empreinte du mot de passe et type d’empreinte) lorsque la méthode « ezjsnode » du module « ezjscore » est activée au niveau de la configuration du produit « eZ Publish ».
    Par défaut, la méthode « ezjsnode » est activée au niveau du fichier de configuration « ezjscore.ini ».  En général, le module « ezjscore » est activé au niveau « eZ Publish ».

    1.2.  Impacts

    Toutes les données de la base de données peuvent être récupérées sans authentification via un simple navigateur et via l’accès au site internet utilisant le produit « eZ Publish ».

    1.3.  Versions affectées


    « eZ Publish » comporte le module « ezjscore » depuis la version 4.2.0. Les versions affectées sont donc :



  • eZ Publish Enterprise 4.6, 
  • eZ Publish Enterprise 4.5, 
  • eZ Publish Enterprise 4.4, 
  • eZ Publish Enterprise 4.3, 
  • eZ Publish Enterprise 4.2, 
  • eZ Publish Enterprise 4.1,
  • eZ Publish Community Project 2011.4
  • eZ Publish Community Project 2011.5
  • eZ Publish Community Project 2011.6 
  • eZ Publish Community Project 2011.7 
  • eZ Publish Community Project 2011.8 
  • eZ Publish Community Project 2011.9 
  • eZ Publish Community Project 2011.10
  • eZ Publish Community Project 2011.11
  • eZ Publish Community Project 2011.12
  • eZ Publish Community Project 2012.1
  • eZ Publish Community Project 2012.2
  • Ainsi que les versions 4.0 et 4.1 d’« eZ Publish » où  le module « ezjscore » a été manuellement installés.

    1.4.  Description

    A la lecture du fichier de configuration « ezjscore.ini », il apparait que la méthode « ezjscnode » est autorisée par défaut :


    Figure 1 - ezjscore.ini

    Pour que le site publié sous « eZ Publish » soit vulnérable, il faut que les fichiers de configuration « module.ini » et/ou « site.ini » comportent :

    Figure 2 - site.ini


    Figure 3 - Module.ini




    Si ces deux prérequis sont satisfaits à savoir :
    8  Activation du module « ezjscore » ;
    8  Autorisation d’accès à la méthode « ezjscnode » ;
    Il est alors possible d’accéder aux informations des objets de la base de données d’ «eZ Publish » par son ID via la construction d’une URL faisant appel à la fonction « load » d’ « ezjscnode » de type :
    http://www.monsite.fr/ezjscore/call/ezjscnode::load::[ID]::all?ContentType=[xml|json]
    où :
    8  [ID]est l’ID de l’objet à récupérer ;
    8  [xml|json]l’affichage résultant si ces formats sont autorisés.

    1.5.  Preuve - récupération  du compte « administrateur » du site ez.no

    L’URL suivante permet de récupérer toutes les informations à propos du compte « administrateur » (ID=15) :


    Figure 4 - Récupération du compte administrateur ID=15
    Nous récupérons en particulier d’après le code explicitant le contenu « user_account » contenu dans le fichier « ezusertype.php »:
    8  Le login ;
    8  L’email ;
    8  L’empreinte MD5 du mot de passe ;
    8  Le type d’empreinte utilisée (user, site, password, plain, …)


    Figure 5 - Informations sur le compte

    functiontoString($contentObjectAttribute)
    {
    $userID=$contentObjectAttribute->attribute("contentobject_id");
    if(empty($GLOBALS['eZUserObject_'.$userID]))
    {
    $GLOBALS['eZUserObject_'.$userID]=eZUser::fetch($userID);
    }
    $user=$GLOBALS['eZUserObject_'.$userID];
    $userInfo=array(
    $user->attribute('login'),
    $user->attribute('email'),
    $user->attribute('password_hash'),
    eZUser::passwordHashTypeName($user->attribute('password_hash_type')),
    (int)$user->isEnabled()
    );
    return implode('|',$userInfo);
    }

    Tous les comptes utilisateurs peuvent en théorie être récupérés de la même façon. Il est alors possible d’effectuer des attaques hors ligne sur les mots de passe. Le fichier « ezuser.php » explique comment sont effectués les calculs des empreintes selon le type :
    staticfunctioncreateHash($user,$password,$site,$type,$hash=false)
    {
    $str='';
    if($type== self::PASSWORD_HASH_MD5_USER )
    {
    $str=md5("$user\n$password");
    }
    elseif($type== self::PASSWORD_HASH_MD5_SITE )
    {
    $str=md5("$user\n$password\n$site");
    }
    elseif($type== self::PASSWORD_HASH_MYSQL )
    {
    $db=eZDB::instance();
    $hash=$db->escapeString($password);

    $str=$db->arrayQuery("SELECT PASSWORD( '$hash' )");
    $hashes=array_values($str[0]);
    $str=$hashes[0];
    }
    elseif($type== self::PASSWORD_HASH_PLAINTEXT )
    {
    $str=$password;
    }
    elseif($type== self::PASSWORD_HASH_CRYPT )
    {
    if($hash)
    {
    $str=crypt($password,$hash);
    }
    else
    {
    $str=crypt($password);
    }
    }
    else// self::PASSWORD_HASH_MD5_PASSWORD
    {
    $str=md5($password);
    }
    eZDebugSetting::writeDebug('kernel-user',$str,"ezuser($type)");
    return$str;
    }

    8  MD5_user : md5( "$user\n$password" );
    8  MD5_site : md5( "$user\n$password\n$site"
    8  MD5_password :md5( $password );
    La variable « $site » est définie dans le fichier de configuration « site.ini ».

    1.6.  Quelques statistiques

    Ce CMS est utilisé par de très nombreux sites et à travers le monde entier. Plus de 250.000 sites s'appuient à ce jour sur eZ Publish et peuvent potentiellement être impactés par cette vulnérabilités.

    1.7.  Recommandation

    Il est hautement recommandé de désactiver la méthode « ezjscnode » via le fichier de configuration « ezjscore.ini ».

    1.8.  Crédits

    Cette vulnérabilité a été découverte par Yann MICHARD de la société OPPIDA.
    Cette information fait suite à l'annonce officielle de l'éditeur.