Python и Scapy: простой текстовый SMTP-сеанс - PullRequest
1 голос
/ 23 марта 2011

Можно ли выполнить простейший сеанс SMTP, используя Scapy ?Я пытался читать захваченные с помощью 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)

Рукопожатие прошло успешно, но что ACK и SEQ значения должны быть во время сеанса?Как я могу их рассчитать?

1 Ответ

0 голосов
/ 30 января 2014

TCP seq и номера подтверждения описаны в rfc 793 (начало на стр. 24). Вся спецификация слишком длинна для размещения здесь, но в основном каждый байт полезной нагрузки имеет порядковый номер. Помимо байтов полезной нагрузки, есть два управляющих флага (SYN и FIN), которые получают свои собственные порядковые номера. Начальные порядковые номера должны быть случайными, но на самом деле не имеет значения, играете ли вы просто. Номер подтверждения в вашем пакете - это следующий порядковый номер, который вы ожидаете получить, а поле seq в пакете - это первый порядковый номер в сегменте.

Таким образом, чтобы подтвердить все пакеты до заданного, добавьте порядковый номер из данного пакета к его длине (включая флаги FIN или SYN, если установлены) и поместите его в поле подтверждения.

...