Winbox是一个小型实用程序,允许使用快速简单的GUI管理MikroTik RouterOS。
我曾经写过关于MikroTik路由器的文章,详细描述了其中的漏洞,如何利用,以及Winbox使用的通信协议,相关开放的端口(8291)等:
MikroTik Firewall & NAT Bypass
Rooting RouterOS with a USB Drive
我花了很多时间来逆向和研究这些系统,所以一旦有人对我的成果产生质疑,那就不得不回应了。
有人表示全球互联网上没有多少路由器打开了8291端口,而这一结果是通过Shodan和Censys得出来的。
如果我的研究成果只影响了全球十几台设备,那确实没啥用,只是浪费了读者的时间,我需要证明事实并非如此。
于是我编写了扫描脚本,它会连接到全球IP的8291端口,在不进行身份验证的情况下,尝试获取路由器的RouterOS版本。我扫描了一堆地址,得到了我需要的答案。
扫描结果
对8291端口的扫描从2019年11月30日持续到2019年12月2日,共发现578456个MikroTik路由器,结果放在GitHub上。
请注意,我并没有扫描全球所有的IP,只是借助了@PACKET_TEL的某个扫描IP名单,以及从Shodan查询(FTP、SNMP、HTTP、HTTP代理、Telnet和PPTP)中收集的IP。
不过,这次扫描得到的578456个结果正好让我对全球RouterOS版本以及漏洞修复率有了一个大概的认识。
补丁
在扫描期间,最新的MikroTik RouterOS版本是6.45.7(Stable)和6.44.6(Long-term),均于2019年10月28日发布。在我开始扫描之前,全球管理员有一个多月的时间来进行升级,而RouterOS版本的扫描结果如下。
是的,只有15%的设备使用了最新版本的RouterOS,这可是一个月之后了。
6.44.6和6.45.7解决了我先前披露的无需身份验证的严重漏洞,而这些漏洞的攻击手段正是利用开放8291端口的Winbox。我也观察到所部署的Winbox蜜罐受到CVE-2019-3978的攻击。下图是37.49.231.122
对DNS缓存的mikrotik.com
,upgrade.mikrotik.com
,以及大约180个加密货币相关的地址进行中毒。
当然,10月份的漏洞并不是我今年公布的唯一一个和8291端口有关的无需身份验证的漏洞。今年2月,MikroTik修复了CVE-2019-3924,我发现的防火墙绕过问题。然而,至今只有不到50%的路由器修补了它。
这种绕过方法确实有一些限制,但仍然是有用的。正如我在文章中描述的那样,它可以用来向局域网发起攻击。而在漏洞信息公开10个月后,仍有数十万路由器存在该问题。
不过大部分机器都已打上了CVE-2018-14847的补丁,这可能是由于威胁确实太大,以及某些义务警察的帮助。
这并不是说我们的蜜罐没有被CVE-2018-14847攻击,我们每天都会观察到好几次。但有趣的是,攻击者似乎都只使用了Exploit-DB的脚本。
通过Winbox端口完全控制设备是很有可能的,但攻击者只是抓取了我蜜罐的管理凭证,也许这只是阶段攻击的第一阶段。
全球MikroTik路由器的种类实在很多,而专业路由器和家用路由器很不一样,往往需要专职人员的维护。基于这一点,我试图找出实际扫描到的是哪种类型的MikroTik设备。
硬件信息
不幸的是,不进行身份验证,Winbox接口就不会共享平台硬件信息,但是Shodan上有很多相关信息(从SNMP接口入手)。
我将Shodan结果下载了下来,与我的端口扫描结果的IP相匹配,结果不是很好。只有大约10%的扫描数据可以与Shodan结果相匹配。你也可以从GitHub获取原始数据。
也许10%是一个糟糕的数字,但我认为这还是有代表性的,统计图表如下:
RB951Ui-2Hnd
是小型家用路由器(RB951Ui-2Hnd)。其他都是虚拟化(x86)或机架式平台。前两大平台CCR1036-8G-2S+
和CCR1036-12-4S
各有36个核心,分别支持28 Gbps和16 Gbps的吞吐量。这些设备都不是放在你的客厅里的,应该是位于在某个ISP中,有专业人员维护。
不要忽略局域网
一个漏洞不一定是通过互联网攻击才会被认为是严重的。内网机器往往更容易受到攻击。
我们还能做些什么?
说实话,15%的补丁率相当糟糕,我不确定还有什么可以做的。MikroTik很早就在他们的安全博客和论坛中公布了漏洞信息和修复补丁。
其他
我知道两种从8291端口提取版本号的方法。
第一种对于RouterOS 2.0到当前的6.0都有效。主要利用RouterOS代码库中的旧逻辑。
由于MikroTik将许多特性分解成单独的包,所以Winbox客户端需要询问路由器应该下载哪个.dll。为此,客户端会向路由器的mproxy二进制文件发送一个请求,指示客户端想要读取“索引”文件。有趣的是,请求的是路由器不再使用的二进制格式。
索引文件实际上是/home/web/winbox/
中的一个文件。你可以更改请求以读取该目录或/home/web/webfig/
中的其他文件。这也是Nessus获取路由器版本的方法。我们的蜜罐也捕捉到类似请求。
另一种方法更常见,只适用于RouterOS 6.0版本,需要发送四个数据包:
1.客户端请求读取列表文件。
2.服务端回复:好的,这是会话ID和文件大小。
3.客户端回复:我想读取会话y的x字节。
4.服务端发送数据。
如果想查看我的所有代码,可以在GitHub上找到。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/3410.html
来源:https://medium.com/tenable-techblog/winbox-in-the-wild-9a2ee4946add