Python3 + Scapyのインストールと使用のチュートリアル

1.説明

以前にDoSプログラムを作成する場合(「サービス拒否(DoS)の理解、防御、および実装」を参照)、データパケットは完全に自分で作成されます。問題の1つは、フィールド、フィールドの長さ、および値を明確にすることです。プロトコルのさまざまなレイヤーの。静止文字、大きな頭または小さな頭、そして2番目はチェックサムを計算することです。全体のプロセスはより苦痛です。

実際、DoSパケットを構築するために、ソースIPなどのいくつかのフィールドを偽造したい場合がよくありますが、実際には、ほとんどの人が気にしない他のフィールドの構築に多くの時間が費やされています。

情報を検索する過程で、多くのDoSプログラムが「Scapy」パッケージを直接使用していることがわかりました(最初は、Scrapyを使用してデータパッケージを構築できる時期をScrapyが考えていたと思いましたが、「r」に気づきました。行方不明でした)。当時はあまり気にしませんでしたが、振り返ってみると、Scapyは確かに「アーティファクト」であり、記録する価値があります。

この記事は主に公式文書に言及しています。その他の使用法については、https//scapy.readthedocs.io/en/latest/usage.htmlを参照してください。

 

2、インストール

pipを使用して直接インストールします。

pip install scapy

いくつかの拡張機能がインストールされていますが、オプションです。

pip install matplotlibpyx暗号化

 

3、データパッケージを生成します

3.1scapyインタラクティブシェルを開始する

PythonのScriptsフォルダーに切り替え、scapyコマンド(基本的にはscapy.bat)を使用して直接起動します。

scapy

起動インターフェイスは次のとおりです(PyXをインストールしなかったため、psdump()とpdfdump()を使用できないというプロンプトが表示され、重要ではなく処理されない警告がいくつかあります)。

 

3.2データパッケージの生成

scapyでは、基本的にプロトコルの大文字に対応する方法を使用して、アプリケーション層の下のデータパケットを直接生成できます。といった:

コードをコピーする


#Ether ()メソッドを使用してイーサネット層データパケットを生成しますeth_packet = Ether()
#IP()メソッドを使用してネットワーク層データパケットを生成します
ip_packet = IP()
#TCP()メソッドを使用してtcpデータを生成しますpacket 
tcp_packet = TCP()
#UDP()メソッドを使用してudpパケットを生成します
udp_packet = UDP()
#ICMP()メソッドを使用してudpパケットを生成します
icmp_packet = ICMP()

コードをコピーする

 

3.3データパッケージの内容を表示する

前のセクションで生成されたデータパケットは、長すぎると完全にブラックボックスになります。データパケット(各フィールド)が何であるかを知るための何らかの方法が必要です。

どのプロトコルのデータパケットも類似しています。例としてtcpデータパケットを取り上げましょう。同様の操作のために他のプロトコルのデータパケットを表示できます。

コードをコピーする


#IP ()メソッドを使用してtcpデータパケットを生成しますip_packet = IP()

#メソッド1、raw()メソッドを使用して
raw(ip_packet)を表示します

#メソッド2、hexdump()を使用して表示します。Wireshark 
hexdump(ip_packet)と同様

#メソッド3、プロトコルクラスを使用したraw()ビュー。最良
#パケットのイーサネット層の内容を表示します(下位層の内容は層に表示されず、上位層の内容は解析されずにロードの形式で表示されます)
Ether(raw(ip_packet))
#パケットのネットワーク層のコンテンツを表示します(下位層のコンテンツはレイヤーに表示されません。上位層のコンテンツは解析されず、ロードの形式でのみ表示されます)
IP(raw(ip_packet))

コードをコピーする

 

3.4カスタムフィールド値

前のセクションでは、rawを使用してプロトコルメソッドと連携し、データパケットの各フィールドの値を明確に確認しました。これらの値は、ローカル情報に基づいて自動的に生成されます。各フィールドの値をカスタマイズする方法を見てみましょう。 。

フィールドの値を定義する方法は2つあります。1つは構築中にパラメーターを直接渡す方法、もう1つは生成後に値を再割り当てする方法です。パラメーター名については、前のセクションで入力した項目です。 。

例として、送信元IPアドレスとTTLの変更を取り上げます。前のセクションでは、デフォルトの送信元IPアドレスが「src」と呼ばれ、値が「10.10.6.91」(これはの現在のIPアドレスです)であることがわかります。私のマシン)、TTLはttlと呼ばれます。デフォルト値は64です。

コードをコピーする

#方法1、構築中にパラメータを直接渡す
#値10.10.6.92をsrcに渡し、値128をttlに渡す;フィールドが文字の場合は文字列の形式で渡し、フィールドが値の場合は渡す数値の形式で入力します
。ip_packet= IP(src = "10.10 .6.92"、ttl = 128)
#データパケットの値を表示し、srcアイテムが10.10.6.92であるかどうかを確認し、ttlアイテムを確認します。 is 128 
IP(raw(ip_packet))

#メソッド2、生成後に再割り当て#src 
10.10.6.92に割り当て、ttl割り当て128;フィールドは文字列に割り当てられ、数値フィールドは
Fuip_packetの値です。 src = "10.10.6.93" 
ip_packet.ttl = 200 is 
#パケットを表示確認された値srcアイテムが10.10.6.93であるかどうか、およびttlアイテムが200であるかどうか
IP(raw(ip_packet))

コードをコピーする

 

3.5マルチレイヤープロトコルのフィールドを同時にカスタマイズする

前のセクションで送信元IPアドレスをカスタマイズしましたが、問題があります。この時点で送信元MACアドレスをカスタマイズしたい場合はどうなりますか。Ether()の代わりにIP()を使用して、構築でパラメーターを直接渡したい;生成後に値を再割り当てしたい、前のセクションでsrcをテストしてソースIPを変更したが、ソースmacを変更できないsrcアイテムを介して変更されました。

多層プロトコルを構築するには、コンストラクターを「/」で区切ることができます。低レベルの関数は前面にあり、高レベルの関数は背面にあります。最後に、コンストラクターの最下位の関数は次のようになります。データパケットの内容を表示するために使用されます。

コードをコピーする


#IPパケットを作成し、ソースmacを「00:00:00:00:00:11」に設定し、ソースipを「10.10.6.92」に設定します。ip_packet= Ether(src = "00:00:00: 00:00:11 ")/ IP(src =" 10.10.6.92 ")
#現在の構造文字の最下層はEther 
Ether(raw(ip_packet))

#TCPパケットを定義し、ソースmacは" 00に設定されます:00:00:00:00:11 "、送信元IPは" 10.10.6.92 "に設定され、送信元ポートは1234に設定されます
tcp_packet = Ether(src =" 00:00:00:00:00:11 " )/ IP(src = "10.10.6.92")/ TCP(sport = 1234)
#現在の構造文字の最下層はEther 
Ether(raw(tcp_packet))

#アプリケーション層のデータパケット、アプリケーションのコンテンツを定義しますレイヤーは "GET / HTTP / 1.0 \ r \ n \ r \ n" 
app_packet = IP()/ TCP()/ "GET / HTTP / 1.0 \ r \ n \ r \ n" 
#現在の構造の最下位レイヤー文字はIPです
IP(raw(app_packet))

コードをコピーする

 

第四に、データパケットを送受信します

4.1データパケットのみを送信し、データパケットは受信しません

send()関数を使用すると、ネットワーク層をカスタマイズできます。sendp()関数を使用すると、イーサネット層をカスタマイズできます。

TCPまたはUDPに関係なく、send()およびその他の関数を直接使用できます。Scapyはそれ自体でソケットタイプを選択します。私たちは気にしません。

send(IP(dst = "10.10.6.92")/ ICMP())

sendp(Ether()/ IP(dst = "10.10.6.92")/ ICMP())

 

4.2応答パケットの送受信

sr1()関数はカスタムネットワーク層に参加し、srp()関数はカスタム層のデータリンク層を可能にします

rec_packet = sr1(IP(dst = "10.10.6.92")/ ICMP()/ "abcdefg")
rec_packet 
#アイテムの値を直接読み取る
rec_packet.src 
#show()メソッドを使用して出力をフォーマットします
rec_packet.show( )

 

4.3シンスキャン

いわゆるsynスキャンは、FlagsフィールドをSYNとして明示的に指定することです。

rec_packet = sr1(IP(dst = "10.10.6.92")/ TCP(dport = 80、flags = "S"))
rec_packet.show()

 

 

5、コードで使用

私たちは皆、ファイルにある場合、scapyの使用方法の前にインタラクティブシェルに基づいています。

インタラクティブシェルとファイルのコード記述に違いはありません。唯一の違いは、インタラクティブシェルがすべてのscapyクラスをインポートしたことであり、ファイル上のすべてのscapyクラスをインポートする最も簡単な方法は次のとおりです。

scapy.allからインポート*

(実際には、この書き方でもPycharmで「Unreslovedreference」が表示されますが、実行時にエラーは報告されません。「Alt + Enter」キーを使用して使用済みクラスをインポートすることは実際には不可能です。一つ。)

 

参照:

https://scapy.readthedocs.io/en/latest/usage.html

https://github.com/secdev/scapy/

おすすめ

転載: blog.csdn.net/THMAIL/article/details/107490817