首先,请注意大多数工业级网络设备不使用 Linux。如果他们这样做了,软件的大部分部分都必须以源代码的形式提供,以符合 GPL 要求。因此,虽然您 100 美元的 Linksys 路由器可能使用 Linux,但您 3000 美元的 Cisco 路由器不会,而且它也不会运行 snort。
(Cisco 的 IDS 和 Snort 可能有几个共同点,也许IDS 开发人员甚至从 Snort 复制了十几行代码,但是针对 snort 进行测试以找到针对 IDS 的攻击向量是非常愚蠢的)。
大多数路由器使用某种 MIPS 或 ARM 处理器。但是,它们的 IP 被转授权给不同的硬件工厂,并且您路由器中的处理器可能对“官方”版本进行了一些增强。也许他们添加了一些芯片来增强 DMA 传输以更快地路由网络数据包。也许他们添加了一个硬件 TCP 校验和生成器。你的 MIPS QEMU / ARM QEMU 处理器不会知道这些,所以你的模拟是行不通的。
现在,即使你知道你的路由器正在运行 linux,即使你知道一个 linux 错误,你也不能确定这个特定的错误是否可以在你的特定硬件上被利用。Shellshock需要 bash;它不会损害busybox shell,即使您的路由器使用bash(不太可能),它也可能是精简版。您必须在适合您实际硬件的仿真处理器上运行官方固件中的 linux 内核和官方固件中的工具,以检查您的错误是否可利用。
但是,官方内核可能甚至无法启动。内核会在某个时候尝试从非易失性存储中读取一些配置值。这可能是 I2C 总线上的专用芯片。您的仿真必须在正确的硬件地址上仿真该 I2C 总线。但是除非您颠倒了硬件,否则您不知道如何执行此操作。
内核将初始化每个路由器端口。这再次意味着它将以特定方式访问特定硬件。如果它没有找到路由器端口,它可能会打开一个红色的“硬件错误”LED 并进入无限循环。因此,如果您不模拟路由器端口,您的内核将无法启动,除非您模拟 LED,否则您甚至不知道为什么。同样,您需要硬件信息。
最后,了解有关硬件的详细信息可能有助于您利用某些东西。假设每个路由器端口都有一个对应的 /dev/portXX 设备,它接受ioctls 来设置比特率、双工和类似的参数。假设所有这些 /dev/portXX 设备具有相同的主 ID,以及从 0 到 31 的次要 ID。
也许端口驱动程序使用次要 id 来计算硬件地址,而不是先对次要 id 进行完整性检查。创建一个次要 ID 介于 32 和 255 之间的设备节点可能允许您在具有不同含义的以太网端口之后写入硬件寄存器。也许端口使用地址0x8000000到0x8000001f,0x80000040是配置cmos的地址。创建次要 ID 为 64 的 /dev/port64 可能允许您使用端口 ioctl 来读/写 cmos。但是,除非您对硬件有明确的深入了解,否则您永远不会发现这种漏洞。