CaptiveFlask徹底解説:Pythonでキャプティブポータルを構築

セキュリティツール

Wi-Fi認証ページを自作しよう!

はじめに:CaptiveFlaskとは? 🤔

CaptiveFlask(キャプティブフラスク)は、PythonのWebフレームワークであるFlaskをベースにして、キャプティブポータル(Captive Portal)を簡単に作成するためのツールです。特に、ペネトレーションテストやセキュリティ研究の分野で利用されることが多いwifipumpkin3というフレームワークのサブツールとして開発されました。

キャプティブポータルとは、公共のWi-Fiスポットなどでよく見かける、インターネットに接続する前に表示される認証ページや利用規約同意ページのことです。ユーザーが特定の操作(パスワード入力、利用規約への同意など)を行うまで、インターネットアクセスを制限する仕組みを提供します。

CaptiveFlaskは、このようなポータルサイトのWebサーバー部分の実装を助け、特定の条件下でユーザーをログインページにリダイレクトさせる機能を提供します。これにより、開発者はFlaskの知識を活かしつつ、比較的容易にキャプティブポータル環境を構築できます。

ただし、CaptiveFlask自体はWebサーバー機能に特化しており、完全なキャプティブポータル環境(DHCPサーバーの設定、DNSハイジャック、ファイアウォールによるアクセス制御など)を構築するには、OSレベルでのネットワーク設定や他のツールとの連携が必要になる点に注意が必要です。

注意: CaptiveFlaskはwifipumpkin3という攻撃的なセキュリティツールの一部として提供されている側面があります。本記事で解説する技術は、教育目的または正当な目的(例:自社ネットワークでのゲストWi-Fi構築)での利用を想定しています。許可なく他者のネットワークに対して使用することは、法律で禁止されている場合があります。

CaptiveFlaskの機能と目的 ✨

CaptiveFlaskの主な機能と目的は以下の通りです。

  • キャプティブポータルWebサーバーの提供: Flaskを利用して、ログインページや認証成功ページなどを提供するWebサーバーを簡単に起動します。
  • リダイレクト処理: ネットワークに接続したユーザーからのHTTPリクエストを、強制的に指定したログインページにリダイレクトさせます(ただし、DNSレベルのリダイレクト設定が別途必要)。
  • 認証情報の受け取り: ユーザーがログインフォームに入力した情報(ユーザー名、パスワードなど)を受け取るエンドポイントを提供します。
  • 認証後のリダイレクト: 認証が成功したユーザーを、指定したURL(通常は元々アクセスしようとしていたサイトや、特定のランディングページ)にリダイレクトさせます。
  • テンプレート機能: HTMLテンプレートを使用して、ポータルページのデザインをカスタマイズできます。wifipumpkin3のコミュニティでは、様々なデザインのテンプレートが共有されています。
  • インターネットアクセス制御連携: wifipumpkin3のようなフレームワークと連携し、認証前のユーザーのインターネットアクセスをブロックし、認証後に許可する、といった制御フローの一部を担います。

これにより、開発者はネットワーク設定の詳細に煩わされることなく、ポータルサイトの見た目や認証ロジックの実装に集中できます。

インストールと基本的な使い方 🚀

CaptiveFlaskは通常、wifipumpkin3フレームワークの一部としてインストールされます。wifipumpkin3をインストールすると、captiveflaskコマンドが利用可能になります。

wifipumpkin3のインストール方法は、公式ドキュメントやリポジトリ(GitHubなど)を参照してください。Kali Linuxなどのペネトレーションテスト用OSでは、パッケージマネージャ(apt)でインストールできる場合もあります。

# Kali Linuxの場合 (バージョンにより異なる可能性があります)
sudo apt update
sudo apt install wifipumpkin3

インストール後、captiveflaskコマンドが利用可能か確認します。ヘルプオプション (-h) を付けて実行すると、利用可能なオプションが表示されます。

captiveflask -h

これにより、以下のようなオプションが表示されるはずです(バージョンによって内容は異なります)。

usage: captiveflask [-h] [-t TEMPLATE] [-s STATIC] [-r REDIRECT] [-p PORT] [-rU REDIRECT_URL] [-f FORCE_REDIRECT] [-v VERSION]

CaptiveFlask - Server to create captive portal with flask
doc: https://github.com/mh4x0f/captiveportals

options:
  -h, --help            show this help message and exit
  -t, --tamplate TEMPLATE
                        path the theme login captive portal
  -s, --static STATIC   path of the static files from webpage
  -r, --redirect REDIRECT
                        IpAddress from gataway captive portal
  -p, --port PORT       The port for captive portal
  -rU, --redirect-url REDIRECT_URL
                        Url for redirect after user insert the credentials on captive portal
  -f, --force-login_successful-template FORCE_REDIRECT
                        force redirect to login_successful.html template
  -v, --version VERSION show version the tool

コマンドラインオプション解説

オプション 説明
-h, --help ヘルプメッセージを表示して終了します。
-t, --tamplate TEMPLATE 使用するキャプティブポータルのログインページのテーマ(HTMLテンプレート)へのパスを指定します。
-s, --static STATIC Webページで使用する静的ファイル(CSS, JavaScript, 画像など)が格納されているディレクトリへのパスを指定します。
-r, --redirect REDIRECT キャプティブポータルのゲートウェイIPアドレスを指定します。通常、CaptiveFlaskを実行しているサーバー自身のIPアドレスになります。DNSハイジャックと連携し、すべてのDNSクエリがこのIPアドレスに解決されるように設定する必要があります。
-p, --port PORT キャプティブポータルサーバーがリッスンするポート番号を指定します(デフォルトは通常80)。
-rU, --redirect-url REDIRECT_URL ユーザーが認証情報を入力した後(認証成功後)にリダイレクトされるURLを指定します。
-f, --force-login_successful-template FORCE_REDIRECT 認証成功時に、指定したリダイレクトURL(-rU)ではなく、強制的にlogin_successful.htmlテンプレートを表示させます。
-v, --version VERSION ツールのバージョンを表示します。

簡単な実行例

最もシンプルな形でCaptiveFlaskを実行するには、リダイレクト先IPアドレスを指定します。

# サーバーのIPアドレスが 192.168.1.100 の場合
sudo captiveflask -r 192.168.1.100

これを実行すると、デフォルトのテンプレートと設定でFlaskベースのWebサーバーが起動します。この時点ではまだWebサーバーが動いているだけで、実際にユーザーのリクエストをこのサーバーに誘導するには、DNSやDHCP、ファイアウォールなどの設定が別途必要です。

例えば、wifipumpkin3のようなツールを使うと、これらのネットワーク設定とCaptiveFlaskの起動を連携させて、より簡単にキャプティブポータル環境をセットアップできます。

# wifipumpkin3 内での利用例 (対話形式)
sudo wifipumpkin3
wp3 > set interface wlan0  # 使用する無線インターフェースを指定
wp3 > set ssid "MyFreeWiFi" # 偽のアクセスポイント名を設定
wp3 > set proxy captiveflask # プロキシとしてcaptiveflaskを使用
wp3 > proxies # 現在のプロキシ設定を確認
wp3 > set captiveflask.DarkLogin true # captiveflaskの特定のテンプレートを有効化 (例)
wp3 > start # アクセスポイントとキャプティブポータルを開始

上記のwifipumpkin3の例では、ツールが内部的にcaptiveflaskを適切な設定で起動し、必要なネットワーク設定(DHCPサーバーの起動、DNSリダイレクトの設定、iptablesによるトラフィック制御など)も自動で行います。

テンプレートのカスタマイズ 🎨

CaptiveFlaskの大きな特徴の一つは、ポータルページの見た目を自由にカスタマイズできる点です。HTML、CSS、JavaScriptを使用して、独自のログインページや認証成功ページを作成できます。

カスタムテンプレートを作成する際の基本的なファイル構成は以下のようになります。

my-custom-template/
├── static/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── script.js
│   └── images/
│       └── logo.png
├── templates/
│   ├── login.html          # ログインページのHTML
│   └── login_successful.html # 認証成功ページのHTML (オプション)
└── config.ini          # テンプレートの設定ファイル (オプション)

login.html の基本構造

login.html はユーザーが最初に目にするページです。最低限、認証情報(ユーザー名、パスワードなど)を入力するためのフォームが必要です。フォームのaction属性は、CaptiveFlaskが処理するエンドポイント(通常は /login または /connect など、CaptiveFlaskの実装に依存)に設定し、methodPOSTにします。

<!DOCTYPE html>
<html>
<head>
    <title>Wi-Fi Login</title>
    <link rel="stylesheet" href="/static/css/style.css">
</head>
<body>
    <h1>Welcome to Our Wi-Fi</h1>
    <form action="/login" method="post"> <!-- actionはCaptiveFlaskのエンドポイントに合わせる -->
        <div class="field">
            <label class="label" for="username">Username:</label>
            <div class="control">
                <input class="input" type="text" id="username" name="username" required>
            </div>
        </div>
        <div class="field">
            <label class="label" for="password">Password:</label>
            <div class="control">
                <input class="input" type="password" id="password" name="password" required>
            </div>
        </div>
        <!-- Hidden fields for MAC address etc. might be added by CaptiveFlask -->
        <div class="control">
            <button class="button is-primary" type="submit">Login</button>
        </div>
    </form>
    <script src="/static/js/script.js"></script>
</body>
</html>

上記の例では、Bulma CSSフレームワークを想定したクラス名を使用していますが、デザインは自由に作成できます。staticディレクトリ内のファイルへのパスは、ルートからの相対パス(例:/static/css/style.css)で指定します。

login_successful.html

-f オプションを使用する場合や、特定のフローで必要とされる場合に、認証成功後に表示されるページです。

<!DOCTYPE html>
<html>
<head>
    <title>Login Successful</title>
    <link rel="stylesheet" href="/static/css/style.css">
    <!-- Optionally redirect after a delay -->
    <!-- <meta http-equiv="refresh" content="5;url=http://www.google.com"> -->
</head>
<body>
    <h1 class="has-text-success">Login Successful!</h1>
    <p>You are now connected to the internet.</p>
    <p>If you are not redirected automatically, <a href="http://www.google.com">click here</a>.</p> <!-- URLは -rU で指定したものなど -->
</body>
</html>

カスタムテンプレートの使用

作成したカスタムテンプレートを使用するには、captiveflaskコマンドの-tオプションでtemplatesディレクトリのパスを、-sオプションでstaticディレクトリのパスを指定します。

sudo captiveflask -r 192.168.1.100 -t ./my-custom-template/templates -s ./my-custom-template/static -rU http://example.com

wifipumpkin3を使用している場合は、テンプレートを特定のディレクトリ構造に配置し、設定ファイル(config.ini)やPythonプラグインファイル(例:MyCustomPlugin.py)を作成することで、wifipumpkin3のプラグインとして認識させることができます。詳細な手順はwifipumpkin3のドキュメントや、extra-captiveflaskリポジトリの例を参照してください。

extra-captiveflaskリポジトリ (https://github.com/mh4x0f/extra-captiveflask) には、コミュニティによって作成された様々なテンプレートが含まれており、カスタムテンプレートを作成する際の参考になります。

CaptiveFlaskとネットワーク設定の関係 🌐

CaptiveFlaskは強力なツールですが、それ単体では完全なキャプティブポータルとして機能しません。以下のネットワークコンポーネントとの連携が不可欠です。

  1. アクセスポイント (AP): ユーザーが接続するためのWi-Fiネットワークを提供します。Raspberry Piや対応する無線LANアダプターを使って構築できます。hostapdなどのソフトウェアがよく使われます。
  2. DHCPサーバー: アクセスポイントに接続してきたデバイスにIPアドレス、サブネットマスク、デフォルトゲートウェイ、そしてDNSサーバーのアドレスを割り当てます。キャプティブポータル環境では、DNSサーバーのアドレスとして、CaptiveFlaskが動作しているサーバーのIPアドレスを指定することが重要です。dnsmasqやISC DHCP Serverなどが用いられます。
  3. DNSサーバー (または DNSリダイレクション): CaptiveFlaskサーバー上でDNSサーバーを動作させ、すべてのドメイン名解決リクエストに対してCaptiveFlaskサーバー自身のIPアドレスを返すように設定します。これにより、ユーザーがどのウェブサイトにアクセスしようとしても、強制的にCaptiveFlaskのログインページに誘導されます。dnsmasqはDHCPとDNSの機能を提供できるため、よく利用されます。あるいは、iptablesのようなファイアウォールを使って、DNS(UDP/53)やHTTP(TCP/80)のトラフィックを強制的にCaptiveFlaskサーバーに向ける方法もあります。
  4. ファイアウォール (アクセス制御): 認証前のユーザーからのトラフィックは、CaptiveFlaskサーバーへのアクセス(HTTP/HTTPS)とDNSクエリを除き、基本的にすべてブロックします。ユーザーがCaptiveFlaskで認証に成功したら、そのユーザー(のMACアドレスやIPアドレス)からのインターネットアクセスを許可するようにファイアウォールのルールを動的に変更します。iptablesnftablesがLinux環境では一般的です。

CaptiveFlaskは主に上記の3番(Webサーバー部分)と、4番の認証成功をトリガーとする部分に関与します。wifipumpkin3のような統合ツールは、これらのコンポーネントの設定と連携を自動化してくれるため、ユーザーは個々の設定を深く理解していなくても、比較的容易にキャプティブポータル攻撃(または正規のポータル構築)を実行できます。

ポイント: ユーザーがWi-Fiに接続すると、デバイスは通常、特定のURL(OSによって異なる。例: `http://connectivitycheck.gstatic.com/generate_204`)にアクセスしてインターネット接続を確認しようとします。キャプティブポータル環境では、このリクエストがDNSハイジャックによってCaptiveFlaskサーバーに送られ、ログインページが表示されることで、OSは「インターネット接続には認証が必要」と判断し、自動的にブラウザ(または専用のポップアップウィンドウ)でログインページを開きます。これが、Wi-Fi接続時に自動でログイン画面が表示される仕組みです。

注意点と限界 ⚠️

  • HTTPSの問題: DNSハイジャックはHTTPトラフィックに対しては有効ですが、HTTPSサイトへの直接アクセス(例: `https://google.com`)の場合、ブラウザは証明書エラーを検出し、リダイレクトがうまく機能しないか、警告が表示されます。これを回避するために、SSL/TLS中間者攻撃の手法(例: SSLstrip)が併用されることがありますが、これは高度な攻撃手法であり、倫理的・法的な問題が伴います。正規の用途では、ポータル自体のドメインに有効な証明書を用意するか、HTTPでのアクセスを強制するなどの工夫が必要です。
  • OS/ブラウザの挙動: キャプティブポータルの検出と自動表示のメカニズムはOSやブラウザによって異なります。すべてのデバイスで意図した通りに動作するとは限りません。
  • セキュリティリスク: CaptiveFlaskやwifipumpkin3は、しばしば悪意のある目的(パスワードフィッシングなど)で使用されるツールです。これらのツールを使用する際は、法規制や倫理規範を遵守し、許可されたネットワーク環境でのみ使用してください。
  • 依存関係: wifipumpkin3の一部であるため、Flaskやその他のPythonライブラリ、さらにはhostapd, iptablesなどのシステムツールに依存します。環境によってはセットアップが複雑になることがあります。

まとめ ✅

CaptiveFlaskは、PythonとFlaskを用いてキャプティブポータルのWebサーバー部分を構築するための便利なツールです。特にwifipumpkin3フレームワークと組み合わせることで、ネットワーク設定を含めたキャプティブポータル環境のセットアップを簡略化できます。

テンプレート機能により、ログインページの見た目を自由にカスタマイズでき、ゲストWi-Fiの認証システムや、セキュリティ教育、ペネトレーションテストなど、様々な用途に応用できます。

ただし、CaptiveFlask自体はWebサーバー機能を提供するものであり、DNS、DHCP、ファイアウォールといった周辺のネットワーク設定と連携して初めて完全なキャプティブポータルとして機能します。また、その性質上、悪用される可能性もあるため、利用にあたっては技術的な理解と共に、倫理的・法的な側面にも十分配慮する必要があります。

興味を持った方は、wifipumpkin3extra-captiveflaskのGitHubリポジトリなどを参照し、さらなる情報を得てみてください。 🚀

コメント

タイトルとURLをコピーしました