Malý backdoor na Flask alebo ako ovládať počítač v lokálnej sieti

Ahoj, Habr!

Nedávno som si pozrel stiahnutú verziu streamu o programovaní „Ako vytvoriť svoje webové aplikácie v Flasku“. A rozhodol som sa upevniť svoje vedomosti v nejakom projekte. Dlho som nevedel, čo napísať, a prišla mi myšlienka: „A prečo by som neurobil mini-backdoor na Flasku?“

V hlave sa okamžite objavili prvé návrhy implementácie a možnosti backdooru. Ale rozhodol som sa ihneď zostaviť zoznam možností backdooru:

  1. Vedieť otvárať webové stránky
  2. Mať prístup k príkazovému riadku
  3. Vedieť otvárať programy, fotografie, videá

Takže prvý bod je veľmi ľahko realizovateľný pomocou modulu webbrowser. Druhý bod som sa rozhodol realizovať pomocou modulu os. A tretí – tiež cez modul os, ale budem používať „linky“ (o tom neskôr).

Písanie servera

Takže, *bubnová rôznová* celý kód servera:

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 'Server beží a čaká na príkazy...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Otvorenie stránky ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Spustenie príkazu ' + 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 'Spustenie ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Už som ukázal celý kód, je čas vysvetliť podstatu.

Celý kód sa spúšťa na lokálnom počítači na porte 5000. Na interakciu s serverom musíme poslať JSON POST požiadavku.

Štruktúra JSON požiadavky:

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

No, logicky, že ‘command’ – príkaz, ktorý chceme vykonať. A ‘data’ – argumenty príkazu.

Môžete písať a posielať JSON požiadavky na interakciu so serverom manuálne (máte na to pomoc requests). Alebo môžete napísať konzolového klienta.

Písanie klienta

Kód:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Napísané v Pythone',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Autor: 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('Príkaz neobsahuje argumenty!')
    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('Príkaz neobsahuje argumenty!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Vysvetlenie:

Najprv sa naimportuje knižnica requests (na interakciu so serverom). Následne sú opísané funkcie start a test. Potom nasleduje cyklus, v ktorom sa deje čaro. Študovali ste kód? Potom je vám zrejmé, aké čaro sa v cykle deje. Zadajte príkaz – ten sa vykoná. Shell – príkazy pre príkazový riadok (logika presahuje očakávania).

Test – kontrola, či server (backdoor) funguje.
Link – použitie "skratky"
Openweb – otvorenie webovej stránky
Quit – odhlásenie z klienta
Set – nastavenie IP vášho počítača v lokálnej sieti

A teraz podrobnejšie o link.

Vedľa servera sa nachádza súbor link.txt. Obsahuje odkazy (celú cestu) k súborom (videá, fotografie, programy).

Štruktúra je takáto:

plný_cesta>popis
plný_cesta>popis

Záver

Máme server-backdoor na ovládanie počítača v lokálnej sieti (v rámci wifi siete). Technicky môžeme spustiť klienta z akéhokoľvek zariadenia, na ktorom je interpret python.

P.S. Príkaz set som pridal, aby sa v prípade priradenia inej IP adrese počítaču v lokálnej sieti mohol priamo v klientovi zmeniť.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster