IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Shell a travers socket ne fonctionne pas


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 37
    Points
    37
    Par défaut Shell a travers socket ne fonctionne pas
    Salut, j'ai un code qui est cense me donner un shell sur le PC ou le serveur est lance a qui je donne le bon mot de passe avant. voice le code, il est pas trop lent. Je lance le serveur et il se bind a mon ip local puis je fais "telnet 192.168.0.X 40001" je lui donne le mot de passe puis quand je lance une commande comme ls, il me dit "not found" ou d'autre erreurs et cela est vrai pour toute commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
     
    #include <unistd.h>
    #include <signal.h>
     
    #include <sys/ioctl.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <syslog.h>
    #include <fcntl.h>
     
    #define PORT 40001
    #define PASS "pass"
     
    int main(void)
    {
    	int sock = socket(AF_INET, SOCK_STREAM, 0);
    	struct sockaddr_in sin;
    	sin.sin_port = htons(PORT);
    	sin.sin_family = AF_INET;
     
    	char buffer[300];
    	int fd, n;
     
    	for(fd = 1, n = -1; fd < 255 && n < 0; fd++)
    	{
    		sprintf(buffer, "192.168.0.%d", fd);
    		sin.sin_addr.s_addr = inet_addr(buffer);
    		n = bind(sock, (struct sockaddr*)&sin, sizeof(struct sockaddr));
    	}
     
    	printf("Port: %s\n", buffer);
     
    	// Je le demonise 
    	if(fork())
    		return 0;
     
    	listen(sock, 5);
     
    	struct sockaddr_in csin;
    	n = sizeof(struct sockaddr_in);
     
    	char *argb[] = {"/bin/sh", NULL};
     
    	while(1)
    	{
    		while( (fd = accept(sock, (struct sockaddr*)&csin, (socklen_t*)&n)) == -1)
    			return -1;
     
    		// A chaque client son processus
    		if(fork() == 0)
    		{
    			/*do
    			{
    				write(fd, "Password: ", sizeof("Password: "));
    				n = read(fd, buffer, sizeof(buffer));
    			}while(n > 0 && strncmp(PASS, buffer, sizeof(buffer)) == 0);*/
     
    			dup2(fd, STDIN_FILENO);
    			dup2(fd, STDOUT_FILENO);
    			dup2(fd, STDERR_FILENO);
     
    			// where is the problem
    			execv("/bin/sh", argb);
     
    			close(fd);
    		}
    	}
     
    	return 0;
    }

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    pourquoi tu fais ça :
    Citation Envoyé par Voleurdepoules Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	for(fd = 1, n = -1; fd < 255 && n < 0; fd++)
    	{
    		sprintf(buffer, "192.168.0.%d", fd);
    		sin.sin_addr.s_addr = inet_addr(buffer);
    		n = bind(sock, (struct sockaddr*)&sin, sizeof(struct sockaddr));
    	}
    à moins que ta machine ne porte plusieurs IP et/ou l'IP 192.168.0.254 tu as de bonnes chances de faire un bind sur 0.0.0.0 (any) et que la boucle for() soit inutile
    sinon à part un #include <arpa/inet.h> et que le code est un peu crado ça compile sans warning et s'exécute convenablement chez moi, je vois pas de problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     grep "define PORT" bindshell.c 
    #define PORT 40001
    $ gcc -Wall bindshell.c -o bindshell
    $ ./bindshell 
    Port: 192.168.0.254
    $ netstat -laputen | grep bindshell
    tcp        0      0 0.0.0.0:44870           0.0.0.0:*               LISTEN      1000       37206       2557/bindshell  
    $ nc 127.0.0.1 44870
    Password: pass
    ls -l
    total 12
    -rwxrwx--- 1 gruik gruik 7699 mai   17 18:50 bindshell
    -rw-rw---- 1 gruik gruik 1377 mai   17 18:50 bindshell.c

  3. #3
    Nouveau membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 37
    Points
    37
    Par défaut
    Je fais le for pour pouvoir binder sur mon ip local sans avoir a regarder sur ifconfig ( methode bete mais qui fonctionne ), je ne pense pas binder sur 0.0.0.0 parce qu’avec le for j'essai toutes les 192.168.0. et je rajoute 'n' a cette endroit du coup je peux binder que sur une adresse commencant par "192.168.0.n".

    Le probleme ne survient pas a la compilation, le probleme c'est que quand je connecte une socket client sur le serveur, il me donne bien les file desciptor de stdin, stdout et stderr mais interpretes mal mes commandes shell.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //je fais
    $telnet IP PORT
    connexion etablie
    // j'envoi mes commandes shell ex:
    ls
    // il me retourne
    ls : not found
    J'ai donc decider de creer un autre programme qui fera office de client pour supprimer les '\n' ( touche 'entree' ) qu'envoi telnet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    // Voila le resultat
    ls
    ls -la
    sh: 1: ls: not found
    sh: 1: : not found
    sh: 1: : not found
    sh: 1: : not found
    : not found
    sh: 1: : not found
    sh: 1: : not found
    : not found
    sh: 1: : not found
    sh: 2: ELF: not found
    clear
    J'ai donc decide de lancer "ls" a la place de "sh", j'ouvre un logiciel qui me montre les programmes en cours ( un genre de "ps -aux" ), la je vois que "ls" ne veut pas se fermer. J'espere avoir ete clair sur les tests que j'ai effectue et que tout le monde m'ai compris .

    P.S: qu'est ce qu'il y a de crado dans le code, j'ai pourtant fais des efforts.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par Voleurdepoules Voir le message
    Je fais le for pour pouvoir binder sur mon ip local sans avoir a regarder sur ifconfig ( methode bete mais qui fonctionne ), je ne pense pas binder sur 0.0.0.0 parce qu’avec le for j'essai toutes les 192.168.0. et je rajoute 'n' a cette endroit du coup je peux binder que sur une adresse commencant par "192.168.0.n".
    c'est quoi l'intérêt ? (et cf mon post précédent, les trucs en rouge)

    Le probleme ne survient pas a la compilation, le probleme c'est que quand je connecte une socket client sur le serveur, il me donne bien les file desciptor de stdin, stdout et stderr mais interpretes mal mes commandes shell.
    ok, ben comme dit ça compile sans warning et s'exécute convenablement chez moi, je vois pas de problème.

    J'ai donc decider de creer un autre programme qui fera office de client pour supprimer les '\n' ( touche 'entree' ) qu'envoi telnet
    un truc comme netcat/nc ? (cf mon post précédent)

    P.S: qu'est ce qu'il y a de crado dans le code, j'ai pourtant fais des efforts.
    • à quoi servent les include errno, signal, syslog ?
    • en revanche il manque arpa/inet.h
    • les variables sont déclarées un peu au petit bonheur au fil du programme, en général on les déclare en début ça permet notamment d'optimiser l'allocation de la stackframe
    • le close(fd) après l'exec ne sert à rien puisque l'espace d'adressage du processus est remplacé par celui de sh


    • tu peux faire un netstat -laputen et vérifier combien de sockets tu ouvres en écoute pour être sûr ?
    • essaye d'utiliser la commande nc plutot que telnet ou d'essayer de recoder la roue, on préfère toujours utiliser des outils qu'on sait déjà fiables
    • en fin de tout je pense que j'irais débugger, d'abord en lançant wireshark pour voir ce qui transite sur le réseau et comment, ensuite à coups de ltrace/strace probablement en oubliant pas l'option pour follow-fork-mode

  5. #5
    Nouveau membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 37
    Points
    37
    Par défaut
    L'interet du for est de binder sur mon adresse local, je pourrais donc plus tard acceder au shell avec un autre ordinateur qui se trouve dans la meme box, si le serveur fonctionne bien, je lirais la sortie de ifconfig ( c'est plus sur ).

    Le probleme, je l'ai deja dit, c'est que le shell interprete mal mes commandes je t'ais donne quelques exemples de retour des commandes dans mon post precedent.

    J'ai utilise telnet parceque c'est le premier qui m'est venu a l'esprit.

    Enfin pour les includes non utilise, c'est parce que je comptais mettre des signal handler pour eviter qu'on tue mon processus alors qu'il est en route, errno pour retourner les messages d'erreur et creer un fichier log...

    Pour finir, je te remercie infiniment pour ton aide et surtout pour la commande nc, avec, le serveur traite excellemment bien mes commandes et tout marche comme sur des roulettes. , il n'y a pas assez de smiley pour exprimer ma joie .

    Pour le code crado, je reflechirais a 5 fois avant d'ecrire.

    P.S: Si tu pourrais me filer des liens sur les normes a respecter ou autres choses dans le genre je serais content de les lires. Et ne m'affiche pas sur code-de-porc stp .

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par Voleurdepoules Voir le message
    L'interet du for est de binder sur mon adresse local, je pourrais donc plus tard acceder au shell avec un autre ordinateur qui se trouve dans la meme box, si le serveur fonctionne bien, je lirais la sortie de ifconfig ( c'est plus sur ).
    à partir du moment où tu bind sur 192.168.0.x n'importe quelle IP exterieure peut venir sur ton portbind, à l'exception de localhost, du coup en faisant un bind sur 0.0.0.0 tu obtiendrais le même résultat sans avoir besoin de boucle for()
    si tu tiens absolument à bind sur l'IP de ta carte réseau tu peux récupérer l'adresse en allant chatouiller ioctl comme décrit >ici<

    bon finalement pour ton problème principal, c'était juste que tu utilisais telnet en fait, si je dis pas de bêtise la différence principale vient du fait que telnet utilise des retours à la ligne du type \r\n (CRLF) au lieu de simples \n (LF)

    Pour le code crado, je reflechirais a 5 fois avant d'ecrire.
    c'était pas dit méchamment te formalise pas, et sans doute assez subjectif également

Discussions similaires

  1. Socket - recv() ne fonctionne pas
    Par I-DEXX dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2013, 17h45
  2. Socket qui fonctionnent en local mais pas à distance..
    Par -Sly- dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 20/06/2010, 11h27
  3. [AC-2002] Commande "Shell" ne fonctionne pas
    Par pier.antoine dans le forum VBA Access
    Réponses: 3
    Dernier message: 04/04/2010, 12h42
  4. fichier shell qui ne fonctionne pas avec le cron mais fonctionne dans le shell
    Par diabli73 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 20/10/2008, 19h12
  5. Script shell ne fonctionne pas
    Par alexp dans le forum Linux
    Réponses: 7
    Dernier message: 15/06/2006, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo