パケット スニッフィングとスプーフィングは、ネットワーク セキュリティにおいて進化する 2 つの脅威です。 Wireshark、tcpdump、netwox など、パケット スニッフィングおよびスプーフィング ツールは数多くあります。これらのツールの中には、攻撃者だけでなくセキュリティ専門家によって広く使用されているものもあります。これらのツールを使用できることは重要ですが、ネットワーク セキュリティにおいてより重要なことは、これらのツールがどのように機能するか、つまりパケット スニッフィングとスプーフィングがソフトウェアでどのように実装されるかを理解することです。
以下は、Scapy を利用した単純なスニファー プログラムです。
from scapy . all import *
print ( "SNIFFING PACKETS" )
def print_pkt ( pkt ):
print ( "Source IP:" , pkt [ IP ]. src )
print ( "Destination IP:" , pkt [ IP ]. dst )
print ( "Protocol:" , pkt [ IP ]. proto )
print ( " n " )
pkt = sniff ( filter = 'icmp' , prn = print_pkt )
上記のコードでは、キャプチャされたパケットごとにコールバック関数print_pkt()
が呼び出されます。この関数はパケットの情報の一部を出力します。
パケットをスニッフィングする場合、特定のタイプのパケットに関心が高まる場合があります。スニファの設計時にフィルタを設定することで、特定のパケットのみを選択することができます。 Scapy のフィルタリングは、BPF (Berkeley Packet Filter) 構文を使用します。
Scapy で可能なフィルタリングの例は次のとおりです。
128.200.0.0/16
などの特定のサブネットで送受信されるパケットのキャプチャパケット スプーフィング ツールとして、Scapy を使用すると、さまざまなパケット ヘッダーのフィールドに任意の値を設定できます。たとえば、悪意のある当事者が IP スプーフィングを使用して、ターゲットに対して DDoS 攻撃を引き起こす可能性があります。 IP スプーフィングとは、送信者の身元を隠すか、別のネットワーク エンティティ (コンピュータ システム、データセンターなど) になりすます、あるいはその両方を目的として、変更されたソース アドレスを持つ IP パケットを作成することです。
スプーフィングICMPパケット
from scapy . all import *
print ( "SENDING SPOOFED ICMP PACKET" )
ip = IP ( src = "1.2.3.4" , dst = "93.184.216.34" ) # IP Layer
icmp = ICMP () # ICMP Layer
pkt = ip / icmp # Construct the complete packet
pkt . show ()
send ( pkt , verbose = 0 )
スプーフィングUDPパケット
from scapy . all import *
print ( "SENDING SPOOFED UDP PACKET" )
ip = IP ( src = "1.2.3.4" , dst = "10.0.2.69" ) # IP Layer
udp = UDP ( sport = 8888 , dport = 9090 ) # UDP Layer
data = "Hello UDP! n " # Payload
pkt = ip / udp / data # Construct the complete packet
pkt . show ()
send ( pkt , verbose = 0 )
スニッフィング技術とスプーフィング技術を組み合わせて、スニッフィングしてからスプーフィングするプログラムを実装します。同じ LAN 上に 2 つの VM が必要です。 VM A から、IP X に ping を送信します。このアクションにより、ICMP エコー要求パケットが生成されます。 X が生きている場合、ping プログラムはエコー応答を受信し、その応答を出力します。スニフしてスプーフするプログラムは VM B 上で実行され、パケット スニッフィングを通じて LAN を監視します。 ICMP エコー要求を見つけると、ターゲット IP アドレスに関係なく、プログラムはパケット スプーフィング技術を使用して即座にエコー応答を送信します。したがって、マシン X が生きているかどうかに関係なく、ping プログラムは常に X が生きていることを示す応答を受け取ります。
IP ()
IP (). show ()
IP () / ICMP ()
p = IP () / ICMP ()
p . show ()
p = IP () / UDP ()
p . show ()
p = IP () / UDP () / "This is my UDP packet"
p . show ()
send ( IP () / UDP () / "This is my UDP packet" )
send ( IP ( dst = '10.0.2.7' ) / UDP () / "This is my UDP packet" )
ご興味をお持ちいただきありがとうございます。このプロジェクトは楽しくて洞察力に富んだものでした。