当前位置: 首页 > 知识库问答 >
问题:

scapy在建立的连接上发送tcp数据包

祁霖
2023-03-14
#!/usr/bin/env python
from scapy.all import *
import time

# VARIABLES
src = sys.argv[1]
dst = sys.argv[2]
sport = random.randint(1024,65535)
dport = int(sys.argv[3])

# SYN
ip=IP(src=src,dst=dst)
SYN=TCP(sport=sport,dport=dport,flags='S',seq=1000)
SYNACK=sr1(ip/SYN)

# ACK
ACK=TCP(sport=sport, dport=dport, flags='A', seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ip/ACK)

time.sleep(15)

ip = IP(src=src, dst=dst)
tcp = ip / TCP(sport=sport, dport=dport, flags="PA", seq=123, ack=1) / "scapy packet 123"
tcp.show2()

send(tcp)
#!/usr/bin/python

import socket
from scapy.all import *

ip = sys.argv[1]
port = sys.argv[2]

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((ip, int(port)))
s.listen(1)

while True :
    conn, addr = s.accept()
    print 'Connection address:', addr
    data = conn.recv(1024) # Stuck here .....
tcpdump: listening on ens1f1, link-type EN10MB (Ethernet), capture size 65535 bytes
18:09:35.820865 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto TCP (6), length 40)
    11.4.3.31.63184 > 11.4.3.30.strexec-d: Flags [S], cksum 0x6543 (correct), seq 1000, win 8192,                                                                        length 0
18:09:35.821017 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 44)
    11.4.3.30.strexec-d > 11.4.3.31.63184: Flags [S.], cksum 0x748d (correct), seq 3017593595, ac                                                                       k 1001, win 29200, options [mss 1460], length 0
18:09:35.930593 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto TCP (6), length 40)
    11.4.3.31.63184 > 11.4.3.30.strexec-d: Flags [.], cksum 0xde5a (correct), seq 1, ack 1, win 8                                                                       192, length 0
18:09:51.057904 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto TCP (6), length 56)
    11.4.3.31.63184 > 11.4.3.30.strexec-d: Flags [P.], cksum 0x8eef (correct), seq 4294966419:429                                                                       4966435, ack 1277373702, win 8192, length 16
18:09:51.057996 IP (tos 0x0, ttl 64, id 1194, offset 0, flags [DF], proto TCP (6), length 40)
    11.4.3.30.strexec-d > 11.4.3.31.63184: Flags [.], cksum 0x8c4a (correct), seq 1, ack 1, win 2                                                                       9200, length 0

我的问题是为什么接收端没有得到发送的数据包?

注意:我的目标是在建立的连接上发送带有错误校验和的TCP数据包,并由不scapy的TCP服务器接收,提前谢谢!!

共有1个答案

曹高阳
2023-03-14

您的序号必须准确地跟踪您发送的有效负载字节。设置了SYN或FIN标志的数据包是一个异常,将被视为具有长度为1的有效负载。换句话说,您可以使用任何您喜欢的初始序列号,但它必须随发送的有效负载逐字节增加(+1表示SYN或SYN+ACK[或FIN])。

因此,如果您在SYN数据包中以1000的序列号开始,那么下一个具有有效负载的数据包(称为此pktA)应该具有1001的序列号。那么您的下一个数据包(pktB)应该具有序列号1001+pkta.payload_size,以此类推。

同样,您不能简单地将TCP报头中的确认号字段设置为1(就像您对“scapy数据包123”所做的那样)。无论何时在报头中提供ACK标志,您都需要通过将报头中的确认号设置为从另一方的最后一个有效载荷中最后接收到的序列号来确认另一方的有效载荷。在本例中,您已经发送了一个带有确认号的裸ACK数据包,因此您不需要严格地包含ACK标志,但通常总是包含ACK标志,如果要包含标志,则应正确设置确认序列号。

 类似资料:
  • 我正在编写一个简单的TCP客户端和服务器Perl脚本。到现在为止,我使用wireshark验证了三路TCP握手,并且建立了连接。但当我尝试发送或恢复数据时,什么也不会发生。 1)客户端和服务器之间的主要区别只是服务器增加了一个LISTEN参数,使它能够侦听传入的连接? 2)在recv和显示数据之间是否缺少任何步骤? 3)当程序第一次执行while循环时,难道不应该至少发送硬编码字符串“$respo

  • 问题内容: 为了了解TCP的工作原理,我尝试建立自己的TCP SYN / SYN-ACK / ACK(基于该教程:http://www.thice.nl/creating-ack-get-packets-with- scapy/ )。 问题是,每当我的计算机从服务器收到SYN-ACK时,它都会生成一个RST数据包,该数据包将停止连接过程。 我在OS X Lion和Ubuntu 10.10 Mave

  • 在Mac OS X 10.8机器上,我有一台Tomcat 7.0.40服务器和一台客户端,都在本地运行。通过三方握手建立TCP连接,然后立即从服务器发送FIN、ACK和RST。客户端收到“来自服务器的文件结束”或“连接重置”。 TCP序列: 客户端SYN 服务器SYN,确认 客户端确认 服务器[TCP窗口更新]确认字符 服务器FIN,确认字符 客户端确认字符 服务器[TCP Dup确认字符]确认字

  • 我正在实现一个TCP堆栈,并且遇到了半关闭连接的问题。 我的实现充当服务器端。客户端建立连接,然后发送一些数据,然后发送“FIN”消息。然后,服务器确认来自客户端的数据,发送自己的一些数据,然后才关闭其一半的连接(发送“FIN”)。 问题是,客户端没有确认服务器在半封闭连接上发送的数据,也没有确认其最终的“FIN”消息。根据netstat,客户端处于FIN_WAIT2状态。在服务器不发送任何数据的

  • 问题内容: 我通过添加laravel安装了redis , 然后为了测试,我添加了以下代码: 在app / config / database.php中,我有: 它引发以下错误: 我用于该项目。使用。 问题答案: 首先,通过打开powershell并键入(确保可能需要在功能中启用此命令或以某种方式安装此命令),以确保Redis实际上在该端口上进行侦听。如果正在侦听,请检查防火墙设置。如果不监听,请确

  • 虽然之前我们已经提到过不建议直接使用 LogStash::Inputs::TCP 和 LogStash::Outputs::TCP 做转发工作,不过在实际交流中,发现确实有不少朋友觉得这种简单配置足够使用,因而不愿意多加一层消息队列的。所以,还是把 Logstash 如何直接发送 TCP 数据也稍微提点一下。 配置示例 output { tcp { host => "19