
Sagemcom F@ST 3890 电缆调制解调器的漏洞利用程序,利用 Cable Haunt 漏洞,通过基于 WebSocket 的缓冲区溢出和 ROP 链实现远程代码执行。
此漏洞利用工具利用 Cable Haunt 漏洞,通过本地网络访问,在 Sagemcom F@ST 3890(50.10.19*)线缆调制解调器上弹出一个 shell。固件版本 50.10.21 或更新版本应能免受 Cable Haunt 漏洞的影响。此概念验证(Proof of Concept)特意设计为仅在本地运行,以限制其被用于恶意目的的可能性。另一个针对 Technicolor TC7230 的 POC 可创建到外部连接的反向 shell,可在此处获取:这里。
已知易受攻击的调制解调器列表可在 https://cablehaunt.com/#faq-am-i-affected 上找到。
exploit.py 会托管一个网站,当有人访问该网站时,它会向线缆调制解调器发送一个恶意的 WebSocket 请求。
该请求会溢出线缆调制解调器频谱分析仪中的返回地址及其相关寄存器,并使用 ROP 链开始监听端口 1337 上的 TCP 连接。
ROP 链在 static/exploitSagemcom.js 中构建并带有注释。
然后,exploit.py 服务器会通过此 TCP 连接发送 exploit.raw 文件,该文件随后将由调制解调器执行。
exploit.raw 文件是 reverseshell.c 编译为 MIPS 架构后的结果(编译方法见下文)。
Reverseshell.c 是专门为该调制解调器编写的 shell。该 shell 监听要在线缆调制解调器的 eCos shell 中执行的命令,并将 STDOUT 重定向到 TCP 连接。
你可以在此处找到解释该漏洞的视频:https://www.youtube.com/watch?v=5FM9mS5ck3Y
注意:目前不支持 Windows 10,你必须使用基于 Linux 的操作系统
为 python3 安装 pwntools 和 flask,然后运行 python exploit.py。
然后在浏览器中访问 http://127.0.0.1:8080,以利用调制解调器。
Firefox 无法用于此操作,因为所使用的 WebSocket 版本不兼容。
现在,一个交互式 shell 应该会出现在你运行 python 脚本的终端中。 如果你退出该 shell,则需要重新启动调制解调器才能启动一个新的 shell。
如果你想编译自己的载荷,可以从 aeolus 获取工具链,并运行以下命令:
/<toolchain Path>/gnutools/mipsisa32-elf/bin/mipsisa32-elf-gcc -O3 -c ./reverseshell.c -o ./reverseshell.o && /<toolchain Path>/toolchains/gnutools/mipsisa32-elf/bin/mipsisa32-elf-objcopy -O binary reverseshell.o exploit.raw
你可以使用此技术构建并利用任何易受 Cable Haunt 漏洞影响的调制解调器。我们建议在尝试编写自己的 ROP 链之前阅读技术报告。前往 Cable Haunt 查看已知易受攻击的线缆调制解调器列表。
首先,你需要准备待攻击线缆调制解调器的固件。 然后,对固件进行逆向工程,找到构建漏洞利用所需的相关函数地址,例如用于获取 shell 的 socket()、bind()、accept()、listen()、recv() 和 connect() 函数。 然后,可以使用 Ropper 通过以下命令查找 gadgets:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
并非所有 gadget 都能被访问到,因为 gadget 只是以原始字节形式发送的地址,而并非所有字节都能通过带文本帧的 WebSocket 请求发送。
例如,地址 0x8080a864 不能直接插入 WebSocket 文本帧中,因为它不是有效的 UTF-8 字符。但是,地址 0xf28080a864 可以插入,因为 0xf2 表示以 0x8080a864 作为尾随字节开始一个新的 UTF-8 符号。
由于 UTF-8 规范,以下字节不能出现在任何使用的地址中:0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c。还有其他限制,我们将在报告中进一步说明。
目前,你可以阅读并使用 utf8TestScript.py 来测试某个地址是否可访问。
你可以使用上述过程为新的线缆调制解调器编译自己的载荷,但请记住:载荷绝不能返回!如果返回,进程会在被破坏的栈上寻找返回地址并崩溃。
对于大多数调制解调器,你需要一种访问 eCos shell 的方法来提取固件,或者直接从闪存芯片中提取。 这些固件通常以一种称为 ProgramStore 的格式打包。 如果串行控制台不工作,请尝试运行以下命令:(可能只有在同轴电缆断开或未开通时才有效)
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 0
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
然后,shell 应该可以访问了,bcm2-utils 可通过该 shell 轻松提取固件。 在对提取出的固件进行逆向时,加载/基地址(据我们所知)始终是 0x80004000。