Мала позадинска врата на Фласку или како контролисати рачунар на локалној мрежи

Хеј Хабр!

Недавно сам гледао преузету верзију програмског тока „Како да направите сопствену веб апликацију у Фласку. И одлучио сам да своје знање консолидујем у неком пројекту. Дуго нисам знао шта да напишем и пала ми је идеја: „Зашто не направити мини-бацкдоор у Фласку?“

У глави су ми се одмах појавиле прве опције за имплементацију и могућности бацкдоор-а. Али одлучио сам да одмах направим листу бацкдоор могућности:

  1. Знајте како да отворите веб странице
  2. Имајте приступ командној линији
  3. Бити у стању да отвара програме, фотографије, видео записе

Дакле, прва тачка је изузетно једноставна за имплементацију помоћу модула веб претраживача. Одлучио сам да имплементирам другу тачку користећи ос модул. И трећи је такође преко ос модула, али ћу користити „линкове“ (више о томе касније).

Писање сервера

Дакле, *друмролл* сав код сервера:

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. Да бисмо остварили интеракцију са сервером, морамо послати ЈСОН ПОСТ захтев.

ЈСОН структура захтева:

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

Па, логично је да је 'команда' команда коју желимо да извршимо. А „подаци“ су аргументи команде.

Можете писати и слати ЈСОН захтеве за ручну интеракцију са сервером (захтеви ће вам помоћи). Или можете написати клијента за конзолу.

Писање клијента

Шифра:

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

Објашњења:

Пре свега, увози се модул захтева (за интеракцију са сервером). Испод су описи стартних и тестних функција. А онда циклус у коме се магија дешава. Јесте ли прочитали код? Дакле, разумете значење магије која се дешава у циклусу. Унесите команду - извршава се. Схелл – команде за командну линију (логика је ван скале).

Тест – проверите да ли сервер ради (бацкдоор)
Веза – употреба „пречице“
Опенвеб – отварање веб странице
Прекини – изађи из клијента
Сет – подешавање ИП-а вашег рачунара на локалној мрежи

А сада више о линку.

Постоји линк.ткт датотека поред сервера. Садржи везе (пуна путања) до датотека (видео снимака, фотографија, програма).

Структура је оваква:

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

Укупан

Имамо бацкдоор сервер за контролу рачунара на локалној мрежи (у оквиру ви-фи мреже). Технички, можемо покренути клијента са било ког уређаја који има питхон интерпретер.

ПС Додао сам наредбу сет тако да ако је рачунару на локалној мрежи додељен други ИП, може се променити директно у клијенту.

Извор: ввв.хабр.цом

Додај коментар