文章

jmap和jcmd在渗透中的利用方式

jmap和jcmd在渗透中的利用方式

一、jmap和jcmd的简介

jmapjcmd 是 Java 开发工具包(JDK)中提供的两个命令行工具,用于与 Java 虚拟机(JVM)进行交互、诊断和监控。

jmap

jmap 是一个用于生成堆转储文件和查看堆内存使用情况的工具。它的主要功能包括:

  • 生成堆转储文件:可以使用 jmap 命令生成 Java 进程的堆转储文件,用于分析 Java 应用程序的内存使用情况和排查内存泄漏问题。
  • 查看堆内存使用情况:可以使用 jmap 命令查看 Java 进程的堆内存使用情况,包括堆大小、已使用内存、空闲内存等信息。

jcmd

jcmd 是一个用于向正在运行的 Java 进程发送诊断命令的工具。它的主要功能包括:

  • 列出 Java 进程:可以使用 jcmd 命令列出目标系统上正在运行的 Java 进程的进程 ID(PID)以及它们的主要参数和状态信息。
  • 执行诊断命令:可以向 Java 进程发送诊断命令,比如生成线程转储信息、执行垃圾回收、查看系统属性、检查 JVM 参数等。

二、渗透中jmap和jcmd的利用方式

1、利用jmap获取敏感信息

既然jmap可以生成堆转储文件,那么就不难想到通过jmapJava进程的堆转储文件生成出来,再结合工具分析heapdump文件,里面就有可能泄露出数据库连接信息(用户名,密码,地址等),如果项目中使用了AK SK甚至AKSK都可能泄露,从而实现接管整个云。

jmap生成堆转储文件的命令很简单:

1
jmap -dump:file=./heapdump [pid]

这边随便启动个项目测试,端口8080

image-20240513211025480

查看一下JavaPID

image-20240513211153564

生成堆转储文件:

image-20240513211301751

通过JDumpSpider这个工具可以快速的分析heapdump文件:

image-20240513211503158

因为这个例子使用了高版本的Shiro,所以也会泄露出ShiroKey和加密模式,所以当渗透时候如果服务器存在多个Java项目我们通过其他口子获取到Shell且恰好还有个高版本Shiro的服务,可通过这样的方式拿到Key,作为权限维持的另一个“口子“。

2、利用jcmd获取Java进程信息

  • 列出 Java 进程

    • 1
      
      jcmd -l
      

      image-20240513212243868

      这样也可以快速看到当前服务器上运行的java项目和PID

  • jcmd生成堆转储文件

    • 1
      
      jcmd [PID] GC.heap_dump /root/tools/Java/heap
      

      image-20240513212857119

      通过jcmd生成的heapdump相对小点,但是不影响泄露出ShiroKey和其他信息。

      image-20240513213049026

三、补充

  1. jps,同样可以拿到进程pid

    image-20240909152626772

本文由作者按照 CC BY 4.0 进行授权