内容简介:译者注:本文将出现大量AWS官方词汇,对于一些中文字面意思难以理解的词汇,为便于读者理解将在首次出现时同时给出中英词汇,方便读者在AWS官方文档中查阅。(本文,我们“
译者注:本文将出现大量AWS官方词汇,对于一些中文字面意思难以理解的词汇,为便于读者理解将在首次出现时同时给出中英词汇,方便读者在AWS官方文档中查阅。( 中文文档 与 英文文档 )
本文,我们“ Advanced Web Hacking ”培训课程的首席培训师 Sunil Yadav 将讨论一个案例研究:识别并利用一种服务器端请求伪造(SSRF)漏洞来访问敏感数据(例如源代码)。此外,该博客还讨论了可能导致(使用持续部署管道,即Continuous Deployment pipeline)部署在AWS Elastic Beanstalk上应用程序远程代码执行(RCE)的风险点。
AWS Elastic Beanstalk
AWS Elastic Beanstalk(译者注:官方译为平台即服务技术,通常以英文原文出现,故不作翻译)是AWS提供的一款平台即服务(PaaS)产品,主要用于部署和扩展各种开发环境的Web应用程序(如Java,.NET,PHP,Node.js,Python,Ruby和 Go 等)。它支持自动化的部署,容量分配,负载均衡,自动扩展(auto-scaling)和应用程序运行状况监视。
准备环境
AWS Elastic Beanstalk支持Web服务器(Web Server)和工作线程(Worker)两种环境配置。
- Web服务器环境 – 主要适合运行Web应用程序或Web API。
- 工作线程环境 – 适合后台工作,长时间运行的流程。
在zip或war文件中提供有关应用程序,环境和上传应用程序代码的信息来配置新应用程序。
图1:创建Elastic Beanstalk环境
新环境配置后,AWS会自动创建S3存储桶(Storage bucket)、安全组、EC2实例以及 aws-elasticbeanstalk-ec2-role ( 默认实例配置文件,按照默认权限被映射到EC2实例)。<br />从用户计算机部署代码时,zip文件中的源代码副本将被放入名为 elasticbeanstalk – region-account-id 的S3存储桶中。
图2:Amazon S3存储桶
Elastic Beanstalk默认不加密其创建的Amazon S3存储桶。这意味着默认情况下,对象以未加密的形式存储在桶中(并且只能由授权用户访问)。详见: https : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.S3.html 默认实例配置文件的托管策略 – aws-elasticbeanstalk-ec2-role:
- AWSElasticBeanstalkWebTier – 授予应用程序将上传日志和调试信息分别上传至Amazon S3和AWS X-Ray的权限。
- AWSElasticBeanstalkWorkerTier – 授予日志上传,调试,指标发布(metric publication)和Woker实例任务的权限,其中包括队列管理,领导选择(leader election)和定期任务。
- AWSElasticBeanstalkMulticontainerDocker – 授予Amazon Elastic容器服务协调集群任务的权限。
策略“ AWSElasticBeanstalkWebTier ”允许对S3存储桶有限的列取,读取和写入权限。只有名称以“ elasticbeanstalk- ” 开头且有递归访问权限的存储桶才能被访问。
图3:托管策略 – “AWSElasticBeanstalkWebTier”
详见: https : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.html
分析
在日常渗透测试中,我们遇到了某应用程序的服务器端请求伪造(SSRF)漏洞。通过对外部域进行 DNS调用 (译者注:属于带外攻击OOB一种)确认漏洞,并通过访问仅允许localhost访问的“http://localhost/server-status”进一步验证漏洞,如下面的图4所示。 http://staging.xxxx-redacted-xxxx.com/view_pospdocument.php?doc=http://localhost/server-status
图4:通过访问受限页面确认SSRF
在SSRF确认存在后,我们(使用 https://ipinfo.io 等服务)通过服务器指纹识别确认服务提供商为亚马逊。此后,我们尝试通过多个端点查询 AWS元数据 ,例如:
- http://169.254.169.254/latest/dynamic/instance-identity/document
- http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role
通过API“ http://169.254.169.254/latest/dynamic/instance-identity/document”中获取帐户ID和地区信息:
图5:AWS元数据-获取帐户ID和地区信息
图6:AWS元数据-获取访问密钥ID、加密访问密钥和令牌
注意:“ aws-elasticbeanstalk-ec2-role” 中 IAM安全凭证表示应用程序部署在Elastic Beanstalk上。<br />我们进一步在AWS命令行界面(CLI)中配置,如图7所示:
图7:配置AWS命令行界面
“aws sts get-caller-identity”命令的输出表明令牌有效,如图8所示:
图8:AWS CLI输出:get-caller-identity
到目前位置,一切顺利,可以确定这是个标准的SSRF漏洞。不过好戏还在后头…..我们好好发挥下:最初,我们尝试使用AWS CLI运行多个命令来从AWS实例获取信息。但是如下面的图9所示,由于安全策略,大多数命令被拒绝访问:
图9:ListBuckets操作上的访问被拒绝
之前介绍过托管策略“AWSElasticBeanstalkWebTier”只允许访问名称以“elasticbeanstalk”开头的S3存储桶:<br />因此,我们需要先知道存储桶名称,才能访问S3存储桶。Elastic Beanstalk创建了名为elasticbeanstalk-region-account-id的Amazon S3存储桶。我们使用之前获取的信息找到了存储桶名称,如图4所示。
- 地区:us-east-2
- 帐号:69XXXXXXXX79
存储桶名称为“ elasticbeanstalk- us-east-2-69XXXXXXXX79 ”。我们使用AWS CLI以递归方式列出它的桶资源: aws s3 ls s3//elasticbeanstalk-us-east-2-69XXXXXXXX79/
图10:列出Elastic Beanstalk的S3存储桶
我们通过递归下载S3资源来访问源代码,如图11所示。aws s3 cp s3:// elasticbeanstalk-us-east-2-69XXXXXXXX79 / / home / foobar / awsdata -recursive
图11:递归复制所有S3 Bucket Data
从SSRF到RCE
现在我们有权限将对象添加到S3存储桶中,我们通过AWS CLI向S3存储桶中上传一个 PHP 文件(zip文件里webshell101.php),尝试实现远程代码执行。然而并不起作用,因为更新的源代码未部署在EC2实例上,如图12和图13所示:
图12:在S3存储桶中通过AWS CLI上传webshell
图13:当前环境中Web Shell的404错误页面
我们围绕这个开展了一些实验并整理了一些可能导致RCE的潜在利用场景:
- 使用CI/CD AWS CodePipeline(持续集成/持续交付AWS管道)
- 重建现有环境
- 从现有环境克隆
- 使用S3存储桶URL创建新环境
使用CI/CD AWS CodePipeline:AWS管道是一种CI/CD服务,可(基于策略)在每次代码变动时构建,测试和部署代码。管道支持GitHub,Amazon S3和AWS CodeCommit作为源提供方和多个部署提供方(包括Elastic Beanstalk)。有关其工作原理可见 此处AWS官方博客 :
在我们的应用程序中,软件版本管理使用AWS Pipeline,S3存储桶作为源仓库,Elastic Beanstalk作为部署提供方实现自动化。首先创建一个管道,如图14 所示:
图14:管道设置
选择S3 bucket作为源提供方,S3 bucket name并输入对象键,如图15所示:
图15:添加源阶段
配置构建提供方或跳过构建阶段,如图16所示:
图16:跳过构建阶段
将部署提供方设置为Amazon Elastic Beanstalk并选择使用Elastic Beanstalk创建的应用程序,如图17所示:
图17:添加部署提供程序
创建一个新管道,如下面的图18所示:
图18:成功创建新管道
之后在S3存储桶中上传一个新文件(webshell)来执行系统命令,如图19所示:
图19:PHP webshell
在源提供方配置的对象中添加该文件,如图20所示:
图20:在对象中添加webshell
使用AWS CLI命令将存档文件上传到S3存储桶,如图21所示:
图21:S3存储桶中的Cope webshell
aws s3 cp 2019028gtB-InsuranceBroking-stag-v2.0024.zip s3://elasticbeanstalk-us-east-1-696XXXXXXXXX/
更新文件时,CodePipeline立即启动构建过程。如果一切正常,它将在Elastic Beanstalk环境中部署代码,如图22所示:
图22:管道触发
管道完成后,我们就可以访问Web shell并对系统执行任意命令,如图23所示。
图23:运行系统级命令
成功实现RCE! 重建现有环境 : 重建环境会终止删除、所有资源并创建新资源。因此,在这种情况下,它将从S3存储桶部署最新的可用源代码。最新的源代码包含部署的Web shell,如图24所示。
图24:重建现有环境
成功完成重建过程后,我们可以访问我们的webshell并在EC2实例上运行系统命令,如图25所示:
图25:从webshell101.php运行系统级命令
从现有环境克隆:如果应用程序所有者克隆环境,它将再次从S3存储桶中获取代码,该存储桶将部署一个带有Web shell的Web应用。克隆环境流程如图26所示:
图26:从现有环境克隆
创建新环境: 在创建新环境时,AWS提供了两个部署代码的选项,一个用于直接上传存档文件,另一个用于从S3存储桶中选择现有存档文件。通过选择S3存储桶选项并提供S3存储桶URL,将会使用最新的源代码进行部署。而被部署的最新源代码中含有Web shell。
参考文档:
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.html
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/iam-instanceprofile.html
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.S3.html
- https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html
- https://gist.github.com/BuffaloWill/fa96693af67e3a3dd3fb
- https://ipinfo.io
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- LWN:利用debounce buffer来阻止恶意设备利用DMA窃取信息
- 新医药 Leon Nanodrugs完成1850万欧元A轮融资,利用粒子合成方法提高药物利用率
- JNDI 注入利用工具
- Outlook滥用利用链
- tcache机制利用总结
- LFItoRCE利用总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux C编程一站式学习
宋劲杉 / 电子工业出版社 / 2009-12 / 60.00元
本书有两条线索,一条线索是以Linux平台为载体全面深入地介绍C语言的语法和程序的工作原理,另一条线索是介绍程序设计的基本思想和开发调试方法。本书分为两部分:第一部分讲解编程语言和程序设计的基本思想方法,让读者从概念上认识C语言;第二部分结合操作系统和体系结构的知识讲解程序的工作原理,让读者从本质上认识C语言。. 本书适合做零基础的初学者学习C语言的第一本教材,帮助读者打下牢固的基础。有一定......一起来看看 《Linux C编程一站式学习》 这本书的介绍吧!