¡Hola, Habr!
Recientemente, vi la versión descargada de un stream sobre programación titulado «Cómo crear tu propia aplicación web en Flask». Y decidí consolidar mis conocimientos en algún proyecto. No sabía qué escribir y se me ocurrió la idea: «¿Por qué no hacer un mini backdoor en Flask?».
Inmediatamente se me vinieron a la mente las primeras opciones de implementación y posibilidades del backdoor. Pero decidí hacer una lista de las funcionalidades del backdoor:
- Ser capaz de abrir sitios web
- Tener acceso a la línea de comandos
- Ser capaz de abrir programas, fotos, videos
Así que, el primer punto se puede implementar fácilmente con el módulo webbrowser. Decidí implementar el segundo punto con el módulo os. Y el tercero – también a través del módulo os, pero utilizaré «enlaces» (de esto hablaré más adelante).
Escritura servidores
Así que, *redoble de tambores* aquí está todo el código del servidor:
from flask import Flask, request
import webbrowser
import os
import re
app = Flask(__name__)
@app.route('http://mycomp', methods=['POST'])
def hell():
json_string = request.json
if json_string['command'] == 'test':
return 'El servidor está en ejecución y esperando comandos...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https://www.'+json_string['data'], new=0)
return 'Abriendo el sitio ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Ejecutando el comando ' + json_string['data'] + '...'
if json_string['command'] == 'link':
links = open('links.txt', 'r')
for i in range(int(json_string['data'])):
link = links.readline()
os.system(link.split('>')[0])
return 'Iniciando ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Ya he compartido todo el código, es hora de explicar la esencia.
Todo el código se ejecuta en el ordenador local en el puerto 5000. Para interactuar con el servidor debemos enviar una solicitud JSON POST.
Estructura de la solicitud JSON:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}Es lógico que ‘command’ sea el comando que queremos ejecutar. Y ‘data’ son los argumentos del comando.
Se pueden escribir y enviar solicitudes JSON para interactuar con el servidor manualmente (puedes utilizar requests). O puedes crear un cliente de consola.
Escritura del cliente
Código:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Escrito en Python',
'******* ** **',
'******** ** **',
'** ** ** ** Autor: ROBOTD4',
'** ** ** **',
'** ** ** **',
'******** *********',
'******* ********',
'nn']
p = ''
iport = '192.168.1.2:5000'
host = 'http://'+iport+'/mycomp'
def test():
dict = {'command': 'test', 'data': 0}
r = requests.post(host, json=dict)
if r.status_code == 200:
print (r.content.decode('utf-8'))
def start():
for i in logo:
print(i)
start()
test()
while True:
command = input('>')
if command == '':
continue
a = command.split()
if command == 'test':
dict = {'command': 'test', 'data': 0}
r = requests.post(host, json=dict)
if r.status_code == 200:
print (r.content.decode('utf-8'))
if a[0] == 'shell':
for i in range(1, len(a)):
p = p + a[i] + ' '
dict = {'command': 'shell', 'data': p}
r = requests.post(host, json=dict)
if r.status_code == 200:
print (r.content.decode('utf-8'))
p = ''
if a[0] == 'link':
if len(a) > 1:
dict = {'command': 'link', 'data': int(a[1])}
r = requests.post(host, json=dict)
if r.status_code == 200:
print (r.content.decode('utf-8'))
else:
print('¡El comando no contiene argumentos!')
if a[0] == 'openweb':
if len(a) > 1:
dict = {'command': 'openweb', 'data': a[1]}
r = requests.post(host, json=dict)
if r.status_code == 200:
print (r.content.decode('utf-8'))
else:
print('¡El comando no contiene argumentos!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Explicaciones:
Primero, se importa el módulo requests (para interactuar con el servidor). Después se describen las funciones start y test. Y luego un ciclo donde ocurre la magia. ¿Leíste el código? Entonces el significado de la magia en el ciclo te es claro. Introduce un comando: se ejecuta.
Test – comprueba si el servidor (puerta trasera) está funcionando.
Link – uso de un 'acceso directo'.
Openweb – abrir un sitio web.
Quit – salir del cliente.
Set – asignar la IP de tu computadora en la red local.
Ahora, hablemos con más detalle sobre link.
Junto al servidor hay un archivo link.txt. Contiene enlaces (ruta completa) a archivos (vídeos, fotos, programas).
La estructura es la siguiente:
ruta_completa>descripción
ruta_completa>descripción
Summary
Tenemos un servidor puerta trasera para controlar una computadora en la red local (dentro de la red wi-fi). Técnicamente, podemos iniciar el cliente desde cualquier dispositivo que tenga un intérprete de python.
P.D. Agregué el comando set para que, si se le asigna otra IP a la computadora en la red local, se pueda cambiar directamente en el cliente.
Fuente: habr.com
