Wi-Fi認証ページを自作しよう!
はじめに:CaptiveFlaskとは? 🤔
CaptiveFlask(キャプティブフラスク)は、PythonのWebフレームワークであるFlaskをベースにして、キャプティブポータル(Captive Portal)を簡単に作成するためのツールです。特に、ペネトレーションテストやセキュリティ研究の分野で利用されることが多いwifipumpkin3
というフレームワークのサブツールとして開発されました。
キャプティブポータルとは、公共のWi-Fiスポットなどでよく見かける、インターネットに接続する前に表示される認証ページや利用規約同意ページのことです。ユーザーが特定の操作(パスワード入力、利用規約への同意など)を行うまで、インターネットアクセスを制限する仕組みを提供します。
CaptiveFlaskは、このようなポータルサイトのWebサーバー部分の実装を助け、特定の条件下でユーザーをログインページにリダイレクトさせる機能を提供します。これにより、開発者はFlaskの知識を活かしつつ、比較的容易にキャプティブポータル環境を構築できます。
ただし、CaptiveFlask自体はWebサーバー機能に特化しており、完全なキャプティブポータル環境(DHCPサーバーの設定、DNSハイジャック、ファイアウォールによるアクセス制御など)を構築するには、OSレベルでのネットワーク設定や他のツールとの連携が必要になる点に注意が必要です。
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の実装に依存)に設定し、method
はPOST
にします。
<!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は強力なツールですが、それ単体では完全なキャプティブポータルとして機能しません。以下のネットワークコンポーネントとの連携が不可欠です。
- アクセスポイント (AP): ユーザーが接続するためのWi-Fiネットワークを提供します。Raspberry Piや対応する無線LANアダプターを使って構築できます。
hostapd
などのソフトウェアがよく使われます。 - DHCPサーバー: アクセスポイントに接続してきたデバイスにIPアドレス、サブネットマスク、デフォルトゲートウェイ、そしてDNSサーバーのアドレスを割り当てます。キャプティブポータル環境では、DNSサーバーのアドレスとして、CaptiveFlaskが動作しているサーバーのIPアドレスを指定することが重要です。
dnsmasq
やISC DHCP Serverなどが用いられます。 - DNSサーバー (または DNSリダイレクション): CaptiveFlaskサーバー上でDNSサーバーを動作させ、すべてのドメイン名解決リクエストに対してCaptiveFlaskサーバー自身のIPアドレスを返すように設定します。これにより、ユーザーがどのウェブサイトにアクセスしようとしても、強制的にCaptiveFlaskのログインページに誘導されます。
dnsmasq
はDHCPとDNSの機能を提供できるため、よく利用されます。あるいは、iptables
のようなファイアウォールを使って、DNS(UDP/53)やHTTP(TCP/80)のトラフィックを強制的にCaptiveFlaskサーバーに向ける方法もあります。 - ファイアウォール (アクセス制御): 認証前のユーザーからのトラフィックは、CaptiveFlaskサーバーへのアクセス(HTTP/HTTPS)とDNSクエリを除き、基本的にすべてブロックします。ユーザーがCaptiveFlaskで認証に成功したら、そのユーザー(のMACアドレスやIPアドレス)からのインターネットアクセスを許可するようにファイアウォールのルールを動的に変更します。
iptables
やnftables
がLinux環境では一般的です。
CaptiveFlaskは主に上記の3番(Webサーバー部分)と、4番の認証成功をトリガーとする部分に関与します。wifipumpkin3
のような統合ツールは、これらのコンポーネントの設定と連携を自動化してくれるため、ユーザーは個々の設定を深く理解していなくても、比較的容易にキャプティブポータル攻撃(または正規のポータル構築)を実行できます。
注意点と限界 ⚠️
- 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、ファイアウォールといった周辺のネットワーク設定と連携して初めて完全なキャプティブポータルとして機能します。また、その性質上、悪用される可能性もあるため、利用にあたっては技術的な理解と共に、倫理的・法的な側面にも十分配慮する必要があります。
興味を持った方は、wifipumpkin3
やextra-captiveflask
のGitHubリポジトリなどを参照し、さらなる情報を得てみてください。 🚀
コメント