En lille backdoor på Flask eller hvordan man styrer en computer i et lokalt netværk

Hello, Habr!

For nylig så jeg en downloadet version af et stream om programmering 'Hvordan man laver sin egen webapplikation i Flask'. Og jeg besluttede at sikre mine færdigheder i et projekt. Jeg vidste længe ikke, hvad jeg skulle skrive, og så kom jeg på ideen: 'Hvorfor ikke lave en mini-backdoor i Flask?'

Mine første idéer til implementering og muligheder for backdoor dukkede straks op i mit hoved. Men jeg besluttede at lave en liste over backdoorens funktioner:

  1. At kunne åbne hjemmesider
  2. At have adgang til kommandoprompten
  3. At kunne åbne programmer, fotos, videoer

Så, den første funktion kan let implementeres med modulet webbrowser. Den anden funktion besluttede jeg at implementere med modulet os. Og den tredje - også via modulet os, men jeg vil bruge 'links' (mere om dette senere).

Skrivning server

Og så, *trommesolo* hele 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 'Serveren kører og venter på kommandoer...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Åbner siden ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Udfører kommando ' + 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 'Starter ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Jeg har allerede delt hele koden, nu er det tid til at forklare essensen.

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

Strukturen for JSON-anmodningen:

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

Nå, det er logisk, at 'command' - er den kommando, vi ønsker at udføre. Og 'data' - er kommandoens argumenter.

Man kan skrive og sende JSON-anmodninger for at interagere med serveren manuelt (requests til din hjælp). Man kan også skrive en konsolklient.

Skrivning af klient

Kode:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Skrevet i Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Forfatter: 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('Kommandoen indeholder ikke argumenter!')
    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('Kommandoen indeholder ikke argumenter!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Forklaringer:

Først importeres requests-modulet (til interaktion med serveren). Dernæst beskrives funktionerne start og test. Og derefter er der en løkke, hvor magien sker. Har du læst koden? Så forstår du meningen med magien, der foregår i løkken. Indtast en kommando – den udføres. Shell – kommandoer til kommandolinjen (logikken er høj).

Test – tjekker, om serveren (backdoor) virker
Link – anvendelse af "genvej"
Openweb – åbning af websted
Quit – afslutning af klienten
Set – angivelse af IP-adressen på din computer i det lokale netværk

Og nu lidt mere om link.

Ved siden af serveren ligger filen link.txt. Den indeholder links (fuld sti) til filer (videoer, billeder, programmer).

Strukturen er sådan:

fuld_sti>beskrivelse
fuld_sti>beskrivelse

Resultat

Vi har en backdoor-server til at styre computeren i det lokale netværk (inden for Wi-Fi-netværket). Teknisk set kan vi starte klienten fra enhver enhed, der har en Python-fortolker.

P.S. Kommandoen set tilføjede jeg for, at hvis computeren i det lokale netværk tildeles en anden IP, kan den ændres direkte i klienten.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster