Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ten post jest poświęcony zrozumieniu, jak gadget ObjectDataProvider jest wykorzystywany do uzyskania RCE oraz jak biblioteki serializacji Json.Net i xmlSerializer mogą być nadużywane z tym gadżetem.
Z dokumentacji: klasa ObjectDataProvider opakowuje i tworzy obiekt, który możesz użyć jako źródło powiązania. Tak, to dziwne wyjaśnienie, więc zobaczmy, co ta klasa ma, co jest tak interesujące: Ta klasa pozwala na opakowanie dowolnego obiektu, użycie MethodParameters do ustawienia dowolnych parametrów i następnie użycie MethodName do wywołania dowolnej funkcji dowolnego obiektu zadeklarowanego przy użyciu dowolnych parametrów. W związku z tym, dowolny obiekt będzie wykonywał funkcję z parametrami podczas deserializacji.
Przestrzeń nazw System.Windows.Data, znajdująca się w PresentationFramework.dll w C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, to miejsce, w którym zdefiniowano i zaimplementowano ObjectDataProvider.
Używając dnSpy możesz zbadać kod klasy, która nas interesuje. Na poniższym obrazku widzimy kod PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Nazwa metody
Jak możesz zauważyć, gdy MethodName
jest ustawione, wywoływana jest base.Refresh()
, przyjrzyjmy się, co to robi:
Dobrze, kontynuujmy, aby zobaczyć, co robi this.BeginQuery()
. BeginQuery
jest nadpisywane przez ObjectDataProvider
i to jest to, co robi:
Zauważ, że na końcu kodu wywoływana jest this.QueryWorke(null)
. Zobaczmy, co to wykonuje:
Zauważ, że to nie jest pełny kod funkcji QueryWorker
, ale pokazuje interesującą część: Kod wywołuje this.InvokeMethodOnInstance(out ex);
to jest linia, w której ustawiona jest metoda.
Jeśli chcesz sprawdzić, że ustawienie MethodName** zostanie wykonane**, możesz uruchomić ten kod:
Zauważ, że musisz dodać jako odniesienie C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll, aby załadować System.Windows.Data
Korzystając z poprzedniego exploit, będą przypadki, w których obiekt będzie deserializowany jako instancja ObjectDataProvider (na przykład w przypadku podatności DotNetNuke, używając XmlSerializer, obiekt został deserializowany przy użyciu GetType
). Wtedy nie będziemy mieli wiedzy o typie obiektu, który jest opakowany w instancji ObjectDataProvider (na przykład Process
). Możesz znaleźć więcej informacji o podatności DotNetNuke tutaj.
Ta klasa pozwala określić typy obiektów obiektów, które są enkapsulowane w danej instancji. Tak więc, ta klasa może być używana do enkapsulowania obiektu źródłowego (ObjectDataProvider) w nowy typ obiektu i dostarczenia potrzebnych właściwości (ObjectDataProvider.MethodName i ObjectDataProvider.MethodParameters). Jest to bardzo przydatne w przypadkach takich jak ten przedstawiony wcześniej, ponieważ będziemy mogli opakować _ObjectDataProvider** wewnątrz instancji **ExpandedWrapper _ i po deserializacji ta klasa utworzy obiekt OjectDataProvider, który wykona funkcję wskazaną w MethodName.
Możesz sprawdzić ten wrapper za pomocą następującego kodu:
Na oficjalnej stronie wskazano, że ta biblioteka pozwala na serializację i deserializację dowolnego obiektu .NET za pomocą potężnego serializatora JSON Json.NET. Więc, jeśli moglibyśmy zdeserializować gadżet ObjectDataProvider, moglibyśmy spowodować RCE po prostu deserializując obiekt.
Przede wszystkim zobaczmy przykład, jak serializować/zdeserializować obiekt za pomocą tej biblioteki:
Używając ysoserial.net stworzyłem exploit:
W tym kodzie możesz przetestować exploit, po prostu go uruchom, a zobaczysz, że kalkulator zostanie uruchomiony:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)