Páginas: [1]
|
 |
|
Autor
|
Tema: problema "pipes" funcion EON para contrlar cmd.exe con sockets (Leído 382 veces)
|
octalh
Desconectado
Mensajes: 533
"El sueño de la razón produce monstruos"
|
Hola, resulta que estoy haciendo pruebas con sockets y basicamente estoy siguiendo los manuales que encontre en el foro... hice mis funciones para controlar una shell remota como las del ejemplo de EON de este link: http://foro.elhacker.net/programacion_cc/wsasocket_contra_socket-t210589.0.htmlpero por alguna razon puedo hacer todo menos escribir datos de entrada en el PIPE. si alguien me puede decir que estoy haciendo mal seria de gran ayuda.. ya que por mas que relei el codigo no encuentro el error. aqui estan mis funciones void datos_func::bshell() { SECURITY_ATTRIBUTES saPipe; STARTUPINFO sInfo; ZeroMemory(&saPipe,sizeof(saPipe)); saPipe.nLength = sizeof(saPipe); saPipe.lpSecurityDescriptor = NULL; saPipe.bInheritHandle = TRUE; CreatePipe(&stdinRd, &stdinWr, &saPipe, 0); CreatePipe(&stdoutRd, &stdoutWr, &saPipe, 0); GetStartupInfo(&sInfo); sInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; sInfo.wShowWindow = SW_HIDE; sInfo.hStdOutput = stdoutWr; sInfo.hStdError = stdoutWr; sInfo.hStdInput = stdinRd; CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&sInfo,&pInfo); Sleep(100); printf(" [ok] Shell iniciada"); } void datos_func::rshell() { char buf[1024]; DWORD bUsados; //PeekNamedPipe(stdoutRd, NULL, NULL, NULL, &bTotales, NULL); PeekNamedPipe(stdoutRd,buf,sizeof(buf),NULL,&bTotales,NULL); ZeroMemory(buf,sizeof(buf)); ReadFile(stdoutRd, buf, sizeof(buf), &bUsados, NULL); Sleep(10); strcat(buf," \n"); send(inetsock,buf,sizeof(buf),0); } void datos_func::eshell(char comandox[100]) { printf(comandox); WriteFile(stdoutWr,comandox,strlen(comandox),&bUsados,NULL); Sleep(100); } la funcion que crea el proceso y la que lee los datos de salida funcionan bien, pero no la de escribir datos nuevos para enviarlos al cmd.exe que esta mal en la ultima funcion.. 
|
|
|
|
« Última modificación: 01 Junio 2008, 18:59 por octalh »
|
En línea
|
|
|
|
|
sirdarckcat
|
Cambia: WriteFile(stdoutWr,comandox,strlen(comandox),&bUsados,NULL); por: WriteFile(stdinWr,comandox,strlen(comandox),&bUsados,NULL); Saludos!!
|
|
|
|
|
En línea
|
|
|
|
octalh
Desconectado
Mensajes: 533
"El sueño de la razón produce monstruos"
|
muchas gracias por responder sirdarckcat, de hecho ya habia intentando cambiando el handle de la entrada de datos del pipe y tampoco funciono :S, no se porque cuando ejecuto la primer funcion que arranca la shell, y luego la funcion que lee los datos me devuelve el: Microsoft Windows XP [Versión 5.1.2600 (C) Copyright 1985-2001 Microsoft Corp
C:\Documents and Settings\doku> quiere decir que la funcion que lee funciona. pero al ejecutar la funcion que escribe el comando, y vuelvo a ejecutar la funcion que lee, ya no me regresa ningun dato en pantalla.  si sirve de algo esta es la forma en que ejecuto la funcion en el cliente. void datos_func::eshell() { cmd.comando = 9; printf(" \n \n Ingrese comando: "); gets(cmd.param1); send(inetsock1, (char *)&cmd, sizeof(cmd), 0); }
asi la recibo recv(inetsock, (char *)&cmd,sizeof(cmd),0); else if(cmd.comando == 9) { eshell(cmd.param1); }
asi se ejecuta void datos_func::eshell(char comandox[100]) { printf(comandox); WriteFile(stdinWr,comandox,strlen(comandox),&bUsados,NULL); Sleep(100); }
en la ultima funcion añadi un print para saber si el comando esta llegando bien, y al parecer todo esta en orden pero no funciona. Ya relei bastante el codigo y no parece haber errores, tendra algo que ver que utilizo una clase donde declare todas las variables ?? class datos_func { public: void bshell(); void rshell(); void eshell(char comandox[100]); void cshell(); private: //shell HANDLE stdinRd, stdinWr, stdoutRd, stdoutWr; // Los pipes PROCESS_INFORMATION pInfo; DWORD bTotales; DWORD bUsados; }; 
|
|
|
|
« Última modificación: 01 Junio 2008, 18:46 por octalh »
|
En línea
|
|
|
|
E0N
Lab &
Colaborador
Conectado
Mensajes: 2.682
|
Wenas, reponidnedo a tu mp No se muy bien por q te puede pasar, a mi hacer esas funciones me costó lo suyo y no me dio pocos problemas la verdad... Pon un cout o printf detras de cada función (te recomiendo q lo testees el local y luego ya le añadas los sockets) y asi ves donde se atasca la funcion, q los pipes son muy dados a atascarse xDDDD A lo mejor es una chorrada como q no estás escribiendo el caracter de fin de cadena o te falta el caracter \n (estuve dos tardes para darme cuenta de esa tontería  ) asi q mira a ver si se te atascan o q es lo q les pasa y nos cuentas, de todas formas las funciones tal y como yo las puse son 100% funcionales... Salu2
|
|
|
|
|
En línea
|
|
|
|
|
sirdarckcat
|
Este código: void datos_func::eshell(char comandox[100]) { printf(comandox); WriteFile(stdinWr,comandox,strlen(comandox),&bUsados,NULL); Sleep(100); }Es vulnerable a FormatStringOverflow (FSoF), te recomiendo que no te acostumbres a hacer eso., %s esta para eso  Saludos!!
|
|
|
|
|
En línea
|
|
|
|
octalh
Desconectado
Mensajes: 533
"El sueño de la razón produce monstruos"
|
Gracias a ambos por responder  , todo el problema era el "\n", pensaba que solo era para dar un salto de linea por "apariencia", no pense que fuera tan importante.  sirdarckcat gracias por el consejo lo tendre en cuenta.. ojala pudieras mostrarme un ejemplo de como debi de haber hecho la funcion para evitar esa vulnerabilidad.. bueno gracias y aki estamos 
|
|
|
|
|
En línea
|
|
|
|
|
|
E0N
Lab &
Colaborador
Conectado
Mensajes: 2.682
|
Gracias a ambos por responder  , todo el problema era el "\n", pensaba que solo era para dar un salto de linea por "apariencia", no pense que fuera tan importante.  sirdarckcat gracias por el consejo lo tendre en cuenta.. ojala pudieras mostrarme un ejemplo de como debi de haber hecho la funcion para evitar esa vulnerabilidad.. bueno gracias y aki estamos  Trankilo, sule pasar xDDD 
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1]
|
|
|
|