MazeSec Merge靶机设计流程

发布于: 2026-05-23 00:53

攻击链

命令注入(www-data)

opt目录泄露mono密码(www-data>mono)

sudo -u lnnn PATH劫持(mono>lnnn)

/opt/admin/ 目录放置 admin 用户suid curl(lnnn>admin)

/etc/group可写(admin>sudo组+已知密码=任意命令执行 或 disk 组提权)

流程图

基础环境

安装环境

apt update
apt install -y nginx php-fpm

创建 mono、lnnn、admin用户

# 创建用户mono
useradd -m -s /bin/bash mono
# 生成密码
openssl rand -base64 18
0ysP8axqGSAkvXnkvxxukVnz
# 设置密码(手动输入上面生成的密码)
passwd mono

# 创建用户lnnn
useradd -m -s /bin/bash lnnn
# 生成密码
openssl rand -base64 18
vdvv2HGFv7tVEXNXqqaQh2Sl
passwd lnnn


# 创建用户
useradd -m -s /bin/bash admin
# 生成密码
openssl rand -base64 18
eF27DvosNkei1RyqDzF8IkL7
passwd admin


# 生成密码
openssl rand -base64 18
7NIKKVqcuzE3UkYLVlqSTLZ7
# 修改root密码
passwd

修改主机名

hostname="Merge"
hostnamectl set-hostname $hostname
cat >/etc/hosts <<EOF
127.0.0.1   localhost
127.0.1.1   $hostname
::1         localhost ip6-localhost ip6-loopback
EOF
su

配置 Web 环境

创建目录结构

mkdir -p /var/www/html
mkdir -p /var/www/tool/.nali
chown -R www-data:www-data /var/www

# 下载nali工具(检查最新版本)
wget "https://ghfile.geekertao.top/https://github.com/zu1k/nali/releases/download/v0.8.1/nali-linux-amd64-v0.8.1.gz" -O /tmp/nali.gz
gunzip /tmp/nali.gz

# 移动到tool目录
mv /tmp/nali /var/www/tool/nali
chmod +x /var/www/tool/nali
chmod 755 /var/www/tool/nali
chown www-data:www-data /var/www/tool/nali

# 下载nali数据库(qqwry.dat)
wget https://ghfile.geekertao.top/https://github.com/FW27623/qqwry/releases/download/2024-09-25/qqwry.dat -O /tmp/qqwry.dat
cp /tmp/qqwry.dat /var/www/tool/.nali/qqwry.dat
chown www-data:www-data /var/www/tool/.nali/qqwry.dat

# 检查PHP socket路径
ls /var/run/php/  # 查看PHP版本,记下socket文件名,例如 php8.4-fpm.sock

配置Nginx(手动编辑 /etc/nginx/sites-available/default)

vim /etc/nginx/sites-available/default

Nginx配置参考:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    # 添加index.php
    index index.php index.html;
    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;  # 根据实际socket文件名修改
    }
}
# 测试Nginx配置
nginx -t

# 重启Nginx
systemctl restart nginx
systemctl enable nginx

创建漏洞 Web 页面

# 创建index.php
vim /var/www/html/index.php

index.php内容:

