O mică ușă din spate pe Flask sau cum să controlați un computer într-o rețea locală

Hei Habr!

Am urmărit recent o versiune descărcată a fluxului de programare „Cum să vă creați propria aplicație web în Flask”. Și am decis să-mi consolidez cunoștințele într-un proiect. Multă vreme nu am știut ce să scriu și mi-a venit ideea: „De ce să nu faci un mini-backdoor în Flask?”

Primele opțiuni pentru implementări și capabilități ale ușii din spate au apărut imediat în capul meu. Dar am decis să fac imediat o listă de capabilități backdoor:

  1. Aflați cum să deschideți site-uri web
  2. Au acces la linia de comandă
  3. Să poată deschide programe, fotografii, videoclipuri

Deci, primul punct este extrem de ușor de implementat folosind modulul browser web. Am decis să implementez al doilea punct folosind modulul os. Și al treilea este, de asemenea, prin modulul os, dar voi folosi „linkuri” (mai multe despre asta mai târziu).

Scrierea unui server

Deci, *drumroll* tot codul serverului:

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

Am aruncat deja tot codul, este timpul să explic esența.

Tot codul rulează pe computerul local pe portul 5000. Pentru a interacționa cu serverul, trebuie să trimitem o solicitare JSON POST.

Structura cererii JSON:

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

Ei bine, are sens ca „comandă” să fie comanda pe care vrem să o executăm. Iar „date” sunt argumentele comenzii.

Puteți scrie și trimite solicitări JSON pentru a interacționa cu serverul manual (solicitările vă vor ajuta). Sau puteți scrie un client de consolă.

Scrierea unui client

Cod:

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

Explicatii:

În primul rând, se importă modulul de solicitări (pentru interacțiunea cu serverul). Mai jos sunt descrieri ale funcțiilor de pornire și de testare. Și apoi ciclul în care se întâmplă magia. Ai citit codul? Deci înțelegi sensul magiei care se întâmplă în ciclu. Introduceți comanda - este executată. Shell – comenzi pentru linia de comandă (logica este off scale).

Testare – verificați dacă serverul rulează (backdoor)
Link – utilizarea unei „comandări rapide”
Openweb – deschiderea unui site web
Ieșire – părăsiți clientul
Setați – setați ip-ul computerului dvs. în rețeaua locală

Și acum mai multe despre link.

Există un fișier link.txt lângă server. Conține linkuri (calea completă) către fișiere (videoclipuri, fotografii, programe).

Structura este astfel:

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

Total

Avem un server backdoor pentru controlul unui computer într-o rețea locală (în cadrul unei rețele wi-fi). Din punct de vedere tehnic, putem rula clientul de pe orice dispozitiv care are un interpret Python.

PS Am adăugat comanda set, astfel încât dacă unui computer din rețeaua locală i se atribuie un alt IP, acesta poate fi schimbat direct în client.

Sursa: www.habr.com

Adauga un comentariu