Python和Scapy:纯文本SMTP会话

时间:2011-03-23 11:13:54

标签: python smtp scapy

是否可以使用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 :(得分:0)

TCP seq和ack编号在rfc 793中描述(从第24页开始)。整个规范太长了,不能在这里发布,但基本上,有效载荷的每个字节都有一个序列号。除了有效负载字节外,还有两个控制标志(SYN和FIN)可以获得自己的序列号。初始序列号应该是随机的,但如果你只是玩游戏,那就不重要了。数据包中的确认号码是您希望接收的下一个序列号,数据包中的seq字段是该段中的第一个序列号。

因此,要确定所有数据包到达给定数据包,请将给定数据包中的序列号添加到其长度(包括FIN或SYN标志,如果已设置)并将其放入您的ack字段中。