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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ermir — 악성 RMI Registry가 list/lookup/bind 메서드를 통해 안전하지 않은 Java 역직렬화를 악용합니다. 취약한 클라이언트에서 원격 코드 실행을 트리거하기 위해 Ysoserial 가젯을 생성 및 전달합니다. | Kitploit
도구/GitHubGitHub/hakivvi/ermir
Payload GenerationVulnerability AnalysisExploitationPenetration Testing
GitHubhakivvi/ermir

ermir

악성 RMI Registry가 list/lookup/bind 메서드를 통해 안전하지 않은 Java 역직렬화를 악용합니다. 취약한 클라이언트에서 원격 코드 실행을 트리거하기 위해 Ysoserial 가젯을 생성 및 전달합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Ermir

Ermir는 악성/가짜 RMI 레지스트리로, 표준 RMI 메서드(list()/lookup()/bind()/rebind()/unbind())를 호출하는 모든 Java 코드의 안전하지 않은 역직렬화를 악용합니다.

요구 사항

  • Ruby v3 이상.

설치

rubygems.org에서 Ermir 설치:

root@kitploit:~
$ gem install ermir

또는 저장소를 클론하고 gem 빌드:

root@kitploit:~
$ git clone https://github.com/hakivvi/ermir.git
$ rake install

사용법

Ermir는 CLI gem으로, ermir와 gadgetmarshal 두 개의 CLI 파일을 제공합니다. ermir는 실제 gem이고, 후자는 GadgetMarshaller.java 파일의 편리한 인터페이스로, Ysoserial의 가젯을 MarshalInputStream 요구 사항에 맞게 다시 작성합니다. 출력은 ermir로 파이프하거나 파일로 저장해야 합니다. 사용자 정의 가젯의 경우 ObjectOutputStream 대신 MarshalOutputStream을 사용하여 직렬화된 객체를 출력 스트림에 작성하십시오.

ermir 사용법:

root@kitploit:~
➜  ~ ermir
Ermir by @hakivvi * https://github.com/hakivvi/ermir.
Info:
    Ermir is a Rogue/Evil RMI Registry which exploits unsecure Java deserialization on any Java code calling standard RMI methods on it.
Usage: ermir [options]
    -l, --listen   bind the RMI Registry to this ip and port (default: 0.0.0.0:1099).
    -f, --file     path to file containing the gadget to be deserialized.
    -p, --pipe     read the serialized gadget from the standard input stream.
    -v, --version  print Ermir version.
    -h, --help     print options help.
Example:
    $ gadgetmarshal /path/to/ysoserial.jar Groovy1 calc.exe | ermir --listen 127.0.0.1:1099 --pipe

gadgetmarshal 사용법:

root@kitploit:~
➜  ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file

작동 원리

java.rmi.registry.Registry는 5가지 메서드를 제공합니다: list(), lookup(), bind(), rebind(), unbind():

  • public Remote lookup(String name): lookup()은 레지스트리에서 이름으로 바인딩된 객체를 검색합니다. 레지스트리는 조회된 원격 객체를 참조하는 Remote 객체를 반환하며, 반환된 객체는 MarshalInputStream.readObject()를 사용하여 읽힙니다. 이는 ObjectInputStream 위의 또 다른 계층으로, 기본적으로 각 클래스/프록시 디스크립터(TC_CLASSDESC/TC_PROXYCLASSDESC) 뒤에 이 클래스나 프록시 클래스를 로드하는 데 사용될 URL이 있어야 합니다. 이는 jdk7u21에서 수정된 것과 동일한 버그입니다. (Ermir는 이전 Java 버전만 취약하므로 이 URL을 지정하지 않고 대신 null을 기록합니다). Ysoserial 가젯은 ObjectOutputStream을 사용하여 직렬화되므로, Ermir는 gadgetmarshal - GadgetMarshaller.java의 래퍼 - 을 사용하여 지정된 가젯을 MarshalInputStream 요구 사항에 맞게 직렬화합니다.

PoC

ermir

기여

버그 제보 및 풀 리퀘스트는 GitHub https://github.com/hakivvi/ermir 에서 환영합니다. 이 프로젝트는 안전하고 환영하는 공간이 되도록 의도되었으며, 기여자는 행동 강령을 준수해야 합니다.

라이선스

이 gem은 MIT 라이선스 조건에 따라 오픈 소스로 제공됩니다.

행동 강령

Ermir 프로젝트의 코드 베이스, 이슈 트래커, 채팅방 및 메일링 리스트에서 상호작용하는 모든 사람은 행동 강령을 준수해야 합니다.

도구 다운로드
image
  • public String[] list(): list()는 레지스트리에 모든 바인딩된 객체 이름을 요청합니다. String 타입은 악성 가젯으로 대체될 수 없는데, 이는 일반 객체와 다르며 readObject()가 아닌 readUTF()로 읽히기 때문입니다. 그러나 list()는 실제 객체인 String[]을 반환하고 readObject()로 읽히므로, Ermir는 이 String[] 타입 대신 가젯을 보냅니다. image

  • public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind()는 객체를 레지스트리의 이름에 바인딩합니다. bind()의 경우 반환 타입은 void이며 반환되는 것이 없지만, 레지스트리가 RMI 반환 데이터 패킷에서 이 반환이 예외 반환임을 지정하면 클라이언트/서버 클라이언트는 반환 타입이 void임에도 불구하고 readObject()를 호출합니다. 이것이 레지스트리가 클라이언트에 예외(보통 java.lang.ClassNotFoundException)를 보내는 방식입니다. 다시 한번, Ermir는 합법적인 Exception 객체 대신 직렬화된 가젯을 전달합니다. image

  • public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind()는 전달된 이름의 바인딩을 제공된 원격 참조로 대체합니다. 역시 void를 반환하며, Ermir는 bind()와 마찬가지로 예외를 반환합니다.

  • public void unbind(java.lang.String $param_String_1): unbind()는 RMI 레지스트리에서 이름으로 원격 객체의 바인딩을 해제합니다. 이 또한 void를 반환합니다.