ISPsystem漏洞分析

ang010ela 漏洞 2019年5月7日发布
Favorite收藏

导语:本文介绍研究人员发现的ISPsystem软件中的关键漏洞,攻击者利用该漏洞利用劫持另一个登入用户的session,并控制用户的站点、虚拟机等。

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

目前,官方已经发布了升级补丁,研究人员建议受影响的用户尽快升级。

本文翻译自:https://research.checkpoint.com/vulnerabilities-in-ispsystem/如若转载,请注明原文地址: https://www.4hou.com/vulnerable/17812.html
点赞 2
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论