【问题标题】:why does system send RST flag when try - TCP 3 way handshake in python为什么系统在尝试时会发送 RST 标志-python 中的 TCP 3 方式握手
【发布时间】:2014-10-22 13:36:28
【问题描述】:

我想在我的 ubuntu 中创建一个 TCP-3 方式的握手。 我在虚拟机中使用了kali linux。在kali linux(IP-172.16.28.130)的终端中,我以“LISTEN”模式打开了一个端口以与该机器建立连接。

nc -l -p 1025

我在 ubuntu 主机上运行的 python 代码,

#!/usr/bin/python
from scapy.all import *
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

#if i send to broadcast address : 192.168.1.255 what will happen?
def sendPacket(src, dst):
   ip = IP(dst = dst)
   port = RandNum(1024, 65535)
   SYN = ip / TCP(sport=port, dport=1025, flags="S", seq = 42)
   SYNACK = sr1(SYN, verbose=0)

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

   print "Done!!\n"

src = '1.2.3.4'
dst = '172.16.28.130'
sendPacket(src, dst)

使用wireshark抓包,

3      172.16.28.1   172.16.28.130   TCP   54   64865 > blackjack [SYN] Seq=0 Win=8192 Len=0

4      172.16.28.130   172.16.28.1   TCP   60   blackjack > 64865 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460

7      172.16.28.1   172.16.28.130   TCP   54   64865 > blackjack [RST] Seq=1 Win=0 Len=0

8      172.16.28.1   172.16.28.130   TCP   54   64865 > http [ACK] Seq=1 Ack=1 Win=8192 Len=0

9      172.16.28.130   172.16.28.1   TCP   60   http > 64865 [RST] Seq=1 Win=0 Len=0

在运行代码之前,我更改了 IPtable,

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.20 -j DROP

当我将目标更改为 dst = "www.google.com" 并将目标端口更改为 dport=80 时,它工作正常。

但是现在, 1) 我可以发送 SYN 数据包 2) 目的地以SYN、ACK包响应 3) 我的系统发送 RST 4)我发送了ACK 5) 目标系统回复 RST 所以我无法建立连接!! 问题: 1) 我怎样才能成功建立连接 2) 我的源 ip = "1.2.3.4", * 但是当我发送到虚拟机时,它显示 172.16.28.1(Broadcast ip)。为什么?

【问题讨论】:

    标签: python ubuntu networking tcp scapy


    【解决方案1】:

    1) 我怎样才能成功建立连接

    这是一个猜测。将您的 iptables 命令更改为:

    iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 172.16.28.1 -j DROP
    

    当您连接到 google.com 时,您通过物理以太网设备进行连接,该设备的 IP 为 192.168.x.y,因此 -s 参数匹配。

    当你连接到 Kali 时,你是通过一个地址为 172.16.x.y 的虚拟以太网设备连接的,所以-s 不匹配。

    您需要从正确的输出队列中删除 RST 数据包。

    2) 我的源 ip = "1.2.3.4", * 但是当我发送到虚拟机时它显示 172.16.28.1(广播 ip)。为什么?

    首先,172.16.28.1 不是您的广播 IP。它是您主机的虚拟以太网设备的 IP。

    您的源 IP 没有出现的原因是您没有使用它:

    ip = IP(dst = dst)
    

    您指定了目标地址,但没有指定源地址。某些实体(scapy 或主机操作系统 IP 堆栈,我不确定)正在为您选择合理的源地址。你可以试试:

    ip = IP(dst = dst, src = src)
    

    看看那里会发生什么。

    【讨论】:

    • src 问题解决了。谢谢..但我还无法建立连接。我以各种方式更改了 iptables,例如“iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.7 -j DROP”,iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 172.16 .28.1 -j DROP,“iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 172.16.28.130 -j DROP”......但没有区别。我的系统发送 RST 。我需要更改 Kali 中的任何内容吗?
    猜你喜欢
    • 2010-09-20
    • 2019-04-04
    • 2015-06-21
    • 1970-01-01
    • 2014-04-27
    • 2011-10-11
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多