Cloud | HTB Business CTF 2024 WriteUp
2024-5-27
| 2024-6-27
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
❤️ 题目由 super cool cloud hacker eson师傅 友情“赞助”,期间还请教了一些问题,感谢🙏。通过 After Party 环境复现,收获满满 😁

0x01 Scurried

We have obtained leaked data pertaining to Vault 101, with suspicion that it may be linked to one of the leaders group. Your task is to analyze and extract pertinent information from the provided data. The flag is the ARN wrapped in HTB{} .
附件 txt 文件有一串 AROAXYAFLIG2BLQFIIP34 ,题目描述需要提交用 HTB{} 包裹的 ARN (Amazon Resource Name)
 
搜了下文档翻到 https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids 发现该字符串以 AROA 开头是角色 ID 前缀,该串就是角色唯一标识符了,然后还写道
大多数情况下,在使用 IAM 资源时,您使用易于识别的名称和 ARN。这样,您就不需要知道特定资源的唯一 ID。不过有时,当实际情况不允许使用好友名称时,唯一 ID 可能非常有用
 
也就是让我们创建一个角色策略,创建成功后,该唯一 ID 就能对应上易于识别的 ARN。
 
我们登陆到 aws,然后访问 iam → 角色 → 创建角色
notion image
 
因为要自定义角色 ID,并选择 自定义信任策略,根据上面文档的角色ID在 Principal 的写法
notion image
 
这里有报错,不要紧,因为我们还没有这个角色引用,直接下一步即可,然后不用选一直下一步,给策略随便写个名字,创建成功后点击我们新建的角色,然后在信任关系就能看到由角色 ID 解析出来易于识别的 ARN 了,vault101 ARN 就拿到了~
notion image
HTB{arn:aws:iam::532587168180:role/vault101}

0x02 Protrude

We have obtained leaked account pertaining to Vault 101, with suspicion that it may be linked to one of the leaders group. Your task is to enumerate and see if we can infiltrate them internally.
 
这次附件给了 AKSK
Access key ID
Secret access key
region name
AKIAXYAFLIG2JE6MC2SY
teWVv0GzIBKS23uozxUGmUH+muE5XB86fnZmRZXu
us-east-1
 
枚举下权限
 
有个 ds.describe_directories() 搜下用法
 
原来是 AD 域里的一台机器,有个访问地址,访问 AccessUrl:vault101.awsapps.com
notion image
 
看标题,像是 AWS 里部署的,搜了下发现是个 WorkDocs,一个个看了下,emmm,基本都要传个 id 之类的,然后也没枚举出来这个权限,不过像这种要传入参数的,不一定能枚举出来?!
 
然后把 Direcroty 和 Organization 联想搜索发现,Connect to Amazon WorkDocs with IAM user credentials and query for users - Amazon WorkDocs ,原来 DirectoryID 就是 organization-id,于是尝试
 
原来能请求,这个是最近编辑的,看一下文档内容
 
把附件下下来即可拿到 flag
notion image
HTB(AWS_WORKDOCS_CAN_HAVE_USEFUL_STUFF)

0x03 MetaRooted

You have obtained unprivileged access to a Linux machine that controls one of the many vault alarm systems. In order to deactivate the alarms and proceed with your quest, you must escalate your privileges to root. You may login via SSH using the provided private key.
IP Address: 34.132.25.162
Username: vaultuser
附件提供一个 ssh 私钥,连上去即可,根据描述我们要提权到 root 用户
看到 crontab 有人定时改密码,直接 ssh 上去拿 flag (bushi)
 
当前机器权限是低权限用户
 
确定是 gcloud
 
并可以直接请求元数据获取服务账号 token
 
其实根据题目名称很明显让我们根据 metadata 去提权,Tutorial on privilege escalation and post exploitation tactics in Google Cloud Platform environments (gitlab.com),gitlab 博客文章写了关于修改 metadata 的利用条件
  1. 使用默认服务账号,并 access scopes 为二者之一
      • Allow full access to all Cloud APIs
      • Set access for each API 然后允许访问 compute API
  1. 使用自定义服务账号,IAM 权限设置为
      • compute.instances.setMetadata (影响单个实例)
      • compute.projects.setCommonInstanceMetadata(影响租户的所有实例)
并且自定义服务账号 access scopes 为下面二者之一就可以利用
  • https://www.googleapis.com/auth/compute
  • https://www.googleapis.com/auth/cloud-platform
 
查看服务账号,是存在自定义服务账号的,所以要看自定义服务账号的权限
根据文档,@ 前面为服务账号名,.iam 前面为 project-id 即租户id
 
谷歌云计算实例一般自带 gcloud,我们看一下这个服务账号的 iam 策略,
这里遇到一个小坑,就是我电脑装着很多个 Python 版本,最新默认的是 Python3.12,但 gcloud 不支持,需要通过环境变量指定 python 低版本可执行路径,就能正常用 gcloud 了
 
那就看 iam 角色
 
绑定的是 VaultManager 角色,查看角色权限
OK,有 compute.instances.setMetadata 权限
 
获取计算实例名
 
可以通过 setMetadata 权限,然后改元数据来在该计算 vault-instance 实例中新建用户和写入 ssh 密钥
注意这里直接用 root 用户是写不了的
 
该用户是有 root 组的 sudo 权限的
HTB{iam.root.becauseiwasgivenTooManyPrivileges}
 
这里也 curl 利用方式,这种就需要自己获取 fingerprint
access_tokenhttp://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?alt=jsonhttp://metadata.google.internal/computeMetadata/v1/instance/service-accounts/[email protected]/token 获取
不过如果获取 fingerprint 走下面这个接口会有问题
会报权限不足错
 
然后 http 接口的话,不走 metadata 接口也可以这样看当前 access_token 的 scopes

0x04 CloudOfSmoke

This carving is thought to hold the key for accessing the mythical vault in the clouds that is rumored to hold as much gold as the legendary underground vault. After a long search, you manage to find the vault at http://34.29.127.192. Can you get in?
F12 发现背景图 URL 是从谷歌存储里的
 
找了下使用 service account key 的方法
 
然后就能看存储里的东西了,然后把东西放到本地,方便看
 
 
但发现里面的代码并不全,还有一些缺失的,不过是 dev 的存储,也能理解,那剩下的呢?
 
枚举一下这个服务账号的权限
notion image
 
发现还有个备份的key
 
扒拉用了一下不同的命令,就发现有两个版本的 backup-key
 
到这里就有点卡住了,等等?上面有说到版本,桶会不会也有版本控制?!
还真有,通过 -a 参数可以看所有版本,比如
 
搞到本地
 
然后这个贼多权限
./cliam gcp --service-account ~/Downloads/cloud-vault-assets/cloudvault-dev-files/config/firestore.json bruteforce
 
简述一下firebase是什么东西:对于开发侧,开发不需要自己搭建服务器、数据库,并开发健全的身份认证服务等,这些 GCP 都给开发者提供了,开发可以更专注于开发业务从而开发一个具体应用。详细看原文, https://cloud.webeye.com/tech-blog/su-kan-mei-you-bi-zhe-geng-quan-mian-de-firebase-jie-shao.html
 
也就是说,firebase 就是一个连接云平台和开发者业务的东西,拿到连接凭证后,就自然可以调用 firebase 和 GCP 的接口了。当然 firebase 这些接口 gcloud cli 工具几乎是没提供,需要通过 firebase 提供的 SDK 去调,这样方便开发在开发业务逻辑时调用。
 
db.js 已经写好了数据库连接逻辑,我们复用即可
回到题目最开始,我们需要登录账号密码,那么这些按理说数据库是有存的。
firebase 的数据存储是使用 firestore,是非关系型数据库,我们可以先找数据库,不过这里没有库的概念,最上层是 collection
 
代码中 getFirestore() 返回 Firestore 对象,https://googleapis.dev/nodejs/firestore/latest/Firestore.html 提供 listCollections() 可以查看所有 collection
 
先进入到 cloudvault-dev-files 路径,安装一下依赖
 
在 config 目录下新建 list.js 内容为
 
运行,找到个 vault_user_store collection
 
补上获取数据部分逻辑
 
运行输出
 
