
Gophishからキャンペーンデータを収集し、レポートを生成するPythonスクリプト
このスクリプトは、Gophish キャンペーン ID をパラメータとして受け取り、キャンペーン結果を収集して統計を表示し、ユーザーエージェントの解析や IP アドレスのジオロケーション検索を実行します。Goreport は、IP アドレス、オペレーティングシステム、ブラウザの種類とバージョン、および場所のリストを、キャンペーン中にそれぞれが確認された回数とともに生成します。
統計に関する注意: Goreport はイベントの総数と、各イベントに参加したメール受信者の数を報告します。言い換えると、Gophish が「Clicked Link」イベントを記録した回数と、リンクをクリックした受信者の数を表示します。これらはまったく異なる数値です。10 人に送信したキャンペーンで、リンクをクリックした受信者が 3 人しかいないのに、クリックイベントが 9 件記録される可能性があります。受信者が複数回リンクをクリックしたりデータを送信したりすることを把握することは貴重な情報ですが、数字を正しく理解するようにしてください。
このスクリプトには、Gophish サーバー、アクティブまたは完了したキャンペーン、および Gophish アプリケーションの API キーが必要です。このキーは、[設定] タブをクリックして入手します。API キーは最初のページにあります。各 Gophish ユーザーアカウントには独自の API キーがあり、そのユーザーが Gophish API に対して認証する方法として機能します。Gophish で複数のアカウントを使用する場合は、正しいユーザーの API キーを取得してください。
以下の Python ライブラリも必要です:
開始するには、いくつかのことを行う必要があります:
pip install -r requirements.txt を実行します。この例では、Gophish が別のサーバー上にあり、HTTPS が使用されていることを前提としています。API エンドポイントにアクセスするには、ポート 3333(または任意のローカルポート)を使用して SSH ポートフォワーディングを設定する必要があります:
[Gophish]
gp_host: https://127.0.0.1:3333
api_key: <YOUR_API_KEY>
[ipinfo.io]
ipinfo_token: <IPINFO_API_KEY>
[Google]
geolocate_key: <GEOLOCATE_API_KEY>
python3 Goreport.py --id 26 --format excel
これにより、キャンペーン 26 の結果が https://localhost:3333/api/campaigns/26/?api_key=<Your_API_Key> から取得され、xlsx ファイルに出力されます。
複数のレポートに対して複数の ID を一度に指定できます。ID はカンマ区切りのリスト、範囲、またはその両方で指定できます。
例: python3 Goreport.py --id 26,29-33,54 --format csv
複数の Gophish ユーザーアカウントやサーバーを使用する場合、複数の API キーを持つことになります。キーを簡単に切り替えられるように、Goreport の --config オプションを使用すると、デフォルトの設定ファイル gophish.config を任意の名前の設定ファイルで上書きできます。この引数に有効で読み取り可能な設定ファイルを指定すると、Goreport は gophish.config の代わりにそのファイルを使用して API 接続をセットアップします。
たとえば、Gophish を実行している 3 つのフィッシングサーバーがある場合、このオプションを使用できます。それぞれ異なる Gophish API キーを持つ 3 つの設定ファイルをセットアップし、必要に応じて使用できます。
例: python3 Goreport.py --id 26,29-33,54 --format csv --config phish_server_2.config
異なる対象グループに対して同じ設定で複数のキャンペーンを実行した場合、これらのキャンペーンに対して一度に Goreport を実行し、結果を 1 つのレポートに結合したい場合があります。これは、Goreport の --combine フラグを追加することで実現できます。
例: python3 Goreport.py --id 26,29-33,54 --format excel --combine
このコマンドは、キャンペーン 26、29、30、31、32、33、54 の結果を収集します。通常、Goreport は 7 つの xlsx ファイルを出力しますが、--combine を追加することで、Goreport は結果を結合し、それらがすべて 1 つの大きなキャンペーンであるかのように 1 つのレポートのみを出力します。
Goreport は、Excel スプレッドシート(xlsx)または Word 文書(docx)のいずれかを出力できます。また、「クイック」レポートオプションもあります。上記の使用例セクションで示したように、--format コマンドライン引数を使用して、希望の形式を選択するだけです。csv 形式については特に説明することはありません。
Word 文書はテンプレート template.docx から構築されます。メインスクリプトと同じ Goreport ディレクトリに、template.docx という名前のテンプレートファイルを配置します。テンプレートには、使用するテーブルスタイルと、見出し 1 および見出し 2 のスタイルを含める必要があります。好みのテーブルスタイルに「Goreport」という名前を付け、見出し 1 と見出し 2 のスタイルを設定します。
カスタムスタイルを作成するか、既存のスタイルを使用してください。重要なのは、template.docx ファイルが存在し、そのファイルに「Goreport」テーブルスタイルが含まれていることだけです。
スタイルの名前を変更するには、スタイルを右クリックし、[テーブルスタイルの変更] を選択して、新しい名前を設定します。
Excel オプションは、結果や統計のさまざまなコレクションに対して複数のワークシートを含む、適切にフォーマットされた Excel ワークブックを出力します。結果テーブルを簡単に並べ替えたりフィルタリングしたりしたい場合に便利なオプションです。
最後に、「クイック」オプションがあります。これはレポート文書を生成しません。レポートの代わりに、キャンペーンに関する基本情報をターミナルに出力します。これは、キャンペーンの進行状況をすばやく確認したり、キャンペーン完了後に結果を参照したりするのに便利です。
レポートを実行するときにキャンペーンのステータスを「完了」に設定したい場合、Goreport は --complete フラグを使用して自動的にこれを行うことができます。このフラグを指定すると、Goreport は API を使用して各キャンペーン ID を「完了」としてマークし、キャンペーンを終了して Gophish のステータスを更新します。
Gophish は IP アドレスを使用して独自のジオロケーション検索を実行し、緯度と経度を返します。これは問題なく動作しますが、失敗して 0,0 の座標を返したり、古い情報を返したりする可能性があります。
Goreport には、位置情報の結果を改善するために使用できる 2 つのオプションがあります。最初の推奨オプションは、ipinfo.io API です。API アクセスは、24 時間あたり 1,000 クエリ未満であれば無料です。フィッシングキャンペーンではそれほど難しいことではないでしょう。
ipinfo.io の API キーが設定ファイルに追加されている場合、Goreport は自動的に ipinfo.io を使用して、一意の IP アドレスごとに現在のジオロケーション情報を収集します。
2 番目のオプションは、Google Maps API です。Goreport v1.0 は、Maps API が無料だったときに使用していました。現在、Google は Geolocate API(現在の名称)に対してリクエストあたり $0.005 を請求しています。ipinfo.io を使用しない場合は、Google アカウントで Maps Geolocate API を有効にし、API キーを Goreport 設定ファイルに追加します。その後、Goreport が API を使用して Gophish の座標を検索し、書式設定された住所を取得するたびに、Goreport コマンドに --google フラグを追加します。
コードを確認したい場合の、プロセスの基本的な概要は次のとおりです:
Goreport.py は Python 3 と Command Line Interface Creation Kit(CLICK)ライブラリを使用しています。スクリプトが実行されると、新しい Goreport オブジェクトが作成されます。Goreport クラスの __init__ 関数は、指定された API キーを使用して認証用の Gophish サーバーへの接続を作成します。その後、run() 関数が呼び出されます。
Run() はコマンドラインオプションを使用してレポートを開始します。--id で指定されたすべてのキャンペーン ID をループするために For ループが使用されます。各 ID のキャンペーン詳細について Gophish サーバーに問い合わせます。
最初に、collect_all_campaign_info() が呼び出され、キャンペーンの基本情報を変数に保存します。これには、キャンペーン名、実行日時、ステータス、使用された SMTP サーバー、テンプレート名などのデータが含まれます。
次に、process_timeline_events() が呼び出され、その ID の Gophish タイムラインモデルを取得します。これには、Gophish によって記録されたイベントが含まれます。この関数が 2 番目に実行されるのは、process_results() によって確認されるいくつかのリストを埋めるためです。
3 番目に、process_results() が呼び出され、その ID の Gophish 結果モデルを取得します。これにより、キャンペーンのターゲット数などのデータが提供されます。
Goreport はこれらの手順を使用していくつかのリストを設定し、キャンペーンの基本結果(メールが正常に送信された相手、リンクをクリックした受信者、データを提供した受信者など)を判断します。
この基盤に基づいて、Goreport はレポート用にデータをさまざまな方法で整理できます。いつでも、結果モデル内の特定のメールアドレスが targets_clicked リストに表示されているかどうかを照会して、その受信者がリンクをクリックしたかどうかを確認できます。その後、タイムラインモデルを確認して詳細を収集できます。Gophish は、IP アドレスやユーザーエージェントなどの詳細をタイムラインモデルに保持し、基本情報を結果モデルに保持します。