Lítil bakdyr á Flask eða hvernig á að stjórna tölvu á staðarneti

Hæ Habr!

Ég horfði nýlega á niðurhalaða útgáfu af forritunarstraumnum „Hvernig á að búa til þitt eigið vefforrit í Flask. Og ég ákvað að treysta þekkingu mína í einhverju verkefni. Í langan tíma vissi ég ekki hvað ég átti að skrifa og hugmyndin kviknaði: „Af hverju ekki að búa til litla bakdyr í Flask?

Fyrstu valkostirnir fyrir útfærslur og getu bakdyranna birtust strax í hausnum á mér. En ég ákvað að gera strax lista yfir bakdyramöguleika:

  1. Vita hvernig á að opna vefsíður
  2. Hafa stjórnlínuaðgang
  3. Geta opnað forrit, myndir, myndbönd

Svo, fyrsta atriðið er mjög auðvelt í framkvæmd með því að nota vefvafraeininguna. Ég ákvað að útfæra seinni liðinn með því að nota OS-eininguna. Og sá þriðji er líka í gegnum OS-eininguna, en ég mun nota „tengla“ (meira um það síðar).

Að skrifa miðlara

Svo, *drumroll* allan miðlarakóðann:

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

Ég hef þegar hent öllum kóðanum, það er kominn tími til að útskýra kjarnann.

Allur kóði keyrir á staðbundinni tölvu á port 5000. Til að hafa samskipti við netþjóninn verðum við að senda JSON POST beiðni.

Uppbygging JSON beiðni:

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

Jæja, það er skynsamlegt að 'skipun' er skipunin sem við viljum framkvæma. Og 'gögn' eru skipanarökin.

Þú getur skrifað og sent JSON beiðnir um að hafa samskipti við netþjóninn handvirkt (beiðnir munu hjálpa þér). Eða þú getur skrifað hugga viðskiptavin.

Að skrifa viðskiptavin

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

Skýringar:

Fyrst af öllu er beiðniareiningin flutt inn (til að hafa samskipti við netþjóninn). Hér að neðan eru lýsingar á ræsingu og prófunaraðgerðum. Og svo hringrásin þar sem galdurinn gerist. Hefurðu lesið kóðann? Svo þú skilur merkingu töfranna sem gerist í hringrásinni. Sláðu inn skipunina - hún er framkvæmd. Skel – skipanir fyrir skipanalínuna (rökfræðin er ekki mælikvarði).

Próf – athugaðu hvort þjónninn sé í gangi (bakdyr)
Tengill – notkun á „flýtileið“
Openweb – að opna vefsíðu
Hætta - farðu úr viðskiptavininum
Setja - stilla ip tölvuna þína á staðarnetinu

Og nú meira um tengil.

Það er link.txt skrá við hlið þjónsins. Það inniheldur tengla (full slóð) á skrár (myndbönd, myndir, forrit).

Uppbyggingin er svona:

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

Samtals

Við erum með bakdyraþjón til að stjórna tölvu á staðarneti (innan Wi-Fi nets). Tæknilega séð getum við keyrt viðskiptavininn úr hvaða tæki sem er sem hefur python túlk.

PS Ég bætti við set skipuninni þannig að ef tölva á staðarnetinu er úthlutað öðru IP er hægt að breyta henni beint í biðlaranum.

Heimild: www.habr.com

Bæta við athugasemd