Nelielas aizmugures durvis uz Flask vai kā vadīt datoru lokālajā tīklā

Čau Habr!

Es nesen noskatījos lejupielādēto programmu straumes versiju “Kā izveidot savu tīmekļa lietojumprogrammu Flaskā”. Un es nolēmu nostiprināt savas zināšanas kādā projektā. Ilgu laiku nezināju, ko rakstīt, un man radās doma: “Kāpēc gan neizveidot kolbā mini aizmugures durvis?”

Manā galvā uzreiz parādījās pirmās aizmugures durvju ieviešanas un iespēju iespējas. Bet es nolēmu nekavējoties izveidot aizmugures iespēju sarakstu:

  1. Ziniet, kā atvērt vietnes
  2. Piekļūstiet komandrindai
  3. Jāprot atvērt programmas, fotogrāfijas, video

Tātad pirmo punktu ir ļoti viegli īstenot, izmantojot tīmekļa pārlūkprogrammas moduli. Es nolēmu ieviest otro punktu, izmantojot OS moduli. Un trešais ir arī caur OS moduli, bet es izmantošu “saites” (vairāk par to vēlāk).

Servera rakstīšana

Tātad, *drumroll* viss servera kods:

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

Es jau izmetu visu kodu, laiks izskaidrot būtību.

Viss kods darbojas vietējā datorā ar portu 5000. Lai sazinātos ar serveri, mums ir jānosūta JSON POST pieprasījums.

JSON pieprasījuma struktūra:

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

Ir loģiski, ka “komanda” ir komanda, kuru mēs vēlamies izpildīt. Un “dati” ir komandas argumenti.

Varat rakstīt un nosūtīt JSON pieprasījumus, lai manuāli mijiedarbotos ar serveri (pieprasījumi jums palīdzēs). Vai arī varat uzrakstīt konsoles klientu.

Klienta rakstīšana

Kods:

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

Paskaidrojumi:

Pirmkārt, tiek importēts pieprasījumu modulis (sadarbībai ar serveri). Zemāk ir palaišanas un pārbaudes funkciju apraksti. Un tad cikls, kurā notiek maģija. Vai esat izlasījis kodu? Tātad jūs saprotat ciklā notiekošās maģijas nozīmi. Ievadiet komandu - tā tiek izpildīta. Shell – komandas komandrindai (loģika nav mērogā).

Tests — pārbaudiet, vai serveris darbojas (aizmugurējās durvis)
Saite — “saīsnes” izmantošana
Openweb – vietnes atvēršana
Iziet – izejiet no klienta
Iestatīt — datora IP iestatīšana lokālajā tīklā

Un tagad vairāk par saiti.

Blakus serverim ir fails link.txt. Tajā ir saites (pilns ceļš) uz failiem (video, fotoattēli, programmas).

Struktūra ir šāda:

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

Kopsavilkums

Mums ir backdoor serveris datora vadīšanai lokālajā tīklā (wi-fi tīklā). Tehniski mēs varam palaist klientu no jebkuras ierīces, kurā ir python tulks.

PS Es pievienoju komandu set, lai, ja datoram lokālajā tīklā ir piešķirts cits IP, to var mainīt tieši klientā.

Avots: www.habr.com

Pievieno komentāru