Une petite porte dérobée sur Flask ou comment contrôler un ordinateur sur un réseau local

Bonjour, Habr!

J'ai récemment regardé la version téléchargée du flux de programmation "Comment construire votre application Web Flask". Et il a décidé de consolider ses connaissances dans un projet. Pendant longtemps, je ne savais pas quoi écrire et l'idée m'est venue: "Pourquoi ne pas faire une mini-porte dérobée sur Flask?".

Les premières options pour l'implémentation et les capacités de la porte dérobée sont immédiatement apparues dans ma tête. Mais j'ai décidé de faire immédiatement une liste de fonctionnalités de porte dérobée:

  1. Être capable d'ouvrir des sites
  2. Avoir un accès en ligne de commande
  3. Être capable d'ouvrir des programmes, des photos, des vidéos

Ainsi, le premier élément est extrêmement facile à implémenter en utilisant le module webbrowser. Le deuxième point que j'ai décidé de mettre en œuvre en utilisant le module os. Et le troisième est également via le module os, mais j'utiliserai des "liens" (plus à ce sujet plus tard).

Orthographe du serveur

Donc * roulement de tambour * tout le code du serveur:

from flask import Flask, request import webbrowser import os import re app = Flask(__name__) @app.route('/mycomp', methods=['POST']) def hell(): json_string = request.json if json_string['command'] == 'test': return 'The server is running and waiting for commands...' if json_string['command'] == 'openweb': webbrowser.open(url='https://www.'+json_string['data'], new=0) return 'Site opening ' + json_string['data'] + '...' if json_string['command'] == 'shell': os.system(json_string['data']) return 'Command execution ' + 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 'Launch ' + link.split('>')[1] if __name__ == '__main__': app.run(host='0.0.0.0') 

J'ai déjà vidé tout le code, il est temps d'expliquer l'essentiel.

Tout le code s'exécute sur l'ordinateur local sur le port 5000. Pour interagir avec le serveur, nous devons envoyer une requête JSON POST.

Structure de demande JSON:

 {'command': 'comecommand', 'data': 'somedata'} 

Eh bien, il est logique que «commande» soit la commande que nous voulons exécuter. Et «données» sont les arguments de la commande.

Vous pouvez écrire et envoyer des requêtes JSON pour interagir avec le serveur avec des stylets (les requêtes vous aident). Ou vous pouvez écrire un client de console.

Rédaction client

Code:

 import requests logo = ['\n\n', '****** ********', '******* *********', '** ** ** **', '** ** ** ** Written on Python', '******* ** **', '******** ** **', '** ** ** ** Author: ROBOTD4', '** ** ** **', '** ** ** **', '******** *********', '******* ********', '\n\n'] 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('   !') 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('   !') if a[0] == 'set': if a[1] == 'host': ip = a[2] + ':5000' if command == 'quit': break 

Explications

La première étape consiste à importer le module de requêtes (pour interagir avec le serveur). Description plus détaillée des fonctions de démarrage et de test. Et puis le cycle dans lequel la magie opère. Avez-vous lu le code? Ainsi, le sens de la magie qui se produit dans le cycle est clair pour vous. Entrez la commande - elle s'exécute. Shell - commandes pour la ligne de commande (la logique passe par le toit ).

Test - vérifier si le serveur fonctionne (porte dérobée)
Lien - à l'aide d'un raccourci
Openweb - ouverture du site
Quit - quitter le client
Définir - définissez l'IP de votre ordinateur sur le réseau local

Et maintenant plus sur le lien.

À côté du serveur se trouve le fichier link.txt. Il contient des liens (chemin complet) vers des fichiers (vidéos, photos, programmes).

La structure est la suivante:

_>
_>


Résumé


Nous avons un serveur de porte dérobée pour contrôler un ordinateur sur un réseau local (à l'intérieur d'un réseau wi-fi). Techniquement, nous pouvons exécuter le client à partir de n'importe quel appareil doté d'un interpréteur python.

PS J'ai ajouté la commande set de sorte que si une adresse IP différente est attribuée à un ordinateur sur le réseau local, elle peut être modifiée directement dans le client.

Source: https://habr.com/ru/post/fr448360/


All Articles