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

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 关于#vscode#的问题:ESP32开发板对接MQTT实现小灯泡的开关
  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