Pintu belakang kecil pada Flask atau cara mengawal komputer pada rangkaian tempatan

Hai Habr!

Saya baru-baru ini menonton versi muat turun aliran pengaturcaraan "Cara membuat aplikasi web anda sendiri dalam Flask." Dan saya memutuskan untuk menyatukan pengetahuan saya dalam beberapa projek. Untuk masa yang lama saya tidak tahu apa yang hendak ditulis dan idea itu datang kepada saya: "Mengapa tidak membuat pintu belakang mini dalam Flask?"

Pilihan pertama untuk pelaksanaan dan keupayaan pintu belakang serta-merta muncul di kepala saya. Tetapi saya memutuskan untuk segera membuat senarai keupayaan pintu belakang:

  1. Tahu cara membuka laman web
  2. Mempunyai akses baris arahan
  3. Dapat membuka program, foto, video

Jadi, perkara pertama adalah sangat mudah untuk dilaksanakan menggunakan modul penyemak imbas web. Saya memutuskan untuk melaksanakan titik kedua menggunakan modul os. Dan yang ketiga juga melalui modul os, tetapi saya akan menggunakan "pautan" (lebih lanjut mengenainya kemudian).

Menulis pelayan

Jadi, *drumroll* semua kod pelayan:

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

Saya sudah membuang semua kod, sudah tiba masanya untuk menerangkan intipati.

Semua kod berjalan pada komputer tempatan pada port 5000. Untuk berinteraksi dengan pelayan, kami mesti menghantar permintaan JSON POST.

Struktur permintaan JSON:

{β€˜command’:  β€˜comecommand’, β€˜data’: β€˜somedata’}

Nah, masuk akal bahawa 'perintah' adalah perintah yang ingin kita laksanakan. Dan 'data' ialah hujah arahan.

Anda boleh menulis dan menghantar permintaan JSON untuk berinteraksi dengan pelayan secara manual (permintaan akan membantu anda). Atau anda boleh menulis klien konsol.

Menulis pelanggan

Kod:

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

Penjelasan:

Pertama sekali, modul permintaan diimport (untuk berinteraksi dengan pelayan). Di bawah ialah penerangan tentang fungsi permulaan dan ujian. Dan kemudian kitaran di mana keajaiban berlaku. Adakah anda telah membaca kod tersebut? Jadi anda faham maksud keajaiban yang berlaku dalam kitaran. Masukkan arahan - ia dilaksanakan. Shell – arahan untuk baris arahan (logik di luar skala).

Ujian – semak sama ada pelayan sedang berjalan (pintu belakang)
Pautan - penggunaan "jalan pintas"
Openweb – membuka laman web
Berhenti – keluar dari pelanggan
Set – tetapkan ip komputer anda pada rangkaian tempatan

Dan sekarang lebih lanjut mengenai pautan.

Terdapat fail link.txt di sebelah pelayan. Ia mengandungi pautan (laluan penuh) ke fail (video, foto, program).

Strukturnya seperti ini:

ΠΏΠΎΠ»Π½Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ>описаниС
ΠΏΠΎΠ»Π½Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ>описаниС

Jumlah

Kami mempunyai pelayan pintu belakang untuk mengawal komputer pada rangkaian tempatan (dalam rangkaian wi-fi). Secara teknikal, kami boleh menjalankan klien dari mana-mana peranti yang mempunyai penterjemah python.

PS Saya menambah arahan set supaya jika komputer pada rangkaian tempatan diberikan IP yang berbeza, ia boleh ditukar terus dalam klien.

Sumber: www.habr.com

Tambah komen