Aller au contenu

DjRamzy

Membres
  • Compteur de contenus

    20
  • Inscription

  • Dernière visite

Messages posté(e)s par DjRamzy

  1. Bonjour à tous,

    Depuis un certain temps maintenant je me suis lancé dans un projet du nom de LSM (voir le site), qui est un manager de serveur via le web (la même chose que DSM, mais qui pourra être mis sur n'importe quel serveur "fait maison").

    Bref, j'en était rendu à l'authentification. Toute simple, seul l'utilisateur 'root' est capable de se connecter. Je compare juste le mot de passe extrait du fichier /etc/shadow avec celui entré. Pour les curieux voir le repo gitorious (surtout le fichier auth.c).

    J'ai voulu tester ça sur mon serveur DS207+, j'ai donc récupéré les chaînes de cross-compilation pour le syno. Voici le lien pour ceux qui cherchent.

    Une fois mis en place je me suis vite rendu compte que l'authentification ne fonctionnait pas.

    Pour m'en assurer j'ai mis au point un petit exécutable de test qui reprend le code de l'authentification du projet LSM:

    Le fichier 'test.c' :

    
    #include <stdlib.h>
    
    #include <stdio.h>
    
    #include <pwd.h>
    
    #include <shadow.h>
    
    #include <string.h>
    
    #include <unistd.h>
    
    
    int main(void)
    
    {
    
       struct passwd* pwdinfo;
    
       struct spwd* shadowinfo;
    
    
       char userid[128];
    
       char passwd[1024];
    
    
       int ret;
    
    
    
       printf("Enter userid: ");
    
       ret = scanf("%s", userid);
    
       if(ret == 0)
    
       {
    
      	printf("\033[31mDo not accept empty userid\033[0m\n");
    
      	exit(EXIT_FAILURE);
    
       }
    
    
       pwdinfo = getpwnam(userid);
    
    
       if(pwdinfo == NULL)
    
       {
    
      	printf("\033[31mUser %s does not exist\033[0m\n", userid);
    
      	exit(EXIT_FAILURE);
    
       }
    
    
       shadowinfo = getspnam(userid);
    
    
       if(shadowinfo == NULL)
    
       {
    
      	printf("\033[31mError while reading password\033[0m\n");
    
      	exit(EXIT_FAILURE);
    
       }
    
    
       printf("Enter passwd: ");
    
       ret = scanf("%s", passwd);
    
       if(ret == 0)
    
       {
    
      	printf("\033[31mDo not accept empty passwd\033[0m\n");
    
      	exit(EXIT_FAILURE);
    
       }
    
    
       printf("crypt: %s\n", crypt(passwd, shadowinfo->sp_pwdp));
    
       printf("exist: %s\n", shadowinfo->sp_pwdp);
    
    
       if(strcmp(crypt(passwd, shadowinfo->sp_pwdp), shadowinfo->sp_pwdp))
    
       {
    
      	printf("\033[31mWrong passwd\033[0m\n");
    
      	exit(EXIT_FAILURE);
    
       }
    
       else
    
       {
    
      	printf("\033[32mCorrect passwd\033[0m\n");
    
       }
    
    
       exit(EXIT_SUCCESS);
    
    }
    
    
    et le fichier Makefile
    
    CC=gcc
    
    CFLAGS=-W -Wall -ansi -pedantic -static -D_GNU_SOURCE
    
    LDFLAGS=-lcrypt
    
    
    all: test
    
    
    test: test.o
    
    	$(CC) -o $@ $^ $(LDFLAGS)
    
    
    %.o: %.c
    
    	$(CC) -o $@ -c {:content:}lt; $(CFLAGS)
    
    
    clean:
    
    	rm *.o
    
    
    mrproper: clean
    
    	rm test
    
    
    Grâce à ce test j'ai réalisé que les mot de passe du compte 'root' et celui du compte 'admin' inscrit dans le fichier /etc/shadow sont bien différent. Pour ma part j'avais quelque chose du genre:
    
    root:$1$dynUWOPL$AXWnKXiqL ...
    
    ...
    
    ...
    
    admin:$1$synergy$5AQr ...
    
    

    J'ai donc cherché un peu sur google avec les noms 'shadow synology' et je suis tombé aussitôt sur cet article qui date d'il y a 2 mois, dans lequelle il explique que les deux mot de passe 'root' et 'admin' sont bien différents et que l'authentification ssh implémenté par le syno chercherait à matcher l'un ou l'autre des 2 mots de passe.

    Il y aurait donc un mot de passe pour nous, et un mot de passe pour ... quelqu'un d'autre, probablement Synology.

    Je poste donc cet article pour savoir si ce que j'avance est bien réel, et dans ce cas informer et alerter les utilisateurs.

    Pour savoir si ce que je dit est plausible rien de plus simple .. enfin, il faut juste regarder votre fichier /etc/shadow et voir si le début de mot de passe crypté du compte 'root' correspond avec ce que j'ai mis plus haut (il n'est pas complet, au cas ou je me tromperais je ne veux pas donner mon passe à tout le monde).

    Vous pouvez aussi compiler le fichier 'test.c' et voir si le compte 'root' et 'admin' ont bien un mot de passe différent.

    Pour être sur de ne pas avoir 'd'accès universel', j'ai fait ce que l'article disais (i.e. remplacer le mot de passe crypté 'root' par celui de 'admin'). Et après redémarrage et tout le tralala ça à l'air de fonctionner, et rien n'a été remplacé.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.