Mali bバックdoor na Flasku ili kako upravljati računalom u lokalnoj mreži

Bok, Habr!

Nedavno sam pogledao preuzetu verziju streama o programiranju 'Kako stvoriti svoju web aplikaciju na Flasku'. I odlučio sam učvrstiti svoje znanje u nekom projektu. Dugo sam razmišljao o tome što napisati i tada mi je pala na pamet ideja: 'Zašto ne napraviti mini-backdoor na Flasku?'

U glavi su se odmah pojavile prve ideje o realizacijama i mogućnostima backdoora. No, odlučio sam odmah sastaviti popis mogućnosti backdoora:

  1. Mogućnost otvaranja web stranica
  2. Pristup komandnoj liniji
  3. Mogućnost otvaranja programa, slika, videa

Dakle, prvu točku je izuzetno lako implementirati pomoću modula webbrowser. Drugom točkom odlučio sam se poslužiti modulom os. A treću ću također koristiti kroz modul os, ali ću koristiti 'linkove' (o tome kasnije).

Pisanje poslužitelja

Evo, *da se čuje bubanj* sav kod poslužitelja:

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 'Poslužitelj radi i čeka na komande...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https:\/\/www.'+json_string['data'], new=0)
        return 'Otvaram stranicu ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Izvršavam komandu ' + 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 'Pokrećem ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Već sam prikazao cijeli kod, sada je vrijeme da objasnim suštinu.

Cijeli kod se pokreće na lokalnom računalu na portu 5000. Za interakciju s serverom moramo slati JSON POST zahtjev.

Struktura JSON zahtjeva:

{‘command’:  ‘doComandu’, ‘data’: ‘nekiPodaci’}

Pa, logično je da je 'command' – komanda koju želimo izvršiti. A 'data' – argumenti komande.

Možete pisati i slati JSON zahtjeve za interakciju s poslužiteljem ručno (tu su vam na raspolaganju requests). A možete napisati konzolnog klijenta.

Pisanje klijenta

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('Komanda ne sadrži 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('Komanda ne sadrži argumente!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Objašnjenja:

Prvo se importira requests modul (za interakciju sa serverom). Zatim su opisane funkcije start i test. Nakon toga slijedi petlja u kojoj se odvija čarobnost. Jeste li pročitali kod? Znači, jasan vam je smisao čarobnosti koja se odvija u petlji. Unesite komandu – ona će se izvršiti. Shell – komande za komandnu liniju (logika se intenzivira).

Test – provjerava da li server (backdoor) radi.
Link – korištenje "prečice"
Openweb – otvaranje web stranice
Quit – izlaz iz klijenta
Set – postavljanje IP adrese vašeg računala u lokalnoj mreži

A sada detaljnije o linku.

Pored servera se nalazi datoteka link.txt. U njoj su linkovi (potpuni put) do datoteka (video, fotografije, programi).

Struktura je sljedeća:

pun pogodak > opis
pun pogodak > opis

Zaključak

Imamo backdoor server za upravljanje računalom unutar lokalne mreže (unutar wi-fi mreže). Tehnički, možemo pokrenuti klijent s bilo kojeg uređaja koji ima Python interpreter.

P.S. Komandu set sam dodao kako bih omogućio promjenu IP adrese ako računalu u lokalnoj mreži bude dodijeljena druga IP adresa, slijedi direktno u klijentu.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster