Een kleine backdoor op Flask of hoe een computer in een lokaal netwerk te beheren

Hallo, Habr!

Recentelijk heb ik de gedownloade versie van de stream over programmeren "Hoe maak je je eigen webapplicatie met Flask" bekeken. En besloot ik mijn kennis te consolideren in een project. Ik wist lange tijd niet wat ik moest schrijven en toen kwam het idee: "Waarom maken we niet een mini-backdoor met Flask?".

In mijn hoofd kwamen meteen de eerste opties voor de implementaties en mogelijkheden van de backdoor naar boven. Maar ik besloot direct een lijst te maken met de mogelijkheden van de backdoor:

  1. In staat zijn om websites te openen
  2. Toegang hebben tot de commandoregel
  3. In staat zijn om programma's, foto's, video's te openen

Dus, het eerste punt is vrij eenvoudig te implementeren met behulp van de webbrowser-module. Het tweede punt wilde ik realiseren met behulp van de os-module. En het derde - ook via de os-module, maar ik ga "links" gebruiken (daarover later).

Schrijven de server

Dus, *tromgeroffel* hier is de volledige 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 'De server draait en wacht op opdrachten...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https:\/\/www.'+json_string['data'], new=0)
        return 'Site wordt geopend ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Opdracht wordt uitgevoerd ' + 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 'Start ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Ik heb de hele code al geplaatst, het is tijd om de essentie uit te leggen.

De gehele code draait op de lokale computer op poort 5000. Voor interactie met server moeten we een JSON POST-verzoek verzenden.

De structuur van het JSON-verzoek:

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

Nou, het is logisch dat 'command' het commando is dat we willen uitvoeren. En 'data' zijn de argumenten van het commando.

Je kunt JSON-verzoeken schrijven en verzenden voor interactie met de server (requests is hiervoor handig). Of je kunt een consoleclient schrijven.

Client schrijven

Code:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Geschreven in Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Auteur: 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('Het commando bevat geen argumenten!')
    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('Het commando bevat geen argumenten!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Uitleg:

Eerst importeren we de requests-module (voor interactie met de server). Daarna worden de functies start en test beschreven. Vervolgens is er een loop waarin de magie gebeurt. Heb je de code gelezen? Dan is de betekenis van de magie in de loop je duidelijk. Voer een commando in – het wordt uitgevoerd. Shell – commando's voor de opdrachtprompt (de logica is buitengewoon).

Test – controleert of de server (backdoor) werkt.
Link – gebruik van de "snelkoppeling".
Openweb – website openen.
Quit – uit de client stappen.
Set – stellen van het ip van jouw computer in het lokale netwerk.

Laten we nu wat meer over link vertellen.

Naast de server ligt een bestand link.txt. Daarin staan de links (volledige paden) naar bestanden (video's, foto's, programma's).

De structuur is als volgt:

volledige_pad>beschrijving
volledige_pad>beschrijving

Conclusie

We hebben een backdoor-server om de computer in het lokale netwerk (binnen het wifi-netwerk) te beheren. Technisch gezien kunnen we de client vanaf elk apparaat starten waarop een Python-interpreter is geïnstalleerd.

P.S. Het commando set heb ik toegevoegd zodat, als de computer in het lokale netwerk een ander ip krijgt toegewezen, dit direct in de client kan worden gewijzigd.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster