用python通过原始套接字发送scapy包

2024-05-29 03:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

有可能吗?如果是?怎样?

这是我的剧本(不起作用):

from scapy.all import *
import socket

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    p=IP(dst="192.168.1.254")/TCP(flags="S", sport=RandShort(), dport=80)
    s.connect(("192.168.1.254",80))
    s.send(p)
    print ("Request sent!")
except:
    print ("An error occurred.")

--更新--

p = bytes(IP(dst="DESTINATIONIP")/TCP(flags="S", sport=RandShort(), dport=80))
    while True:
        try:
            socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, sockip, sockport, True)
            s = socks.socksocket()
            s.connect((DESTINATIONIP,DESTINATIONPORT))
            s.send(p)
            print ("Request Sent!")
        except:
            print ("An error occurred.")

可以通过http代理而不是socks发送这个syn包吗?


Tags: importipsendrequestconnectsockettcpdst
1条回答
网友
1楼 · 发布于 2024-05-29 03:38:07

要使用原始套接字发送scapy数据包,必须先将数据包转换为原始字节。例如,使用scapy制作的数据包如下:

p = IP(dst="192.168.1.254")/TCP(flags="S", sport=RandShort(),dport=80)

应使用bytes(p)转换为原始字节。 这会给你类似的东西:

'E\x00\x00(\x00\x01\x00\x00@\x06\xf6w\xc0\xa8\x01\t\xc0\xa8\x01\xfe\x97%\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00t\x15\x00\x00'

然后可以使用原始套接字发送它。因此,对于您的示例,您可以修改一些代码,例如:

from scapy.all import *
import socket

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    p = IP(dst="192.168.1.254")/TCP(flags="S", sport=RandShort(),dport=80)/Raw("Hallo world!")
    s.connect(("192.168.1.254",80))
    s.send(bytes(p))
    print "[+] Request Sent!"
except Exception, e:
    raise e

这应该管用!

注意!!! 记住,当您使用套接字(模块)与另一台计算机通信时 套接字自动构造数据包(头等)并发送所需的内容 发送。但是当你用scapy构建一个包的时候,你从一开始就把它制作出来 您定义了它的内容及其头、层等,因此在您的示例中,当您发送数据包时 您将发送“all”作为内容负载,甚至包括数据包头(ip头、tcp头)。 您可以通过运行以下嗅探器进行测试:

#!/usr/bin/env python

from scapy.all import *

def printer(packet):
    if packet.haslayer(Raw):
        print packet.getlayer(Raw).load

print "[+] Sniff started"
while True:
    sniff(store=0, filter="host 192.168.1.254 and port 80", prn=printer, iface="your_interface_here")

好吧,当嗅探器运行时,试着运行我文章中的第一段代码(当我用原始层=tcp.payload更新数据包时),你会发现不仅如此 但整个数据包作为数据传输。所以你把邮件头发了两次。这就是为什么sockets有自己的send方法,而scapy有自己的方法。

相关问题 更多 >

    热门问题