Flask 上の小さなバックドア、またはローカル ネットワーク上のコンピューターを制御する方法

おい、ハブル!

最近、プログラミング ストリーム「Flask で独自の Web アプリケーションを作成する方法」のダウンロード版を視聴しました。 そして、あるプロジェクトで自分の知識を統合することにしました。 長い間、何を書けばいいのかわからなかったのですが、「Flask でミニバックドアを作ってみてはどうだろう?」というアイデアが思いつきました。

バックドアの実装と機能に関する最初の選択肢がすぐに私の頭の中に浮かびました。 しかし、私はすぐにバックドア機能のリストを作成することにしました。

  1. ウェブサイトの開き方を知る
  2. コマンドラインにアクセスできる
  3. プログラム、写真、ビデオを開くことができる

したがって、最初のポイントは、WebBrowser モジュールを使用して実装するのが非常に簡単です。 XNUMX 番目の点は、os モジュールを使用して実装することにしました。 XNUMX つ目も os モジュールを使用しますが、「リンク」を使用します (これについては後で詳しく説明します)。

サーバーを書く

したがって、すべてのサーバー コードを *ドラムロール* します。

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 で実行されます。 サーバーと対話するには、JSON POST リクエストを送信する必要があります。

JSON リクエスト構造:

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

そうですね、「command」が実行したいコマンドであることは当然です。 「data」はコマンド引数です。

JSON リクエストを作成して送信して、サーバーと手動で対話できます (リクエストが役に立ちます)。 または、コンソール クライアントを作成することもできます。

クライアントを書く

コー​​ド:

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

説明:

まず最初に、requests モジュールがインポートされます (サーバーと対話するため)。 以下に、start 関数と test 関数について説明します。 そして魔法が起こるサイクル。 コードを読みましたか? それで、あなたはサイクルで起こる魔法の意味を理解しました。 コマンドを入力すると実行されます。 シェル – コマンド ラインのコマンド (ロジックはスケールから外れています)。

テスト - サーバーが実行されているかどうかを確認します (バックドア)
リンク - 「ショートカット」の使用
Openweb – Web サイトを開く
終了 – クライアントを終了します
設定 – ローカルネットワーク上のコンピュータのIPを設定します

次に、リンクについて詳しく説明します。

サーバーの隣に link.txt ファイルがあります。 ファイル (ビデオ、写真、プログラム) へのリンク (フルパス) が含まれています。

構造は次のとおりです。

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

合計

ローカル ネットワーク (Wi-Fi ネットワーク内) 上のコンピューターを制御するためのバックドア サーバーがあります。 技術的には、Python インタープリターを備えた任意のデバイスからクライアントを実行できます。

PS ローカル ネットワーク上のコンピュータに別の IP が割り当てられている場合に、クライアントで直接変更できるように set コマンドを追加しました。

出所: habr.com

コメントを追加します