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

Olá Habr!

Recentemente, assisti à versão baixada do fluxo de programação "Como criar seu aplicativo da Web do balão". E ele decidiu consolidar seu conhecimento em algum projeto. Durante muito tempo eu não sabia o que escrever e a idéia veio à minha mente: "Por que não fazer um mini-backdoor no Flask?".

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

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

Portanto, o primeiro item é extremamente fácil de implementar usando o módulo navegador da web. O segundo ponto que decidi implementar usando o módulo os. E o terceiro também é através do módulo os, mas usarei "links" (mais sobre isso mais tarde).

Ortografia do servidor

Então * drum roll * 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') 

Eu já joguei 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, é lógico que 'comando' é 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 com canetas (solicitações ajudam você). Ou você pode escrever um cliente de console.

Redação do Cliente

Código:

 import requests logo = ['\n\n', '****** ********', '******* *********', '** ** ** **', '** ** ** ** Written on Python', '******* ** **', '******** ** **', '** ** ** ** Author: ROBOTD4', '** ** ** **', '** ** ** **', '******** *********', '******* ********', '\n\n'] 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

A primeira etapa é importar o módulo de solicitações (para interagir com o servidor). Descrição adicional das funções de início e teste. E então o ciclo em que a mágica acontece. Você leu o código? Portanto, o significado da mágica que acontece no ciclo é claro para você. Digite o comando - ele é executado. Shell - comandos para a linha de comando (a lógica passa pelo telhado ).

Teste - verifique se o servidor está funcionando (backdoor)
Link - usando um atalho
Openweb - abertura de sites
Sair - sair do cliente
Definir - defina o ip do seu computador na rede local

E agora mais sobre o link.

Ao lado do servidor está o arquivo link.txt. Ele contém links (caminho completo) para arquivos (vídeos, fotos, programas).

A estrutura é a seguinte:

_>
_>


Sumário


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 tenha um intérprete python.

PS: Adicionei o comando set para que, se um ip diferente for atribuído a um computador na rede local, ele possa ser alterado diretamente no cliente.

Source: https://habr.com/ru/post/pt448360/


All Articles