Eng kleng Backdoor op Flask oder wéi ee Computer op engem lokalen Netzwierk kontrolléiert

Hey Habr!

Ech hunn viru kuerzem eng erofgeluede Versioun vum Programméierungsstream gekuckt "Wéi Dir Är eege Webapplikatioun a Flask erstellt." An ech hu beschloss, mäi Wëssen an engem Projet ze konsolidéieren. Fir eng laang Zäit wousst ech net wat ech schreiwen an d'Iddi ass bei mir komm: "Firwat net eng Mini-Backdoor am Flask maachen?"

Déi éischt Optiounen fir Implementatiounen a Fäegkeeten vun der Backdoor koumen direkt a mengem Kapp. Awer ech hu beschloss direkt eng Lëscht vu Backdoor-Fähigkeiten ze maachen:

  1. Wësse wéi Dir Websäiten opmaacht
  2. Hutt Kommando Linn Zougang
  3. Kënnen Programmer, Fotoen, Videoen opmaachen

Also, den éischte Punkt ass extrem einfach ze implementéieren mam Webbrowser Modul. Ech hu beschloss den zweete Punkt mam OS Modul ëmzesetzen. An déi drëtt ass och duerch den OS Modul, awer ech wäert "Links" benotzen (méi doriwwer méi spéit).

Schreiwen engem Server

Also, *drumroll* all Servercode:

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

Ech hunn de ganze Code scho gedumpt, et ass Zäit d'Essenz z'erklären.

All Code leeft um lokalen Computer um Hafen 5000. Fir mam Server ze interagéieren, musse mir eng JSON POST Ufro schécken.

JSON Ufro Struktur:

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

Gutt, et mécht Sënn datt 'Kommando' de Kommando ass dee mir wëllen ausféieren. An 'Daten' sinn d'Commandargumenter.

Dir kënnt JSON Ufroe schreiwen a schécken fir manuell mam Server ze interagéieren (Ufroen hëllefen Iech). Oder Dir kënnt e Konsol Client schreiwen.

Schreiwen engem Client

Code:

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

Erklärungen:

Als éischt gëtt den Ufromodul importéiert (fir mam Server ze interagéieren). Drënner sinn Beschreiwunge vun de Start- an Testfunktiounen. An dann den Zyklus an deem d'Magie geschitt. Hutt Dir de Code gelies? Also verstitt Dir d'Bedeitung vun der Magie déi am Zyklus geschitt. Gitt de Kommando - et gëtt ausgefouert. Shell - Kommandoen fir d'Kommandozeil (d'Logik ass aus Skala).

Test - kontrolléiert ob de Server leeft (Backdoor)
Link - Benotzung vun enger "Ofkierzung"
Openweb - eng Websäit opmaachen
Quit - de Client verloossen
Set - d'IP vun Ärem Computer am lokalen Netzwierk setzen

An elo méi iwwer Link.

Et gëtt eng link.txt Datei nieft dem Server. Et enthält Linken (voll Wee) op Dateien (Videoen, Fotoen, Programmer).

D'Struktur ass esou:

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

D 'Resultat

Mir hunn e Backdoor Server fir e Computer op engem lokalen Netzwierk ze kontrolléieren (bannent engem Wi-Fi Netz). Technesch kënne mir de Client vun all Apparat lafen deen e Python Dolmetscher huet.

PS Ech hunn de Set Kommando bäigefüügt fir datt wann e Computer am lokalen Netzwierk eng aner IP zougewisen gëtt, kann et direkt am Client geännert ginn.

Source: will.com

Setzt e Commentaire