Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: <<<-Basura->>> en 20 Junio 2011, 05:03 am



Título: Ataque por fuerza bruta en c++
Publicado por: <<<-Basura->>> en 20 Junio 2011, 05:03 am
Hola estoy tratando de simular un ataque de fuerza bruta a un programa diseñado por mi, necesito ayuda pues no se que hacer  :-\

tengo este programa echo en c++ :
(http://www.imagengratis.org/images/vent2.png)
Bueno lo que hace es pedir un usuario y una contraseña, lo normal

Con este otro programa obtengo la dirección de memoria del programa "LOGIN"
(http://www.imagengratis.org/images/vent1.png)

Bueno lo que necesito saber es como puedo insertar el usuario y la  contraseña desde el programa "FUERZA BRUTA" y comenzar a probar las posibles contraseñas que sean posibles en "LOGIN"


Título: Re: Ataque por fuerza bruta en c++
Publicado por: BlackZeroX en 20 Junio 2011, 05:54 am
.
Yo usaría PIPES ( No son exclusivos de Linux ni de Windows, de hecho se implementan de manera similar. )

Dulces Lunas!¡.


Título: Re: Ataque por fuerza bruta en c++
Publicado por: <<<-Basura->>> en 20 Junio 2011, 06:50 am
BlackZeroX estuve leyendo sobre los pipes y encontré muy poco sobre el tema, pero voy entendiendo de a pocos, pero lo que quiero decir es que si no conoces alguna otra página algún link donde este algún tutorial para pipes :D


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Dark Invader en 20 Junio 2011, 11:24 am
Mira a ver si esto es lo que buscas:http://www.reloco.com.ar/linux/prog/pipes.html (http://www.reloco.com.ar/linux/prog/pipes.html)

Salu2


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Queta en 20 Junio 2011, 11:26 am
http://msdn.microsoft.com/en-us/library/aa365780.aspx (http://msdn.microsoft.com/en-us/library/aa365780.aspx)

Me parece que estás en Windows, ¿no?


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Danyel_Casvill en 20 Junio 2011, 17:06 pm
Con sockets no?Bueno eso fue lo que habimos dicho en el proyecto, además lo intente y funcionó, intentalo con sockets  ;)


Título: Re: Ataque por fuerza bruta en c++
Publicado por: fantasma306 en 20 Junio 2011, 20:48 pm
Con sockets no?Bueno eso fue lo que habimos dicho en el proyecto, además lo intente y funcionó, intentalo con sockets  ;)

los dos programas son independientes el uno del otro. el programa que pide la contraseña y el login no esta programado para conectarse a ningun socket ni esta programado para comunicar por pipes. Son programas a parte...

esto es una de las condiciones: entonces a partir de esto, como se podria conseguir ?


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Danyel_Casvill en 20 Junio 2011, 20:59 pm
el programa que pide la contraseña y el login no esta programado para conectarse a ningun socket ni esta programado para comunicar por pipes. Son programas a parte...

esto es una de las condiciones: entonces a partir de esto, como se podria conseguir ?

Ok, con esta condicion cambian las cosas, voy a buscar a ver que encuentro


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Khronos14 en 21 Junio 2011, 01:21 am
A mi se me ocurre que le envíes pulsaciones de teclas a la consola del login. Puedes usar la función keybd_event para hacer eso.

Saludos.


Título: Re: Ataque por fuerza bruta en c++
Publicado por: <<<-Basura->>> en 21 Junio 2011, 09:11 am
hey Khronos14 no tienes algún ejemplo sencillo que pueda implementar, la verdad me puse a probar y se me hizo un desastre  ;D  ;D , no nunca pude hacer lo que quería :(


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Khronos14 en 21 Junio 2011, 13:59 pm
Mira este pequeño ejemplo que acabo de hacer:

Código
  1. #include <iostream>
  2. #include <Windows.h>
  3.  
  4. int main(int argc, char * argv[])
  5. {
  6. HWND hCalc = FindWindow(NULL, L"Calculadora"); //Obtenemos el Handle de la ventana de la calculadora
  7. if (hCalc != 0)
  8. {
  9. SetForegroundWindow(hCalc); //Hacemos que la calculadora tenga el foco para enviarle las teclas
  10. keybd_event((BYTE)VkKeyScan('2'), 0, 0, 0); //Pulsamos la tecla 2
  11. keybd_event((BYTE)VkKeyScan('2'), 0, 2, 0); //Levantamos la tecla
  12.  
  13. keybd_event(VK_ADD, 0, 0, 0); //Pulsamos +
  14. keybd_event(VK_ADD, 0, 2, 0); //Levantamos +
  15.  
  16. keybd_event((BYTE)VkKeyScan('3'), 0, 0, 0); //Pulsamos la tecla 3
  17. keybd_event((BYTE)VkKeyScan('3'), 0, 2, 0); //Levantamos la tecla 3
  18.  
  19. keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
  20. keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter
  21.  
  22. /*
  23. * Con estas pulsaciones la calculadora debería sumar 2 + 3
  24. */
  25. }
  26. else
  27. std::cout << "No se encontró la ventana" << std::endl;
  28.  
  29. std::cin.get();
  30. return 0;
  31. }
  32.  

Para que funcione, tienes que tener la calculadora abierta. Otro método de buscar la ventana es mediante las APIs para trabajar con procesos, como: Process32First,  CreateToolhelp32Snapshot, etc..

Aquí tienes una tabla con todas las Virtual Key Codes:

http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx

Saludos.


Título: Re: Ataque por fuerza bruta en c++
Publicado por: fantasma306 en 21 Junio 2011, 14:43 pm
Khronos14  ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) de lujo


Título: Re: Ataque por fuerza bruta en c++
Publicado por: El_Java en 21 Junio 2011, 14:56 pm
Si es para lo de nuestro proyecto, creo que con hacer un socket udp que se conectara con la direccion 192.168.1.1 del localhost nos valdría, pero claro, esto es teoría, tendre que comprobarlo... xD

el codigo de Khronos14 es solo para Windows, no?


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Khronos14 en 21 Junio 2011, 15:09 pm
Hola El_Java, sí, el código sólo funciona en Windows.

Saludos.


Título: Re: Ataque por fuerza bruta en c++
Publicado por: fantasma306 en 21 Junio 2011, 17:06 pm
Bueno aqui tengo un codigo basandome en lo que dijo Khronos14 pero no funciona muy bien, los datos se envian correctamente pero se cierra la consola que pide el login y contraseña:

Victima
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. const string usu = "aaa";
  6. const string pas = "cab";
  7.  
  8. int main(){
  9. string USU;
  10. string PAS;
  11.    do{
  12. system("title LOGIN");
  13. cout << "Usuario: ";
  14. cin >> USU;
  15. cout << "Password: ";
  16. cin >> PAS;
  17.    }while(usu!=USU && pas!=PAS);
  18.    return 0;
  19. }
  20.  

BruteForce
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <Windows.h>
  5. using namespace std;
  6.  
  7. bool enviar(string login, string pass);
  8.  
  9. int main(){
  10. const HANDLE Consola = GetStdHandle(STD_OUTPUT_HANDLE);
  11. string login, pswd;
  12. ifstream pass("dico.txt");
  13. ifstream user("dico.txt");
  14. if(pass.is_open() && user.is_open()){
  15. bool seguir=true;
  16. while(!user.eof() && seguir){
  17. user>>login;
  18. while(!pass.eof() && seguir){
  19. pass>>pswd;
  20. SetForegroundWindow((HWND)Consola);
  21. seguir=enviar(login,pswd);
  22. Sleep(1000);
  23. }
  24. }
  25.  
  26. }
  27. system("pause");
  28. return 0;
  29. }
  30.  
  31. bool enviar(string login, string pass){
  32. HWND hCalc = FindWindow(NULL, TEXT("LOGIN"));//Obtenemos el Handle de la ventana de la calculadora
  33. if (hCalc != 0){
  34. cout<<"User: "<<login<<endl;
  35. cout<<"Pass: "<<pass<<endl;
  36. SetForegroundWindow(hCalc);
  37.  
  38. /*enviar pass*/
  39. for(register int i=0;i<login.size();i++){
  40. keybd_event((BYTE)VkKeyScan(login[i]), 0, 0, 0);
  41. keybd_event((BYTE)VkKeyScan(login[i]), 0, 2, 0);
  42. }
  43. keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
  44. keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter
  45.  
  46. /*enviar login*/
  47. for(register int i=0;i<pass.size();i++){
  48. keybd_event((BYTE)VkKeyScan(pass[i]), 0, 0, 0);
  49. keybd_event((BYTE)VkKeyScan(pass[i]), 0, 2, 0);
  50. }
  51. keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
  52. keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter
  53.  
  54. return true;
  55. }
  56. else
  57. return false;
  58. }


no se en que falla...


Título: Re: Ataque por fuerza bruta en c++
Publicado por: Khronos14 en 21 Junio 2011, 17:45 pm
Creo que te falta un cin.clear() en el código de la víctima.

Saludos.



Título: Re: Ataque por fuerza bruta en c++
Publicado por: leogtz en 21 Junio 2011, 17:49 pm
¿Por qué no haces la prueba con tuberías?, es decir, que el programa espere el user y el password de la entrada estándar y se lo mandas con un comando.

type words | programa
ó
cat words | programa


Título: Re: Ataque por fuerza bruta en c++
Publicado por: fantasma306 en 21 Junio 2011, 17:54 pm
Creo que te falta un cin.clear() en el código de la víctima.

Saludos.

no me ha funcionado, sigue igual :S

¿Por qué no haces la prueba con tuberías?, es decir, que el programa espere el user y el password de la entrada estándar y se lo mandas con un comando.

type words | programa
ó
cat words | programa

para programar "pipes" o "tuberias" hay que modificar el programa Victima, para establecer una comunicacion,
y lo que se quiere hacer es que se pueda enviar datos a otra consola, sin conocer el codigo que tiene... lo de las consolas es solo para hacer la prueba...

saludos


Título: Re: Ataque por fuerza bruta en c++
Publicado por: leogtz en 21 Junio 2011, 18:02 pm
no me ha funcionado, sigue igual :S

para programar "pipes" o "tuberias" hay que modificar el programa Victima, para establecer una comunicacion,
y lo que se quiere hacer es que se pueda enviar datos a otra consola, sin conocer el codigo que tiene... lo de las consolas es solo para hacer la prueba...

saludos

Ah, entiendo, yo pensé que solo lo hacía por probar... .En fín, saludos.


Título: Re: Ataque por fuerza bruta en c++
Publicado por: do-while en 21 Junio 2011, 18:17 pm
¡Buenas!

No se si se podria hacer de esta forma o no. Durante un tiempo estuve trasteando con la ingenieria inversa. Las funciones de lectura, si leen cadenas, necesitan la diereccion de memoria de la cadena en la que almacenan datos. Esta parte de la memoria supongo que sera de lectura/escritura. Lo que podrias intentar es parchear la lectura de los datos, para escribir la cadena desde fuera del programa e introducir un salto a la parte en la que se comprueba si el user/pass es correcto, y asi hasta que encuentres un par valido... Asi te olvidas de las APIs y el programa es mas portable... Pero ya te digo, solo es una idea.

¡Saludos!

   
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje


Título: Re: Ataque por fuerza bruta en c++
Publicado por: fantasma306 en 21 Junio 2011, 18:30 pm
¡Buenas!

No se si se podria hacer de esta forma o no. Durante un tiempo estuve trasteando con la ingenieria inversa. Las funciones de lectura, si leen cadenas, necesitan la diereccion de memoria de la cadena en la que almacenan datos. Esta parte de la memoria supongo que sera de lectura/escritura. Lo que podrias intentar es parchear la lectura de los datos, para escribir la cadena desde fuera del programa e introducir un salto a la parte en la que se comprueba si el user/pass es correcto, y asi hasta que encuentres un par valido... Asi te olvidas de las APIs y el programa es mas portable... Pero ya te digo, solo es una idea.

¡Saludos!

si, eso tambien lo habia pensado, desensamblar el programa victima, ver en que direccion de memoria se guardan los datos, y a partir de ahi crear el programa BruteForce, e ir escribiendo en esas zonas de memoria..., tengo que probarlo :P

pero como escribir en esas zonas de memoria?

saludos


Título: Re: Ataque por fuerza bruta en c++
Publicado por: fantasma306 en 21 Junio 2011, 20:34 pm
Ya encontre el error, me da vergüenza decir donde estaba el error  :-[

error de logica en el codigo victima...

bueno aqui os dejo el codigo por si quereis hecharle un vistazo:

VICTIMA:
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. const string usu = "aaa";
  6. const string pas = "cab";
  7.  
  8. int main(){
  9. string USU;
  10. string PAS;
  11.    do{
  12. system("title LOGIN");
  13. cout << "Usuario: ";
  14. cin >> USU;
  15. cout << "Contraseña: ";
  16. cin >> PAS;
  17. cin.clear();
  18.    }while(usu!=USU || pas!=PAS);
  19. if(usu==USU && pas==PAS)
  20. cout<<"Contraseña CORRECTA"<<endl;
  21.    return 0;
  22. }
  23.  

ATAQUE:
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <Windows.h>
  5. using namespace std;
  6.  
  7. bool enviar(string login, string pass);
  8.  
  9. int main(){
  10. const HANDLE Consola = GetStdHandle(STD_OUTPUT_HANDLE);
  11. string login, pswd;
  12. ifstream pass("dico.txt");
  13. ifstream user("dico.txt");
  14. if(pass.is_open() && user.is_open()){
  15. bool seguir=true;
  16. while(!user.eof() && seguir){
  17. getline(user,login,'\n');
  18. while(!pass.eof() && seguir){
  19. getline(pass,pswd,'\n');
  20. SetForegroundWindow((HWND)Consola);
  21. seguir=enviar(login,pswd);
  22. Sleep(300);
  23. }
  24. }
  25.  
  26. }
  27. system("pause");
  28. return 0;
  29. }
  30.  
  31. bool enviar(string login, string pass){
  32. HWND hCalc = FindWindow(NULL, TEXT("LOGIN"));//Obtenemos el Handle de la ventana
  33. if (hCalc != 0){
  34. cout<<"User: "<<login<<endl;
  35. cout<<"Pass: "<<pass<<endl;
  36. SetForegroundWindow(hCalc);
  37.  
  38. /*enviar login*/
  39. for(register int i=0;i<login.size();i++){
  40. keybd_event((BYTE)VkKeyScan(login[i]), 0, 0, 0);
  41. keybd_event((BYTE)VkKeyScan(login[i]), 0, 2, 0);
  42. }
  43. keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
  44. keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter
  45.  
  46. /*enviar pass*/
  47. for(register int i=0;i<pass.size();i++){
  48. keybd_event((BYTE)VkKeyScan(pass[i]), 0, 0, 0);
  49. keybd_event((BYTE)VkKeyScan(pass[i]), 0, 2, 0);
  50. }
  51. keybd_event(VK_RETURN, 0, 0, 0); //Pulsamos enter
  52. keybd_event(VK_RETURN, 0, 2, 0); //Levantamos enter
  53.  
  54. return true;
  55. }
  56. else
  57. return false;
  58. }
  59.  
  60.  


en la consola de ataque, el ultimo user y pass son los correctos...

solo un pequeño detalle, si en el codigo de la victima, el programa no se cierra, el programa atacante sigue poniendo el users y pass en la consola. Por lo tanto no se podria saber cual es el codigo y el users


Título: Re: Ataque por fuerza bruta en c++
Publicado por: BlackZeroX en 21 Junio 2011, 23:33 pm
...

Usa getforegroundwindow() para saber si el handle de la ventana ACTIVA es el correcto ( con respecto al obtenido con FindWindow() ) )... si estas en windows ( Obvio por que veo las apis de windows... ) puedes usar SendMessage() para enviar las pulsaciones (teclas y/o texto), de este modo no importa si esta minimazada la ventana u otro estado, SIEMPRE le llegaran las pulsaciones de teclas ( 2do plano ).

En el codigo del proceso enviar deberian usar GetForegroundWindow() para saber si la ventana SUPERIOR esta activa ( focus() ) o es otra, de este modo se invocaria nuevamente a SetForegroundWindow() para establecerle el foro (activa), este es un metodo cutre, usar pipes o SendMessage() son mas factibles ademas de que pueden trabajar en 2do plano.

En Resumen:

Ya que quedan fuera los pipes usa SendMessage() (http://msdn.microsoft.com/en-us/library/ms644950%28v=VS.85%29.aspx) + WM_KEYDOWN (http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx) + WM_KEYUP (http://msdn.microsoft.com/en-us/library/ms646281(v=VS.85).aspx) + hHandle de la ventana destino ( para asegurar la llegada de las pulsaciones virtuales ) + las constantes Virtual Key Code (http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx)

Dulces Lunas!¡.