どうすればscapyでパケットデータを変更できますか?
編集したパケットを使用sniff()
してみましsend()
たが、元のパケットがすでに宛先に到達しているため、機能しません。
iTayb、
scapyを使用してある種のサービスをプロキシすることに興味があるようですか?もしそうなら、どれですか?
ビジネスの最初の順序は、パケットがscapyを実行しているボックスをどのように通過するかです。これを行うには、リモートマシンのゲートウェイをスケープボックスと一致するように設定します。これが何らかの侵入テスト用である場合は、いくつかのMACアドレスをスプーフィングする必要があります。これは、arpcachepoisonメソッドを使用するscapy、またはettercapなどのサードパーティプログラムを使用して行うことができます。
これが完了すると、sniff()とsend()を使用するメソッドが少しうまく機能するはずです。送信部分に到達する前に、必ずパケットを変更してください;)これを行う方法の小さな例を次に示します。 。ここでは、IPヘッダーの宛先アドレスを変更するだけですが、必要に応じて変更できます。
from scapy import *
def chgSend(x):
x[IP].dst = '192.168.1.1'
send(x)
while 1:
sniff(prn=chgSend)
DC
「しかし、元のパケットがすでに宛先に到達しているため、機能しません。」
したがって、最初にMiTMソリューションを設定して、両端間のすべての通信がデバイスを通過するようにし、パケットデータを変更できるようにする必要があります。
この機能/attackの既知のソフトウェアパッケージには、ettercapとcain/abelがあります。
私も同じ問題を抱えていました、
問題は、ip_forwardを有効にして、変更されたパケットがscapyによって送信される前に、元のパケットが元の宛先に転送されることだと思います。
理論的には、解決策は、変更したいパケットを別のポートに転送するルールをiptablesに作成することです(これは多かれ少なかれEttercapが内部で行うことです)。
i.e = iptables -t nat -A PREROUTING -p tcp --destination-port "YourInterestingPort" -j REDIRECT --to-port 1234
次に、scapyでそのポートをリッスンし、パケットを変更して、パケットを元のポートに送信します。
このソリューションは、フィルタリングのために実装が困難です。必要なパケットのみをリダイレクトおよび変更し、synackarpなどを除外する必要があります...
サーバーの応答を変更する場合、それを行うためのより簡単な方法は、パケットをその場で変更する代わりに、仲介者のように機能することです。
ソケットを開き、パケットを受信し、接続を開いて、元の宛先に送信します(クライアントであるかのように見せかけます)。次に、元の宛先から回答を受け取り、回答を変更して、元のクエリアに戻します。
while True:
c, addr = s_mb.accept() # Establish connection with client.
query = c.recv(BUFFER_SIZE)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, PORT))
s.send(PACKET)
response = s.recv(1024)
if response = "THIS IS THE RESPONSE THAT I WANT TO MODIFY":
if(real_simulation):
fakeresponse = "MODIFIED RESPONSE"
#print "The packet has beeb modified"
else:
fakeresponse = response
s.close()
c.send(fakeresponse)
(汚いコードでごめんなさい)
scapy send()関数を使用すると、新しいパケットが作成されますが、MITMfを使用すると、send関数は必要ありません。scapy構文などのパケットフィールドを変更するだけで、sendfuncを使用したり新しいパケットを作成したりする必要はありません...
これはMITMfに適したgithub レポジトリです。
このレポジトリはscapyのようなもので、ターゲットに対して完全な機能を備えたゼロから作成されています。
サンプルコード:
if packet.haslayer(ICMP):
log.info('Got an ICMP packet!')
packet.dst = '192.168.1.0'