From 47a34aab30da353705d5f997a77650b6e2a1f9f0 Mon Sep 17 00:00:00 2001 From: "Mr.Rabbit" Date: Wed, 13 Dec 2023 16:59:02 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E5=BE=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bocchi/main.py | 62 ++++++++++++++++++++++-------------------------- log_20231129.txt | 20 ++++++++++++++++ 2 files changed, 49 insertions(+), 33 deletions(-) create mode 100644 log_20231129.txt diff --git a/bocchi/main.py b/bocchi/main.py index c447b55..56e8f73 100644 --- a/bocchi/main.py +++ b/bocchi/main.py @@ -49,33 +49,14 @@ def get_timestamp(): # --------------------------------------------------------------------- def get_menu(): menuText = "## メニュー\n\ -### 調査系\n\ -- スキャン\n\ - - nmapを使用してターゲットを調査します。\n\ - - **通常**\n\ - - [**IPアドレス**]をスキャンして\n\ - - **フルポート**\n\ - - [**IPアドレス**]をフルポートスキャンして\n\ -- 脆弱性診断\n\ - - GVM(Openvas)を使用して脆弱性診断します。\n\ - - [**IPアドレス**]を脆弱性診断して\n\n\ -### 攻撃系\n\ -- 認証試行\n\ - - Brutesprayを使用して認証試行をします。\n\ - - [**IPアドレス**]を認証試行して\n\n\ -### 情報表示\n\ -- faradayの表示\n\ - - faradayのダッシュボードを表示します。\n\ - - [**情報** or **ファラデー** or **faraday**]を表示して\n\ -- サービスリストの表示\n\ - - 検出したサービスをリストで表示します。\n\ - - [**サービス**]を表示して\n\ -- 脆弱性リストの表示\n\ - - 検出した脆弱性をリストで表示します。\n\ - - [**脆弱性**]を表示して\n\ -- 脆弱性診断結果の表示\n\ - - GVMのダッシュボードを表示します。\n\ - - [**脆弱性診断の結果**]を表示して\n\n\ +- [**IPアドレス**]を**スキャン**して\n\ +- [**IPアドレス**]を**フルポートスキャン**して\n\ +- [**IPアドレス**]を**脆弱性診断**して\n\n\ +- [**IPアドレス**]を**認証試行**して\n\n\ +- [**情報** or **ファラデー** or **faraday**]を表示して\n\ +- [**サービス**]を表示して\n\ +- [**脆弱性**]を表示して\n\ +- [**GVM**]を表示して\n\n\ :warning: トリガーワード(**@bocchi**,**@ぼっち**)の後、半角スペースを入れてから要件をお伝えください。" return menuText @@ -99,6 +80,7 @@ def check_directory(target_ip): else: os.makedirs(dir_path) # os.mkdirではなくos.makedirsを使用してサブディレクトリも作成する return dir_path + # --------------------------------------------------------------------- # answer # --------------------------------------------------------------------- @@ -361,29 +343,43 @@ def analyze_scan_logs(log_file_path, target_ip): return suggestion_message.strip() +# --------------------------------------------------------------------- +# show_full_port_scan +# --------------------------------------------------------------------- def show_full_port_scan(): messages = "\ -フルポートスキャンでは以下のコマンドを実行します。\n\ +Nmapを使用して**フルポートスキャン**を対象IPアドレスに行います。\n\ +以下のコマンドを実行します。\n\ `nmap -vv --reason -Pn -T4 -sV -sC --version-all -A -p- --osscan-guess --script=vuln -oA IPAddress`" return messages +# --------------------------------------------------------------------- +# show_standard_scan +# --------------------------------------------------------------------- def show_standard_scan(): messages = "\ -スキャンでは以下のコマンドを実行します。\n\ +Nmapを使用して**スキャン**を対象IPアドレスに行います。\n\ +以下のコマンドを実行します。\n\ `nmap -vv --reason -Pn -T4 -sV -sC --version-all -A --osscan-guess --script=vuln -oA IPAddress`" return messages +# --------------------------------------------------------------------- +# show_vulnerability_scan_with_gvm +# --------------------------------------------------------------------- def show_vulnerability_scan_with_gvm(): messages = "\ -脆弱性診断は`GreenboneVulnerabilityManagement`を`gvm-cli`を使用して以下の要領で実行します。\n\ +脆弱性診断は**GreenboneVulnerabilityManagement**を`gvm-cli`を使用して以下の要領で実行します。\n\ 1. ターゲットの作成\n\ 2. タスクの作成\n\ 3. タスクの実行" return messages +# --------------------------------------------------------------------- +# show_brutespray_attack +# --------------------------------------------------------------------- def show_brutespray_attack(): messages = "\ -認証試行は以下の要領で実行します。\n\ +認証試行は**Brutespray**を使用して以下の要領で実行します。\n\ 1. Nmapを使用してサービスバージョンを取得\n\ `nmap -vv -Pn -T4 -sV -oG IPAddress`\n\ 2. Brutesprayで認証攻撃を実行\n\ @@ -426,7 +422,7 @@ def bot_reply(): elif "認証試行" in userOrder: # Brutesprayで認証攻撃 askForBruteAttackConfirmation(posted_user, ipaddr) - elif ("やる" in userOrder and "事" in userOrder) or ("する" in userOrder and "事" in userOrder): + elif ("やる" in userOrder and "事" in userOrder) or ("する" in userOrder and "事" in userOrder) or "調査状況" in userOrder: send_message_to_user(posted_user,analyze_scan_logs(log_file, ipaddr)) else: send_message_to_user(posted_user, f"{ipaddr}に対して何をするか命じてください。") @@ -440,7 +436,7 @@ def bot_reply(): elif "サービス" in userOrder: # サービスをリストで表示 send_message_to_user(posted_user,fc.show_service_list_in_faraday()) - elif "脆弱性診断" in userOrder or "gvm" in userOrder or "GVM" in userOrder: + elif "gvm" in userOrder or "GVM" in userOrder: # GVMのダッシュボードを表示 send_message_to_user(posted_user,gc.show_gvm()) elif "脆弱性" in userOrder: diff --git a/log_20231129.txt b/log_20231129.txt new file mode 100644 index 0000000..7e615d2 --- /dev/null +++ b/log_20231129.txt @@ -0,0 +1,20 @@ +INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://172.20.10.2:5000 +INFO:werkzeug:Press CTRL+C to quit +INFO:werkzeug: * Restarting with stat +WARNING:werkzeug: * Debugger is active! +INFO:werkzeug: * Debugger PIN: 411-156-465 +INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:24:23] "POST /matter HTTP/1.1" 500 - +INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:25:22] "POST /matter HTTP/1.1" 500 - +INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://172.20.10.2:5000 +INFO:werkzeug:Press CTRL+C to quit +INFO:werkzeug: * Restarting with stat +WARNING:werkzeug: * Debugger is active! +INFO:werkzeug: * Debugger PIN: 411-156-465 +INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:40:38] "POST /matter HTTP/1.1" 500 - +INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:42:17] "POST /matter HTTP/1.1" 500 - From b79b465414534f31d9ec340cc2202e973ae6fb6f Mon Sep 17 00:00:00 2001 From: "Mr.Rabbit" Date: Fri, 22 Dec 2023 13:52:16 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bocchi/main.py | 60 ++++++++++++++++++++++++++++++++++-- bocchi/matterCommunicator.py | 55 +++++++++++++++++++++++++++++++++ log_20231129.txt | 20 ------------ 3 files changed, 112 insertions(+), 23 deletions(-) delete mode 100644 log_20231129.txt diff --git a/bocchi/main.py b/bocchi/main.py index 56e8f73..a6f2f88 100644 --- a/bocchi/main.py +++ b/bocchi/main.py @@ -112,7 +112,7 @@ def perform_full_port_scan(ipaddr, posted_user): """ # フルポートスキャンの開始連絡 messages = f"nmapで{ipaddr}のフルポートスキャンを開始します。\nしばらくお待ちください:coffee:" - send_message_to_user(posted_user=posted_user, msg=messages) + send_message_to_user(posted_user, messages) # nmapコマンドの作成 resultsPath = check_directory(ipaddr) @@ -295,6 +295,39 @@ def perform_brutespray_attack(ipaddr, posted_user): # エラーメッセージを通知 send_message_to_user(posted_user, messages) +# --------------------------------------------------------------------- +# perform_all_attacks +# --------------------------------------------------------------------- +def perform_all_attacks(ipaddr, posted_user): + """ + フルポートスキャンを実行し、 + GVM(Openvas)を使用して脆弱性診断を実行し、 + Brutesprayを使用して認証攻撃を実行し、 + 結果をMattermostに通知するメソッド。 + + Parameters: + ipaddr (str): 攻撃対象のIPアドレス + posted_user (str): Mattermostへの通知時に使用するユーザー情報 + + Returns: + str: 全ての調査、攻撃の結果メッセージ + """ + # 全ての調査及び攻撃の開始連絡 + messages = f"{ipaddr}に対して全ての調査及び攻撃を開始します。" + send_message_to_user(posted_user, messages) + + # フルポートスキャンの実行 + perform_full_port_scan(ipaddr, posted_user) + + # 脆弱性診断の実行 + perform_vulnerability_scan_with_gvm(ipaddr, posted_user) + + # 認証試行の実行 + perform_brutespray_attack(ipaddr, posted_user) + + messages = "全ての調査及び攻撃を終了します。" + send_message_to_user(posted_user, messages) + # --------------------------------------------------------------------- # analyze_scan_logs # --------------------------------------------------------------------- @@ -422,6 +455,9 @@ def bot_reply(): elif "認証試行" in userOrder: # Brutesprayで認証攻撃 askForBruteAttackConfirmation(posted_user, ipaddr) + elif "全部実行" in userOrder: + # 全部実行 + askForAllAttacks(posted_user, ipaddr) elif ("やる" in userOrder and "事" in userOrder) or ("する" in userOrder and "事" in userOrder) or "調査状況" in userOrder: send_message_to_user(posted_user,analyze_scan_logs(log_file, ipaddr)) else: @@ -449,9 +485,9 @@ def bot_reply(): send_message_to_user(posted_user,get_menu()) elif "教える" in userOrder: if "スキャン" in userOrder: - send_message_to_user(posted_user, show_full_port_scan()) - if "フルポートスキャン" in userOrder: send_message_to_user(posted_user, show_standard_scan()) + if "フルポートスキャン" in userOrder: + send_message_to_user(posted_user, show_full_port_scan()) if "脆弱性診断" in userOrder: send_message_to_user(posted_user, show_vulnerability_scan_with_gvm()) if "認証試行" in userOrder: @@ -536,6 +572,24 @@ def brute_attack(): } return jsonify(response) +@app.route('/actions/all_attacks', methods=['POST']) +def all_attacks(): + data = request.get_json() + text = data.get("context", {}).get("text", "") + if not text: + return jsonify({"ephemeral_text": "Invalid request. Context['text'] is not found."}) + posted_usr,ipaddr = text.split(",") + thread = threading.Thread(target=perform_all_attacks, args=(ipaddr, posted_usr)) + thread.start() + + response = { + "update": { + "props": {} + }, + "ephemeral_text": f"{posted_usr}により全部実行が承認されました。" + } + return jsonify(response) + @app.route('/actions/reject', methods=['POST']) def reject(): response = { diff --git a/bocchi/matterCommunicator.py b/bocchi/matterCommunicator.py index da371ff..7c4dd2d 100644 --- a/bocchi/matterCommunicator.py +++ b/bocchi/matterCommunicator.py @@ -268,3 +268,58 @@ def askForBruteAttackConfirmation(posted_usr,ipaddr): data = json.dumps(reply_data) ) return reply_request + +# --------------------------------------------------------------------- +# askForAllAttacks +# --------------------------------------------------------------------- +def askForAllAttacks(posted_usr,ipaddr): + """ + Mattermostに対してフルポートスキャン、脆弱性診断、ブルートフォース攻撃の承認メッセージを送信し、ボタンのアクションに応じた処理を行うメソッド。 + + Parameters: + posted_usr (str): メッセージを投稿したユーザーのID + ipaddr (str): 攻撃対象のIPアドレス + + Returns: + requests.Response: Mattermostへのリクエストのレスポンス + """ + reply_headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ' + BOT_TOKEN, + } + + reply_data = { + "response_type": "in_channel", + "channel_id": CHANNEL_ID, + "message": f"@{posted_usr} BOCCHI reply message. :wave:", + "props": { + + "attachments": [{ + "title": "フルポートスキャン、脆弱性診断及び、認証試行の実施", + "text": "この行為は法律に抵触する可能性があります。管理者から許可を得た端末や自身の端末に対して使用してください。\n認証試行を承認しますか?", + "actions": [{ + # Acceptボタン + "name": "Accept", + "integration": { + "url": f"{BOCCHI_SERVER}/actions/all_attacks?token={BOT_TOKEN}", + "context": { + "text": posted_usr +","+ ipaddr + } + } + }, { + # Rejectボタン + "name": "Reject", + "style": "danger", + "integration": { + "url": f"{BOCCHI_SERVER}/actions/reject?token={BOT_TOKEN}" + } + }] + }] + } + } + reply_request = requests.post( + MM_API_ADDRESS, + headers = reply_headers, + data = json.dumps(reply_data) + ) + return reply_request diff --git a/log_20231129.txt b/log_20231129.txt deleted file mode 100644 index 7e615d2..0000000 --- a/log_20231129.txt +++ /dev/null @@ -1,20 +0,0 @@ -INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://172.20.10.2:5000 -INFO:werkzeug:Press CTRL+C to quit -INFO:werkzeug: * Restarting with stat -WARNING:werkzeug: * Debugger is active! -INFO:werkzeug: * Debugger PIN: 411-156-465 -INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:24:23] "POST /matter HTTP/1.1" 500 - -INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:25:22] "POST /matter HTTP/1.1" 500 - -INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://172.20.10.2:5000 -INFO:werkzeug:Press CTRL+C to quit -INFO:werkzeug: * Restarting with stat -WARNING:werkzeug: * Debugger is active! -INFO:werkzeug: * Debugger PIN: 411-156-465 -INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:40:38] "POST /matter HTTP/1.1" 500 - -INFO:werkzeug:172.20.10.3 - - [29/Nov/2023 07:42:17] "POST /matter HTTP/1.1" 500 -