Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
gadgetinspector — Java 애플리케이션에서 역직렬화 가젯 체인을 찾기 위한 바이트 코드 분석기 | Kitploit
도구/GitHubGitHub/jackofmosttrades/gadgetinspector
Static AnalysisExploit FrameworksVulnerability AnalysisPenetration TestingBinary Analysis
GitHubjackofmosttrades/gadgetinspector

gadgetinspector

Java 애플리케이션에서 역직렬화 가젯 체인을 찾기 위한 바이트 코드 분석기

저장소 보기
1.1k2296년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

가젯 인스펙터

이 프로젝트는 Java 라이브러리 및 클래스패스에서 가젯 체인을 검사합니다. 가젯 체인은 역직렬화 취약점을 위한 익스플로잇을 구성하는 데 사용됩니다. 애플리케이션의 클래스패스에서 가능한 가젯 체인을 자동으로 발견함으로써 침투 테스터는 신속하게 익스플로잇을 구성할 수 있고, 애플리케이션 보안 엔지니어는 역직렬화 취약점의 영향을 평가하고 그 수정 작업의 우선순위를 정할 수 있습니다.

이 프로젝트는 Black Hat USA 2018에서 발표되었습니다. 자세한 내용은 거기서 확인하세요! (링크 추후 공개)

면책 조항: 이 프로젝트는 최상의 알파 단계입니다. 테스트와 문서가 추가되어야 합니다. 추가하여 도움을 주시기 바랍니다!

빌드

시스템에 JDK가 설치되어 있다고 가정하면, ./gradlew shadowJar를 실행하기만 하면 됩니다. 그런 다음 java -jar build/libs/gadget-inspector-all.jar <인자>로 애플리케이션을 실행할 수 있습니다.

사용 방법

이 애플리케이션은 인자로 war 파일의 경로(이 경우 war가 압축 해제되고 모든 클래스와 라이브러리가 클래스패스로 사용됨) 또는 임의의 수의 jar 파일을 기대합니다.

분석은 메모리 집약적일 수 있습니다(그리고 지금까지 가젯 인스펙터는 메모리 사용을 줄이기 위해 전혀 최적화되지 않았습니다). 작은 라이브러리의 경우 최소 2GB의 힙 크기(예: -Xmx2G 플래사용)를 할당하는 것이 좋습니다. 더 큰 애플리케이션의 경우 사용 가능한 만큼의 메모리를 사용하는 것이 좋습니다.

툴킷은 이후 단계에서 사용할 데이터 세트를 구축하기 위해 여러 단계의 클래스패스 검사를 거칩니다. 이러한 데이터 세트는 .dat 확장자를 가진 파일에 기록되며 실행 후 삭제할 수 있습니다(주로 개발 중에 이전 단계를 건너뛸 수 있도록 작성됩니다).

분석이 완료되면 gadget-chains.txt 파일이 작성됩니다.

예제

다음은 commons-collections-3.2.1.jar에 대해 실행한 예제입니다. 예를 들어:

root@kitploit:~
wget http://central.maven.org/maven2/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar
java -Xmx2G -jar build/libs/gadget-inspector-all.jar commons-collections-3.2.1.jar

gadget-chains.txt에는 다음과 같은 체인이 있습니다:

root@kitploit:~
com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandlerImpl.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; (-1)
  com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandlerImpl.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; (0)
  org/apache/commons/collections/map/DefaultedMap.get(Ljava/lang/Object;)Ljava/lang/Object; (0)
  org/apache/commons/collections/functors/InvokerTransformer.transform(Ljava/lang/Object;)Ljava/lang/Object; (0)
  java/lang/reflect/Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (0)

이 체인의 진입점은 JDK InvocationHandler 클래스의 구현체입니다. 원래 commons-collections 가젯 체인과 동일한 트릭을 사용하여 이 클래스의 직렬화 가능한 구현체는 가젯 체인에서 도달 가능하므로 발견된 체인이 여기서 시작됩니다. 이 메서드는 classToInvocationHandler.get()을 호출합니다. 발견된 가젯 체인은 classToInvocationHandler가 DefaultedMap으로 직렬화될 수 있음을 나타내므로 이 호출은 DefaultedMap.get()으로 점프합니다. 체인의 다음 단계는 이 메서드에서 value.transform()을 호출합니다. 이 클래스의 value 매개변수는 InvokerTransformer로 직렬화될 수 있습니다. 이 클래스의 transform 메서드 내에서 cls.getMethodName(iMethodName, ...).invoke(...)를 호출하는 것을 볼 수 있습니다. 가젯 인스펙터는 iMethodName이 직렬화된 멤버로서 공격자에 의해 제어 가능하다고 판단하므로, 공격자는 클래스에 대해 임의의 메서드를 실행할 수 있습니다.

