V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rev1si0n
V2EX  ›  程序员

请教大家一个方案,关于 TCP 流量识别以及匹配。

  •  
  •   rev1si0n · 2024-03-06 15:48:23 +08:00 · 3588 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    (以下是情况假设)有一台电脑,我设置了 wireshark 只抓浏览器的包,随后我通过浏览器访问 baidu.com ,抓到了访问百度首页的所有数据包。随后,设置 wireshark 抓取电脑全局流量,并随机使用电脑上安装的软件,其中我可能会访问 baidu.com 。最终,我想通过这个浏览器访问百度的流量包(全局流量的子集),解析出所有 TCP 包的时间大小相对时间协议等,在全局流量中通过滑动窗口去匹配哪个时间段访问了百度首页。这可能很麻烦,因为某些包可能并不一定会发出,其次,因为中间可能掺杂着其他流量,所以对于访问百度首页的数据包还要进行适当的 X 轴拉伸匹配。在此请教大家一下有没有什么好的实现方法或者类似的方案。

    53 条回复    2024-03-20 08:39:09 +08:00
    rrfeng
        1
    rrfeng  
       2024-03-06 15:52:58 +08:00
    首先说明你为什么要抓包
    lambdaq
        2
    lambdaq  
       2024-03-06 15:55:32 +08:00
    wireshark 怎么实现只抓浏览器的包的。。。?
    rev1si0n
        3
    rev1si0n  
    OP
       2024-03-06 16:01:57 +08:00
    @rrfeng
    @lambdaq 为什么抓包,抓包就是为了说明上面的问题。怎么实现只抓浏览器的包,你是觉得不行吗,至少我,能想出来至少三种办法,我觉得,设置浏览器代理最适合你。
    F7TsdQL45E0jmoiG
        4
    F7TsdQL45E0jmoiG  
       2024-03-06 16:03:02 +08:00
    自己弄个代理,浏览器配代理,然后抓代理的包
    liuhan907
        5
    liuhan907  
       2024-03-06 16:12:45 +08:00
    你首先应该想一下怎么解 https 的流量
    tool2d
        6
    tool2d  
       2024-03-06 16:16:15 +08:00   ❤️ 1
    我会选择用 windows 系统的防火墙来过滤,有一个 API 参数是 FWPM_CONDITION_ALE_APP_ID ,可以匹配浏览器的运行 PID 。

    可能还需要装一个开源 VPN 虚拟网卡,作为抓包和转发的中转节点。

    想想还是 linux 简单,iptables 需要匹配进程,一句--uid-owner 就搞定了。
    lambdaq
        7
    lambdaq  
       2024-03-06 16:16:59 +08:00
    @rev1si0n 我还以为 wireshark 原生支持了。。。。。
    lxyv
        8
    lxyv  
       2024-03-06 16:27:05 +08:00
    可以考虑用微软的 network monitor 抓包,根据应用进程 pid 筛选
    rev1si0n
        9
    rev1si0n  
    OP
       2024-03-06 16:43:58 +08:00
    @liuhan907 不考虑解,因为是无解的,也并不要求解析出访问内容只需要知道这个行为,所以打算从 tcp 层面进行分析。
    rekulas
        10
    rekulas  
       2024-03-06 17:13:36 +08:00
    不如说说你真正想实现的是什么功能
    rev1si0n
        11
    rev1si0n  
    OP
       2024-03-06 17:24:50 +08:00
    @rekulas 标题已经很明白了,TCP 流量匹配,根据一段特征流量从当日流量匹配出特征流量出现的时间点。
    tool2d
        12
    tool2d  
       2024-03-06 17:31:18 +08:00
    @rev1si0n "解析出所有 TCP 包的时间大小相对时间协议等,在全局流量中通过滑动窗口去匹配哪个时间段访问了百度首页。"

    TCP 滑动窗口值是动态变换的,网速好就大一点,网速卡就小一点,这个和用户是否访问百度又没必然联系。

    用时间协议去匹配网站特征? 那你还不如用 TLS 浏览器指纹匹配,更靠谱一点。
    thevita
        13
    thevita  
       2024-03-06 17:39:38 +08:00
    你需要个 DPI, 比如 suricata, 给你解析到协议(会重组 tcp ,不用你自己“根据一段特征流量从当日流量匹配出特征流量出现的时间点”, 把各种你可能需要的内容提取出来,也能自己加些检测规则)

    产生的数据流,要可用,可后面接写时序分析什么的,自由发挥
    kkocdko
        14
    kkocdko  
       2024-03-06 17:43:14 +08:00
    这种问题你应该去问代理协议的开发者相关的社区,在这里你只能获得上边几楼的那种质量的回答。

    如果只是想拿来用,可以 OpenGFW ,由 hysteria 团队开发的 GFW 实现。

    一般来说是 tls sni ,tls 指纹,dns 查询的 re-mapping 等。如果是你个人做着玩,我建议你选择类似 fakeip 的思路,然后劫持 dns ,弄一个比较大的地址池,这样的话比较不容易跟丢。
    kkocdko
        15
    kkocdko  
       2024-03-06 17:45:22 +08:00
    13 楼的回答也不错,dpi 的话考虑到楼主刚入门不一定能玩得来。
    czfy
        16
    czfy  
       2024-03-06 17:58:17 +08:00
    这题目让我想到这个帖子
    🧱的测试 IP 和最近的新研究 https://v2ex.com/t/1021128
    rev1si0n
        17
    rev1si0n  
    OP
       2024-03-06 18:03:47 +08:00
    @tool2d 确实网速是个因素,以及由于其他不需要的掺杂流量的影响,所以需要再对这个子集的流量进行时间上的伸缩(举个例子就像橡皮筋,橡皮筋上有 N 个不同间隔和大小的点,我可以拉伸或者缩短,就是每个包发送的时间变大或者变小再拿过去和当日流量匹配,如果包大小,间隔,协议等都能模糊匹配上,那就认定匹配成功了。当然这样做也不太现实),指纹的话,服务器 tls 指纹倒是可以引用一下,但是精细度就没法和直接流量级的比了(虽然能不能实现还是个问题)。
    @thevita 多谢多谢,我看看,除了 GFW 里听说过还没了解过这个。

    @kkocdko 今天至少没白问,这里开始涉及到盲区了,个人研究下是不是有可能,劫持只能对自己做,但是是想这个是可以做到通用的,指纹确实可以做到一些,但是精细度不够,或许也可以试一下指纹配合 TCP 特征。
    liuhan907
        18
    liuhan907  
       2024-03-06 18:20:22 +08:00   ❤️ 1
    @rev1si0n 你不解出来 https 流量怎么匹配 baidu 访问?
    fano
        19
    fano  
       2024-03-06 18:40:48 +08:00
    你研究的问题是 Encrypted Traffic Fingerprinting / Website Fingerpinting ,可以 Google Scholar 一下研究现状
    fano
        20
    fano  
       2024-03-06 18:42:37 +08:00
    @rev1si0n "像橡皮筋,橡皮筋上有 N 个不同间隔和大小的点,我可以拉伸或者缩短" Google 一下 Dynamic time warping 算法
    DefoliationM
        21
    DefoliationM  
       2024-03-06 18:44:09 +08:00 via Android
    tls 加密的东西你怎么匹配,aead 加密后的数据都是随机字节流,没有特征,sni 倒是能匹配,不过现在也有 esni 了。
    Jirajine
        22
    Jirajine  
       2024-03-06 18:52:53 +08:00
    能说说你的目的是什么吗?看主贴感觉像 GFW 的工作人员。

    @liuhan907 #18 加密仅仅只是加密,一些其他信息,比如时序特征是单纯加密无法掩盖的。比如你用过 n 层加密代理发布消息,攻击者就可能通过你消息发布的时间、字数来定位到发送消息的人,一些专注安全的 IM 会自动加 padding ;再比如主流浏览器的建立 tls 连接时发送的握手包非常固定,当这个包被另一个 tls 隧道传输时,可以很容易识别出特征来,也就是 tls in tls 识别。
    rrfeng
        23
    rrfeng  
       2024-03-06 18:53:36 +08:00
    我很好奇楼上各位是怎么读懂 op 想干什么的……明显 op 问了个 X-Y problem
    sampeng
        24
    sampeng  
       2024-03-06 18:55:16 +08:00
    我也没太搞懂。唯一我只知道像 GFW 一样的做流量识别,但我不觉得从来没研究这一块只是知道 tcp 的人能搞的出来的。那 GFW 就是个笑话了。。在不讨论 GFW 一样牛逼的流量识别算法下,按朴素的技术理解,普通大众看到的 tls 数据完全是无序随机的。
    liuhan907
        25
    liuhan907  
       2024-03-06 18:56:46 +08:00
    @Jirajine 实别当然是能识别的出来,但是也只能检测出流量特征而不能检查内容特征。不然 GFW 早八百年就完美无缺了
    sampeng
        26
    sampeng  
       2024-03-06 18:58:26 +08:00
    @rrfeng 标题啊。。。TCP 的特征识别。。。
    fano
        27
    fano  
       2024-03-06 19:06:27 +08:00
    @rrfeng 谢谢,学习到了新名词 X-Y problem
    rrfeng
        28
    rrfeng  
       2024-03-06 19:10:39 +08:00
    @sampeng 姑且理解为「从流量中识别某个网站」

    http 不说了,https 也根本不用学习特征的…… sni 会暴露一切。虽然只能识别到「域名」维度,但「页面」维度无论如何也无能为力了。

    所以要怎么做取决于要做什么,只做阻断的话干嘛不搞 dns 。
    rekulas
        29
    rekulas  
       2024-03-06 19:12:48 +08:00
    @rrfeng 94 所以我上面问他到底想做啥

    光看描述,感觉就像为 gfw 或网络审查服务的工作 , 这种不适合在论坛讨论 毕竟可能用于不太好的用途
    Jirajine
        30
    Jirajine  
       2024-03-06 19:13:14 +08:00
    @liuhan907 #25 其实是能的,把过滤放到可信终端进行,不可信终端不可联网就行了,可以在密码学意义上保证其无法绕过。
    只是没有必要,显然现在的 GFW 工作的很符合它的预期。
    liuhan907
        31
    liuhan907  
       2024-03-06 19:54:18 +08:00
    @Jirajine 那就是白名单,或者干脆在终端装 app 了。那还何谈密码学,那是社工。
    hefish
        32
    hefish  
       2024-03-06 20:22:48 +08:00
    OP 考虑的非常全面。感谢 OP 的研究。
    Jirajine
        33
    Jirajine  
       2024-03-06 21:14:50 +08:00
    @liuhan907 #31 可信终端指的是基于 trusted computing/attestation ,一个没有权限经过签名的系统除非你 exploit 了不然就是密码学意义上的无法绕过。
    deorth
        34
    deorth  
       2024-03-06 21:26:14 +08:00 via Android
    得加钱
    liuhan907
        35
    liuhan907  
       2024-03-06 21:29:08 +08:00
    @Jirajine 那终究还是要在终端机器上做手脚,无非就是现在 Android bootloader 加现在 Google 商店那套验证。但那就已经是完全和现在的网络环境隔离开了,没有什么可行性。
    neoblackcap
        36
    neoblackcap  
       2024-03-06 23:03:32 +08:00
    @rekulas 也不一定是 GFW ,很多企业防火墙都要提供审计功能。相当于识别你系统的流量,检测打工人是否在一直工作,有没有摸鱼呗
    iceheart
        37
    iceheart  
       2024-03-07 07:24:28 +08:00 via Android
    这就是墙的需求吧。
    如果只抓浏览器请求,ssl 用 sni ,http 抓头就够了
    cczh678
        38
    cczh678  
       2024-03-07 08:29:53 +08:00
    想要做应用识别、用户行为识别?
    rev1si0n
        39
    rev1si0n  
    OP
       2024-03-07 09:56:07 +08:00
    @rrfeng
    @Jirajine
    @sampeng
    @rekulas
    @cczh678 没错,用途就是 38 楼所说,用户行为识别,但并不是面对打工人以及隐私用途,题只是举例去描述,做过的人看到也能大差不差理解出来做的是什么。
    @neoblackcap
    rev1si0n
        40
    rev1si0n  
    OP
       2024-03-07 09:57:18 +08:00
    @fano 谢谢哥,我这就去看看。
    rev1si0n
        41
    rev1si0n  
    OP
       2024-03-07 10:01:10 +08:00
    @liuhan907
    @DefoliationM
    @sampeng 话是这么说,TCP 内容层面看到的内容确实是无序随机的,但是,每个请求或者每个包,发出的接收到的流量,以及每个包之间的相对间隔通信端口地址等,大量数据去学习的话,应该是有一定规律的。
    shilyx
        42
    shilyx  
       2024-03-07 10:07:52 +08:00
    访问百度同域名其他页面和访问首页在流量上没什么区分

    域名不同还有点区分,https 里有明文域名信息

    但 tls 的握手不会总是发生,有缓存的。因此包里没有也不代表没有访问


    正解:
    本机做透明代理,代理层做 tls 卸载

    创建一个根证书,安装到系统受信任证书位置。根据 tls 握手包自动签发当前 dns 名称的证书,实现中间人攻击

    浏览器层面无察觉

    ![_202403070957531d44fb8523cb079f.jpeg]( https://youjb.com/images/2024/03/07/_202403070957531d44fb8523cb079f.jpeg)
    Jirajine
        43
    Jirajine  
       2024-03-07 10:17:09 +08:00
    @rev1si0n #41 能否识别取决于你要识别的到底是什么。如果只是站点域名,那有明文 sni 和 dns ,不用自己识别。以百度首页为例,百度首页的返回 body 大小应该是固定的,引用的其他资源应该也是固定大小的,根据这个特征可以大概判断访问的是百度首页还是其他页面。
    GenericT
        44
    GenericT  
       2024-03-07 10:23:22 +08:00
    @Jirajine “百度首页的返回 body 大小应该是固定的”
    你忘了 Content-Encoding 了,不同的 Accept 回来的东西不一样的,brotli 和 gzip 的长度显然不一样,不同的 CDN 节点的 compression level 也可能不一样
    rev1si0n
        45
    rev1si0n  
    OP
       2024-03-07 11:22:21 +08:00
    @Jirajine
    @GenericT 所以这也就需要大量样本去找特征
    rev1si0n
        46
    rev1si0n  
    OP
       2024-03-07 11:25:05 +08:00
    @Jirajine 并不是站点级别,是比站点更加详细的信息,比如,在看百度贴吧的帖子,那么看帖子出现的流量就是一个特征,不需要知道具体是访问了什么帖子,只需要知道在访问帖子。
    rev1si0n
        47
    rev1si0n  
    OP
       2024-03-07 11:28:32 +08:00
    @shilyx 证书和网络是不可控因素,在这个帖子里就是个纯旁听的角色,不能动,只能听收发的流量。
    Jirajine
        48
    Jirajine  
       2024-03-07 12:59:15 +08:00
    @rev1si0n #46 还是那句话,取决于你到底要识别什么,贴吧应该是有单独子域名的,其他页面也有可能会引用独特域名的资源。
    shilyx
        49
    shilyx  
       2024-03-07 13:45:57 +08:00
    特征只在于 tsl 握手环节,和 ip 地址

    其他部分都是加密流量,即便认定了什么特征也不可靠,缘木求鱼
    liuhan907
        50
    liuhan907  
       2024-03-07 15:14:21 +08:00
    @rev1si0n 虽说 TLS 不是为了对抗审查做出来的,但是也有随机化的部分。我觉得不是靠数据统计就能找到可用的规律的。
    NeedI09in
        51
    NeedI09in  
       2024-03-07 17:01:21 +08:00
    在你能 proxy 这些请求的前提下。
    1.中间人攻击,需要信任证书
    2.抓 connect 请求,connect 请求是明文,能知道 host ,缺陷:连接层面的 connect 量,不能知道实际发了多少个请求,只知道实际 connect 了多少次。
    cczh678
        52
    cczh678  
       2024-03-07 19:21:05 +08:00
    @rev1si0n 谢谢 OP 答复,我这边可以提供商业化的解决方案,符合合规要求,不会有个人隐私的侵犯。如果需要,我们再细致交流下
    ben666
        53
    ben666  
       357 天前
    TLS 连接握手部分是可以看到域名的明文的
    方法 1: 网关上连接跟踪每个报文
    方法 2:交换机上镜像一份报文,离线

    现在网络上的报文处理很多用 DPDK 技术,可以看一些知名的 DPDK 项目,学习一下怎么用:
    1. 测试仪 https://github.com/baidu/dperf
    2. 4 层负载均衡 https://github.com/iqiyi/dpvs
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3958 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:10 · PVG 13:10 · LAX 22:10 · JFK 01:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.