这下就差个密码了,密码是哈希过的,结合前面的 backup-key 其中第一个就是密码明文,然后 secret 是 totp 二步验证的密钥。然后去一开始的站点用账号密码登录后,在输入二步验证码就拿到 flag 了
notion image
HTB{th3_v4ULt_1s_0n_f1r3!}
 
其实这里上面可以看出,写这个脚本,又要对数据类型,又要看文档以及理解他相关代码,又要匹配 collection、document 啥的,eson师傅说不如直接导出 firestore 的 backup 这样就简单粗暴些,不用自己看文档写代码了,毕竟他就是个数据库,但
官方提供的方法只能导出到谷歌存储里,不能直接下载
 
网上找找这种备份项目就好了,比如
node-firestore-backup
steadyequipmentUpdated Apr 15, 2024
,就是不过项目他现在用有点问题,会报错 this.options.database.getCollections is not a function,就是现在不是叫 getCollections,而是叫 listCollections(),dist/firestore.js 有两处,改过来运行就好了
notion image
当然,总有一些工具或者脚本不用改就能用的

0x05 Asceticism

Upon thorough investigation, we have come across AWS Identity and Access Management (IAM) keys within a publicly accessible Git repository. Our initial suspicion is that these keys are associated with Vault11. However, we are seeking further clarification and confirmation on this matter. We kindly request your assistance in delving deeper into the situation to ascertain the precise ownership of these keys and to explore potential strategies for internally addressing any security vulnerabilities they may pose.
 
附件也是给了个 AKSK
Access key ID
Secret access key
Region Name
AKIAXYAFLIG2DFBKVWHJ
AyOOKTDrBkaHCaaGuLKlD8VNlJvfp8T/f8k/D7+U
us-east-1
enumerate-iam 并没有枚举出有用的权限,神奇了,按理说是可以的,eson 师傅说比赛时可以正常枚举权限,可能是 After Party 环境改了啥东西
 
先继续,假设 ls 到了 vault11-reports 桶,里面有个 flag.txt
 
但拿不下来
 
由于桶里没有其他内容,可以考虑看看桶有没有启用版本控制
 
发现一个 csv 文件,拿下来
 
发现一个 AKSK
Access key ID
Secret access key
AKIAXYAFLIG2CSJQ4R5Y
BGTlUZBVjhdydUk9AMMG+X5b+1fzsvdstY8xVet6
 
枚举一下权限
查看ec2实例和快照权限
 
> aws ec2 describe-instances
 
一些有用的信息汇总,和一开始我们想 cp flag 报错 KMS 有点关系
  • Window 机器,ARN 的资源id是 WindowsVM-KMS
  • 挂载着两块硬盘
  • 主机 iam 绑定
  • 公网连接信息
 
查看快照信息
执行的贼慢,而且等了很久后发现贼大,看了下文档 https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-snapshots.html
发现默认会把 aws 公共的快照也弄下来
 
这时我们需要 filter 一下,比如
  • owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the related parameter instead of this filter.
> aws ec2 describe-snapshots --owner-id self
 
或者是先获取 Account ID,然后获取,结果是一样的
都是获取自己的 Account ID 下的快照
 
一共有 3 个快照,磁盘对应关系
  • "VolumeId": "vol-075ee6a3f4c846e85" <=> /dev/xvdb
  • "VolumeId": "vol-0ed252fb0ff6d55cf" <=> /dev/sda1
 
Windows Backup Drive Snapshot 这个快照名看起来比较特别,先分析它
 
来获取 EBS 的快照,先安装
 
查看快照列表(不用配置 AKSK,直接用即可,因为会自动读取 aws configure 配置的)
 
下载快照
这种快照 volatility 分析不了,eson师傅补充说这是磁盘取证,想了下确实是这么回事,平常都是对快照的内存镜像分析的(比如 VMware 的 .vmem),不会对备份的磁盘进行分析。然后,这里我下载的是备份盘的,根据 volume-id 对比 describe instance 可以知道。然后为啥 D 盘备份盘有系统盘的 SAM、SYSTEM 咧。估计是出题方为了照顾下载问题,30G 太大,网络不好容易经常断。
 
这里可以用
debian系 系统装起来更方便,直接 apt 就能装
 
装好后,-a,--add IMAGE ,run 为加载镜像,list-filesystems 查看文件系统类型,这些在 man 中都有,然后把 /dev/sda1 挂载到当前 shell,翻文件翻到快照的虚拟磁盘文件 vhdx(Hyper-v 的 Virtual Hard Disk v2)
 
退出 guestfish 交互 shell,查看虚拟磁盘文件的类型
 
有磁盘文件的了,然后实例是Windows,翻翻以前打域的笔记,直奔拿 SAM
 
然后本地 dump 哈希(用mac或linux的师傅可千万别像WP专门开个win机子把 vhdx 放 win 里面弄.jpg
 
NTLM哈希传递拿下 AWS 的实例
 
来桌面看看有没有密码本.txt
有个内容加密过的东西 backup.ps1.enc
 
前面 describe instance 的时候这个实例有绑定 iam,访问下元数据,不知道我这里为啥访问不了,直接超时,试了很多次都是这样,v1 v2版本都试了,powershell 也是
 
问了下 eson 师傅,原来是 Windows 的特性,因为返回的不是标准的 HTML 格式,但 Windows 下会默认以 MSHTML(Microsoft HTML)解析,然后解析不了导致超时报错。原来上面报错有写,一心想着超时,没注意到,以为是请求问题
By default, script code in the web page may be run when the page is being parsed to populate the ParsedHtml property. Use the -UseBasicParsing switch to suppress this.
加上  -UseBasicParsing 参数即可,这里用 Invoke-WebRequest
 
继续获取 sts
 
然后枚举权限
有 kms 的查看 keys 权限
 
手动改下本机的 ~/.aws/credentials
 
aws kms list-keys 发现有两个 key,然后一个个看
 
发现有一个能用,通过描述得知用于加密解密,用这个来解密 backup.ps1.enc
 
得到 base64 编码后的脚本,解码即可拿到
 
枚举一下权限
这个 ps 脚本用来备份快照的,不过它并没有备份快照的权限,也没有查看实例权限,反而只有一个查看 secret 权限(有点生草,不能创建快照可以理解,毕竟防止参赛者乱来)
 
secretsmanager.list_secrets
 
尝试读每一个
 
然后 AWSVault11-dev 这个能读,拿到了用户名密码
 
然后,这个用户名密码能登 AWS 控制台….
 
账户 ID 就是 ARN 里的账户 ID
notion image
 
访问 s3 去拿一开始我们访问不到的 flag
notion image
 
依次点进 flag.txt,在点下载或者打开
notion image
 
就能拿到 flag了
notion image
HTB{W15D0M_15_5uFF3R1Ng_kA1_d3n_aGaP1_aF70}
 

Reference

  1. https://github.com/hackthebox/business-ctf-2024/tree/main/cloud 官方 WriteUp
  1. IAM 标识符 - AWS Identity and Access Management (amazon.com)
  1. workdocs — AWS CLI 2.15.58 Command Reference (amazonaws.com)
  1. 使用 IAM 用户凭证连接到 Amazon WorkDocs 并查询用户 - Amazon WorkDocs
  1. Tutorial on privilege escalation and post exploitation tactics in Google Cloud Platform environments (gitlab.com)
  1. 服务账号的类型  |  IAM 文档  |  Google Cloud
  1. gcloud auth activate-service-account  |  Google Cloud CLI Documentation
  1. gcloud storage ls  |  Google Cloud CLI Documentation
  1. 速看!没有比这更全面的 Firebase 介绍! (webeye.com)
  1. Firestore  |  Firebase (google.com)
  1. @firebase/firestore  |  Firebase JavaScript API reference (google.com)
  1. Firestore - Documentation (googleapis.dev)
  1. Export and import data  |  Firestore  |  Firebase (google.com)
  1. steadyequipment/node-firestore-backup: Google Firebase Firestore backup tool (github.com)
  1. describe-snapshots — AWS CLI 2.15.58 Command Reference (amazonaws.com)
  1. libguestfs, library for accessing and modifying VM disk images
  1. Invoke-WebRequest (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
 
 
  • 云安全
  • 云安全CTF
  • AWS
  • GCP
  • HackTheBok
  • 离职了,第一份安全攻防工作碎碎念谷歌Flank潜藏3年的Github Action供应链攻击
    Loading...
    目录