En lille bagdør på Flask eller hvordan man styrer en computer på et lokalt netværk

Hej Habr!

Jeg så for nylig en downloadet version af programmeringsstrømmen "Sådan opretter du din egen webapplikation i Flask." Og jeg besluttede at konsolidere min viden i et eller andet projekt. I lang tid vidste jeg ikke, hvad jeg skulle skrive, og ideen kom til mig: "Hvorfor ikke lave en mini-bagdør i Flask?"

De første muligheder for implementeringer og muligheder for bagdøren dukkede straks op i mit hoved. Men jeg besluttede mig for straks at lave en liste over bagdørsfunktioner:

  1. Ved, hvordan man åbner hjemmesider
  2. Har kommandolinjeadgang
  3. Kunne åbne programmer, billeder, videoer

Så det første punkt er ekstremt nemt at implementere ved hjælp af webbrowsermodulet. Jeg besluttede at implementere det andet punkt ved hjælp af os-modulet. Og den tredje er også gennem os-modulet, men jeg vil bruge "links" (mere om det senere).

At skrive en server

Så *trommerulle* al serverkoden:

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')

Jeg har allerede dumpet al koden, det er tid til at forklare essensen.

Al kode kører på den lokale computer på port 5000. For at interagere med serveren skal vi sende en JSON POST-anmodning.

JSON-anmodningsstruktur:

{‘command’:  ‘comecommand’, ‘data’: ‘somedata’}

Nå, det giver mening, at 'kommando' er den kommando, vi ønsker at udføre. Og 'data' er kommandoargumenterne.

Du kan skrive og sende JSON-anmodninger om at interagere med serveren manuelt (anmodninger vil hjælpe dig). Eller du kan skrive en konsolklient.

At skrive en klient

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

Forklaringer:

Først og fremmest importeres anmodningsmodulet (til interaktion med serveren). Nedenfor er beskrivelser af start- og testfunktionerne. Og så den cyklus, hvor magien sker. Har du læst koden? Så du forstår betydningen af ​​den magi, der sker i cyklussen. Indtast kommandoen - den udføres. Shell – kommandoer til kommandolinjen (logikken er ikke skala).

Test – tjek om serveren kører (bagdør)
Link – brug af en "genvej"
Openweb – åbning af en hjemmeside
Afslut – forlad klienten
Set – indstilling af ip på din computer på det lokale netværk

Og nu mere om link.

Der er en link.txt-fil ved siden af ​​serveren. Den indeholder links (fuld sti) til filer (videoer, fotos, programmer).

Strukturen er sådan:

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

Total

Vi har en bagdørsserver til at styre en computer på et lokalt netværk (inden for et wi-fi netværk). Teknisk set kan vi køre klienten fra enhver enhed, der har en python-fortolker.

PS Jeg tilføjede set-kommandoen, så hvis en computer på det lokale netværk er tildelt en anden IP, kan den ændres direkte i klienten.

Kilde: www.habr.com

Tilføj en kommentar