文章插图
图12. Apache Guacamole结构中的关键节点
在权限提升上 , 我们重点关注如下两个组件:
1、guacamole-client:上图中的Web服务器
2、guacamole-server:上图中的代理节点
guacamole-clientguacamole-client组件为执行用户认证的web服务器 。这个web服务器保存每个用户会话所需的配置 , 存储的信息包括:
1、所需的协议:通常为RDP 。
2、网内员工PC的IP地址 。
3、其他信息 。
当客户端成功通过身份认证后 , guacamole-client会向guacamole-server发起Guacamole Protocol会话 , 为客户端创建匹配的会话 。guacamole-client会连接guacamole-server的TCP 4822端口(默认端口) , guacd进程在该端口上监听 。
创建会话后 , guacamole-client的作用是在guacamole-server以及客户端浏览器之间来回中转消息 。
guacamole-server根据Apache的官方文档:“guacd是Guacamole的核心” 。在启动后 , guacd会在TCP 4822端口上监听 , 等待来自guacamole-client的连接 。需要注意的是 , 该端口上的通信没有使用身份认证或者加密(支持SSL , 但默认情况下并没有启用) 。因此 , 我们在图12中添加了2个防火墙 , 负责限制对该TCP端口的访问 , 只允许来自guacamole-client的连接 。
建立连接后 , guacd会创建一个新线程 , 调用负责初始化Guacamole Protocol的函数 。此时 , 用户有两个选项可用:
1、创建一个新连接;
2、加入已有的连接 。
备注:这里我们使用的是“连接”(connection)而不是“会话”(session) , 因为这个词在Guacamole中指的是与指定计算机的连接 。每个计算机有一个连接 , 多个用户可以共享相同的连接 。这里不存在“用户会话” , 因为整个设计理念都基于与特定计算机的连接 , 用户只需要加入连接即可 。目前最常用的是第一个选项 。此时系统会为新创建的连接生成一个随机的唯一ID(UUID) , 然后fork()一个进程来处理 。UUID与新进程的对应关系存在内存中名为proc-map的一个字典中 , UUID会被发送回guacamole-client 。需要注意的是 , 新生成的进程在启动与内网主机的连接前会立即释放权限 。
第二个选项比较特别 , 应该已经实现 , 这样多个用户才能共享一个连接 , 协同工作 。在这种场景中 , 用户提供连接的UUID来请求加入已有的连接 。为了区分不同用户 , 创建该连接的用户为“所有者” , 其他用户的owner字段被设置为false 。这个选项还支持将非“所有者”的用户连接设置成只读连接 。
文章插图
图13. 添加新用户 , 在proc-map中存储进程 , 允许其他用户加入
为了支持用户加入 , 为特定连接生成的进程会继承一个socket对 , 用来与guacd父进程通信 。当主线程初始化所需的客户端时(比如为RDP连接初始化FreeRDP) , 另一个线程会等待来自父进程的消息 , 当新用户要求加入连接时向我们的进程发送信号 。
guacd进程充当一个连接管理器角色 , 为每个连接生成进程 , 同时也为生成的进程实现了核心逻辑 。因此从现在开始 , 我们将guacd父进程称之为“主进程” 。
0x06 权限提升步骤0:控制单个guacd进程前面已介绍过利用方式 。
步骤1:伪装为guacamole-client虽然我们控制的guacd进程只是运行在网关内的一个低权限进程 , 但仍具有一些有用的权限 。首先 , 由于该进程运行在网关上 , 因此我们可以通过TCP 4822端口连接主进程 。由于主进程在该端口上没有身份认证 , 因此我们可以成功连接 , 像正常guacamole-client一样控制该进程 。
步骤2:从内存中获取秘密这是漏洞利用的关键点 。由于guacd可执行文件中同时包含主进程以及每个连接进程的逻辑 , 因此当生成新进程时只用到了fork() 。这里我们要强调一点:只使用了fork() , 并没有使用execve() 。
这意味着什么呢?fork出来的进程包含父进程的整个内存快照 , 而当调用execve()时 , 这个快照会被新的映像所替代 。没有调用该函数时 , 子进程将继承父进程的整个内存地址空间 。其中包括:
推荐阅读
- Treck TCP/IP协议库多个漏洞安全风险通告
- CVE-2020-1948: Apache Dubbo 远程代码执行漏洞通告
- 超级店长怎么绑定多个店铺 淘宝店铺超级店长有什么用
- 关于 Apache ShardingSphere 5.x 的分片算法 API 设计的公开讨论
- Apache CommonCollection Gadget 几种特殊的玩法
- 80后架构师教你学ApacheBeam,一个开源统一分布式数据处理编程库
- 降落伞|一针一线缝出来!神十三棒棒糖降落伞:3000多个零部件、展开1200平方米
- 直通车为什么要开多个计划 直通车一个宝贝可以用两个计划吗
- Apache Airflow的完整介绍
- 直通车开两个计划用同样的词 直通车为什么要开多个计划