Një backdoor të vogël në Flask ose si të menaxhoni një kompjuter në rrjetin lokal

Përshëndetje, Habr!

Së fundi, pash versionin e shkarkuar të stream-it mbi programimin "Si të krijosh aplikacionin tënd në Flask". Dhe vendosa të forcoj njohuritë e mia në ndonjë projekt. Nuk dija shumë çfarë të shkruaja dhe më erdhi ideja: "Pse të mos bëj një mini-backdoor në Flask?".

Në mendje më dolën menjëherë disa mundësi për realizimin dhe funksionalitetet e backdoor-it. Por vendosa të krijoj menjëherë një listë mundësish për backdoor-in:

  1. Të kem mundësinë të hap faqet e internetit
  2. Të kem qasje në terminalin e komandave
  3. Të kem mundësinë të hap programe, foto, video

Pra, pika e parĂ« realizohet shumĂ« lehtĂ« me modulin webbrowser. Punktin e dytĂ« e vendosa ta realizoj me modulin os. Dhe tĂ« tretin – gjithashtu pĂ«rmes modulit os, por do tĂ« pĂ«rdor "linket" (pĂ«r kĂ«tĂ« mĂ« vonĂ«).

Shkrimi serverë

Pra, *bateritë* ky është kodi i plotë i serverit:

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 'Serveri po funksionon dhe po pret komandat...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https:\/\/www.'+json_string['data'], new=0)
        return 'Hapja e faqes ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Ekzekutimi i komandës ' + 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 'Nisja ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Tani që e kam dhënë gjithë kodin, është koha të shpjegoj thelbin.

Gjatë kodit ekzekutohet në kompjuterin lokal në portin 5000. Për të komunikuar me server duhet të dërgojmë një kërkesë JSON POST.

Struktura e kërkesës JSON:

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

Pra, logjikisht, ‘command’ Ă«shtĂ« komanda qĂ« duam tĂ« ekzekutojmĂ«. NdĂ«rsa ‘data’ Ă«shtĂ« argumentet e komandĂ«s.

Mund të shkruani dhe dërgoni kërkesa JSON për të komunikuar me serverin me dorë (për këtë ju ndihmojnë requests). Ose mund të shkruani një klient konsolë.

Shkrimi i klientit

Kodi:

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 nuk përmban 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 nuk përmban argumente!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Shpjegimet:

Së pari, moduli requests importohet (për ndërveprimin me serverin). Më pas, përshkruhen funksionet start dhe test. Pastaj ka një cikël ku ndodh magjia. E lexuat kodin? Do të thotë, kuptoni kuptimin e magjisë që ndodh në cikël. Shkruani një komandë - ajo do të ekzekutohet. Shell - komandat për komandën e linjës (logjika është në majë).

Test - kontrolloni nëse serveri (backdoor) funksionon.
Link - përdorimi i "shkurtoreve".
Openweb - hapja e një website.
Quit - dalja nga klienti.
Set - caktimi i IP-së së kompjuterit tuaj në rrjetin lokal.

Tani le të flasim më shumë për link.

Pranë serverit ka një skedar link.txt. Në të ndodhen lidhje (rruga e plotë) të skedarëve (video, foto, programe).

Strukturë e tillë:

plot_i_plot>përshkrim
plot_i_plot>përshkrim

Përfundimi

Ne kemi një server-backdoor për të menaxhuar kompjuterin në rrjetin lokal (në brendësi të rrjetit wi-fi). Teknikisht mund të nisni klientin nga çdo pajisje që ka interpretuesin python.

P.S. Komandën set e kam shtuar që nëse kompjuterit në rrjetin lokal i jepet një IP tjetër, të mund të ndryshohet drejtpërdrejt në klient.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster