内容简介:ISPsystem panel是一款管理web服务器、VPS和计费软件的含有友好接口的知名软件。全球上百家托管服务提供商都在使用ISPsystem软件产品,包括1Cloud, King Servers, Ru-Center。ISPsystem的安装量超过1万。图1: ISPmanager安装量估计
ISPsystem panel是一款管理web服务器、VPS和计费软件的含有友好接口的知名软件。全球上百家托管服务提供商都在使用ISPsystem软件产品,包括1Cloud, King Servers, Ru-Center。ISPsystem的安装量超过1万。
图1: ISPmanager安装量估计
本文介绍研究人员发现的ISPsystem软件中的关键漏洞,攻击者利用该漏洞利用劫持另一个登入用户的session,并控制用户的站点、虚拟机等。因为所有的ISPsystem都使用相同内核,所以都受到该漏洞的影响。
ISPsystem允许用户免费下载和设置其软件。要使用软件用户首先要购买license,但也可以免费获取试用的license。研究人员下载和安装了用于VPS管理的ISPsystem panel实例:
图2: VMmanager安装
脚本设置了必要的环境,包括 MYSQL 数据库和HTTP服务器。默认情况下,HTTP服务器运行在TCP 1500端口。
图3: VMmanager HTTP服务器进程
在完成必要的设置步骤后,就可以通过web浏览器访问panel,下面是登陆页截图:
图4: VMmanager panel登陆接口
下面进行不影响其他用户体验的本地试验。
认证过程
首先看一下认证过程,认证是使用下面的HTTP POST请求执行的:
图5: VMmanager HTTP认证请求
认证成功后,服务器可以设置session cookie,这是web浏览器保存的一个唯一字符串。Session cookie可以让系统无须每次都输入用户名和密码来进行认证。Session cookie的name是与产品名有关,含有2个部分,分别是产品名(比如 “vmmgr”或“vemgr”)和“ses5”。本例中,session cookie name为vmmgrses5,另一个cookie vmmgrlang5用来选择用户接口的模板和语言。
图6: VMmanager成功认证响应
可以看出,cookie的值是十六进制编码的6字节字符串,字符串中含有12个字符,范围为[0-9a-z]。cookie的过期时间设备为1年。
因此,攻击者只需要找出准确的6字节值就可以劫持另一个用户的有效会话。对于session id有256^6种可能的组合。
可预测的Session Identifier漏洞
对远程暴力破解攻击来说,256^6是一个庞大的数字。因此,研究人员决定查看是否可能减少该值的范围。
为此,需要了解session cookie生成的算法。
业务逻辑是用C++实现的。数据库操作、用户认证、用户会话管理都是用C++代码实现的,并且在ihttpd进程环境中执行。
因为想要了解cookie session的生成方法,研究人员在二进制文件中搜索了字符串ses5,发现该字符串在以下库中:
/usr/local/mgr5/lib/libispapi.so /usr/local/mgr5/lib/libmgr.so /usr/local/mgr5/lib/libispcgi.so /usr/local/mgr5/lib/libostemplate.so /usr/local/mgr5/libexec/ihttpd.so
在检查了这些文件后,研究人员发现密码认证是在libispapi.so库中执行的:
在认证过程中,isp_api::Session类中创建了一个新对象:
图7: 反编译认证路径部分:创建Session class实例
最后,调用 isp_api::Authen::Data::generate_id 来生成session id。代码如下:
图8: 生成session cookie值
Session id的长度为6字节。同样长度的字节从libmgr.so库传递给了 str::Random。最后一个需要做的就是str::Random实现。该函数并不应该用库函数std::rand混淆,因为有完全不同的实现。
为了生成随机字节序列,str::Random方法中使用了rand()函数:
图9: str::Random实现部分:生成随机序列
为了生成长度为N的随机字符串,rand()函数被调用了N次。调用的结果就是分配给一个变量char类型。这样,rand()函数产生的值被分成8字节的段。但rand()函数并没有生成真随机数,因为使用的是伪随机数生成算法。
而伪随机数生成器生成的序列完全是由于初始状态也就是seed决定的,因此,seed相同的话,生成的伪随机数序列也相同。str::Random方法生成session cookie的过程如下图所示:
图10: 用str::Random生成session cookies示例
在本例中,在少于400个伪随机数生成后会设置新的seed。Seed是一个32位的证书。负责设置随机seed的函数str::Random实现如下所示:
图11: str::Random实现部分:设置随机seed
在上面的伪代码中,g_rnd_reset_counter 变量用来确定伪随机数生成器的seed更新的时间。g_rnd_reset_counter的初始值会被设置为rand()%255 + 128。也就是说该值的范围为128~382。str::Random方法没调用1次,生成的随机字符串的长度就会从变量g_rnd_reset_counter中减去。当变量变小或等于0,生成器的seed就会重置。
str::Random的实现过程让确定伪随机数初始化的最后一个seed值变成了可能。最简单的方法就是查找伪随机生成器对每个seed值产生的session cookie:
图12: seed lookup过程
如果知道session cookie,就可以计算出生成器的seed值,并预测生成器用该seed产生的完整的序列。
如果获取了session cookie,就可以有382次尝试暴力破解的计划。
图13:伪随机session identifier预测
潜在攻击场景
在潜在的攻击场景中,攻击者要遵循以下步骤:
·在T时间内,用有效用户名和密码登陆,保存分配的session cookie的值;
· 用rand函数为所有seed(0到232)生成382字节值的数组,在生成的数组中搜索保存的session cookie序列。
· 从用所有seed生成的382字节数组中提取所有6字节的子序列,找出是否有已知的session cookies。
· 尝试用所有提取的6字节的子序列的session cookie来登陆。
· 如果攻击过程中有其他用户登陆,那么会话就会被劫持。
T的范围应该尽量小来确保对生成器使用的每个新seed都可以获取至少一个session cookie。T的最优取值于时间和活动用户数量有关。如果活跃用户较多,T应该减小。
在本例中,seed lookup在16核CPU上花费了不到20分钟。而且时间可以通过多种方式来减少。
攻击PoC
攻击的第一步使用 python 和urllib2库来实现。下面的选项用来登陆攻击的panel:
图14: PoC:创建登陆请求并建立HTTPS连接(Python)
session identifier是从“vemgrses5” cookie中获取的:
图15: PoC: 提取session cookie 值(Python)
首先,执行脚本来检查单点登陆时rand()查询的频率和有无其他活动用户。
为了找出与脚本获取的session id匹配的seed值,可以使用下面的C代码:
图16: PoC: 用特定seed生成随机数序列 (C, Linux)
上面的代码设置了特定的seed,生成了已知session cookie的伪随机序列。使用函数srandom_r()和random_r() 而不是srand和rand来多个线程并行。
下面是执行的结果:
图17: 在生成的随机序列和偏移量中找出session identifiers
Session cookie 列中含有服务器对每次成功尝试登陆返回的vmmgrses5。Found seed列中含有对应session cookie的seeds值。所有的session cookie都是由相同的seed生成的伪随机序列。Offset列表明与伪随机序列最开始的偏移量。最后一列是相同随机序列中相邻session id的距离。
从中可以看出,同一序列中session cookie的偏移量的距离恒为14.也就是说每次成功登陆rand()都回被调用14次:6次来生成session cookie字符串,8次其他位置的调用。如果距离大于14,说明有其他活动用户。
在脚本执行期间,研究人员尝试用浏览器来邓丽。服务器分配的session cookie为vemgrses5=9e723afa5922。
图18: 来自VMmanager服务器的HTTP响应首部
下面来证明session cookie是可预测的。
对脚本获得的session cookie,研究人员在实验过程中得到了下面的结果:
图19: Demo:来自session identifiers的Seeds lookup结果
在10:57:56到10:58:17期间,偏移量的距离增大了。这段时间恰好有用户活动。因此,通过检查距离,可以确定网站上用户的活动。
下面看一下用seed 0x747777E4生成的伪随机序列:
图20: Demo: 预测的伪随机序列中含有想要的identifier
可以看出用户的session cookie存在于生成的序列中的。脚本获取的已知值用绿色表示,研究人员预测的值有红色表示。
最后一步就是暴力破解与已知值的距离大于14的所有6字节的子序列:
图21: Demo:暴力破解数据
在本例中,只需要检查66个值就可以找出另一个用户session cookie的正确值。
最后,因为默认设置的服务器与含有session cookie的远程主机的IP地址不匹配,研究人员使用含有窃取的session ID的请求来攻击另一个用户的session:
图22: Demo: 劫持会话的请求
总结
根据以上分析可以看出,只要有一定的资源,攻击者一个人也可以很容易地实现攻击。
受影响的ISPsystem产品包括:
· ISPsystem ISPmanager
· ISPsystem BILLmanager
· ISPsystem DCImanager
· ISPsystem VMmanager
· ISPsystem DNSmanager
· ISPsystem IPmanager
· ISPsystem COREmanager
目前,官方已经发布了升级补丁,研究人员建议受影响的用户尽快升级。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析
- 【漏洞分析】CouchDB漏洞(CVE–2017–12635, CVE–2017–12636)分析
- 【漏洞分析】lighttpd域处理拒绝服务漏洞环境从复现到分析
- 漏洞分析:对CVE-2018-8587(Microsoft Outlook)漏洞的深入分析
- 路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析
- Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。