Flask-da kiçik arxa qapı və ya yerli şəbəkədə kompüteri necə idarə etmək olar

Hey Habr!

Bu yaxınlarda “Flask-da öz veb tətbiqinizi necə yaratmaq olar” proqramlaşdırma axınının yüklənmiş versiyasına baxdım. Və biliklərimi hansısa layihədə möhkəmləndirməyə qərar verdim. Uzun müddət nə yazacağımı bilmədim və ağlıma belə bir fikir gəldi: "Niyə Flask-da mini-backdoor düzəltməyəsən?"

Arxa qapının tətbiqi və imkanlarının ilk variantları dərhal beynimdə göründü. Ancaq dərhal arxa qapı imkanlarının siyahısını tərtib etmək qərarına gəldim:

  1. Veb saytları necə açmağı öyrənin
  2. Komanda xəttinə giriş əldə edin
  3. Proqramları, şəkilləri, videoları aça bilmək

Beləliklə, birinci nöqtəni veb-brauzer modulundan istifadə etməklə həyata keçirmək olduqca asandır. Mən os modulundan istifadə edərək ikinci bəndi həyata keçirmək qərarına gəldim. Üçüncüsü də OS modulu vasitəsilədir, lakin mən “links”dən istifadə edəcəyəm (bu barədə daha sonra).

Server yazmaq

Beləliklə, *trumroll* bütün server kodu:

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

Mən artıq bütün kodu atdım, mahiyyəti izah etmək vaxtıdır.

Bütün kodlar yerli kompüterdə 5000 portunda işləyir. Server ilə qarşılıqlı əlaqə yaratmaq üçün JSON POST sorğusu göndərməliyik.

JSON sorğu strukturu:

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

Yaxşı, məntiqlidir ki, 'əmr' bizim yerinə yetirmək istədiyimiz əmrdir. Və "məlumatlar" əmr arqumentləridir.

Siz serverlə əl ilə qarşılıqlı əlaqə yaratmaq üçün JSON sorğularını yazıb göndərə bilərsiniz (sorğular sizə kömək edəcək). Və ya bir konsol müştəri yaza bilərsiniz.

Müştəri yazmaq

Kodu:

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

İzahatlar:

İlk növbədə sorğu modulu idxal olunur (serverlə qarşılıqlı əlaqə üçün). Aşağıda başlanğıc və test funksiyalarının təsviri verilmişdir. Və sonra sehrin baş verdiyi dövr. Kodu oxumusunuz? Beləliklə, dövrədə baş verən sehrin mənasını başa düşürsən. Komandanı daxil edin - icra olunur. Shell – komanda xətti üçün əmrlər (məntiq miqyasdan kənardır).

Test – serverin işlədiyini yoxlayın (arxa qapı)
Link – “qısayoldan” istifadə
Openweb – internet saytının açılması
Çıxın - müştəridən çıxın
Set - kompüterinizin IP-nin yerli şəbəkədə qurulması

İndi link haqqında daha çox.

Serverin yanında link.txt faylı var. Fayllara (videolar, fotoşəkillər, proqramlar) bağlantılar (tam yol) ehtiva edir.

Quruluş belədir:

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

Ümumi

Yerli şəbəkədə (wi-fi şəbəkəsi daxilində) kompüteri idarə etmək üçün arxa qapı serverimiz var. Texniki olaraq, müştərini python tərcüməçisi olan istənilən cihazdan işlədə bilərik.

PS Mən set əmrini əlavə etdim ki, yerli şəbəkədəki kompüterə başqa bir IP təyin edilərsə, o, birbaşa müştəridə dəyişdirilə bilər.

Mənbə: www.habr.com

Добавить комментарий