ISPsystem漏洞分析

栏目: 编程工具 · 发布时间: 5年前

内容简介: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万。

ISPsystem漏洞分析

图1:  ISPmanager安装量估计

本文介绍研究人员发现的ISPsystem软件中的关键漏洞,攻击者利用该漏洞利用劫持另一个登入用户的session,并控制用户的站点、虚拟机等。因为所有的ISPsystem都使用相同内核,所以都受到该漏洞的影响。

ISPsystem允许用户免费下载和设置其软件。要使用软件用户首先要购买license,但也可以免费获取试用的license。研究人员下载和安装了用于VPS管理的ISPsystem panel实例:

ISPsystem漏洞分析

图2: VMmanager安装

脚本设置了必要的环境,包括 MYSQL 数据库和HTTP服务器。默认情况下,HTTP服务器运行在TCP 1500端口。

ISPsystem漏洞分析

图3: VMmanager HTTP服务器进程

在完成必要的设置步骤后,就可以通过web浏览器访问panel,下面是登陆页截图:

ISPsystem漏洞分析

图4: VMmanager panel登陆接口

下面进行不影响其他用户体验的本地试验。

认证过程

首先看一下认证过程,认证是使用下面的HTTP POST请求执行的:

ISPsystem漏洞分析

图5: VMmanager HTTP认证请求

认证成功后,服务器可以设置session cookie,这是web浏览器保存的一个唯一字符串。Session cookie可以让系统无须每次都输入用户名和密码来进行认证。Session cookie的name是与产品名有关,含有2个部分,分别是产品名(比如 “vmmgr”或“vemgr”)和“ses5”。本例中,session cookie name为vmmgrses5,另一个cookie vmmgrlang5用来选择用户接口的模板和语言。

ISPsystem漏洞分析

图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库中执行的:

ISPsystem漏洞分析

在认证过程中,isp_api::Session类中创建了一个新对象:

ISPsystem漏洞分析

图7: 反编译认证路径部分:创建Session class实例

最后,调用 isp_api::Authen::Data::generate_id 来生成session id。代码如下:

ISPsystem漏洞分析

图8: 生成session cookie值

Session id的长度为6字节。同样长度的字节从libmgr.so库传递给了 str::Random。最后一个需要做的就是str::Random实现。该函数并不应该用库函数std::rand混淆,因为有完全不同的实现。

为了生成随机字节序列,str::Random方法中使用了rand()函数:

ISPsystem漏洞分析

图9:  str::Random实现部分:生成随机序列

为了生成长度为N的随机字符串,rand()函数被调用了N次。调用的结果就是分配给一个变量char类型。这样,rand()函数产生的值被分成8字节的段。但rand()函数并没有生成真随机数,因为使用的是伪随机数生成算法。

而伪随机数生成器生成的序列完全是由于初始状态也就是seed决定的,因此,seed相同的话,生成的伪随机数序列也相同。str::Random方法生成session cookie的过程如下图所示:

ISPsystem漏洞分析 图10: 用str::Random生成session cookies示例

在本例中,在少于400个伪随机数生成后会设置新的seed。Seed是一个32位的证书。负责设置随机seed的函数str::Random实现如下所示:

ISPsystem漏洞分析

图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:

ISPsystem漏洞分析

图12:  seed lookup过程

如果知道session cookie,就可以计算出生成器的seed值,并预测生成器用该seed产生的完整的序列。

如果获取了session cookie,就可以有382次尝试暴力破解的计划。

ISPsystem漏洞分析

图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:

ISPsystem漏洞分析

图14:  PoC:创建登陆请求并建立HTTPS连接(Python)

session identifier是从“vemgrses5” cookie中获取的:

ISPsystem漏洞分析

图15:  PoC: 提取session cookie 值(Python)

首先,执行脚本来检查单点登陆时rand()查询的频率和有无其他活动用户。

为了找出与脚本获取的session id匹配的seed值,可以使用下面的C代码:

ISPsystem漏洞分析

图16:  PoC: 用特定seed生成随机数序列 (C, Linux)

上面的代码设置了特定的seed,生成了已知session cookie的伪随机序列。使用函数srandom_r()和random_r() 而不是srand和rand来多个线程并行。

下面是执行的结果:

ISPsystem漏洞分析

图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。

ISPsystem漏洞分析

图18: 来自VMmanager服务器的HTTP响应首部

下面来证明session cookie是可预测的。

对脚本获得的session cookie,研究人员在实验过程中得到了下面的结果:

ISPsystem漏洞分析

图19: Demo:来自session identifiers的Seeds lookup结果

在10:57:56到10:58:17期间,偏移量的距离增大了。这段时间恰好有用户活动。因此,通过检查距离,可以确定网站上用户的活动。

下面看一下用seed 0x747777E4生成的伪随机序列:

ISPsystem漏洞分析

图20: Demo: 预测的伪随机序列中含有想要的identifier

可以看出用户的session cookie存在于生成的序列中的。脚本获取的已知值用绿色表示,研究人员预测的值有红色表示。

最后一步就是暴力破解与已知值的距离大于14的所有6字节的子序列:

ISPsystem漏洞分析

图21: Demo:暴力破解数据

在本例中,只需要检查66个值就可以找出另一个用户session cookie的正确值。

最后,因为默认设置的服务器与含有session cookie的远程主机的IP地址不匹配,研究人员使用含有窃取的session ID的请求来攻击另一个用户的session:

ISPsystem漏洞分析

图22: Demo: 劫持会话的请求

总结

根据以上分析可以看出,只要有一定的资源,攻击者一个人也可以很容易地实现攻击。

受影响的ISPsystem产品包括:

· ISPsystem ISPmanager

· ISPsystem BILLmanager

· ISPsystem DCImanager

· ISPsystem VMmanager

· ISPsystem DNSmanager

· ISPsystem IPmanager

· ISPsystem COREmanager

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM国际大学生程序设计竞赛

ACM国际大学生程序设计竞赛

俞勇 编 / 2012-12 / 29.00元

《ACM国际大学生程序设计竞赛:知识与入门》适用于参加ACM国际大学生程序设计竞赛的本科生和研究生,对参加青少年信息学奥林匹克竞赛的中学生也很有指导价值。同时,作为程序设计、数据结构、算法等相关课程的拓展与提升,《ACM国际大学生程序设计竞赛:知识与入门》也是难得的教学辅助读物。一起来看看 《ACM国际大学生程序设计竞赛》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具