菜单

Ghidra服务器

相关源文件

Ghidra 服务器提供了一个协作逆向工程环境,允许多个用户同时共享和处理 Ghidra 项目。它管理共享存储库,支持多种用户认证方法,并提供对项目数据的安全访问。本页面介绍 Ghidra 服务器的技术架构、配置和操作。

有关作为客户端连接到 Ghidra 服务器的信息,请参阅 Ghidra 文档。

架构概述

Ghidra 服务器基于 Java 的远程方法调用 (RMI) 框架构建,并采用 SSL/TLS 安全协议。服务器由几个关键组件组成,它们协同工作以提供对共享存储库的安全协作访问。

来源: Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java67-998

认证系统

服务器通过 AuthenticationModule 接口实现了一个模块化认证框架。每种认证方法都作为一个单独的模块实现。

认证过程如下:

  1. 客户端从服务器请求认证回调
  2. 服务器根据配置的认证模式返回相应的回调
  3. 客户端使用凭据填充回调
  4. 客户端将填充后的回调发送回服务器
  5. 服务器使用相应的模块进行认证
  6. 认证成功后,服务器返回一个存储库服务器句柄

来源

认证模式

Ghidra 服务器支持以下认证模式:

模式描述命令行选项
密码文件本地密码认证-a0
Active Directory通过 Kerberos 进行 AD 认证-a1 -d<domain>
PKI基于证书的认证-a2
JAAS可插拔认证框架-a4 -jaas <config_file>
SSH用于无头客户端的 SSH 密钥认证-ssh
匿名用户只读匿名访问-anonymous

来源: Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java89-117

客户端-服务器通信

Ghidra 服务器使用两个通道进行客户端-服务器通信:

  1. RMI/SSL(端口 13100-13101)- 用于控制操作、认证和元数据
  2. BlockStreamServer(端口 13102)- 用于高效传输二进制数据

来源: Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java232-265 Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java266-385

配置

Ghidra 服务器通过多种来源进行配置:

  1. server.conf - 服务器设置的主配置文件
  2. 命令行参数 - 服务器启动选项
  3. jaas.conf - 可选的 JAAS 认证配置

server.conf 中的关键配置选项

# JVM Memory settings
wrapper.java.initmemory=396
wrapper.java.maxmemory=768

# TLS/SSL Configuration
wrapper.java.additional.6=-Dghidra.tls.server.protocols=TLSv1.2;TLSv1.3
wrapper.java.additional.7=-Djdk.tls.server.cipherSuites="TLS_DHE_RSA_WITH_AES_256_GCM_SHA384\,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\,TLS_AES_256_GCM_SHA384"

# Repository location
ghidra.repositories.dir=./repositories

# Authentication mode
wrapper.app.parameter.1=-a0
wrapper.app.parameter.2=${ghidra.repositories.dir}

来源: Ghidra/RuntimeScripts/Common/server/server.conf1-262

命令行选项

最重要的命令行选项包括:

选项描述
-a#认证模式(0=密码,1=AD,2=PKI,4=JAAS)
-p#基本端口号(默认为 13100)
-ip <hostname>远程访问主机名
-i <ip>接口绑定地址
-d<domain>Active Directory 域名
-e<days>密码过期天数
-u允许用户指定用户名
-ssh启用 SSH 认证
-anonymous启用匿名访问
<repository_path>存储库目录路径

来源: Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java84-86 Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/ServerHelp.txt1-58

服务器初始化

服务器初始化序列遵循以下步骤:

来源: Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java518-848

安全特性

Ghidra 服务器实施了多项安全措施:

  1. TLS/SSL 加密 - 所有通信都使用 TLS 协议和强密码套件进行加密

  2. 序列化过滤 - 通过强大的过滤机制防止反序列化攻击

  3. 认证 - 多种认证方法,安全级别可自定义

  4. 密码策略 - 可选的密码过期和重置要求

  5. 访问控制 - 对存储库进行细粒度访问控制

