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

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条回答 默认 最新

  • 冰山76 2022-06-08 09:45
    关注

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

    也就是说隧道就是虚拟网卡的通信通道,只要把数据发给虚拟网卡,然后另一方把虚拟网卡数据取出(省略中间其他过程),
    还是你先通过普通网卡转发到虚拟网卡,再到对方虚拟网卡,再转回给你另一端网卡再取出?
    如果是第一种,建立连接是直接与虚拟网卡通信,虚拟网卡的地址是你应该通信的地址,真实网卡是否ping通与虚拟网卡是否ping通之间无关 ,也就是网络连接初始化函数有没有填写正确

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 修改了问题 6月7日
  • 修改了问题 6月7日
  • 展开全部

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条