
デバイスの優先ネットワークリストからSSIDをキャプチャして表示する偵察ツール。

プリファードネットワークリストスニファ (PNLS) は、シンプルなWebインターフェースを備えたレッドチーム向けWi-Fi監査ツールであり、デバイスのプリファードネットワークリスト (PNL)[^2] からSSID[^1]を傍受することができます。これは、周辺の プローブリクエスト をスニッフィングし、そこからSSIDやその他の情報を解析し、最終的にWeb UIに伝搬することで実現されます。このプロジェクトの主な動機は、802.11プローブリクエストと、それらが送信するデータに関連するプライバシーリスクを調査することでした。
図 1: PNLS システム概要
[!WARNING] このプロジェクトのすべてのコンテンツは、セキュリティ研究目的のみを対象としています。
[!NOTE]
このプロジェクトは、Wi-Fiネットワークにおけるプライバシー保護に関する現在進行中の研究の一部です。
PNLS の進行中の作業を監視するには、プロジェクトのボードを参照してください。
このプロジェクトを複製してデプロイするために必要なもの(ハードウェアおよびソフトウェアコンポーネントの両方)を以下に示します。作業環境の準備ができたら、セットアップセクションに進んでください。
sudo airmon-ng start wlan0 [2].[!NOTE]
Re4sonのカーネルを使用するKaliイメージには、外部Wi-Fiカード用のドライバと、RPi 3および4の内蔵ワイヤレスカード用のNexmonファームウェアが含まれています[3]。
図 2: 外部アンテナとバッテリーバンクを備えたRPi 4で動作するPNLS
図 3: AWUS036ACSアンテナを搭載したケースに入ったRPi 4で動作するPNLS
図 4: AWUS036ACMアンテナを搭載したRPi 4で動作するPNLS
Dockerを使用したくない場合は、Dockerなしのセットアップに進んでください。
開発インスタンスを迅速にセットアップします:
# First clone this repo.
git clone https://github.com/AleksaMCode/Preferred-Network-List-Sniffer.git
# Move to the project root folder.
cd Preferred-Network-List-Sniffer
# Build backend and frontend image.
docker compose build
# Bring up both the backend and the frontend server.
docker compose up
# Move into the sniffer folder.
cd sniffer
# Run the Sniffer service.
sudo python3 sniffer.py
現在、マルチプラットフォームイメージは利用できず、プロジェクトはARM64v8アーキテクチャのみをサポートしています。最新のプレビルドイメージをGitHub Container Registryからダウンロードし、ローカルで実行してください。
# First clone this repo.
git clone https://github.com/AleksaMCode/Preferred-Network-List-Sniffer.git
# Move to the project root folder.
cd Preferred-Network-List-Sniffer
# Download the prebuild images.
docker pull ghcr.io/aleksamcode/pnls-backend-ghcr:latest
docker pull ghcr.io/aleksamcode/pnls-frontend-ghcr:latest
# Bring up both the backend and the frontend server.
docker compose up
# Move into the sniffer folder.
cd sniffer
# Run the Sniffer service.
sudo python3 sniffer.py
バックエンド: ASGIサーバーとRedisサーバーを起動し、必要なサービスを実行するには、これらの手順を参照してください。
フロントエンド: Reactサーバーを実行するには、これらの手順を参照してください。
以下は、すべてを「手動」で実行したときのスクリーンショットです:
図 5: PNLSのスクリーンショット
プローブリクエストは、デバイスを以前に関連付けられたワイヤレスアクセスポイント (AP) に接続するために使用される管理802.11フレームです。デバイスがWi-Fiを有効にしているがネットワークに接続していない場合、定期的にPNLのSSIDを含むプローブリクエストのバーストを送信します。これらのフレームは暗号化されずに送信され、無線周波数 (RF) を監視している誰でもキャプチャして読み取ることができます。プローブはブロードキャストDAアドレス (ff:ff:ff:ff:ff:ff) に送信されます。送信後、デバイスはプローブタイマーを開始します。タイマーの終了時に、デバイスは受信した応答を処理します。応答を受信しなかった場合、デバイスは次のチャンネルに移動してプロセスを繰り返します。プローブリクエストには2つのタイプがあります:
ダイレクトプローブリクエスト: デバイスのPNLの特定のSSIDを使用
ヌルプローブリクエスト: ワイルドカードSSID(空のSSID)を使用
ブランクリクエストは、範囲内のすべての利用可能なAPから応答を得るために送信されます。
キャプチャされたすべてのパケットから802.11プローブリクエストフレームをフィルタリングすることに加えて、スニファはワイルドカードSSIDもフィルタリングします。
多くのWi-Fiクライアントが存在する大規模なローカルネットワークがある場所でプローブリクエストをキャプチャすると、PNLSは必然的にそのネットワークのSSIDを含む多くのプローブリクエストをキャプチャします。そのようなSSIDのフィルタリングは、私たちにとって価値がなく、ソケット負荷の増加を引き起こす可能性があるため、有利な場合があります。これらのSSIDをフィルタリングすると、ソケット接続の負荷が軽減されるだけでなく、Web UI上での前述のSSIDのスパムも防止できます。
この機能を使用する場合、ソースコードを少し調整する必要があります。具体的には、settings.pyファイル内のSSID_FILTERリストを、スニファが無視する値に更新する必要があります。更新後、プロジェクトを再構築してPNLSを起動してください。