En liten bakdörr pÄ Flask eller hur man styr en dator i ett lokalt nÀtverk.

Hej, Habr!

Nyligen sÄg jag den nedladdade versionen av en stream om programmering "Hur man skapar sin egen webbapplikation med Flask". Jag bestÀmde mig för att förstÀrka mina kunskaper med ett projekt. Jag visste lÀnge inte vad jag skulle skriva och kom pÄ idén: "Varför inte göra en mini-backdoor med Flask?".

Först dök de första varianterna av implementationer och möjligheter till backdooren upp i huvudet. Men jag bestÀmde mig för att omedelbart göra en lista över backdoorens funktioner:

  1. Kunna öppna webbplatser
  2. Ha tillgÄng till kommandoraden
  3. Kunna öppna program, bilder, videor

SĂ„ det första punkt Ă€r extremt enkelt att implementera med hjĂ€lp av modulwebblĂ€saren. Den andra punkten bestĂ€mde jag mig för att implementera med hjĂ€lp av modulen os. Och den tredje – ocksĂ„ genom modulen os, men jag kommer att anvĂ€nda "lĂ€nkar" (mer om detta senare).

Skrivande servern

SĂ„, *trumvirvel* hela 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 'Servern körs och vÀntar pÄ kommandon...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Öppnar sidan ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Kör kommandot ' + 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 'Starta ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Jag har redan visat hela koden, det Àr dags att förklara essensen.

Hela koden körs pÄ den lokala datorn pÄ port 5000. För att interagera med servern mÄste vi skicka en JSON POST-begÀran.

Strukturen för JSON-begÀran:

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

Ja, det Àr logiskt att 'command' Àr kommandot vi vill utföra. Och 'data' Àr kommandots argument.

Man kan skriva och skicka JSON-begÀrningar manuellt för att interagera med servern (hÀr har ni hjÀlp av requests). Eller sÄ kan man skriva en konsolklient.

Skriva klienten

Kod:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Skriven i Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Författare: 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('Kommandot innehÄller inga argument!')
    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('Kommandot innehÄller inga argument!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Förklaringar:

Först importeras requests-modulen (för att interagera med servern). DĂ€refter beskrivs funktionerna start och test. Och sedan en loop dĂ€r magin hĂ€nder. Har du lĂ€st koden? DĂ„ förstĂ„r du meningen med magin som hĂ€nder i loopen. Skriv in kommandot – det utförs. Shell – kommandon för kommandoraden (logiken Ă€r övervĂ€ldigande).

Test – kontrollerar om servern (bakdörren) fungerar
Link – anvĂ€ndning av "genvĂ€g"
Openweb – öppnar en webbplats
Quit – avbryter klienten
Set – anger IP-adressen för din dator i det lokala nĂ€tverket

Nu ska vi prata mer om link.

Bredvid servern ligger filen link.txt. I den finns lÀnkar (full vÀg) till filer (video, bilder, program).

Strukturen Àr följande:

full_path>beskrivning
full_path>beskrivning

Resultat

Vi har en bakdörrserver för att styra datorn i det lokala nÀtverket (inne i wi-fi-nÀtverket). Tekniskt kan vi köra klienten frÄn vilken enhet som helst som har en Python-tolk.

P.S. Kommandot set lade jag till för att om datorn i det lokala nÀtverket fÄr en annan IP-adress, kan den Àndras direkt i klienten.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster