深入分析MikroTik RouterOS CVE-2018-14847 & Get bash shell

0×01. 媒介

MikroTik路由器在4月份被发明存在目录遍历破绽CVE-2018-14847,危险程度为中。Tenable Research的专家于10月7日在DerbyCon上颁发了题为“Bug Hunting inRouterOS”的演讲,先容了这项新技巧,便是使用该破绽。今朝结合该破绽的黑客对象已放出,运行RouterOS的MikroTik设备成为恶意代码的目标。

本文从MikroTik RouterOS与客户真个通信协议入手,辅以逆向阐发,深入解读了CVE-2018-14847以及内置开拓者后门的破绽道理,最落后行完备的组合拳进阶使用,达到Get bash shell的目的。整体流程图如下:

0×02. 通信协议阐发

MikroTik RouterOS是一款基于Linux核心开拓,兼容Arm,mips,x86 PC等多种架构收集设备操作系统。经由过程安装该操作系统可以将标准的PC电脑变成专业路由器,也便这天常平凡常说的软路由。同时,RouterOS供给了富厚的治理设置设置设备摆设摆设接口:1)winbox:GUI软件治理; 2)cli:敕令设置设置设备摆设摆设;3)webfig :网页图形化治理。而Winbox for MikroTikRouterOS是一个用于治理MikroTik RouterOS系统的 GUI客户端利用法度榜样。

RouterOS官方供给了响应的ISO系统镜像包,以是可以像安装正常操作系统一样安装RouterOS,直接在vm中安装一个虚拟机。

经由过程CliTelnet的要领对RouterOS进行设置设置设备摆设摆设,然则要知道以下两点:

•这不是一个osbash shell,不能造访到底层的linux的操作系统

•只能使用内置的一些敕令集对RouterOS进行设置设置设备摆设摆设和治理

从下图的nmap扫描结果可以看可以看到RouterOS专门供给了8291端口跟winbox通信。

破绽道理是怎么的呢?要理解破绽的道理,首先得必要理解Routeros与winbox的通信历程,本文先从webfig和Routeros的通信历程入手。

2.1 通信协议识别

造访webfig,首先哀求的一个js文件,下载来美化后看看代码:

代码很多,17000行阁下。大年夜致浏览了一下,可以看到webfig与RouterOS之间所有的通信消息都是由这个js文件孕育发生和处置惩罚。 初始化相关代码:

登录、认证相关功能,相关的POST数据包都发送到RouterOS的jsproxy处置惩罚, 这里的jsproxy就相称于jsp中servlet一样。

但当查看这些数据包的时刻,发明POST是加密的,同样返回的数据也是。

而此中的加密算法在js文件中可以找到:

此中的孕育发生56位key的算法采纳的是RFC 3079 MS-CHAP-2 。

这是一个很老的PPP协议(存在离线碰撞破解破绽)

从js代码和数据包可以看到采纳的身份认证要领是:提问/应答(Challenge/Response)要领。

2.2 认证历程梳理

至此,笔者来完备地梳理一下全部认证的流程:

客户端首先发送一个空的POST哀求给办事器。

[1] [2] [3] [4]下一页

办事器收到后发出Challenge(提问):

客户端使用输入的账号密码采纳MS-CHAP-2算法天生通信key,再使用这个key应用RC4加密天生Reponse(应答),发给办事器。

办事器将客户真个应答使用自己谋略的出的key解密,能解出来则认证成功。接下的通信数据包便是全是用这个认证成功的key加密的Content-type为msg的POST数据包。

2.3 数据包解密

理清楚认证历程,就可以来斟酌下数据包怎么解密?

思路总结成两步:

1. 离线暴力从登录数据包中碰撞出账号密码。

2. 使用碰撞出的账号密码天生key解密另外通信数据包。

2.4 Json数据含义解析

至此我们已经拿到解密之后的数据包了,可以看到是json款式的。然则这些数据的含义照样一脸懵逼的。虽然js文件存在一些映射关系,然则要理解这些数据的含义还得加上逆向+仔细看代码+可能存在的文档:

这里笔者直接就把Tenable的阐发申报当文档,可以到每一个key-value键值对都是由如下几部分组成:

而此中type可以取如下值:

而此中一些常见变量名的含义如下:

OK,结合上面的文档继承阐发,发明Uff0001 system_to这个变量的值是一个数组[13, 7],当RouterOS接到这条消息后jsproxy会做一次映射,终极找到/nova/bin/下的对应可履行法度榜样来处置惩罚这条消息。

详细怎么映射的呢? 在RouterOS中有一个叫/nova/etc/loader/system.x3的二进制文件,我们直接cat查看下:

虽然找不到详细的映射关系,然则可以知道映射关系就存储在这个文件中。Tenable经由过程阐发对应的文件款式和内容,获得了对应的映射要领:

并开拓了一个提取数字到可履行文件对应关系的法度榜样,笔者使用该法度榜样获得对应的映射结果:

也便是说数组[13,7]中的13终极调用的是/nova/bin/user,那么剩下的7代表什么?继承往下看:

由于没有用livecd的要领将RouterOS的文件系统挂载出来,以是只有使用binwalk把官网的iso镜像包中的文件系统提掏出来:

用ida打开nova/bin/user,经由过程逆向阐发,发明calls to nv::Looper::addHandler是调用handler的关键代码,统共有八处这样的调用:

并且其传入的参数可为3,2,1,4,5,6,7,8,数组第二项的值恰恰在此中:

部分汇编代码:

也便是说[13,7]中两项分手对应:[/nove/bin/下的一个二进制法度榜样,二进制法度榜样中对应的handler]。 继承跟进,发明7对应的handler中有如下详细的措施:

上一页[1] [2] [3] [4]下一页

至此,{Uff0001:[13,7],uff0007:16646157,s1:’admin’} 这条json消息中第一个键值对的值就搞清楚了,接着看第二个uff0007:16646157。经由过程前面的变量名对应关系,可以知道uff0007代表的是敕令,也便是对应上面handler中详细的分支。

这里Tenable也给出了一份详细的映射关系:

16646157对应着Get敕令,跟进看看Get command:

此中进了很多函数,这里就不逐一细致阐发了,但可以看到此函数实现的最主要功能点便是:获取json消息中传入的用户名字符串admin的对利用户信息。

0×03. 破绽阐发

3.1 初步使用阐发

理清楚全部通信历程以及json消息的含义之后,正式开始破绽阐发。 破绽发生在winbox和RouterOS的通信中,颠末阐发发明其数据包的本色照样与webfig与RouterOS之间的通信一样,采纳的是json消息的形式,对应的参数含义都是同等的,以致winbox的数据包没有加密,只是将json按照必然规则转化成了二进制形式使用TCP进行传输。

以是同样可以将winbox的二进制数据包转化成JSON形式:

转化出来的第一条json消息就对应着exp中list a 中的二进制payload:

ok,这下便是认识的json款式了,重点关注以下几个变量的值:

找到Uff0001:[2,2]对应的二进制法度榜样和对应的handler:

继承跟进uff0007:7, 由前面可知这键值对的含义是command变量值为7。ok,继承找handler 2中的怎么处置惩罚7敕令的,起起首找到handler 2,此中箭头所指函数便是处置惩罚command 7的函数:

跟进这个函数,是一个switch分支,找到case 7,可以看到当变量值为7时打开了一个/home/web/webfig下的文件,并将这个文件的大年夜小和一个session id作为返回值(因为代码太长了笔者只截取了关键部分):

对应着RouterOS回应的第一条json消息:

就按这样的思路继承逆向阐发,发明commoad可以取以下七个值,分手实现了不合的功能(因为篇幅缘故原由就只截取了部分功能的关键代码):

1.Opens a file in /var/pckg/ for writing.

2.Writes to the open file.

3.Opens a file in /var/pckg/ for reading.

4.Reads the open file.

5.Cancel transfer (and deletes the file).

6.Creates a directory in /var/pckg/.

7.Opens a file in /home/web/webfig/ for reading.

这样exp中发送的第二条二进制payload就好理解了,含义便是:带上RouterOS返回的SessionID和文件大年夜小(PS: 至于为啥要带上这两个,上面的代码已经很清楚,RouterOS对这两个值做了验证),发给mproxyhandler 2中的command4:

上一页[1] [2] [3] [4]下一页

此外,在handler 2调用前可以看到对这七个command做了策略限定的:

同样,RouterOS供给了一个叫Get Policies的敕令,可以用来获取system_to数组对应command的权限策略,也便是能获取某个command的履行是否必要认证,利Tenable的自动化对象获取看下:

结果和上面的汇编代码同等,可以看到command 4 和 7的policy值为0,是不必要认证的,也便是说网上一些关于该破绽是基于权限绕过的描述是不完全精确的,这里不存在权限认证bypass,上面已经提到了,第二条使用代码中调换Session id是为了经由过程Command 5中的IF前提,让exp继承履行下去。

至此破绽道理就理清楚了,全部破绽总结来着实便是一个未授权的随意率性文件读取破绽。来看看详细的使用历程:

1.构造数据包去读取/flash/rw/store/user.dat文件,该文件中存储RouterOS的用户名密码。

2.因为存储的是:password xormd5(user+”283i4jfkai3389″), 以是可逆,获得密码明文。

3.登录RouterOS,节制路由器。

以上便是CVE-2018-14847的破绽阐发和使用。这时虽然进入到了RouterOS,但照样不能造访底层linux那部分,以是就有了更进阶的使用。

3.2 进阶使用阐发

在Tenable的申报中,发明在6.42 stable版本曩昔很多版本存在开拓者后门。笔者以6.41 statle版本为例阐发。

定位到后门关键点:

可以看到除了治理员admin用户,还有一个内置用户devel。要满意if前提,不仅必要用户为devel以及后面函数的返回值为真。跟进nv::hasOptionPackage()函数,发明其是/lib/libumsg.so动态库中的函数:

继承跟进nv::hasPackage()函数:

此函数只对/pckg/option这个文件做了存在与否的简单判断,存在的话,返回为真,加上用户为devel就满意了关键点处的if前提,byte_8053D15变量的值就被置为1。

当byte_8053D15变量值为1,且/pckg/option文件存在时,RouterOS直接调用了/bin/bash,此时得到的便是一个 Root shell,到达了linux系统层。

至此,全部后门道理梳理清楚了,但这些后门文件默认是不存在,要想使用必要先写入,此时不妨转头看看mproxy handler 2的几个command。command 1履行了创建文件的操作,彷佛刚好符合需求,然则必要认证,也便是说要想写入后门文件,必须得先登录成功。笔者思虑这个设定也确凿合理,要进开拓者模式,首先得得到认证,一样平常环境下账号密码也只有开拓者或者用户自己知道,只是正好有了上面的未授权的随意率性文件读取,来了一个组合拳。

0×04. 破绽整体使用

这样整体思路就很明确了:

1.先经由过程command4,7随意率性文件读取得到用户名密码。

2.登录后再经由过程command1写入后门文件。

3.使用内置用户devel+admin用户密码登录获取Rootshell。

全部使用历程假如用python经由过程socket直接发二进制数据跟winbox通信,是可行,然则数据包的构造很繁杂麻烦。以是这里可以直接使用RouterOS官方供给的 c++的winboxapi库大年夜大年夜简化了代码(详细exp来自Tenable):

使用结果:

1、正常登录,返回登录掉败:

2、履行BTW后,再次登录,返回登录成功。

0×05. 参考链接

https://github.com/tenable/routeros/

上一页[1] [2] [3] [4]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包