そもそもWifiに入られて何が問題なのか
Windowsなら「ファイルとプリンターの共有」がONになっていないだろうか。MacOSならAirDropがONになっていないだろうか。
Google Project Zeroの発表ではAirDropを悪用したゼロクリック攻撃でWiFi経由でiPhone端末の乗っ取りが可能であることが示されました
フリーwifiに入るということは、誰と同じネットワークにいるか分からないということです。
通信の傍受に関してもメールの内容はいまだに暗号化通信でやりとりされてないケースがあるのでフリーwifiでのメール利用は避けましょう。
またHTTPSが常識となってきている世の中なので問題ないのではと考えるのは早計です。URL上のクエリストリングは暗号化されず、HTTPSを使ってもCookieの改変は防げませんのでCookie関連の攻撃は防げません。
メールのやりとりを改ざんフィッシングへ誘導や、隣接ネットワークによる攻撃はたいていやりたい放題です。Wifiに入られることは問題になると考えていた方が良いでしょう。
WifiでやりとりされるのはWebの情報のみにあらず、攻撃者と同じネットワークにいる可能性を考えましょう
パーソナルとエンタープライズの違いはパスワード認証か電子証明書による認証か
WPA/WPA2にはパーソナルとエンタープライズがありますが違いは認証にあります。IDとパスワードを入力するのがパーソナルです。電子証明書を利用するのがエンタープライズです。
パーソナルに関しては認証突破の知恵比べがイタチごっこの様相です。WEPは「aircarck-ng」などで秒速でパスワードが破られるので間違えても利用ないようにしましょう。WPA/WPA2-PSKもコストをかけられるなら「Pyrit」などで突破可能です。また、記事の後半で示すようにコマンド一つでパスワードは表示できてしまいます。電子証明書は管理さえできていればパスワードより容易にセキュアな状態となるでしょう。つまり企業ならエンタープライズを推奨します。
SSIDをそもそも晒して狙われるのが問題ではと考えSSIDステレス機能を利用する企業もあるようなのでこの点に言及したいと思います。
SSIDステルス機能があれば大丈夫?
結論NGです。SSIDステルス機能はプローブ要求、この「IDありますか?」には応えてしまうので隠せている内には入りません。APが自ら発信するパッシブスキャンには効果がありますが、アクティブスキャンでは表示されてしまうので抑止力としては弱いです。
他の軽減策は?
社用携帯など組織で管理している端末が明確な場合はMACアドレスをフィルタリングする方法が有効です。ただしBYODを推進している組織や、外部委託などが多い場合は実施が難しいのではないかと考えられますます。
WPA/WPA2はエンタープライズ、電子証明書認証にしましょう
コマンド一つでパスワードが表示可能な「WPA/WPA2パーソナル」
Wifiの情報は簡単に抜かれることを示していきたいと思います。(Windowsにて)
Wi-Fi情報を取得するに便利なnetsh wlan show ですがこのオプションに「既知のネットワーク詳細をパスワード含めて表示する」が存在します。
netsh wlan show name=”SSID” key=clearと続ければ表示可能です。Key Contentの部分に表示されていることが確認できるでしょう。
実際情報を盗むことを考えると表示などさせず単純に引っこ抜いてそのまま取り込むだけで良いのでコマンドで実行可能です。
netsh wlan export profile //エクスポート
netsh wlan add profile filename="filename" //インポート
AWS CLIなどのシェルコマンド実行にも使えるsubprocessで以下のような感じでSSID毎にパスワードを含む情報を表示できます。
import subprocess
import re
command_output = subprocess.run(["netsh", "wlan", "show", "profiles"], capture_output = True).stdout.decode()
wifi_list = []
all_user_profile = (re.findall("All User Profile : (.*)\r", command_output))
if len(all_user_profile) != 0:
for name in all_user_profile:
profile = {}
profile_info = subprocess.run(["netsh", "wlan", "show", "profile", name], capture_output = True).stdout.decode()
if re.search("Security key : Absent", profile_info):
continue
else:
profile["ssid"] = name
profile_info_pass = subprocess.run(["netsh", "wlan", "show", "profile", name, "key=clear"], capture_output = True).stdout.decode()
password = re.search("Key Content : (.*)\r", profile_info_pass)
if password == None:
profile["password"] = None
else:
profile["password"] = password[1]
wifi_list.append(profile)
for get_result in range(len(wifi_list)):
print(wifi_list[get_result])
数秒でパスワードが表示されたかと思います。
メールアカウントのパスワードなどもコマンドで抜かれる場合があるので、パスワードの端末管理は安全と言い切るのは難しいですね。リモートワークが進み働く場所が組織管理下の社屋ではなくないケースが一般化した時代になってきましたので、Wifiのセキュリティについてこの機会に見直してみるのはいかがでしょうか?
以上です。参考になれば幸いです。