来源: Ghidra/Features/GhidraServer/src/main/java/ghidra/server/remote/GhidraServer.java880-996 Ghidra/Features/GhidraServer/data/serial.filter1-23

运行 Ghidra 服务器

Ghidra 服务器可以在两种模式下运行:

控制台模式

用于测试、调试或临时使用

ghidraSvr console

服务/守护进程模式

用于长期运行的生产部署

# Windows:
ghidraSvr install    # Install as service
ghidraSvr start      # Start service
ghidraSvr stop       # Stop service
ghidraSvr uninstall  # Remove service

# Linux/macOS:
svrInstall           # Install as daemon
svrAdmin             # Administration tool
svrUninstall         # Remove daemon

来源: Ghidra/RuntimeScripts/Common/server/svrREADME.md1-1095

服务器管理

svrAdmin 工具提供管理用户和存储库的行政功能

# User management
svrAdmin -add <username>            # Add user
svrAdmin -remove <username>         # Remove user
svrAdmin -reset <username>          # Reset password
svrAdmin -dn <username> <DN>        # Set user PKI certificate DN

# Repository management
svrAdmin -create <name> <owner>     # Create repository
svrAdmin -delete <name>             # Delete repository
svrAdmin -grant <repo> <user> <RW>  # Grant repository access
svrAdmin -revoke <repo> <user>      # Revoke repository access

# Server management
svrAdmin -clearCache                # Clear server cache
svrAdmin -fixUsers                  # Fix corrupted user database

来源: Ghidra/RuntimeScripts/Common/server/svrREADME.md300-325

内存考量

Ghidra 服务器在内存中维护存储库信息,这对于大型存储库可能是一个限制因素。内存使用量可以在 server.conf 中配置。

wrapper.java.maxmemory=768  # Maximum memory in MB

估算内存需求的公式

Required Memory (MB) = 16 + (32 * FileCount/10000) + (2 * ClientCount)

对于大型存储库,请适当增加此值。

来源: Ghidra/RuntimeScripts/Common/server/svrREADME.md112-141

故障排除

常见问题和解决方案

问题可能解决方案
服务器无法启动检查日志中的错误,验证存储库目录权限
认证失败验证用户名/密码或证书,检查认证模式
连接超时检查网络配置、防火墙设置、正确的主机名
存储库访问被拒绝验证用户在存储库 ACL 中具有适当权限
内存错误增加 server.conf 中的 wrapper.java.maxmemory

主要的日志文件是:

  • wrapper.log - 服务包装器日志(在 Ghidra 安装目录中)
  • server.log - 服务器应用程序日志(在存储库目录中)

来源: Ghidra/RuntimeScripts/Common/server/svrREADME.md103-111

SSH 用户认证

对于无头客户端,SSH 认证可以与密码认证一起配置

  1. 使用 -ssh 选项启用 SSH 认证
  2. 用户使用 ssh-keygen -m pem -t rsa -b 2048 生成 SSH 密钥
  3. 将公钥文件添加到 repositories/~ssh/<username>.pub

SSH 认证适用于无头分析客户端,但不适用于 GUI 客户端。

来源: Ghidra/RuntimeScripts/Common/server/svrREADME.md234-258

JAAS 认证

Java 认证和授权服务 (JAAS) 提供了一个灵活的认证框架

  1. 使用 -a4 -jaas <config_file> 选项进行配置
  2. jaas.conf 中定义认证模块
  3. 支持各种认证后端:
    • LDAP/Active Directory
    • PAM(在 Linux 上)
    • 外部程序/脚本

外部程序认证示例

来源: Ghidra/RuntimeScripts/Common/server/jaas.conf1-79 Ghidra/Features/GhidraServer/src/main/java/ghidra/server/security/loginmodule/ExternalProgramLoginModule.java81-344

结论

Ghidra 服务器通过其灵活的认证系统、安全通信和版本控制的存储库,为协作逆向工程提供了一个强大的平台。通过了解其架构和配置选项,您可以为您的团队部署和管理一个安全、可扩展的服务器环境。