Shell Remota en C

Iniciado por fary, 27 Marzo 2011, 14:48 PM

0 Miembros y 3 Visitantes están viendo este tema.

fary

Buenas, estoi intentando hacer una Shell Remota en C  ya que nunca hice una en este lenguaje y me pica la curiosidad  :xD el caso es que no me sale...

El código que tengo es este:

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    PHANDLE leer;
    PHANDLE escribir;
   
    SECURITY_ATTRIBUTES sa;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
   
    DWORD bytes;

    CreatePipe(leer,escribir,&sa,0);

    si.cb = 68;
    si.dwFlags = 257;
   
    si.hStdError = escribir;
    si.hStdOutput = escribir;
   
    CreateProcessA(0,"cmd.exe /c ping 127.0.0.1", &sa, &sa, 1, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
    Sleep(100);
    CloseHandle(escribir);
   
    char buffer[1024];
    char total[1024];
   
    int ret = ReadFile(leer,buffer,250,&bytes,0);
   
    lstrcat(total,buffer);
   
    while(ret != 0)
    {
        ret = ReadFile(leer,buffer,250,&bytes,0);
        lstrcat(total,buffer);       
    }
   
    MessageBoxA(0,total,0,0);
    system("PAUSE");

    return 0;
}


Alguien sabe que hago mal?

salu2!
Un byte a la izquierda.

Karcrack

Esta es la buen forma de hacerlo:
http://goodfellas.shellcode.com.ar/docz/asm/WritingSmallShellcode.pdf
:D

fary

Muchas gracias Karcrack sin duda lo leeré pero tambien me gustaria saber que ago mal en el código que postee.

salu2!
Un byte a la izquierda.

[Zero]

#3
¿No tendrías que crear el pipe luego de iniciar la shell? Estas llamando a CreatePipe con dos handles nulos (o ni eso, que no están inicializados a 0), al igual que tampoco inicializaste a 0 los miembros de PROCESS_INFORMATION y STARTUPINFO (salvo cb, que sí lo pusiste bien).

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

fary

Muchas gracias a los dos, ya lo consegui hacer... el caso es que me quedo así:

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
   SECURITY_ATTRIBUTES sa;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   
   void * leer;
   void * escribir;
 
   ZeroMemory(&sa,sizeof(&sa));
   
   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
   sa.bInheritHandle = TRUE;
   sa.lpSecurityDescriptor = NULL;

    CreatePipe(&leer,&escribir,&sa,0);

    GetStartupInfoA(&si);
   
   si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
   si.wShowWindow = SW_HIDE;
   si.hStdOutput = escribir;
   si.hStdError  = escribir;
   si.hStdInput = leer;
   
   CreateProcessA(0,"c:\\windows\\system32\\cmd.exe /c dir",0,0,TRUE,0,0,0,&si,&pi);
   Sleep(200);
   CloseHandle(escribir);
   
   char buffer[1024];
   DWORD bleidos;
   ReadFile(leer,buffer,1024,&bleidos,0);
   MessageBoxA(0,buffer,0,0);
   
   system("PAUSE");
   return 0;
}



No es una "MegaShell" pero su "apaño" hace  :P
salu2!
Un byte a la izquierda.

Karcrack

@Drinky94: Mejor seria que en vez de utilizar una ruta hardcodeada pusieses la variable de entorno adecuada; %ComSpec% :) Y eso de usar Sleeps es muy cutre :P :P

fary

Te refieres a esperar a que se cree el proceso usando WaitForSingleObject, no?

salu2!
Un byte a la izquierda.

Karcrack

Hasta que el proceso no se crea no continua la ejecución de tu programa :D

fary

Cita de: Karcrack en 27 Marzo 2011, 21:26 PM
Hasta que el proceso no se crea no continua la ejecución de tu programa :D

No se me ocurre como hacerlo... de una forma rápida, alguna pista?

salu2!
Un byte a la izquierda.

Karcrack

No hay que hacer nada :huh: Con hacer CreateProces() sobra... hasta que el proceso no se ha creado no vuelve la ejecución a tu programa...