2

我正在为包含网络服务器的闭源嵌入式设备开发一个模拟器。我正在使用 Python 在嵌入式 angstrom linux 2.6.34 中构建模拟器,到目前为止,我已经在功能上实现了网络服务器,以至于它在视觉上与浏览器中的原始设备相同。现在,我试图让它看起来与 Nmap 操作系统和服务扫描相同,但事实证明这要困难得多。

Nmap 扫描最初被证明非常不同(源设备没有完全匹配,我的模拟器死机为 Linux 2.6.32 - 2.6.39)。在关闭模拟器上的服务和关闭端口等明显的事情之后,我开始比较来自源设备的wireshark数据包,包括IP和TCP标头,以及嵌入式设备,以确定我需要进行哪些协议级别的更改。使用 Linux 中的 sysctl.config 文件,TCP 窗口缩放等一些参数很容易,但其他一些参数则更难。例如,当数据包在源设备上被分段时,PSH 标志设置在 TCP 标头中,而不是在我的设备上,这对于“最随意的观察者”来说也是一个明显的区别。这里的目标不是简单地混淆我的设备,

在我的探索中,我遇到了几个看起来很有希望的解决方案,但是当我知道那里有更简单的解决方案时 ,我害怕在应该可行的解决方案上浪费更多时间。

这是我尝试过的事情的列表,以及是什么促使我研究另一种方法。他们中的大多数人的问题是缺乏文档。如果有人知道一种特定的方法应该可以工作,并且可以向我指出体面的文档来帮助我进行配置,我将不胜感激。作为一个懒惰的工程师,我正在寻找最简单的解决方案。我不怕 C,但如果有程序或模块,我可以通过 python 启动或接口,我更喜欢那样。

  • IP 个性:仅适用于 2.4 内核,而且我的模拟器(作为嵌入式 ARM 架构)没有可用的移植内核,可以追溯到那么远。

  • Ethercap 过滤器:让这些在我的模拟器上工作(安装在模拟器上,而不是 mitm)用于传出数据包,但不适用于 TCP 和 IP 标头,据我所知,您只能更改数据包中的数据字段,这是不够的. 手册页给人的印象是它可以工作,但没有发现有人使用它来更改标题,这让我认为它无法完成。

  • Divert Sockets:尽管显然是为 2.6 内核设计的补丁,但仍无法使其正常工作。这与 IPtables 一起创建过滤器,您可以在其中修改传出数据包(标头和所有),然后再通过防火墙。我找不到足够的文档来整理这些部分。

  • TAP/TUN:根据我目前所了解到的,这个基于软件的网络接口应该可以工作,但我不相信这是最简单的方法。我看到的示例是针对 <2.6.36 内核的,因为“后来的内核行为不同”,其中包括我的模拟器版本。

  • libpcap:我相信 lippacp 只给你原始数据包,你不能修改数据包。我相信我可以复制数据包,杀死它们,修改副本,然后将它们发送回去,但同样,我认为还有一种更简单的方法。

  • 使用用户态 TCP/IP 堆栈:找不到很好的文档或示例来说明如何使用,例如 Linux 2.4.34 中的 lwIP 堆栈,并禁用本机内核堆栈。

  • 打开内核并使用本机 TCP/IP 堆栈进行处理:我知道这起作用,但我担心更改-编译-测试的开发周期会花费时间,更不用说在 .c 文件中解析指针混乱了. 我从来没有这样做过,我不知道在哪里编译整个内核或特定模块,或者如何使用 openembedded 为我的 ARM 设备编译。我知道还有其他方法可以做到这一点,所以当我还有很多工作要做时,我很担心花时间学习如何打开内核。

在所有这些中,我已经用尽了 ettercap 并将插座转移到最远的地方,因为我认为它们会是最简单的。有任何这些(或其他)任意调整标题的例子吗?谢谢您的帮助!

4

1 回答 1

1

在最近的内核中,您可以使用 NFQUEUE 修改数据包而无需任何内核补丁。用户空间部分甚至还有 python 绑定。您可以在此处查看:https ://www.wzdftpd.net/redmine/projects/nfqueue-bindings/wiki/Examples,其中包括一个重写数据包的 rewrite.py 示例。

对于 iptables 部分,您需要这样的规则:

iptables -A OUTPUT -p tcp -m tcp --sport 80 -j NFQUEUE --queue-num 0

其中最后的参数是队列号,它必须与代码中的那个匹配。

如果简单的数据包编辑还不够,您还可以尝试 lwIP。Linux 中 Tap 设备上的 lwIP 开箱即用。为此,请同时获取 lwIP 和 contrib 包。然后在 contrib/ports/unix/proj/unixsim 中有一个例子,它使用 lwIP 来实现一些东西,包括通过 tap 设备的 web 服务器。

从实际网络接口访问 lwIP 堆栈的最简单方法是为 tap 设备设置 NAT,并将端口从实际接口转发到 tap 接口。不过,这仍然会涉及内核,因此它可能会比您想要的更多。一些可能的选项可以将其与 NFQUEUE 结合或修改 lwIP 以使用原始套接字而不是分接接口(我认为它不是开箱即用的)。

有关 nmap 指纹如何工作的信息,您可以查看此处: http: //nmap.org/book/osdetect-methods.html。要从 nmap 获取原始指纹,请使用“-vv”选项。此外,您可能希望使用最新版本的 nmap,因为它将具有最新的指纹识别。

于 2012-09-25T06:10:48.667 回答