DjRamzy Posté(e) le 15 juin 2011 Partager Posté(e) le 15 juin 2011 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é. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yokav Posté(e) le 15 juin 2011 Partager Posté(e) le 15 juin 2011 Salut, Je confirme ce que tu as avanc 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cricx Posté(e) le 15 juin 2011 Partager Posté(e) le 15 juin 2011 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é. oui, tu as tout-à-fait raison, le mot de passe root est le même pour tous... Mais personne (hormis synology) ne le connait. et sans demande particulière d'assistant auprès de synology, il y a peu de chance que quelqu'un se connecte sur nos synos, sauf si, bien sûr, le mot de passe fuite. Donc pour être plus sûr, il faut, soit changer le mot de passe de root par celui d'admin, soit interdire le login root autrement que par clé ssh (ou les deux). Merci à toi pour avoir donné l'information, quant à moi je change illico le mot de passe root ! (simplement avec la commande passwd root. Un essai de login fonctionne, le fichier shadow a bien été changé, j'ai gardé quelque part l'ancien mot de passe au cas où). Reste à savoir si certaines fonctions du dsm (l'interface web) ne nécessitent pas la connaissance du mot de passe root, dans la mesure où le compte admin est un compte standard d'utilisateur et n'a donc aucun droit particulier sur le système. Quelqu'un pour vérifier que l'interface d’administration fonctionne toujours après changement du mot de passe ? Après un petit test supplémentaire (modification dans shadow du mot de passe d'admin), un essai de connexion en tant que root échoue. Ce qui laisse penser que le ssh embarqué utilise le mot de passe d'admin pour le compte root, et que le mot de passe root n'est utilisé qu'en local (probablement par l'interface d'administration). Le problème d'accès ssh avec le compte root ne semble se poser qu'en cas d'installation d'openssh par ipkg, car dans ce cas le login root n'est plus possible avec le mot de passe d'admin, et quiconque a le mot de passe root commun a tous peut se connecter en tant que root. Reste à savoir si le ssh de synology n'a pas d'autres particularités (du genre l'utilisateur synomachin devient root), il faudrait voir si le code source est dispo chez syno pour le vérifier. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
DjRamzy Posté(e) le 15 juin 2011 Auteur Partager Posté(e) le 15 juin 2011 oui, tu as tout- 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
cricx Posté(e) le 15 juin 2011 Partager Posté(e) le 15 juin 2011 Si au contraire, tout le monde peux conna 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sp@r0 Posté(e) le 16 juin 2011 Partager Posté(e) le 16 juin 2011 tiens, c'est une id 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Diaoul Posté(e) le 17 juin 2011 Partager Posté(e) le 17 juin 2011 Une explication officielle de Synology serait sympa sur ce coup l 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
vachton Posté(e) le 17 juin 2011 Partager Posté(e) le 17 juin 2011 Pour john, qqn peut confirmer, mais il ne fait que passer un dictionnaire, synology a certainement pas mit un mot de passe du dico ni une combinaison de mots du dico. Pour le fichier test.c, il y a une horreur... je vois des scanf...., je veux bien que ça soit un fichier de test mais avec cette fonction on peut déborder dans la mémoire à son aise. J'espère que tu ne mets pas de scanf dans tes fichiers de prod car on peut cracher ton appli comme on veut :/ Le mieux est d'utiliser fgets(stdin,userid, 128) ainsi on limite le nombre de caractère entré.. ce que scanf ne fait pas. 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sp@r0 Posté(e) le 18 juin 2011 Partager Posté(e) le 18 juin 2011 Pour john, qqn peut confirmer, mais il ne fait que passer un dictionnaire, synology a certainement pas mit un mot de passe du dico ni une combinaison de mots du dico. Pour le fichier test.c, il y a une horreur... je vois des scanf...., je veux bien que 0 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.