Як пушти дари хурд дар Flask ё чӣ гуна идора кардани компютер дар шабакаи маҳаллӣ

Эй Ҳабр!

Ман ба наздикӣ як версияи зеркашидашудаи ҷараёни барномасозии "Чӣ тавр веб-барномаҳои шахсии худро дар Flask эҷод кардан мумкин аст" -ро тамошо кардам. Ва ман қарор додам, ки донишамро дар ягон лоиҳа мустаҳкам кунам. Муддати тӯлонӣ ман намедонистам чӣ нависам ва фикре пайдо шуд: "Чаро дар Flask мини-backdoor насозед?"

Вариантҳои аввалини татбиқ ва қобилиятҳои пушти дарвоза фавран дар сари ман пайдо шуданд. Аммо ман тасмим гирифтам, ки фавран рӯйхати қобилиятҳои пушти дарро тартиб диҳам:

  1. Чӣ тавр кушодани вебсайтҳоро бидонед
  2. Дастрасии сатри фармонро дошта бошед
  3. Қобилияти кушодани барномаҳо, аксҳо, видеоҳо

Ҳамин тавр, нуқтаи аввалро бо истифода аз модули веб-браузер амалӣ кардан хеле осон аст. Ман тасмим гирифтам, ки нуқтаи дуюмро бо истифода аз модули os амалӣ кунам. Ва сеюм низ тавассути модули OS аст, аммо ман "пайвандҳо" -ро истифода хоҳам кард (бештар дар ин бора баъдтар).

Навиштани сервер

Ҳамин тавр, *drumroll* ҳама рамзи сервер:

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

Ман аллакай ҳама рамзро партофтам, вақти он расидааст, ки моҳиятро шарҳ диҳам.

Ҳама рамзҳо дар компютери маҳаллӣ дар порти 5000 кор мекунанд. Барои ҳамкорӣ бо сервер, мо бояд дархости JSON POST фиристем.

Сохтори дархости JSON:

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

Хуб, ин маънои онро дорад, ки "фармон" фармонест, ки мо мехоҳем иҷро кунем. Ва "маълумот" далелҳои фармон мебошанд.

Шумо метавонед дархостҳои JSON-ро барои муошират бо сервер дастӣ нависед ва ирсол кунед (дархостҳо ба шумо кӯмак мекунанд). Ё шумо метавонед як муштарии консол нависед.

Навиштани муштарӣ

Кодекси

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

Шарҳҳо:

Пеш аз ҳама, модули дархостҳо ворид карда мешавад (барои ҳамкорӣ бо сервер). Дар зер тавсифи функсияҳои оғоз ва санҷиш оварда шудааст. Ва он гоҳ даврае, ки дар он ҷодугарӣ рӯй медиҳад. Шумо кодро хондаед? Пас шумо маънои ҷодуеро, ки дар давра рӯй медиҳад, мефаҳмед. Фармонро ворид кунед - он иҷро мешавад. Shell - фармонҳо барои сатри фармон (мантиқ аз миқёс берун аст).

Санҷиш - санҷед, ки сервер кор мекунад (дар паси дарвоза)
Пайванд - истифодаи "миёнабур"
Openweb - кушодани вебсайт
Хуруҷ - аз муштарӣ баромадан
Танзим - насб кардани IP-и компютери шумо дар шабакаи маҳаллӣ

Ва ҳоло бештар дар бораи пайванд.

Дар паҳлӯи сервер файли link.txt мавҷуд аст. Он дорои истинодҳо (роҳи пурра) ба файлҳо (видеоҳо, аксҳо, барномаҳо).

Сохтор чунин аст:

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

Натиҷа

Мо сервери пушти дари барои идоракунии компютер дар шабакаи маҳаллӣ (дар дохили шабакаи Wi-Fi) дорем. Аз ҷиҳати техникӣ, мо метавонем муштариро аз ҳар дастгоҳе, ки тарҷумони python дорад, идора кунем.

PS Ман фармони танзимро илова кардам, ки агар ба компютер дар шабакаи маҳаллӣ IP-и дигар таъин карда шавад, онро бевосита дар муштарӣ тағир додан мумкин аст.

Манбаъ: will.com

Илова Эзоҳ