m0_54724257
2022-06-07 20:36
采纳率: 50%
浏览 69
已结题

scapy的send函数转发一个dst为自己虚拟网卡的icmp reply包无法接收

问题遇到的现象和发生背景

目标 :

scapy构造一个imcp的reply的包,目的地址是自己的虚拟网卡,源地址是其他虚拟机的地址,我有什么办法可以让他接到

拓扑图:

client虚拟网卡tun:192.168.53.99,默认从着发出
下一行不重要,跟上面同理。
server虚拟网卡tun0:192.168.53.98,到client的默认路由

img

程序原理

client和server中间通过一个ssl管道最为隧道,client会通过自己通过createtun函数创建的虚拟网卡发出,信息会用ipfoward函数将数据包封装进入sslsocket的data内,server出来的时候会用received函数把它从data内拿出来并转发到目标。从server回来也是同理,server通过ipfoward封装,client会用received将信息拿出并转发到自己虚拟网卡tun

问题

上面粗体的地方出了问题,比如说client发出一个dst为host的icmp包,在上面粗体的地方,received函数把icmp的reply包拆解出来后转发。虽然说这个reply的icmp包的dst为自己的虚拟网卡,在自己send出去后,自己接收不到icmp的reply包,ping命令就无法完成。通过wireshark发现reply包出现在10.9.0.0/24网段内

问题相关代码,请勿粘贴截图

sock是我连接好的sslsocket

from socket import IP_DEFAULT_MULTICAST_LOOP
from scapy.all import *
import fcntl
import struct
import os
import time
import aes
import base64
#加密装入隧道
def ipforward(sock, tun):
    while True:
        packet = os.read(tun, 2048)#读取发送时的缓存
        if packet:
            ip = IP(packet)#scapy封装
            print(ip.summary())
            packet = aes.encrypt(packet)#icmp内容加密
            sock.sendall(packet)#sslsocket发送

#隧道接收解密并转发
def received(sock):
    while True:
        data=sock.recv(2048)#sslsocket接收信息
        pkt = IP(aes.decrypt(data)) #解密出icmp数据包
        print(" Inside:{} -->{}".format(pkt.src,pkt.dst))
        print(pkt.summary())
        send(pkt)#scapy转发
 #创建虚拟网卡
def create_tun(myip, dst):
    TUNSETIFF = 0x400454ca
    IFF_TUN = 0x0001
    IFF_TAP = 0x0002
    IFF_NO_PI = 0x1000

    # Create the tun interface
    tun = os.open("/dev/net/tun", os.O_RDWR)
    ifr = struct.pack('16sH', b'tun%d', IFF_TUN | IFF_NO_PI)
    ifname_bytes = fcntl.ioctl(tun, TUNSETIFF, ifr)

    # Get the interface name
    ifname = ifname_bytes.decode('UTF-8')[:16].strip("\x00")
    print("Interface Name: {}".format(ifname))
    os.system("ip addr add {}/24 dev {}".format(myip, ifname))
    os.system("ip link set dev {} up".format(ifname))
    os.system("ip route add {}/24 dev {} via {}".format(dst, ifname, myip))
    return tun

运行结果及报错内容

client ping host

img

10.9.0网段抓包。五个一组,前四个是正常的TLS的包,data部分数据为icmp包,第五个就是不应该出现的东西了,本来received函数scapy用转发的时候应该直接发送到自己的虚拟网卡,可是结果ping失败并且出现在网段中

img

192.168.60网段抓包

img

client程序结果,一切正常

img

我觉得的原因

有没有可能是sslsocket的问题?

我想要达到的结果

ping成功,这个成功去我其他都能正常

一些不重要的个人尝试

我自己构造了一个dst为自己的icmp包后,一切正常,可以在网段接收到自己的reply包

2条回答 默认 最新

相关推荐 更多相似问题