如何嗅探和注入原始套接字?

2024-09-29 23:32:23 发布

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

我在这里问是因为我已经搜索了很多,直到现在我还没有找到一个关于如何完成这项任务的线索。手头的任务是构建一个能够:

  • 嗅探tcp包
  • 解码de payload,在我的例子中是用JWT加密的-JWT turn是base64中的json
  • 用解密后的数据重新打包
  • 如果可能,在同一接口上重新插入数据包,但可以是 虚拟接口
  • 它必须在飞行中发生。在

所有到达服务器的流量都进入了一个没有任何IP关联的接口,因此嗅探必须在第二层进行,并在第二层重新注入,但情况可能会在第二层被捕获,然后直接注入第三层,但在这种情况下,我不确定该怎么做。我的意思是第二层必须绑定到一个接口,而不是主机名和端口。在

我的脚本基于这个http://www.offensivepython.com/2014/08/tcp-packet-injection-with-python.html进行注入,并且在实验室(Kali,Centos 6.8)中可以很好地将tuple主机,port传递给套接字.绑定()关于嗅探,我写了以下内容:

#!/usr/bin/python


import socket
import ctypes
import fcntl
from struct import *
from time import sleep
class ifreq(ctypes.Structure):
    _fields_ = [("ifr_ifrn", ctypes.c_char * 16),("ifr_flags", ctypes.c_short)]


IFACE="eth0"
ETH_P_IP=0x0800
IFF_PROMISC = 0x100
SIOCGIFFLAGS = 0x8913
SIOCSIFFLAGS = 0x8914

skt = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_IP))

ifr = ifreq()
ifr.ifr_ifrn = IFACE
fcntl.ioctl(skt.fileno(), SIOCGIFFLAGS, ifr)
ifr.ifr_flags |= IFF_PROMISC
fcntl.ioctl(skt.fileno(), SIOCSIFFLAGS, ifr)


print "[+] Sniffing packets"
while True:
    pct = skt.recvfrom(65535)
    pct = pct[0]
    ipheader = pct[:20]
    iph = unpack('!BBHHHBBH4s4s', ipheader)
    version_ih1 = iph[0]
    version = version_ih1 >> 4
    ih1 = version_ih1 & 0xF
    iph_length = ih1 * 4
    ttl = iph[5]
    protocol = iph[6]
    src_addr = socket.inet_ntoa(iph[8])
    dst_addr = socket.inet_ntoa(iph[9])

    print 'Version: %s \nIP Header Length: %s\nTTL: %s\nProtocol: %s\nSource Addr: %s\nDest Addr: %s'%(version, iph_length, ttl, protocol, src_addr, dst_addr)

    tcp_header = pct[iph_length:iph_length+20]
    tcph = unpack('!HHLLBBHHH', tcp_header)
    src_port = tcph[0]
    dst_port = tcph[1]
    sequence = tcph[2]
    ack = tcph[3]
    doff_reserved = tcph[4]
    tcph_length = doff_reserved >> 4
    if src_port == 0 | dst_port == 0:
        continue

    print 'SRC Port: %s \nDST_Port: %s\nSEQ: %s\nACK: %s\nDoff Reserved: %s\nTCP Header Length: %s'%(src_port, dst_port, sequence, ack, doff_reserved, tcph_length)

    h_size = iph_length + tcph_length * 4
    data_size = len(pct) - h_size
    data = pct[h_size:]
    print 'Data: %s\n' %data
    sleep(2)

我已经测试了这个solution,并且在我的实验室(Kali,CentOS 6.8)中可以很好地进行注入,我可以运行tcpdump并查看到达指定接口的包,但是在生产中(rhel6.8)现在确实在tcpdump中显示了任何内容。在

我在socket linux文档、python socket文档(如Core python、Foundation of Network Programming、linux Programming Interface)中一直在搜索这一点,并且有关于如何正确使用AF峎u包的从无到有的信息。 我的问题是:

  • 是否有可能在第二层解码流量
  • 如果是,按照上述脚本的推理 我做错什么了?在
  • 不同的套接字实现之间有什么不同吗 不同的Linux发行版(RHEL、Centos、Debian)
  • 如何使用参数正确使用套接字接口 (socket.AF_包, SOCK峎生,[可选])
  • 上面这一项中的可选参数是协议,在我见过的一些例子中插座.htons(以太,以太,插座.ntohs(以太,而常数有时就是全部,有什么区别?在
  • 有人能给我举个例子吗?在

这个问题是因为我使用的是一个威胁检测工具,它处理所有数据并生成警报、事件和报告,但是使用JWT编码的数据不可能看到请求中实际发生的情况,因此无法看到实际数据并正确使用该工具。在

提前谢谢。在


Tags: 数据importsrcportversionsocketctypeslength

热门问题