【问题标题】:Rewriting Live TCP/IP (Layer 4) (i.e. Socket Layer) Streams重写实时 TCP/IP(第 4 层)(即套接字层)流
【发布时间】:2011-02-03 13:44:56
【问题描述】:

我有一个简单的问题,我相信这里有人曾经做过......

我想重写第 4 层 TCP/IP 流(不是较低层的单个数据包或帧。)Ettercap 的etterfilter 命令允许您基于固定字符串或正则表达式执行第 4 层 TCP/IP 流的简单实时替换。示例 Ettercap 脚本代码:

 if (ip.proto == TCP && tcp.dst == 80) {
    if (search(DATA.data, "gzip")) {
       replace("gzip", "    ");
       msg("whited out gzip\n");
    }
 }

 if (ip.proto == TCP && tcp.dst == 80) {
    if (search(DATA.data, "deflate")) {
       replace("deflate", "       "); 
       msg("whited out deflate\n");
    }
 } 

http://ettercap.sourceforge.net/forum/viewtopic.php?t=2833

我想根据我自己的过滤程序重写流,而不仅仅是简单的字符串替换。任何人都知道如何做到这一点?除了 Ettercap 之外,还有什么东西可以像这样进行实时替换,比如作为 VPN 软件的插件之类的?

我希望在两个以太网接口之间有一个类似于 ettercap 的 silent bridged sniffing 配置的配置。通过这种方式,我可以静默过滤来自任一方向的流量,而不会出现 NAT 问题。请注意,我的过滤器是一个充当管道过滤器的应用程序,类似于 unix 命令行过滤器的设计:

 >[eth0] <----------> [my filter] <----------> [eth1]<

我的过滤器将是一个用户空间 Python 函数。

我已经知道但不适合的:

  • Tun/Tap - 在较低的数据包层工作,我需要使用较高层的流。

  • Ettercap - 除了上面示例中的受限功能之外,我找不到任何替代方法。

  • 挂钩到某些 VPN 软件? - 我只是不知道是哪一个或确切的方式。

  • libnetfilter_queue - 适用于较低层的数据包,而不是 TCP/IP 流。

同样,重写应该发生在传输层(第 4 层),就像在本示例中所做的那样,而不是基于较低层数据包的方法。准确的代码将大有帮助!

谢谢!

【问题讨论】:

  • 关于您的代码的问题 - replace("gzip", " "); 行是否引用 DATA.data 对象?从代码中并没有明显看出它提到了在哪里搜索字符串。
  • 这个例子是用 ettercap 的自定义“etterfilter”脚本语言编写的。是的,replace 函数似乎在操纵Data.data 变量。

标签: python c security network-programming sockets


【解决方案1】:

查看Scapy 或其他数据包制作工具。这种类型的市场并不多。

【讨论】:

    【解决方案2】:

    Ettercap 似乎是一个开源项目,因为它托管在 SourceForge 上。也许你应该看看它是如何做到的。

    【讨论】:

      【解决方案3】:

      当时我正在编写一个网络流量分析工具,使用 libpcap 进行捕获,使用 libnids 进行流组装。

      我还没有尝试重新注入流量,但是您可以使用 TAP 将流量转发到用户程序,该程序将使用 libnids 组装数据包,将流输出到过滤器代码,然后获取流并分解它们(I'我很确定 libnids 也有这种能力)并将它们重新注入到你需要它去的地方。

      如果你想要 python,pynids 似乎可以满足你的需要,但我没有这方面的经验。

      【讨论】:

      • 是的,这是我目前得出的确切结论:TAP + libnids。
      【解决方案4】:

      看起来你可以编写一个 ettercap 插件来加载用 python 编写的过滤器。或者改为用 C 编写自定义过滤器。

      【讨论】:

        【解决方案5】:

        为什么不直接使用任何您想要的过滤器访问 DATA.data?

        我认为您不必使用 search() 您只需构建自己的分析器/状态机。

        例如

        for (int i = 0; i

        最后的想法; (1) 我不知道 DATA.len 存在,但似乎有一些东西。 (2) 我知道我复制了您的搜索/替换,但想展示您如何能够做到这一点。 '手动'。以后你可以得到花哨的东西。 (3) 如果您要调整数据包的长度(甚至是内容),您可能需要考虑改变窗口大小/CRC 检查等。 例如DATA.data[i] = "cc" 将覆盖两个字符(可能不是您想要的)或更改数据包的一侧。 我假设有一些库调用可以再次设置正确。

        【讨论】:

        • 不幸的是,etterfilter 不使用 C 或任何标准语言,而是一种非常有限的自定义脚本语言。它几乎不比配置文件更灵活。
        【解决方案6】:

        PyPCAP 值得一试,因为这一切都取决于下面的 libpcap。砍掉中间人!

        【讨论】:

        • pcap 不适用于例如tcp层。当您考虑到重新传输和请求拆分为多个 tcp 段/IP 数据包时,从 pcap 提取像 http get 请求这样看似简单的东西是相当复杂的
        【解决方案7】:

        由于 Ettercap 是开源的,您可以更改其源代码来做您想做的事情。运行您自己的 C 代码来重写 TCP 流应该相对容易。艰苦的工作已经完成了。

        查看etterfilter 手册页以开始使用。在源代码中搜索过滤器引擎(显然它是一个 JIT 解释器)。

        我也会尝试将此问题邮寄给 etterfilter 作者,也许他们喜欢 stackoverflow :-)

        注意:要使用 Python 而不是 C,请参阅http://docs.python.org/release/2.5.2/ext/embedding.html

        【讨论】:

        • 我不知道为什么我的答案是社区 wiki。我可以改回来吗?
        • 恐怕不行,你是不是修改了好几遍?大量编辑后,帖子会自动转到 CW。
        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-15
        相关资源
        最近更新 更多