安全性堪忧:手把手教你寻找MikroTik路由器漏洞(2)
时间:2023-04-09 03:11 来源:网络整理 作者:默认发布 点击:次
在寻找漏洞时,如果能访问目标的文件系统,那么会很有帮助。如果能够在本地运行GDB等工具,那么效果也会不错。但是,RouterOS提供的Shell并不是普通的Unix Shell。它只是RouterOS命令的命令行界面。 幸运的是,我有一个解决方案可以应对这些问题。根据编写rc.d脚本的S12defconf方式,我们发现RouterOS将会执行存储在/rw/DEFCONF文件中的任何内容。 普通用户无法访问该文件,但考虑到虚拟机和Live CD的独特性,我们可以借助它来创建文件,并在其中插入所需要的任何命令。要准确描述这一过程,可能太过复杂,因此我制作了一个视频,长度为5分钟左右,记录了从虚拟机安装到实现Root Telnet访问的全过程。 视频:https://youtu.be/OZ11gbF9fwM 通过Root Telnet访问,现在就可以完全控制虚拟机。我们可以上传更多的工具、附加到进程、查看日志等。至此为止,我们就已经准备好了,即将开始探索路由器的***面。 三、有人在听吗? 借助ps命令,我们可以快速确定网络可以访问到的***面。 看起来,路由器会监听一些众所周知的端口(HTTP、FTP、Telnet和SSH),但同样也有一些鲜为人知的端口。端口2000上的btest是带宽测试服务。端口8291上的mproxy是WinBox与之接口的服务。WinBox是一个在Windows上运行的管理工具,它与Telnet、SSH和HTTP接口共享所有的功能。 四、真正的***面 运行ps命令后,我们得到的输出结果不太乐观。看起来,好像只有几个二进制文件能够作为我们寻找漏洞的目标。但事实并非如此。HTTP服务器和WinBox都使用了自定义的协议,我将其称为WinboxMessage,实际代码称之为nv::message。该协议指定应该将消息传递到哪个二进制文件上。事实上,如果安装了所有软件包,大约有90多种不同的网络可以借助WinboxMessage协议访问二进制文件。 还有一种简单的方法可以找出我们要寻找漏洞的二进制文件。可以在每个包的/nova/etc/loader/*.x3文件中找到一个列表。x3是一个自定义文件格式,所以我写了一个解析器。在运行后,输出结果较长,因此我做了一部分删减,删减后输出结果如下。 albinolobster@ubuntu:~/routeros/parse_x3/build$ ./x3_parse -f ~/6.42.11/_system-6.42.11.npk.extracted/squashfs-root/nova/etc/loader/system.x3 /nova/bin/log,3 /nova/bin/radius,5 /nova/bin/moduler,6 /nova/bin/user,13 /nova/bin/resolver,14 /nova/bin/mactel,15 /nova/bin/undo,17 /nova/bin/macping,18 /nova/bin/cerm,19 /nova/bin/cerm-worker,75 /nova/bin/net,20 ... x3文件还包含每个二进制文件的“SYS TO”标识符。这是WinboxMessage协议用于确定应处理消息位置的标识符。 五、对WinboxMessage的深入分析 在清楚可以接触到哪些二进制文件之后,我们其实还要清楚如何与它们进行通信。在本章中,我将介绍几个例子。 5.1 入门 假如我想和/nova/bin/undo进行对话,应该从哪里开始?我们首先从一些代码开始讲起。我写了一些C++代码,它将完成所有WinboxMessage协议格式化和会话处理。我还创建了一个可以继续构建的程序框架,各位读者可以继续完善。 std::string ip; std::string port; if (!parseCommandLine(p_argc, p_argv, ip, port)) { return EXIT_FAILURE; }
Winbox_Session winboxSession(ip, port); if (!winboxSession.connect()) { std::cerr << "Failed to connect to the remote host" << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; 大家可以看到,Winbox_Session类负责连接到路由器,此外它还负责身份验证逻辑以及发送和接收消息。 现在,从上面的输出中可以看出,/nova/bin/undo有一个SYS TO,标识符为17。为了实现undo,我们需要更新代码,以创建消息,并设置相应的SYS TO标识符。 Winbox_Session winboxSession(ip, port); if (!winboxSession.connect()) { std::cerr << "Failed to connect to the remote host" << std::endl; return EXIT_FAILURE; }
WinboxMessage msg; msg.set_to(17); 5.2 命令与控制 每条消息还需要一个命令。正如稍后我们看到的,每个命令都会调用特定的功能。所有处理程序都使用一些内置的命令(0xfe0000–0xfe00016)和一些具有唯一实现的自定义命令。 Pop /nova/bin/undo进入反汇编程序,并找到nv::Looper::Looper构造函数的唯一代码交叉引用。 按照我标记为undo_handler的偏移到vtable,可以看到以下内容。 (责任编辑:admin) |
- 上一篇:阿联酋努力争取更好地与神职人员萨德尔在努力遏制伊朗的关系
- 下一篇:如何防止网站被黑