O mic backdoor pe Flask sau cum să gestionezi un computer în rețeaua locală

Salut, Habr!

Recent am vizionat o versiune descărcată a unui stream de programare „Cum să-ți creezi propria aplicație web pe Flask”. Și am decis să îmi consolidez cunoștințele într-un proiect. Am ezitat mult să aleg ce să scriu și mi-a venit ideea: „De ce să nu fac un mini-backdoor pe Flask?”.

În minte mi-au apărut imediat primele variante de realizare și posibilități ale backdoor-ului. Dar am decis să fac mai întâi o listă a posibilităților backdoor-ului:

  1. Să poată deschide site-uri
  2. Să aibă acces la linia de comandă
  3. Să poată deschide programe, fotografii, videoclipuri

Așadar, primul punct este extrem de ușor de realizat cu ajutorul modulului webbrowser. Al doilea punct l-am decis să-l implementez cu ajutorul modulului os. Iar al treilea – tot prin modulul os, dar voi folosi „link-uri” (despre asta mai târziu).

Scrierea server

Deci, *tămbălău* 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 ''Serverul rulează și așteaptă comenzi...''
    if json_string[''command''] == ''openweb'':
        webbrowser.open(url=''https://www.''+json_string[''data''], new=0)
        return ''Deschid site-ul '' + json_string[''data''] + ''...''
    if json_string[''command''] == ''shell'':
        os.system(json_string[''data''])
        return ''Executarea comenzii '' + 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 ''Lansare '' + link.split(''>'')[1]
if __name__ == ''__main__'':
    app.run(host=''0.0.0.0'')

Am expus deja tot codul, acum este vremea să explic esența.

Întregul cod rulează pe computerul local pe portul 5000. Pentru a interacționa cu serverul trebuie să trimitem o cerere JSON POST.

Structura cererii JSON:

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

Ei bine, este logic că ‘command’ este comanda pe care vrem să o executăm. Iar ‘data’ sunt argumentele comenzii.

Se pot scrie și trimite cereri JSON pentru a interacționa cu serverul manual (aveți la dispoziție requests). Sau se poate scrie un client de linie de comandă.

Scrierea clientului

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('Comanda nu conține argumente!')
    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('Comanda nu conține argumente!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Explicații:

În primul rând, se importă modulul requests (pentru interacțiunea cu serverul). Apoi, sunt descrise funcțiile start și test. Apoi urmează un ciclu în care are loc magia. Ați citit codul? Atunci pentru voi este clar sensul magiei care se petrece în ciclu. Introduceți o comandă – aceasta se execută. Shell – comenzi pentru linia de comandă (logica este peste măsură).

Test – verificarea, funcționează serverul (backdoor)
Link – utilizarea unui „shortcut”
Openweb – deschiderea unui site
Quit – ieșirea din client
Set – setarea IP-ului calculatorului vostru în rețeaua locală

Și acum, mai în detaliu despre link.

Lângă server se află un fișier link.txt. În el se află linkuri (cale completă) către fișiere (video, foto, programe).

Structura este următoarea:

calea_completă>descriere
calea_completă>descriere

Rezultatul

Avem un server-backdoor pentru a controla un computer în rețeaua locală (în interiorul rețelei Wi-Fi). Tehnic, putem rula clientul de pe orice dispozitiv care are un interpret Python.

P.S. Am adăugat comanda set pentru a putea schimba direct în client IP-ul dacă unui computer din rețeaua locală i se atribuie un alt IP.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster