Python与Scapy:纯文本SMTP会话

1 投票
1 回答
3489 浏览
提问于 2025-04-16 14:15

可以用 Scapy 来进行最简单的 SMTP 会话吗?我尝试用 tcpdump 捕获的数据来用 Scapy 发送数据包,但没有成功……

这是我目前的代码

#!/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 的值应该是什么呢?我该怎么计算它们?

1 个回答

0

TCP的序列号和确认号在rfc 793中有详细说明(从第24页开始)。这份文档内容很长,不能全部贴在这里,但简单来说,每一个传输的数据字节都有一个序列号。除了这些数据字节,还有两个控制标志(SYN和FIN),它们也有自己的序列号。初始的序列号应该是随机的,不过如果你只是随便玩玩,这个其实没什么太大关系。你包里的确认号是你期待下一个收到的序列号,而包里的序列号字段是这个数据段的第一个序列号。

所以,如果你想确认所有到某个包为止的数据包,就把那个包的序列号加上它的长度(包括FIN或SYN标志,如果有的话),然后把这个结果放到你的确认字段里。

撰写回答