Una piccola backdoor in Flask o come controllare un computer nella rete locale

Ciao, Habr!

Recentemente ho guardato la versione scaricata di uno streaming sulla programmazione "Come creare la propria web app in Flask". Ho deciso di consolidare le mie conoscenze in qualche progetto. Non sapevo cosa scrivere e mi è venuta l'idea: "Perché non fare una mini backdoor in Flask?".

Subito nella mia mente sono emerse le prime idee per l'implementazione e le possibilità della backdoor. Ma ho deciso di stilare subito un elenco delle funzionalità della backdoor:

  1. Essere in grado di aprire siti web
  2. Avere accesso alla riga di comando
  3. Essere in grado di aprire programmi, foto, video

Quindi, il primo punto può essere implementato molto facilmente utilizzando il modulo webbrowser. Ho deciso di implementare il secondo punto utilizzando il modulo os. E il terzo – anche attraverso il modulo os, ma userò 'link' (ne parlerò più avanti).

Scrittura server

Quindi, *rullare i tamburi* ecco tutto il codice del server:

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 'Il server è in esecuzione e attende comandi...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Apertura del sito ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Esecuzione del comando ' + 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 'Avvio ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Ho già pubblicato tutto il codice, è ora di spiegare il concetto.

Tutto il codice viene eseguito sul computer locale sulla porta 5000. Per interagire con server dobbiamo inviare una richiesta JSON POST.

Struttura della richiesta JSON:

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

È logico che 'command' sia il comando che vogliamo eseguire. E 'data' sono gli argomenti del comando.

Puoi scrivere e inviare richieste JSON per interagire con il server a mano (ti consiglio requests). Oppure puoi scrivere un client da console.

Scrittura del client

Codice:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Scritto in Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Autore: 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('Il comando non contiene argomenti!')
    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('Il comando non contiene argomenti!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Spiegazioni:

Per prima cosa, viene importato il modulo requests (per interagire con il server). Poi sono descritte le funzioni start e test. E poi c'è un ciclo in cui avviene la magia. Avete letto il codice? Significa che il significato della magia che avviene nel ciclo è chiaro per voi. Inserite un comando - viene eseguito. Shell - comandi per la riga di comando (la logica è sorprendente).

Test – verifica se il server (backdoor) funziona
Link – utilizzo di un "collegamento"
Openweb – apertura di un sito web
Quit – uscita dal client
Set – impostazione dell'IP del vostro computer nella rete locale

Adesso approfondiamo il link.

Accanto al server si trova il file link.txt. Esso contiene collegamenti (percorso completo) ai file (video, foto, programmi).

La struttura è la seguente:

percorso_completo>descrizione
percorso_completo>descrizione

Risultato

Abbiamo un server-backdoor per gestire il computer nella rete locale (all'interno della rete Wi-Fi). Tecnologicamente possiamo avviare il client da qualsiasi dispositivo che dispone di un interprete Python.

P.S. Ho aggiunto il comando set per poter modificare direttamente nel client se a un computer nella rete locale viene assegnato un altro IP.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster