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

こんにちは、Habr!



私は最近、プログラミングストリームのダウンロードバージョン「Flask Webアプリケーションの構築方法」を見ました。 そして、彼はいくつかのプロジェクトで彼の知識を統合することを決めました。 長い間、何を書くべきかわからず、「Flaskでミニバックドアを作ってみませんか?」というアイデアが浮かびました。



バックドアの実装と機能の最初のオプションはすぐに頭に浮かびました。 しかし、すぐにバックドア機能のリストを作成することにしました。



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


そのため、最初の項目はwebbrowserモジュールを使用して非常に簡単に実装できます。 osモジュールを使用して実装することにした2番目のポイント。 そして、3番目も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'}
      
      





さて、「コマンド」が実行したいコマンドであることは論理的です。 そして、「データ」はコマンドの引数です。



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



カスタマーライティング



コード:



 import requests logo = ['\n\n', '****** ********', '******* *********', '** ** ** **', '** ** ** ** Written on Python', '******* ** **', '******** ** **', '** ** ** ** Author: ROBOTD4', '** ** ** **', '** ** ** **', '******** *********', '******* ********', '\n\n'] 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
      
      





説明



最初のステップは、要求モジュールをインポートすることです(サーバーと対話するため)。 開始およびテスト機能の詳細。 そして、魔法が起こるサイクル。 コードを読みましたか? したがって、サイクルで発生する魔法の意味は明らかです。 コマンドを入力します-実行されます。 シェル-コマンドラインのコマンド( ロジックは屋根を通過します )。



テスト-サーバーが動作しているかどうかを確認します(バックドア)

リンク-「ショートカット」の使用

Openweb-ウェブサイトを開く

終了-クライアントを終了します

設定-ローカルネットワーク上のコンピューターのIPを設定します



そして今リンクについての詳細。



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



構造は次のとおりです。



_>

_>








まとめ



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



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



All Articles