<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
Użyj [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) do łatwego tworzenia i **automatyzacji prac** z wykorzystaniem najbardziej zaawansowanych narzędzi społeczności.\
_Java Remote Method Invocation_, czyli _Java RMI_, to obiektowy mechanizm _RPC_, który pozwala obiektowi znajdującemu się w jednej _maszynie wirtualnej Java_ na wywoływanie metod obiektu znajdującego się w innej _maszynie wirtualnej Java_. Pozwala to programistom pisać aplikacje rozproszone z wykorzystaniem paradygmatu obiektowego. Krótka prezentacja _Java RMI_ z perspektywy ofensywnej znajduje się w [tym wystąpieniu na konferencji Black Hat](https://youtu.be/t\_aw1mDNhzI?t=202).
Zazwyczaj tylko domyślne komponenty _Java RMI_ (rejestr _RMI_ i system aktywacji) są powiązane z powszechnymi portami. _Obiekty zdalne_, które implementują rzeczywistą aplikację _RMI_, zazwyczaj są powiązane z losowymi portami, jak pokazano powyżej.
_nmap_ czasami ma problemy z identyfikacją usług _SSL_ chronionych _RMI_. Jeśli napotkasz nieznaną usługę ssl na powszechnym porcie _RMI_, powinieneś przeprowadzić dalsze dochodzenie.
W prostych słowach, _Java RMI_ pozwala programiście udostępnić obiekt _Java_ w sieci. Otwiera to port _TCP_, do którego klienci mogą się podłączyć i wywoływać metody na odpowiadającym obiekcie. Mimo że brzmi to prosto, _Java RMI_ musi rozwiązać kilka wyzwań:
1. Aby przekazać wywołanie metody za pomocą _Java RMI_, klienci muszą znać adres IP, port nasłuchiwania, zaimplementowaną klasę lub interfejs oraz `ObjID` docelowego obiektu ( `ObjID` to unikalny i losowy identyfikator tworzony podczas udostępniania obiektu w sieci. Jest on wymagany, ponieważ _Java RMI_ pozwala wielu obiektom nasłuchiwać na tym samym porcie _TCP_).
2. Zdalni klienci mogą alokować zasoby na serwerze, wywołując metody na udostępnionym obiekcie. Maszyna wirtualna _Java_ musi śledzić, które z tych zasobów są wciąż używane, a które z nich mogą być poddane procesowi garbage collection.
Pierwsze wyzwanie jest rozwiązywane przez rejestr _RMI_, który jest w zasadzie usługą nazw dla _Java RMI_. Sam rejestr _RMI_ jest również usługą _RMI_, ale zaimplementowany interfejs i `ObjID` są ustalone i znane wszystkim klientom _RMI_. Pozwala to klientom _RMI_ korzystać z rejestru _RMI_, znając tylko odpowiadający port _TCP_.
Kiedy programiści chcą udostępnić swoje obiekty _Java_ w sieci, zazwyczaj wiążą je z rejstrem _RMI_. Rejestr przechowuje wszystkie informacje wymagane do połączenia z obiektem (adres IP, port nasłuchiwania, zaimplementowaną klasę lub interfejs oraz wartość `ObjID`) i udostępnia je pod czytelną nazwą (nazwa powiązana). Klienci, którzy chcą skorzystać z usługi _RMI_, pytają rejestr _RMI_ o odpowiadającą nazwę powiązaną, a rejestr zwraca wszystkie wymagane informacje do połączenia. Dlatego sytuacja jest w zasadzie taka sama jak w przypadku zwykłej usługi _DNS_. Poniższy listing pokazuje mały przykład:
Drugie z wyżej wymienionych wyzwań jest rozwiązane przez _Rozproszony Kolektor Śmieci_ (_DGC_). To kolejna _usługa RMI_ z znaną wartością `ObjID`, dostępna praktycznie na każdym punkcie końcowym _RMI_. Gdy klient _RMI_ zaczyna korzystać z usługi _RMI_, wysyła informację do _DGC_, że odpowiadający _obiekt zdalny_ jest w użyciu. _DGC_ może śledzić liczbę odwołań i jest w stanie czyścić nieużywane obiekty.
Domyślne komponenty _Java RMI_ są od dłuższego czasu znanymi wektorami ataku, a wiele podatności istnieje w przestarzałych wersjach _Java_. Z perspektywy atakującego, te domyślne komponenty są interesujące, ponieważ implementują znane klasy / interfejsy i łatwo jest z nimi interakcjonować. Sytuacja ta jest inna dla niestandardowych _usług RMI_. Aby wywołać metodę na _obiekcie zdalnym_, musisz znać odpowiadającą sygnaturę metody z góry. Bez znajomości istniejącej sygnatury metody nie ma możliwości komunikacji z _usługą RMI_.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) to skaner podatności _Java RMI_, który potrafi automatycznie identyfikować powszechne _podatności RMI_. Gdy zidentyfikujesz punkt końcowy _RMI_, powinieneś spróbować:
Wynik działania enumeracji jest wyjaśniony bardziej szczegółowo na [stronach dokumentacji](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) projektu. W zależności od wyniku, należy spróbować zweryfikować zidentyfikowane podatności.
Wartości `ObjID` wyświetlane przez _remote-method-guesser_ mogą być używane do określenia czasu działania usługi. Może to pomóc zidentyfikować inne podatności:
Nawet jeśli podczas wyliczania nie zidentyfikowano żadnych podatności, dostępne usługi _RMI_ mogą nadal ujawniać niebezpieczne funkcje. Ponadto, pomimo że komunikacja _RMI_ z domyślnymi komponentami _RMI_ jest chroniona przez filtry deserializacji, w przypadku rozmów z niestandardowymi usługami _RMI_ takie filtry zazwyczaj nie są wdrożone. Znajomość poprawnych sygnatur metod na usługach _RMI_ jest zatem cenna.
Niestety, _Java RMI_ nie obsługuje wyliczania metod na _obiektach zdalnych_. Niemniej jednak, możliwe jest próbowanie metod sygnatur za pomocą narzędzi takich jak [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) lub [rmiscout](https://github.com/BishopFox/rmiscout):
Oprócz zgadywania, warto również szukać w wyszukiwarkach lub na _GitHubie_ interfejsu lub nawet implementacji napotkanej usługi _RMI_. Tutaj pomocne mogą być _nazwa związana_ i nazwa zaimplementowanej klasy lub interfejsu.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) oznacza klasy lub interfejsy jako `znane`, jeśli są one wymienione w wewnętrznej bazie danych narzędzia znanych _usług RMI_. W tych przypadkach można użyć akcji `znane` aby uzyskać więcej informacji na temat odpowiadającej _usługi RMI_:
Korzystaj z [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby łatwo budować i **automatyzować** przepływy pracy zasilane przez najbardziej zaawansowane narzędzia społecznościowe na świecie.\
<summary><strong>Zacznij od zera i zostań mistrzem hakowania AWS z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na githubie.