Um pequeno backdoor no Flask ou como controlar um computador em uma rede local

Oi, Habr!

Recentemente assisti a uma versão baixada do fluxo de programação “Como criar seu próprio aplicativo web no Flask”. E resolvi consolidar meus conhecimentos em algum projeto. Durante muito tempo não sabia o que escrever e me veio a ideia: “Por que não fazer um mini-backdoor no Flask?”

As primeiras opções de implementação e capacidades do backdoor apareceram imediatamente na minha cabeça. Mas decidi fazer imediatamente uma lista de recursos de backdoor:

  1. Saiba como abrir sites
  2. Ter acesso à linha de comando
  3. Ser capaz de abrir programas, fotos, vídeos

Portanto, o primeiro ponto é extremamente fácil de implementar utilizando o módulo webbrowser. Decidi implementar o segundo ponto usando o módulo os. E o terceiro também é através do módulo os, mas usarei “links” (mais sobre isso depois).

Escrevendo um servidor

Então, *drumroll* todo o código do servidor:

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

Já descartei todo o código, é hora de explicar a essência.

Todo o código é executado no computador local na porta 5000. Para interagir com o servidor, devemos enviar uma solicitação JSON POST.

Estrutura de solicitação JSON:

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

Bem, faz sentido que ‘comando’ seja o comando que queremos executar. E 'dados' são os argumentos do comando.

Você pode escrever e enviar solicitações JSON para interagir com o servidor manualmente (as solicitações irão ajudá-lo). Ou você pode escrever um cliente de console.

Escrevendo um cliente

Código:

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

Explicações:

Em primeiro lugar, é importado o módulo de solicitações (para interação com o servidor). Abaixo estão as descrições das funções de início e teste. E então o ciclo em que a mágica acontece. Você leu o código? Então você entende o significado da magia que acontece no ciclo. Digite o comando - ele será executado. Shell – comandos para a linha de comando (a lógica está fora de escala).

Teste – verifique se o servidor está rodando (backdoor)
Link – uso de um “atalho”
Openweb – abrindo um site
Sair – sai do cliente
Set – configurando o ip do seu computador na rede local

E agora mais sobre link.

Há um arquivo link.txt próximo ao servidor. Contém links (caminho completo) para arquivos (vídeos, fotos, programas).

A estrutura é assim:

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

Total

Temos um servidor backdoor para controlar um computador em uma rede local (dentro de uma rede wi-fi). Tecnicamente, podemos executar o cliente a partir de qualquer dispositivo que possua um interpretador python.

PS Adicionei o comando set para que se um computador na rede local receber um IP diferente, ele possa ser alterado diretamente no cliente.

Fonte: habr.com

Adicionar um comentário