1

Scapyを使用して最も単純なSMTPセッションを実行することは可能ですか?とを使用してキャプチャされたパケットを読み取ろうとしましたが、うまくいきませんでした...tcpdumpScapy

これは私が持っているものです

#!/usr/bin/python
from scapy.all import *
from scapy.layers.inet import IP, TCP
source_ip = '1.2.3.4'
source_port = 5100 
source_isn = 1000
dest_ip = '1.2.3.5' 
dest_port = 25
ip=IP(src=source_ip, dst=dest_ip)
SYN=TCP(sport=source_port, dport=dest_port, flags="S", seq=source_isn)
SYNACK=sr1(ip/SYN)
source_isn = SYN.seq + 1
source_ack = SYNACK.seq + 1
CK=TCP(ack=source_ack, sport=source_port, dport=dest_port, flags="A",seq=source_isn)
handshakedone=sr1(ip/ACK)
DTA=TCP(ack=handshakedone.seq+len(handshakedone.load), seq=source_isn, sport=source_port,dport=dest_port,flags="PA")
sr(ip/DTA/Raw(load='mail from: test@gmail.com\r\n'))
send(ip/DTA/Raw(load='rcpto to: me@gmail.com\r\n'))
source_isn = ACK.seq + len(mfrom)
.....
RST=TCP(ack=SYNACK.seq + 1, seq=source_isn, sport=source_port, dport=dest_port, flags="RA")
send(ip/RST)

ハンドシェイクは成功しますが、セッション中ACKSEQ値はどうあるべきですか?どうすれば計算できますか?

4

1 に答える 1

0

TCP seq および ack 番号は、rfc 793 (24 ページから開始) で説明されています。仕様全体をここに掲載するには長すぎますが、基本的に、ペイロードのすべてのバイトにはシーケンス番号があります。ペイロード バイトに加えて、独自のシーケンス番号を取得する 2 つの制御フラグ (SYN と FIN) があります。最初のシーケンス番号はランダム化する必要がありますが、ただ遊んでいるだけなら問題ありません。パケット内の ack 番号は、次に受信すると予想されるシーケンス番号であり、パケット内の seq フィールドはセグメント内の最初のシーケンス番号です。

したがって、特定のパケットまでのすべてのパケットを確認するには、特定のパケットのシーケンス番号をその長さ (設定されている場合は FIN または SYN フラグを含む) に追加し、それを ack フィールドに入れます。

于 2014-01-30T19:52:03.610 に答える