이 가젯 체인은 Frohoff가 발견한 전체 commons-collections 가젯 체인의 구성 요소입니다. 위의 경우, 가젯 인스펙터는 AnnotationInvocationHandler 및 LazyMap 대신 CompositeInvocationHandlerImpl과 DefaultedMap을 통해 진입점을 발견했지만, 대체로 동일합니다.

다른 예제

이 도구가 찾을 수 있는 체인의 종류에 대한 더 많은 예제를 찾고 있다면, 다음 라이브러리들도 흥미로운 결과를 제공합니다:

  • http://central.maven.org/maven2/org/clojure/clojure/1.8.0/clojure-1.8.0.jar
  • https://mvnrepository.com/artifact/org.scala-lang/scala-library/2.12.5
  • http://central.maven.org/maven2/org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar

가젯 인스펙터를 완전한 애플리케이션(JAR 또는 WAR로 패키징된)에 대해 실행할 수도 있다는 점을 잊지 마세요. 예를 들어 Zksample2 애플리케이션의 war를 분석하면 다음과 같은 가젯 체인을 얻을 수 있습니다:

root@kitploit:~
net/sf/jasperreports/charts/design/JRDesignPieDataset.readObject(Ljava/io/ObjectInputStream;)V (1)
  org/apache/commons/collections/FastArrayList.add(Ljava/lang/Object;)Z (0)
  java/util/ArrayList.clone()Ljava/lang/Object; (0)
  org/jfree/data/KeyToGroupMap.clone()Ljava/lang/Object; (0)
  org/jfree/data/KeyToGroupMap.clone(Ljava/lang/Object;)Ljava/lang/Object; (0)
  java/lang/reflect/Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (0)

보시다시피, 이는 애플리케이션에 포함된 여러 다른 라이브러리를 활용하여 체인을 구축합니다.

FAQ

Q: 가젯 인스펙터가 가젯 체인을 찾았다면, 그로부터 익스플로잇을 구축할 수 있습니까?

A: 항상 그렇지는 않습니다. 분석은 몇 가지 단순화 가정을 사용하며, 거짓 양성(실제로 존재하지 않는 가젯 체인)을 보고할 수 있습니다. 간단한 예로, 분기 조건의 만족 가능성을 해결하려고 시도하지 않습니다. 따라서 다음을 가젯 체인으로 보고합니다:

root@kitploit:~
public class MySerializableClass implements Serializable {
    public void readObject(ObjectInputStream ois) {
        if (false) System.exit(0);
        ois.defaultReadObject();
    }
}

또한, 가젯 인스펙터는 관심 있는 함수에 대해 상당히 광범위한 조건을 가지고 있습니다. 예를 들어, 리플렉션(즉, 공격자가 메서드를 제어할 수 있는 Method.invoke() 호출)을 관심 있는 것으로 간주하지만, 종종 간과되는 단언(assertion)으로 인해 공격자가 호출되는 메서드에 영향을 줄 수는 있지만 완전한 제어는 아닐 수 있습니다. 예를 들어, 공격자는 모든 클래스에서 "getError()" 메서드를 호출할 수 있지만, 다른 메서드 이름은 호출할 수 없습니다.

Q: 가젯 체인이 발견되지 않았다면, 내 애플리케이션이 익스플로잇으로부터 안전하다는 의미입니까?

A: 아닙니다! 첫째, 가젯 인스펙터는 "흥미로운" 부작용이 있다고 간주하는 "싱크" 함수의 집합이 매우 좁습니다. 이는 목록에 없는 다른 흥미롭거나 위험한 동작이 없다는 것을 의미하지 않습니다.

또한, 정적 분석에는 여러 가지 한계가 있어 가젯 인스펙터는 항상 사각지대를 가지게 됩니다. 예를 들어, 가젯 인스펙터는 현재 다음을 발견하지 못할 것입니다. 리플렉션 호출을 추적하지 않기 때문입니다.

root@kitploit:~
public class MySerializableClass implements Serializable {
    public void readObject(ObjectInputStream ois) {
        System.class.getMethod("exit", int.class).invoke(null, 0);
    }
}
도구 다운로드