<?php
putenv('NALI_DB_IP4=qqwry');
putenv('NALI_HOME=/var/www/tool/.nali');
$output = '';
$error = '';
$input_val = '';
$blacklist = [' ', ';', '&', '|', '$','`'];
if (isset($_POST['ip']) && $_POST['ip'] !== '') {
    $input_val = $_POST['ip'];
    $input = $_POST['ip'];
    foreach ($blacklist as $char) {
        if (strpos($input, $char) !== false) {
            $error = 'Invalid characters detected';
            break;
        }
    }
    if ($error === '') {
        $cmd = '/var/www/tool/nali ' . $input . ' 2>&1';
        $output = shell_exec($cmd);
        if ($output === null || $output === '') {
            $error = 'Query failed or no result';
        }
    }
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>离线IP地址查询</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{background:#0d1117;color:#c9d1d9;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;display:flex;justify-content:center;align-items:center;min-height:100vh;flex-direction:column}
.main{width:100%;max-width:600px;padding:2rem;display:flex;flex-direction:column;align-items:center;justify-content:center;margin-top:-8vh}
.form-group{width:100%;display:flex;gap:0.5rem}
.form-group input{flex:1;background:#161b22;border:1px solid #30363d;border-radius:6px;padding:0.75rem 1rem;color:#c9d1d9;font-size:0.95rem;outline:none;transition:border-color 0.2s}
.form-group input:focus{border-color:#58a6ff}
.form-group button{background:#238636;color:#fff;border:none;border-radius:6px;padding:0.75rem 1.5rem;font-size:0.9rem;cursor:pointer;transition:background 0.2s;white-space:nowrap}
.form-group button:hover{background:#2ea043}
.result{width:100%;margin-top:1.5rem;padding:1rem;border-radius:6px;min-height:3rem}
.result-success{background:#161b22;border:1px solid #238636}
.result-error{background:#161b22;border:1px solid #da3633;color:#f85149}
.result pre{font-size:0.9rem;white-space:pre-wrap;word-break:break-all}
.placeholder-result{width:100%;margin-top:1.5rem;min-height:3rem;visibility:hidden}
.footer{position:fixed;bottom:0;left:0;right:0;padding:1.5rem 0;text-align:center;width:100%}
.footer a{display:inline-block;font-size:0.7rem;color:#8b949e;border:1px solid #30363d;padding:2px 8px;border-radius:12px;letter-spacing:0.5px;text-decoration:none;transition:color 0.2s,border-color 0.2s}
.footer a:hover{color:#58a6ff;border-color:#58a6ff}
</style>
</head>
<body>
<div class="main">
<form class="form-group" method="POST" action="">
<input type="text" name="ip" id="ipInput" placeholder="输入IP地址查询" value="<?php echo htmlspecialchars($input_val); ?>" autofocus>
<button type="submit">查询</button>
</form>
<?php if ($error !== ''): ?>
<div class="result result-error"><pre><?php echo htmlspecialchars($error); ?></pre></div>
<?php elseif ($output !== ''): ?>
<div class="result result-success"><pre><?php echo htmlspecialchars(trim($output)); ?></pre></div>
<?php else: ?>
<div class="placeholder-result"></div>
<?php endif; ?>
</div>
<div class="footer">
<a href="https://maze-sec.com" target="_blank">maze-sec</a>
</div>
<script>
document.addEventListener('keydown', function(e) {
    if (e.key === '/' && document.activeElement !== document.getElementById('ipInput')) {
        e.preventDefault();
        document.getElementById('ipInput').focus();
    }
});
</script>
</body>
</html>
# 设置权限
chown www-data:www-data /var/www/html/index.php
chmod 644 /var/www/html/index.php

opt目录密码泄露

echo 'mono:0ysP8axqGSAkvXnkvxxukVnz' > /opt/pass.txt
chmod 644 /opt/pass.txt

部署dirty_merge

# 克隆 Dirty-Merge
mkdir /opt/Dirty-Merge
cd /opt/Dirty-Merge
wget 192.168.6.156/dirty_merge -O dirty_merge
wget 192.168.6.156/ethtool -O ethtool
wget 192.168.6.156/gro_fragnesia.c -O gro_fragnesia.c
vim README.md
chmod +x dirty_merge ethtool
mv ethtool /usr/local/bin/ethtool

sudo -u lnnn path劫持

# 添加sudo权限
vim /etc/sudoers.d/mono

内容:

Defaults env_keep += "PATH"
Defaults !secure_path
mono ALL=(lnnn) NOPASSWD: /opt/Dirty-Merge/dirty_merge

权限收紧

chmod 700 /etc/sudoers.d

放置flag

echo 'flag{user-b67448e8af484d5f8958f307b3d57f09}' > /home/lnnn/user.txt
chown lnnn:lnnn /home/lnnn/user.txt
chmod 600 /home/lnnn/user.txt

suid跳板curl

通过 admin 用户的 suid curl实现 lnnn>admin

mkdir -p /opt/admin
chown admin:lnnn /opt/admin
chmod 750 /opt/admin
cp $(which curl) /opt/admin/curl
chown admin:admin /opt/admin/curl
sudo -u admin chmod +s /opt/admin/curl

printf "\033[1;32m关注详细的参数帮助信息\033[0m\n" > /opt/admin/hint.txt
printf "\033[1;32mFocus on the detailed parameter help information\033[0m\n" >> /opt/admin/hint.txt

printf "\033[1;32mman,what can i do\033[0m\n" > /home/admin/hint.txt

修改group配置权限

chown root:admin /etc/group
chmod 664 /etc/group

放置flag

flag{user-b67448e8af484d5f8958f307b3d57f09}
flag{root-1b5f527b85d84d80816879c8044b0ea9}
echo 'flag{root-1b5f527b85d84d80816879c8044b0ea9}' > /root/root.txt

清理痕迹

# 清理痕迹
rm -rf /tmp/*
# 清理 root 家目录下的临时文件
rm -f /root/.lesshst
rm -f /root/.viminfo
# 清理apt缓存
apt clean
# 清理日志
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \;