Client für Remote Shell



  • Hi Leute. Ich würde gerne nen Client schreiben, der die Remote Shell, die in meinem Server integriert ist, steuern kann... Was (für eine Funktion) muss ich dafür schreiben? (siehe unten im Client)

    MEIN SERVER:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <winsock2.h>
    #include <iostream>
    
    using namespace std;
    
    //Class Declaration
    void ServerStart();
    
    int main()
    {
        SetConsoleTitle("Remote Shell"); 
        ServerStart();//Start Server
    }
    
    void ServerStart()
    {
        WSADATA wsa;
    
        SOCKET s;
        SOCKADDR_IN sAddr;
    
        USHORT port;
    
        PROCESS_INFORMATION pi;
        STARTUPINFO si;
    
        port = 12345;//Set listening port
    
        memset( &si, 0, sizeof( si ) );
        si.cb = sizeof( si );
        si.wShowWindow = SW_HIDE;
        si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    
        sAddr.sin_addr.s_addr = INADDR_ANY;
        sAddr.sin_port =  (port >> 8) | (port << 8);
        sAddr.sin_family = AF_INET;
    
        WSAStartup( 0x0202, &wsa );
    
        s = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0 );
        bind( s, (LPSOCKADDR)&sAddr, sizeof( sAddr ) );
        listen( s, 5 );
    
        __asm
        {
            push ebx
            mov ebx, s
        }
        s = accept( s, NULL, NULL );//Accept Client
        __asm
        {
            push ebx
            call DWORD PTR [closesocket]//Close if error.
            pop ebx
        }
    
        si.hStdInput = (HANDLE)s;
        si.hStdOutput = (HANDLE)s;
        si.hStdError = (HANDLE)s;
    
        CreateProcess( NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );//Start the remote process
    
        WaitForSingleObject( pi.hProcess, INFINITE );//Allow Client to control remote process
    
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
        closesocket( s );
    
        WSACleanup();
            ServerStart();//Server Start Loop
    }
    

    MEIN CLIENT:

    #include <windows.h>
    #include <cstdio> 
    #include <conio.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //Prototypen
    int startWinsock();
    
    int main()
    {
      SOCKET s;
      SOCKADDR_IN addr;
      int rc;
    
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
    {
      printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
      return 1;
    }
    else
    {
      printf("Socket erstellt!\n");
    }
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
    addr.sin_family=AF_INET;
    addr.sin_port=htons(12345); // wir verwenden mal port 12345
    addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
    
    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    if(rc==SOCKET_ERROR)
    {
      printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
    getchar();
      return 1;
    }
    else
    {
      printf("Verbunden mit 127.0.0.1..\n");
    }
      // Was muss hier rein? <--------------------------------------
      getchar();
      return 0;
    }
    
    int startWinsock()
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    


  • WTF soll das __asm Zeugs???

    Edit1: Ausserdem sollst Du im Client das Socket wieder schliessen. Und auch WSACleanup(..) mal wider aufrufen.

    Edit2: Ausserdem, warum rufst Du StartServer(..) rekursiv auf? Eine Schleife würde genügen. Anders wirst Du dann per Gelegenheit mal einen Stackoverflow kriegen.



  • theta schrieb:

    WTF soll das __asm Zeugs???

    Gute Frage. Fehlt da nicht auch ein pop ebx beim ersten __asm? Es ist immer eine ganz schlechte Idee was auf den Stack zu legen und NICHT wieder abzuholen. Zumindest sollte man es irgendwo wieder runter holen wenn man es nicht mehr braucht. Damit kann man sein ganzes OS aus dem Tackt bringen wenn man es an der falschen Stelle macht.

    Ansonsten schließe ich mich auch dem Vorredner an. ^^



  • theta schrieb:

    WTF soll das __asm Zeugs???

    Edit1: Ausserdem sollst Du im Client das Socket wieder schliessen. Und auch WSACleanup(..) mal wider aufrufen.

    Edit2: Ausserdem, warum rufst Du StartServer(..) rekursiv auf? Eine Schleife würde genügen. Anders wirst Du dann per Gelegenheit mal einen Stackoverflow kriegen.

    Ok Socket schließen, so etwa?:

    else
    {
      printf("Verbunden mit 127.0.0.1..\n");
    }
      // HIER WEITERMACHEN!!
        closesocket( s );
        WSACleanup();
      getchar();
      return 0;
    

    Bin ziemlicher Anfänger. Versuch aber mein Bestes...

    Skalli schrieb:

    theta schrieb:

    WTF soll das __asm Zeugs???

    Gute Frage. Fehlt da nicht auch ein pop ebx beim ersten __asm? Es ist immer eine ganz schlechte Idee was auf den Stack zu legen und NICHT wieder abzuholen. Zumindest sollte man es irgendwo wieder runter holen wenn man es nicht mehr braucht. Damit kann man sein ganzes OS aus dem Tackt bringen wenn man es an der falschen Stelle macht.

    Ansonsten schließe ich mich auch dem Vorredner an. ^^

    Hab es so gemacht:

    __asm
        {
            push ebx
            mov ebx, s
    	    pop ebx  //hier eingefügt
        }
        s = accept( s, NULL, NULL );//Accept Client
        __asm
        {
            push ebx
            call DWORD PTR [closesocket]//Close if error.
            pop ebx
        }
    

    Nur wie bekomme ich das nun mit dem Client hin, dass er die Remote Shell steuern kann?

    mfg skully



  • Ja, aber warum zur Hö*** schreibst Du nicht C oder C++ Code um das Socket zu schliessen im Fehlerfall?



  • theta schrieb:

    Ja, aber warum zur Hö*** schreibst Du nicht C oder C++ Code um das Socket zu schliessen im Fehlerfall?

    Ich wollte mit Inline-Assembler experimentieren. Der Code ist übrigens auch nicht von mir. Ich versuche ihn nur nachzuvollziehen...



  • Ich habe mich noch mal informiert und glaube, dass ich etwas mit sog. "Named Pipes" schreiben muss. kennt sich da evtl. jmd. mit aus?



  • Ich habe mich noch mal informiert und glaube, dass ich etwas mit sog. "Named Pipes" schreiben muss.

    Warum glaubst Du das?

    kennt sich da evtl. jmd. mit aus?

    Ja... aber da gibts sicher noch andere (z.B. Jeffrey Richter oder Charles Petzold)...

    Simon



  • theta schrieb:

    Ich habe mich noch mal informiert und glaube, dass ich etwas mit sog. "Named Pipes" schreiben muss.

    Warum glaubst Du das?

    kennt sich da evtl. jmd. mit aus?

    Ja... aber da gibts sicher noch andere (z.B. Jeffrey Richter oder Charles Petzold)...

    Simon

    Kannst Du nicht auch was dazu beitragen? Wäre nett...



  • Will mir denn keiner helfen? 😕 😞



  • Ok, dann welche Literatur empfiehlt ihr mir hier?



  • __asm
        {
            push ebx
            mov ebx, s
            pop ebx  //hier eingefügt
        }
    

    ist absoluter Quatsch. Du solltest Assembler schon verstehen wenn du es benutzt.

    Erst ebx auf den stack pushen, dann den socket nach ebx laden und sofort wieder ebx poppen - was soll das denn?


Anmelden zum Antworten