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

Hé Habr !

J'ai récemment regardé une version téléchargée du flux de programmation « Comment créer votre propre application Web dans Flask ». Et j'ai décidé de consolider mes 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 dans Flask ?

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

  1. Savoir ouvrir des sites Web
  2. Avoir un accès en ligne de commande
  3. Pouvoir ouvrir des programmes, des photos, des vidéos

Ainsi, le premier point est extrêmement simple à mettre en œuvre à l’aide du module navigateur Web. J'ai décidé d'implémenter le deuxième point en utilisant le module os. Et le troisième se fait également via le module os, mais j'utiliserai des « liens » (nous en reparlerons plus tard).

Ecrire un serveur

Alors, *roulements 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'essence.

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 la requête 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 manuellement avec le serveur (les requêtes vous aideront). Ou vous pouvez écrire un client console.

Écrire un client

Code:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Written on Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Author: 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('Комманда не содержит аргументов!')
    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 :

Tout d'abord, le module de requêtes est importé (pour interagir avec le serveur). Vous trouverez ci-dessous les descriptions des fonctions de démarrage et de test. Et puis le cycle dans lequel la magie opère. Avez-vous lu le code ? Vous comprenez donc le sens de la magie qui se produit dans le cycle. Entrez la commande - elle est exécutée. Shell – commandes pour la ligne de commande (la logique est hors échelle).

Test – vérifiez si le serveur est en cours d’exécution (porte dérobée)
Lien – utilisation d’un « raccourci »
Openweb – ouvrir un site Web
Quitter – quitter le client
Définir – définir l'adresse IP de votre ordinateur sur le réseau local

Et maintenant plus sur le lien.

Il y a un fichier link.txt à côté du serveur. Il contient des liens (chemin complet) vers des fichiers (vidéos, photos, programmes).

La structure est la suivante :

полный_путь>описание
полный_путь>описание

Total

Nous disposons d'un serveur de porte dérobée pour contrôler un ordinateur sur un réseau local (au sein 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 afin que si un ordinateur du réseau local se voit attribuer une adresse IP différente, elle puisse être modifiée directement dans le client.

Source: habr.com

Ajouter un commentaire