这是Hackthebox Sherlocks系列中的一道AWS CloudTrail日志分析题
在这之前,私以为云渗透就是简简单单的AK+SK账户接管刷分一条龙
做这道题的过程中才发现原来云渗透还别有一番天地
题目虽然解完了 但对其中的很多知识点其实并不熟悉
遂写下这篇文章记录解题的过程及学习到的知识
序言
AWS概述
AWS(Amazon Web Services)是亚马逊公司提供的一套广泛的云计算服务。它包括一系列的基础设施服务,例如计算、存储、数据库和网络等,使企业和开发者可以在云中部署和管理他们的应用程序和服务。
而AWS中最重要和使用最广泛的两项服务就是S3和EC2
S3
S3(Simple Storage Service):
• 存储服务:S3是一个对象存储服务,专为存储和检索任何规模的数据而设计。
• 数据存储方式:它使用存储桶(Bucket)来存放数据,每个存储桶可以包含任意数量的对象(文件)。
• 特点:高可用性、高耐久性、易于扩展。适用于备份、存档、大数据分析和内容分发等场景。
说来S3其实并不陌生,这样的对象存储服务我们在日常里可能已经很常用了,以在先知平台投稿为例,用typora写好的文章我们无法直接拷贝markdown投稿,因为我们日常写作一般会配置自己的图床使用,而先知平台要求使用先知官方的图床以便管理
所以我们还要把图片一次次拷贝一次次粘贴到一坨<先知的编辑器>中让它帮我们上传到先知的图床(不是 什么时候优化?)
这里的图床用到的其实就是阿里云的对象存储服务,术语称作OSS
所以其实只是叫法不一样,国内外的云厂商都有各自的叫法:
- Google Cloud Storage 谷歌提供的对象存储服务 叫做
GCS
- Azure Blob Storage 微软Azure提供的对象存储服务 简称
ABS
- 腾讯云提供的对象存储服务叫
COC
- 华为云提供的对象存储服务叫
OBS
- 阿里云提供的对象存储服务叫
OSS
S3有一个很重要的属性叫Region
,即区域,区域可以帮助用户优化数据存储的位置,以满足低延迟、高可用性和法律法规的需求。
区域具体信息可以参照下表,其中可用区表明这个区域有几个数据中心,这些数据中心具有独立的电力系统、网络和冷却系统,它们提供了高可用性、灾难备份和负载均衡的能力
地区 | 区域名称 | 可用区 |
---|---|---|
美国东部(弗吉尼亚北部) | us-east-1 | 6 |
美国东部(俄亥俄) | us-east-2 | 3 |
美国西部(加利福尼亚北部) | us-west-1 | 3 |
美国西部(俄勒冈) | us-west-2 | 4 |
加拿大(中部) | ca-central-1 | 3 |
南美洲(圣保罗) | sa-east-1 | 3 |
欧洲(爱尔兰) | eu-west-1 | 3 |
欧洲(伦敦) | eu-west-2 | 3 |
欧洲(法兰克福) | eu-central-1 | 3 |
欧洲(米兰) | eu-south-1 | 3 |
欧洲(巴黎) | eu-west-3 | 3 |
欧洲(斯德哥尔摩) | eu-north-1 | 3 |
欧洲(苏黎世) | eu-central-2 | 3 |
欧洲(西班牙) | eu-south-2 | 3 |
亚太地区(东京) | ap-northeast-1 | 4 |
亚太地区(首尔) | ap-northeast-2 | 4 |
亚太地区(大阪) | ap-northeast-3 | 3 |
亚太地区(新加坡) | ap-southeast-1 | 3 |
亚太地区(悉尼) | ap-southeast-2 | 3 |
亚太地区(孟买) | ap-south-1 | 3 |
亚太地区(香港) | ap-east-1 | 3 |
亚太地区(雅加达) | ap-southeast-3 | 3 |
亚太地区(海德拉巴) | ap-south-2 | 3 |
中国(北京) | cn-north-1 | 3 |
中国(宁夏) | cn-northwest-1 | 3 |
中东(巴林) | me-south-1 | 3 |
中东(阿布扎比) | me-central-1 | 3 |
以色列(特拉维夫) | il-central-1 | 3 |
非洲(开普敦) | af-south-1 | 3 |
EC2
EC2(Elastic Compute Cloud):
• 计算服务:EC2提供可扩展的虚拟服务器(称为实例),用户可以根据需求启动和管理这些实例。
• 灵活性:用户可以选择不同的实例类型,根据工作负载的需求配置计算能力、内存和存储。
• 使用场景:适用于运行应用程序、处理大规模计算任务、开发和测试环境等。
嗯,其实EC2也完全不陌生。使用它其实完全就像一台VPS,可以满足各类业务和应用需求。
在其他的云厂商中其实就很熟悉了:
- 阿里云:阿里云弹性计算服务,术语称作ECS,即Elastic Compute Service
- 腾讯云:腾讯云弹性计算服务,术语称作CVM,即Cloud Virtual Machine
- Azure:Azure Virtual Machines
AK+SK
S3和EC2有若干种适应不同业务需求的操作方式
- AWS Management Console:
- 用户可以通过AWS管理控制台的图形界面管理EC2实例。可以启动、停止、重启实例,配置安全组,分配弹性IP,监控实例性能等
- AWS CLI(Command Line Interface):
- 使用AWS CLI,用户可以通过命令行管理EC2实例或查看、下载S3中的文件
- AWS SDKs
- AWS提供多种编程语言的SDK(如Python的boto3、Java的AWS SDK for Java等),开发者可以通过编程的方式管理EC2实例,实现自动化操作
...
这若干种操作方式,从攻击的角度上来说都依赖于AK+SK
AK和SK本质上对应着一个账户或一个IAM用户/角色的权限
- Access Key(AK):类似于用户名,用户标识请求的来源,即哪个账户或IAM用户/角色在发起请求。
- Secret Key(SK):类似于密码,用于对请求进行加密签名,确保请求的真实性和完整性。
IAM
IAM(Identity and Access Management)是AWS提供的一项服务,用于安全管理用户、组、角色及其对AWS资源的访问权限。通过IAM,用户可以控制谁可以访问哪些自愿以及可以执行哪些操作。IAM也有一些关键的概念:
- 用户(Users):
- 用户是指在AWS账户中创建的具有唯一身份标识的实体,代表一个真实的个人或服务。每个用户都有自己的凭证(如用户名、密码、访问密钥等)
- 组(Groups):
- 组是用户的集合。可以将用户添加到组中,并为组分配权限策略。这样,组中的所有用户都继承该组的权限。这简化了权限管理,因为不需要逐个用户分配权限
- 角色(Roles):
- 角色是一种具有特定权限的身份,AWS资源(如EC2实例、Lambda函数)可以承担这些角色来临时获取权限。角色有助于在不同AWS服务之间进行安全的访问授权,而不需要长期的访问密钥
- 权限策略(Policies):
- 权限策略是JSON格式的文档,定义了允许或拒绝哪些操作和资源。策略可以附加到用户、组或角色,控制其权限。策略的基本组成部分包括动作(Action)、资源(Resource)和条件(Condition)
题目场景
Leading telecoms provider Forela uses AWS S3 as an essential part of their infrastructure. They can deploy applications quickly and do effective analytics on their sizable dataset thanks to it acting as both an application storage and a data lake storage. Recently, a user reported an urgent issue to the helpdesk: an inability to access files within a designated S3 directory. This disruption has not only impeded critical operations but has also raised immediate security concerns. The urgency of this situation demands a security-focused approach. Reports of a misconfigured S3 Bucket policy for the forela-fileshare bucket, resulting in unintended public access, highlight a potential security vulnerability that calls for immediate corrective measures. Consequently, a thorough investigation is paramount.
领先的电信提供商 Forela 将 AWS S3 作为其基础设施的重要组成部分。他们可以快速部署应用程序,并对其庞大的数据集进行有效的分析,这要归功于它既充当应用程序存储又充当数据湖存储。最近,一位用户向服务台报告了一个紧急问题:无法访问指定 S3 目录中的文件。这种中断不仅阻碍了关键行动,而且还引发了直接的安全问题。这种情况的紧迫性要求采取以安全为重点的办法。有报告称,forela-fileshare 存储桶的 S3 存储桶策略配置错误,导致意外的公共访问,突出显示了一个潜在的安全漏洞,需要立即采取纠正措施。因此,彻底的调查至关重要。
题目提供了一个压缩包附件 解压后目录结构如下
.
├── af-south-1
├── ap-northeast-1
│ ├── 02
│ └── 03
├── ap-northeast-2
│ ├── 02
│ └── 03
├── ap-south-1
│ ├── 02
│ └── 03
├── ap-southeast-1
│ ├── 02
│ └── 03
├── ap-southeast-2
│ ├── 02
│ └── 03
├── ca-central-1
│ ├── 02
│ └── 03
├── eu-central-1
│ ├── 02
│ └── 03
├── eu-north-1
│ ├── 02
│ └── 03
├── eu-south-1
├── me-south-1
│ └── 02
├── sa-east-1
│ ├── 02
│ └── 03
├── us-east-1
│ ├── 02
│ └── 03
├── us-east-2
│ ├── 02
│ └── 03
├── us-west-1
│ ├── 02
│ └── 03
└── us-west-2
├── 02
└── 03
44 directories
其中每一级目录存放着大量json格式的CloudTrail日志文件,如949622803460_CloudTrail_us-west-2_20231103T0620Z_IPcCcUaN66ZeGDcn.json
,总共有2390个json文件
准备
面对如此之多的json文件,我们需要预先做一些处理方便我们进行分析
合并json
jq是一个用于解析、查询、筛选、转换和格式化JSON数据的命令行工具,它提供了一种类似于XPATH或SQL的查询语言,可以用它来操作JSON数据,类似于使用sed、awk和grep处理文本数据。
这里我们使用它来合并所有json文件到merged.json
jq -s '.' **/*.json > merged.json
这里的-s
参数会将每个json文件作为一个单独的对象读入到一个数组中
ls -lh merged.json
-rw-r--r-- 1 null staff 53M null 25 17:40 merged.json
接下来 我们逐步提取这个merged.json中的关键信息到文件 方便后续进行分析
解题
Task 1
What was the originating IP address the Threat Actor (TA) used to infiltrate the Forela’s AWS account?
威胁行为者(TA)用来侵入Forela的AWS账户的源IP地址是什么?
对于AWS的攻击,攻击者可能会选用一些自动化的工具,如PACU、ScoutSuite、CloudSploit等工具,在没有进行伪造的情况下这些工具一定有明显的指纹特征
提取UA
jq '.[] | .Records | .[] | .userAgent' merged.json > useragent.out
通过.[]
展开JSON数组取出其中的Records
数组进一步展开然后提取userAgent
元素
cat useragent.out | sort | uniq > useragent.txt
对useragent.out文件去重 放到useragent.txt中
"APN/1.0 HashiCorp/1.0 Terraform/1.5.6 (+https://www.terraform.io) terraform-provider-aws/4.67.0 (+https://registry.terraform.io/providers/hashicorp/aws) aws-sdk-go/1.44.261 (go1.19.8; freebsd; amd64)"
"APN/1.0 HashiCorp/1.0 Terraform/1.5.6 aws-sdk-go/1.44.122 (go1.20.8; freebsd; amd64)"
"AWS Internal"
"Boto3/1.10.2 Python/3.8.0 Linux/4.14.138-99.102.amzn2.x86_64 exec-env/AWS_Lambda_python3.8 Botocore/1.13.2 Botocore/1.31.49"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0"
"[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36]"
"[Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0]"
"[Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0]"
"[S3Console/0.4, aws-internal/3 aws-sdk-java/1.12.488 Linux/5.10.196-163.744.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.372-b08 java/1.8.0_372 vendor/Oracle_Corporation cfg/retry-mode/standard]"
"[S3Console/0.4, aws-internal/3 aws-sdk-java/1.12.488 Linux/5.10.197-164.748.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.372-b08 java/1.8.0_372 vendor/Oracle_Corporation cfg/retry-mode/standard]"
"[aws-cli/2.0.30 Python/3.7.7 Windows/10 botocore/2.0.0dev34]"
"[aws-cli/2.12.0 Python/3.11.4 Linux/6.3.0-kali1-cloud-amd64 source/x86_64.kali.2023 prompt/off command/s3.cp]"
"[curl/7.81.0]"
"[curl/7.88.1]"
"[python-requests/2.31.0]"
"access-analyzer.amazonaws.com"
"aws-cli/2.0.30 Python/3.7.7 Windows/10 botocore/2.0.0dev34"
"aws-cli/2.12.0 Python/3.11.4 Linux/6.3.0-kali1-cloud-amd64 source/x86_64.kali.2023 prompt/off command/ec2.describe-instances"
"aws-cli/2.12.0 Python/3.11.4 Linux/6.3.0-kali1-cloud-amd64 source/x86_64.kali.2023 prompt/off command/iam.create-access-key"
"aws-cli/2.12.0 Python/3.11.4 Linux/6.3.0-kali1-cloud-amd64 source/x86_64.kali.2023 prompt/off command/iam.list-users"
"aws-internal/3 aws-sdk-java/1.12.571 Linux/5.10.196-163.744.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.392-b08 java/1.8.0_392 vendor/Oracle_Corporation cfg/retry-mode/standard"
"aws-internal/3 aws-sdk-java/1.12.571 Linux/5.10.197-164.748.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.392-b08 java/1.8.0_392 vendor/Oracle_Corporation cfg/retry-mode/standard"
"cloudtrail.amazonaws.com"
"resource-explorer-2.amazonaws.com"
"s3.amazonaws.com"
在去重后的结果中 我们发现可能属于攻击的工具UA为aws-cli/2.12.0 Python/3.11.4 Linux/6.3.0-kali1-cloud-amd64
这可以作为我们的重要依据
提取源IP
jq '.[] | .Records | .[] | "\(.sourceIPAddress) \(.userAgent)"' merged.json
同时提取sourceIPAddress和userAgent 并过滤kali
得到的54.242.59.197的确是这题正确的flag
思考
这个题让我意识到aws-cli工具的指纹并不是硬编码,而是通过动态收集系统环境信息来生成的User Agent,其中包含了CLI版本、Python版本、操作系统和内核版本等信息。当然,这样的方法是为了能够准确反映出CLI的运行环境,帮助AWS进行监控、安全审核和故障排查
从渗透的角度来说,使用kali、parrot等操作系统来运行aws-cli可能不是一个合适的做法,使用docker可能会更安全
相对应的,自动化的AWS渗透工具,在不自行修改相关特征编译的情况下,所携带的指纹会更加突兀
不用pacu✅ 用kali❎
Task 2
What was the time, filename, and Account ID of the first recorded s3 object accessed by the TA?
威胁行为者第一次访问S3对象的时间、文件名和账户ID是什么?
有了攻击者的IP,我们需要看的日志条目自然就少了很多。通过select语法过滤源IP为攻击者IP的事件
筛选攻击事件
筛选所有
jq '.Records | .[] | select(.sourceIPAddress=="54.242.59.197")' all.json | jq -s 'sort_by(.eventTime)' > activities.json
然后筛选Getobject事件
jq 'select(.eventName == "GetObject")' activities.json > attack-getobject.json
排序
最后再根据时间排序
jq -s 'sort_by(.eventTime)' attack-getobject.json
排序后的第一起事件就是这道题所对应的
[
{
"eventVersion": "1.09",
"userIdentity": {
"type": "AWSAccount",
"principalId": "",
"accountId": "anonymous"
},
"eventTime": "2023-11-02T14:52:03Z",
"eventSource": "s3.amazonaws.com",
"eventName": "GetObject",
"awsRegion": "us-east-1",
"sourceIPAddress": "54.242.59.197",
"userAgent": "[curl/7.88.1]",
"requestParameters": {
"bucketName": "forela-fileshare",
"Host": "forela-fileshare.s3.amazonaws.com",
"key": "_restricted/Priv-Keys/prod-EC2-readonly_accessKeys.csv"
},
"responseElements": null,
"additionalEventData": {
"bytesTransferredIn": 0,
"x-amz-id-2": "JUIol8m+Mh2nEpgzDbo9lsn00ZSz1aEeS/H6GZxzZqIkhiB0+LV0Dp8OQYxxKjCZVNdHKqQY4l3PglJsRIV93O5hJajBZARxgG5iFJNrX/Q=",
"bytesTransferredOut": 99
},
"requestID": "G3X38CFCQH64630V",
"eventID": "6394c764-88b2-4b8a-9166-3a7b2208f1cf",
"readOnly": true,
"resources": [
{
"type": "AWS::S3::Object",
"ARN": "arn:aws:s3:::forela-fileshare/_restricted/Priv-Keys/prod-EC2-readonly_accessKeys.csv"
},
{
"accountId": "949622803460",
"type": "AWS::S3::Bucket",
"ARN": "arn:aws:s3:::forela-fileshare"
}
]
拼接相关字段后得到2023-11-02T14:52:03Z,prod-EC2-readonly_accessKeys.csv,anonymous
就是这题的答案
思考
手动进行日志分析需要一些经验 通过jq工具能够很好的根据条件筛选并排序我们需要的东西
以下是对Amazon S3的常见操作及其在AWS CloudTrail日志中记录的事件名称的列表:
操作描述 | 事件名称(Event Name) |
---|---|
创建存储桶 | CreateBucket |
删除存储桶 | DeleteBucket |
列出存储桶中的对象 | ListObjects |
获取存储桶策略 | GetBucketPolicy |
设置存储桶策略 | PutBucketPolicy |
删除存储桶策略 | DeleteBucketPolicy |
上传对象 | PutObject |
获取对象(下载) | GetObject |
删除对象 | DeleteObject |
列出多版本对象 | ListObjectVersions |
列出存储桶 | ListBuckets |
启用存储桶版本控制 | PutBucketVersioning |
禁用存储桶版本控制 | PutBucketVersioning |
获取对象标签 | GetObjectTagging |
设置对象标签 | PutObjectTagging |
删除对象标签 | DeleteObjectTagging |
复制对象 | CopyObject |
还原对象(从 Glacier) | RestoreObject |
初始化多部分上传 | CreateMultipartUpload |
上传多部分对象 | UploadPart |
完成多部分上传 | CompleteMultipartUpload |
列出多部分上传 | ListMultipartUploads |
中止多部分上传 | AbortMultipartUpload |
获取存储桶生命周期配置 | GetBucketLifecycle |
设置存储桶生命周期配置 | PutBucketLifecycle |
删除存储桶生命周期配置 | DeleteBucketLifecycle |
获取存储桶加密配置 | GetBucketEncryption |
设置存储桶加密配置 | PutBucketEncryption |
获取对象ACL | GetObjectAcl |
设置对象ACL | PutObjectAcl |
获取存储桶CORS配置 | GetBucketCors |
设置存储桶CORS配置 | PutBucketCors |
删除存储桶CORS配置 | DeleteBucketCors |
获取存储桶事件通知配置 | GetBucketNotification |
设置存储桶事件通知配置 | PutBucketNotification |
删除存储桶事件通知配置 | DeleteBucketNotification |
获取存储桶日志记录配置 | GetBucketLogging |
设置存储桶日志记录配置 | PutBucketLogging |
获取存储桶请求支付配置 | GetBucketRequestPayment |
设置存储桶请求支付配置 | PutBucketRequestPayment |
获取存储桶静态网站托管配置 | GetBucketWebsite |
设置存储桶静态网站托管配置 | PutBucketWebsite |
删除存储桶静态网站托管配置 | DeleteBucketWebsite |
Task 3
How many Access Keys were compromised, at a minimum?
至少有多少个访问密钥被泄露?
对于S3的攻击,泄露密钥肯定最终是通过文件,获取文件我们已经知道了,CloudTrail记录的事件类型一定是GetObject
提取GetObject
那么我们筛选所有GetObject事件
jq '.[] | select(.eventName == "GetObject")' activities.json > getobject.json
提取ARN
接着我们提取resources列表中的ARN字段
jq '.resources | .[] | .ARN' getobject.json > arn.out
接着处理arn.out 过滤keys关键字 结果去重
cat arn.out |awk -F: "{print $6}"|grep -i keys|sort|uniq
"arn:aws:s3:::forela-fileshare/_restricted/Priv-Keys/prod-EC2-readonly_accessKeys.csv"
"arn:aws:s3:::forela-fileshare/_restricted/Priv-Keys/prod-IAM-readonly_accessKeys.csv"
"arn:aws:s3:::forela-fileshare/_restricted/Priv-Keys/prod-S3-readonly_accessKeys.csv"
"arn:aws:s3:::forela-fileshare/_restricted/Priv-Keys/prod-VPC-readonly_accessKeys.csv"
"arn:aws:s3:::forela-fileshare/projects/Vendor-IAM_Role_Enhancement/PendingTest/dev-access-auditor_accessKeys.csv"
"arn:aws:s3:::forela-fileshare/projects/Vendor-IAM_Role_Enhancement/PendingTest/dev-alerting-analyst_accessKeys.csv"
"arn:aws:s3:::forela-fileshare/projects/Vendor-IAM_Role_Enhancement/PendingTest/dev-policy-specialist_accessKeys.csv"
7条结果 也正是这道题的答案
思考
这道题主要思路是提取所有GetObject事件 再从中提取ARN字段 那么ARN究竟是什么呢
ARN(Amazon Resource Name)是用于唯一标识AWS资源的命名规范。它们在AWS中用于准确地指定和引用各种资源,确保在跨账户、跨区域和跨服务的环境中能够明确地标识出特定的资源。
本质上ARN有如下作用:
- 唯一标识资源:
• 每个ARN在AWS中是唯一的,它确保了在复杂和分布式的AWS环境中可以明确地引用特定的资源。 - 权限管理:
• ARN在IAM(Identity and Access Management)策略中广泛使用,用于定义哪些用户或角色可以访问哪些具体的资源。例如,你可以编写IAM策略来允许某个用户读取特定的S3存储桶中的对象,这个对象由其ARN唯一标识。 - 日志和审计:
• CloudTrail等日志服务使用ARN来记录对资源的访问和操作。这有助于审计和追踪具体的操作,确保安全和合规。 - 跨服务调用:
• 在AWS服务之间进行调用时,ARN用于指定目标资源。例如,Lambda函数可以使用ARN来指定需要访问的S3对象或DynamoDB表
上也就是说ARN可以记录下aws的所有操作事件 这里联想到了bypass CloudTrail 具体方式会在后面讨论
Task 4
The TA executed a command to filter EC2 instances. What were the name and value used for filtering?
威胁行为者执行了一个命令来过滤EC2实例。用于过滤的名称和值是什么?
过滤EC2实例的命令通常需要调用DescribeInstances
API,所以我们可以先过滤出所有eventName为DescribeInstances
的事件
过滤DescribeInstances事件
jq '.[] | select(.eventName == "DescribeInstances")' activities.json
只有一条结果有name和value两个字段
"eventTime": "2023-11-02T15:05:58Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "DescribeInstances",
"awsRegion": "us-east-2",
"sourceIPAddress": "54.242.59.197",
"userAgent": "aws-cli/2.12.0 Python/3.11.4 Linux/6.3.0-kali1-cloud-amd64 source/x86_64.kali.2023 prompt/off command/ec2.describe-instances",
"requestParameters": {
"instancesSet": {},
"filterSet": {
"items": [
{
"name": "instance-state-name",
"valueSet": {
"items": [
{
"value": "running"
}
]
}
}
]
}
}
还原操作命令
根据日志 我们能还原出TA使用aws-cli执行的命令
aws ec2 describe-instances --region us-east-2 --filters "Name=instance-state-name,Values=running"
这条命令得到了所有状态为正在运行的EC2实例
Task 5
Can you provide the count of unsuccessful discovery and privilege escalation attempts made by the TA before gaining elevated access with the compromised keys?
你能提供威胁行为者在使用被盗密钥获得提升权限之前进行的未成功的发现和权限提升尝试的次数吗?
未成功的的操作一定会记录下对应的errorMessage,所以我们先进行过滤
过滤errorMessage
jq '.[] | .errorMessage' activities.json > error.out
然后我们查看error.out 排除null查看数据条数
cat error.out |grep -v "null"|nl
最后得到42条数据 也就是这道题的答案
Task 6
Which IAM user successfully gained elevated privileges in this incident?
哪个 IAM 用户在此次事件中成功获得了提升的权限?
aws中的权限对应的是policy策略,要实现权限提升就需要添加用户策略,所以可以先过滤PutUserPolicy事件
过滤PutUserPolicy事件
jq '.[] | select(.eventName == "PutUserPolicy")' activities.json
{
"eventVersion": "1.08",
"userIdentity": {
"type": "IAMUser",
"principalId": "AIDA52GPOBQCG3LZF5EYW",
"arn": "arn:aws:iam::949622803460:user/dev-policy-specialist",
"accountId": "949622803460",
"accessKeyId": "AKIA52GPOBQCMBGZADBX",
"userName": "dev-policy-specialist"
},
"eventTime": "2023-11-02T15:21:32Z",
"eventSource": "iam.amazonaws.com",
"eventName": "PutUserPolicy",
"awsRegion": "us-east-1",
"sourceIPAddress": "54.242.59.197",
"userAgent": "Boto3/1.10.2 Python/3.8.0 Linux/4.14.138-99.102.amzn2.x86_64 exec-env/AWS_Lambda_python3.8 Botocore/1.13.2 Botocore/1.31.49",
"requestParameters": {
"userName": "dev-policy-specialist",
"policyName": "sbhyy79zky",
"policyDocument": "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\",\"Action\": \"*\",\"Resource\": \"*\"}]}"
},
"responseElements": null,
"requestID": "b9f84080-e9a7-4d91-a8b2-8b79c3a8d241",
"eventID": "eed211e3-9c53-4157-86cc-8e5f7e10d7fb",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "949622803460",
"eventCategory": "Management",
"tlsDetails": {
"tlsVersion": "TLSv1.2",
"cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
"clientProvidedHostHeader": "iam.amazonaws.com"
}
}
可以看到dev-policy-specialist
用户添加了sbhyy79zky
策略,策略内容为允许对所有资源执行所有操作
"requestParameters": {
"userName": "dev-policy-specialist",
"policyName": "sbhyy79zky",
"policyDocument": "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\",\"Action\": \"*\",\"Resource\": \"*\"}]}"
}
那么dev-policy-speciallist
也就是这道题的答案
还原操作命令
aws iam put-user-policy \
--user-name dev-policy-specialist \
--policy-name sbhyy79zky \
--policy-document '{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "*","Resource": "*"}]}'
Task 7
Which event name permitted the threat actor to generate an admin-level policy?
哪个事件名称允许威胁行为者生成管理员级别的策略?
对应的就是PutUserPolicy事件
Task 8
What is the name and statement of the policy that was created that gave a standard user account elevated privileges?
创建的赋予普通用户账户提升权限的策略的名称和声明是什么?
对应的也是刚刚得到的事件 sbhyy79zky,[{"Effect": "Allow","Action": "","Resource": ""}]
Task 9
What was the ARN (Amazon Resource Name) used to encrypt the files?
用于加密文件的 ARN(Amazon Resource Name)是什么?
userIdentity字段描述了发起请求的用户身份信息 那我们先提取dev-policy-specialist相关的userIdentity信息
jq '.[] | select(.userIdentity.userName == "dev-policy-specialist")' activities.json > dev-policy-specialist.json
在aws中,AWS Key Management Service (KMS) 一般被用作文件加密
提取的userIdentity信息中有如下字段
"x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:263954014653:key/mrk-85e24f85d964469cba9e4589335dd0f4"
其中的arn也是这道题的答案
Task 10
What was the name of the file that the TA uploaded to the S3 bucket?
风险行为者上传到 S3 存储桶的文件名称是什么?
前面我们已经学习了,aws上传文件对应的事件是PutObject 那我们直接提取
jq '.[] | select(.eventName == "PutObject")' activities.json
其中我们就可以直接提取到上传的文件
Task 11
Which IAM user account did the TA modify in order to gain additional persistent access?
风险行为者修改了哪个 IAM 用户账户以获得额外的持久访问权限?⬤
TA为forela-admin用户创建了AccessKey
Task 12
What action was the user not authorized to perform to view or download the file in the S3 bucket?
用户未被授权执行哪些操作以查看或下载 S3 存储桶中的文件?
从日志中看出未被授权一定是攻击者尝试执行了相关命令 返回了错误信息 所以我们可以返回去看前面提取的errorMessage
json的层级已经乱了 我们还是看原始的合并后的json 直接过滤errorMessage 在其中发现只有kms:Decrypt权限与文件读取有关系
kms:Decrypt权限是用于读取加密文件的