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:
- Ser capaz de abrir sites
- Ter acesso à linha de comando
- 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 servidorEntã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 ClienteCó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.