Yon ti backdoor sou Flask oswa kijan pou kontwole yon òdinatè sou yon rezo lokal

Hey Habr!

Dènyèman, mwen te gade yon vèsyon telechaje nan kouran pwogramasyon an "Ki jan yo kreye pwòp aplikasyon entènèt ou nan Flask." Apre sa, mwen deside konsolide konesans mwen nan kèk pwojè. Pou yon tan long mwen pa t 'konnen ki sa yo ekri ak lide a te vin nan mwen: "Poukisa pa fè yon mini-backdoor nan Flask?"

Opsyon yo premye pou aplikasyon ak kapasite nan degize a imedyatman parèt nan tèt mwen. Men, mwen deside imedyatman fè yon lis kapasite backdoor:

  1. Konnen ki jan yo louvri sit entènèt
  2. Gen aksè liy kòmand
  3. Kapab louvri pwogram, foto, videyo

Se konsa, premye pwen an trè fasil pou aplike lè l sèvi avèk modil navigatè a. Mwen deside aplike dezyèm pwen an lè l sèvi avèk modil os la. Ak twazyèm lan se tou atravè modil os la, men mwen pral sèvi ak "lyen" (plis sou sa pita).

Ekri yon sèvè

Se konsa, *drumroll* tout kòd sèvè a:

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

Mwen te deja jete tout kòd la, li lè yo eksplike sans lan.

Tout kòd kouri sou òdinatè lokal la sou pò 5000. Pou kominike avèk sèvè a, nou dwe voye yon demann JSON POST.

Estrikti demann JSON:

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

Oke, li fè sans ke 'kòmand' se kòmandman an nou vle egzekite. Ak 'done' yo se agiman yo lòd.

Ou ka ekri epi voye demann JSON pou kominike avèk sèvè a manyèlman (demann yo pral ede w). Oswa ou ka ekri yon kliyan konsole.

Ekri yon kliyan

Kòd:

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

Eksplikasyon:

Premye a tout, modil demann lan enpòte (pou kominike avèk sèvè a). Anba a se deskripsyon fonksyon yo kòmanse ak tès. Lè sa a, sik la nan ki majik la k ap pase. Èske w li kòd la? Se konsa, ou konprann siyifikasyon an nan majik la ki rive nan sik la. Antre kòmandman an - li egzekite. Shell - kòmandman pou liy lòd la (lojik la pa echèl).

Tès - tcheke si sèvè a ap kouri (backdoor)
Lyen - itilize yon "rakoursi"
Openweb - louvri yon sit entènèt
Kite - sòti kliyan an
Mete - mete ip òdinatè w lan sou rezo lokal la

Epi, koulye a plis sou lyen.

Gen yon dosye link.txt akote sèvè a. Li gen lyen (chemen konplè) nan dosye (videyo, foto, pwogram).

Estrikti a se tankou sa a:

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

Total

Nou gen yon sèvè backdoor pou kontwole yon òdinatè sou yon rezo lokal (nan yon rezo wi-fi). Teknikman, nou ka kouri kliyan an soti nan nenpòt aparèy ki gen yon entèprèt python.

PS Mwen te ajoute lòd la mete pou ke si yon òdinatè sou rezo lokal la asiyen yon IP diferan, li ka chanje dirèkteman nan kliyan an.

Sous: www.habr.com

Add nouvo kòmantè