Mala pozadinska vrata na Flasku ili kako kontrolisati računar na lokalnoj mreži

Hej Habr!

Nedavno sam gledao preuzetu verziju programskog toka “Kako kreirati vlastitu web aplikaciju u Flasku.” I odlučio sam da svoje znanje konsolidujem u nekom projektu. Dugo nisam znao šta da napišem i pala mi je ideja: "Zašto ne napraviti mini-backdoor u Flasku?"

U glavi su mi se odmah pojavile prve opcije implementacije i mogućnosti backdoor-a. Ali odlučio sam da odmah napravim listu backdoor mogućnosti:

  1. Znati kako otvoriti web stranice
  2. Imati pristup komandnoj liniji
  3. Moći otvarati programe, fotografije, video zapise

Dakle, prva tačka je izuzetno jednostavna za implementaciju pomoću modula web pretraživača. Odlučio sam implementirati drugu tačku koristeći os modul. I treći je takođe preko os modula, ali ću koristiti "linkove" (o tome više kasnije).

Pisanje servera

Dakle, *drumroll* sav serverski kod:

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

Već sam izbacio sav kod, vrijeme je da objasnim suštinu.

Sav kod radi na lokalnom računaru na portu 5000. Za interakciju sa serverom, moramo poslati JSON POST zahtjev.

JSON struktura zahtjeva:

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

Pa, logično je da je 'komanda' komanda koju želimo da izvršimo. A 'data' su argumenti naredbe.

Možete pisati i slati JSON zahtjeve za ručnu interakciju sa serverom (zahtjevi će vam pomoći). Ili možete napisati konzolni klijent.

Pisanje klijentu

Kod:

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

Objašnjenja:

Prije svega, uvozi se modul zahtjeva (za interakciju sa serverom). Ispod su opisi startnih i testnih funkcija. A onda ciklus u kojem se dešava magija. Jeste li pročitali kod? Dakle, razumete značenje magije koja se dešava u ciklusu. Unesite naredbu - izvršava se. Shell – komande za komandnu liniju (logika je van skale).

Test – provjerite da li server radi (backdoor)
Link – upotreba “prečice”
Openweb – otvaranje web stranice
Prekini – izađi iz klijenta
Postavi – podešavanje IP-a vašeg računara na lokalnoj mreži

A sada više o linku.

Postoji link.txt fajl pored servera. Sadrži veze (puna putanja) do datoteka (video snimaka, fotografija, programa).

Struktura je ovakva:

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

Rezultat

Imamo backdoor server za kontrolu računara na lokalnoj mreži (unutar wi-fi mreže). Tehnički, možemo pokrenuti klijenta sa bilo kojeg uređaja koji ima python interpreter.

PS Dodao sam naredbu set tako da ako se nekom kompjuteru na lokalnoj mreži dodijeli drugačija IP adresa, može se promijeniti direktno u klijentu.

izvor: www.habr.com

Dodajte komentar